Guest login apps
Your app, your onboarding, your brand from the first pixel. One API call puts the guest online — our portal never appears.
For developers
Your own guest login app. Your own onboarding flow. Your own paid WiFi. A captive portal API and guest WiFi API in one: fourteen REST endpoints, JSON in and out, to create locations, configure networks, register devices, log guests in and collect mobile money.
The external API is in private beta. The samples on this page show the request shape; the base URL and your keys arrive together.
$ curl -s "$HALO_API/external/locations" -H "Authorization: Bearer eyJ…"
● 200 OK · 84 ms
{
"locations": [{
"id": "9f2c-…-84hz",
"name": "The Sentinel Hotel",
"networks": 3,
"devices_online": 24
}, …]
}
$ What people build
We handle thousands of guest logins a day through our portal. When operators outgrow it — or never wanted it — they build on the API instead.
Your app, your onboarding, your brand from the first pixel. One API call puts the guest online — our portal never appears.
Create the location, configure its network, register the routers — new venues onboard from your own back office, not ours.
Push logo, banner and background per location straight from your asset pipeline. A hundred portals, one script.
Send an MTN or Airtel prompt to the guest’s phone, poll until it settles, let them through. Uganda-ready out of the box.
The surface
Grouped by resource, one Bearer token for nearly all of it. This is the whole surface — what you see here is what ships.
Full endpoint reference ships with your keys. · Request access →
Two calls, whole story
# Exchange your key pair for a Bearer token. HALO_API arrives with your keys. curl -X POST "$HALO_API/external/token" \ -d key="halo_pk_…" \ -d secret="halo_sk_…" { "token_type": "Bearer", "token": "eyJhbGciOiJIUzI1…" } # Shown once — store it.
# Guest taps “Connect” in your app: curl -X POST "$HALO_API/connect/external/trigger-login" \ -H "Authorization: Bearer eyJ…" \ -d mac="ac:37:43:9b:1f:02" \ -d location="9f2c-…-84hz" { "status": "online" } # Our portal never appeared.
Proof
The fleet board below — every venue with its networks and device counts — is the same GET /external/locations you get. Our cloud consumes the surface it serves; the endpoints on this page are the ones our own apps ride, not a brochure copy of them.

Ground rules
A key and a secret from your dashboard mint a Bearer token at /external/token. The token is shown once; rotate the pair any time.
Every account gets a fake venue with fake guests generating real-shaped data. Break it all you like.
Everything lives under /external and stays there. We deprecate with notice, not surprises.
Rate limits exist and are printed on every response header, so you can plan around them.
JSON errors that say what went wrong and what to do about it. No error code scavenger hunts.
The API is part of the product, not an upsell. Same rule as every feature: if we build it, you have it.
Tell us what you’re making and we’ll send keys, the endpoint reference and a sandbox venue — usually the same day.
Get API accessRather see the product first? Book a demo
We’ll write to .
While you wait: See pricing Read the case studies