Skip to content

CaptiFi API

Pull your guest data straight into your own systems: a booking platform, a CRM, a spreadsheet, or whatever you already use for reporting.

Plan

The API is included on the Growth plan and above. On Essentials the API keys page shows what it does and how to upgrade.

What you can do with it

You want toEndpoint
List your venuesGET /venues
Pull guest sign-ups, filtered and paginatedGET /guests
Get visit and opt-in totals for a periodGET /stats
Check which account a key belongs toGET /me

The API is read-only. Nothing you do with a key can change your CaptiFi settings, your splash pages or your guest records, so it is safe to hand a key to a developer or an agency.

Step 1: create a key

Go to API Keys in the sidebar and give your key a name. Name it after the system that will use it, so you can tell your keys apart later.

The API Keys page with the create form, the list of existing keys and the usage example

On Essentials the page explains what the API does and how to get it:

The API Keys page on a plan without API access, showing what it does and an Upgrade to Pro button

Your key appears once, immediately after you create it.

The one-time key reveal, with a copy button and a warning that the key cannot be shown again

Copy it straight away

We store your key encrypted, exactly like a password, so we cannot show it to you again. If you lose it, revoke it and create a new one.

You can hold up to 5 keys at once. Use separate keys for separate systems: if one needs replacing you can revoke it without breaking the others.

Step 2: make a request

Send your key as a bearer token in the Authorization header. The base URL is:

https://app.captifi.io/api/v1/customer
bash
curl -H "Authorization: Bearer YOUR_KEY" \
     -H "Accept: application/json" \
     "https://app.captifi.io/api/v1/customer/guests?per_page=50"

Every response is JSON in the same shape: your rows under data, and paging or totals under meta.

json
{
  "data": [
    {
      "id": 84213,
      "venue_id": 17110,
      "name": "Sam Fletcher",
      "first_name": "Sam",
      "last_name": "Fletcher",
      "email": "sam@example.com",
      "phone": "+447700900123",
      "marketing_consent": true,
      "is_return_visit": false,
      "visited_at": "2026-08-18T19:14:00+01:00"
    }
  ],
  "meta": { "current_page": 1, "last_page": 3, "per_page": 50, "total": 132 }
}

Endpoint reference

GET /me

Confirms which account a key belongs to. Useful as a connection test.

json
{ "data": { "account_id": 41404, "business_name": "Ecton House", "plan": "Pro", "venue_count": 7 } }

GET /venues

Your venues, alphabetically.

FieldNotes
idUse this as venue_id on the other endpoints
name, city, countryAs set on My Venues
created_atISO 8601

GET /guests

Guest sign-ups, newest first. Only guests who actually arrived are returned, so contacts you imported yourself never appear here as footfall.

ParameterValuesNotes
venue_ida venue idDefaults to every venue on your account
from, toYYYY-MM-DDInclusive
marketing_consent1 or 0Filter to guests who opted in (or did not)
per_page1-200Defaults to 50
page1+Read meta.last_page to know when to stop

GET /stats

Totals for a period, matching the figures on your dashboard.

ParameterValues
venue_ida venue id (defaults to all)
from, toYYYY-MM-DD (defaults to the last 30 days)

visits counts every arrival. unique_guests counts distinct email addresses, so a guest who connected three times in the period counts once. marketing_opt_ins counts arrivals from guests who agreed to marketing.

json
{
  "data": { "from": "2026-07-20", "to": "2026-08-18", "visits": 412, "unique_guests": 388, "marketing_opt_ins": 305 },
  "meta": { "venue_ids": [17110] }
}

Rate limits

120 requests per minute, per key. Every response tells you where you stand:

HeaderMeaning
X-RateLimit-Limityour ceiling, 120
X-RateLimit-Remainingcalls left in the current minute
Retry-Afteron a 429, the seconds to wait before retrying

If you go over, the API answers 429. Wait for the number of seconds in Retry-After before retrying, rather than retrying straight away: the window is a rolling minute, so a 429 can mean waiting up to 60 seconds.

The quota is counted per key, not per IP address, so one system going over never uses up another system's allowance. Pulling a large history is best done with per_page=200 and paging through, rather than many small requests.

Revoking a key

Click Revoke next to any key. It stops working immediately, and anything using it will start getting 401. This cannot be undone, so if you are replacing a key in a live system, create the new one first.

Common responses

StatusMeaningWhat to do
200Success-
401The key is missing, wrong or revokedCheck the Authorization header
403Your plan does not include the API, or the credential is not an API keyUpgrade to Growth, or create a proper API key
404The venue_id is not on your accountCheck GET /venues
422A parameter is invalidThe response names the parameter
429Rate limitedWait, then retry

Security

  • Treat a key like a password: never put it in front-end code, a public repo, or a shared document.
  • Keys are scoped to your account. A key can only ever read your own venues and your own guests.
  • A key cannot be used to sign in to the dashboard, and it cannot change anything.
  • If a key may have leaked, revoke it. That is instant and cannot be undone.

Your responsibilities under GDPR

Guest records include personal data. Once you pull them into your own system you are the controller of that copy: your own retention rules, security and deletion requests apply to it. Deleting a guest in CaptiFi does not delete the copy you exported. See GDPR & Data Protection.

See also

CaptiFi — Guest WiFi Marketing Platform