The Captive Portal API lets the HotSpot announce itself to phones, tablets and computers the moment they join the guest network.
The DHCP server gives them the address of a small HTTPS service (RFC 8910, DHCP option 114).
The device asks that service whether it is behind a portal and where to sign in (RFC 8908). No guessing is involved.
This page explains the concept, the prerequisites, how to enable the feature, how to read its status, and how to check it from the command line.
In short: enable HTTPS on the portal with a certificate issued by a public authority (for example Let's Encrypt) for a public host name, tick Captive Portal API (RFC 8908).
Then click Reconfigure all.
Artica checks the certificate itself and publishes the API only when devices will accept it.
The classic way: probes
Without this feature, every operating system detects a captive portal by probing.
It requests a well-known HTTP address (connectivitycheck.gstatic.com/generate_204, captive.apple.com, www.msftconnecttest.com/connecttest.txt, edge-http.microsoft.com/captiveportal/generate_204, …) and compares the answer with the expected one.
The HotSpot answers these probes on port 80:
it sends a 302 redirect to the login page for devices that are not signed in yet, and the genuine answer for signed-in devices (see Enable automatic browser redirection).
This works, but it is indirect:
The modern way: RFC 8910 + RFC 8908
https://hotspot.example.com:8026/captive-portal/api (RFC 8910).application/captive+json, RFC 8908):captive: true while the device must sign in, false after;user-portal-url: the HTTPS login page to open;seconds-remaining: the time left in the session, once signed in and when the session is limited."captive": false.| Component | Role |
|---|---|
| Artica daemon | Decides whether the API can be published. It requires HTTPS enabled on the portal, a public host name in the certificate, and a certificate that verifies against the public authorities of the appliance, chain included. It records the API URL, or the reason why it is not published. |
| DHCP server (ISC or Kea) | Sends option 114 on the HotSpot network, and only with an HTTPS API address. |
| DNS cache (Unbound) | Answers the API host name with the HotSpot IP address for the guests, whatever the public DNS says. Only that exact name is pinned: the other names of the domain keep resolving normally. |
| HotSpot web service | Serves GET /captive-portal/api on the portal HTTPS port. It asks the proxy engine (Go-Shield) whether the device is signed in, which is the same decision used for the probes. |
The probes keep working as before. Devices that do not support RFC 8908 simply ignore option 114.
Cache-Control: private header keeps it out of shared caches.seconds-remaining, the operating system knows when the session ends and can warn the user,
| Platform | RFC 8910 / 8908 | What happens |
|---|---|---|
| Android 11 and later | Yes | Uses option 114 and the API, keeps its probes as a fallback. |
| iOS / iPadOS 14 and later, macOS 11 and later | Yes | Uses option 114 and the API. |
| Windows 10/11, Microsoft Edge | No documented support | Unchanged: detection through the probes (NCSI and Edge), answered by the HotSpot with a 302 to the login page. |
| Linux (NetworkManager), Firefox | Probes | Unchanged: detection through the probes. |
When not to use it: the portal is published through the reverse proxy (the API is then not available), the HotSpot has no public DNS name, or the guest network is not served by the Artica DHCP server and you cannot set option 114 on your own DHCP server.
hotspot.example.com:1. Prepare the certificate
In the Certificates Center, request a Let's Encrypt certificate (or import one issued by your authority) for the public name of the HotSpot.
When the chain is stored separately, Artica serves the certificate with its chain, like nginx does:
Android does not download a missing intermediate certificate.
Go to HotSpot > Web portal authentication > General settings, then click the service section (or any of its lines):
Click Apply.
The HotSpot service restarts and the card shows the result.
The DHCP and DNS configurations must be rebuilt so that they carry the API.
Go to HotSpot > Status and click Reconfigure all.
The task runs these steps in order, each one checked on the file it produces:
Run Reconfigure all again after each change of certificate, host name or SSL port.
The Captive Portal API (RFC 8908) line of the service section shows either the published API address or, in orange, why it is not published.
Published: the API address shown here is the one DHCP option 114 carries.
Certificate not trusted: a self-signed certificate, or one from a private authority, even with a public name.
Private name: the default certificate of the HotSpot wizard uses a .local name.
| Message | Cause | What to do |
|---|---|---|
| INACTIVE | The switch is off. | Turn on Captive Portal API (RFC 8908) in the service form. |
| HTTPS must be enabled on the portal | SSL is off. | Turn on Use The SSL Encryption. |
| No certificate selected for HTTPS | No certificate, or it cannot be read. | Select a certificate. |
| The certificate has no public host name (a .local name cannot be used) | Only private names, IP addresses or wildcards. | Use a certificate for a public name such as hotspot.example.com. |
| The certificate is not issued by a public authority, or is expired | Self-signed, private authority, missing intermediate, expired, or the name does not match. |
Use a Let's Encrypt or commercial certificate, with its chain. |
| Not available when the portal is published by the reverse proxy | The portal is behind the reverse proxy. | Not supported in this mode. |
tcpdump -i eth0 -n -vvv port 67;References: RFC 8910 – Captive-Portal Identification in DHCP and Router Advertisements, RFC 8908 – Captive Portal API, RFC 8952 – Captive Portal Architecture.