AirDetect
AirDetect turns the Bluetooth Low Energy (BLE) radios already present in your AdmiralOS devices into real-time presence and footfall sensors. No new hardware, no extra installs - any device in a fleet with a BLE radio can measure how many people are nearby and for how long.
AirDetect measures presence, not people. It estimates anonymised visitor counts and dwell time from radio signals. It does not capture imagery, identify individuals, or track any one device's location.
AirDetect is an opt-in, usage-based service. You pay only for the presence you detect (per person, per minute), billed monthly on your existing invoice. There is no free tier and no minimum commitment.
How it works
| Stage | What happens |
|---|---|
| Capture | Each device with a BLE radio listens for nearby signals and turns them into anonymised presence detections. |
| Amalgamate | Detections from every device in the fleet are centralised and exposed through a single, unified interface. |
| Detect | Detection algorithms convert noisy radio data into clean presence counts and dwell times - never identities. |
| Activate | Use the data to trigger signage content, measure dwell, prove audience, or feed occupancy systems. |
Because detection runs on-device, enabling AirDetect requires no redeployment of hardware. Devices begin reporting on their next check-in after the feature is enabled.
Who can do what
AirDetect access is governed at the organisation level:
| Action | Required role |
|---|---|
| View status, usage, analytics, sessions, exports | Any organisation member (airdetect_viewer) |
| Enable / disable AirDetect on a fleet | Organisation admin (airdetect_admin) |
Enabling or disabling AirDetect is a billed action, so it is restricted to admins. Members can freely view all analytics once the feature is on.
If the organisation has an outstanding billing issue (suspended or terminated account), AirDetect is locked. Status and analytics calls return a billing error until the issue is resolved. Resolve it under Settings → Billing.
Enabling AirDetect (Portal)
AirDetect is managed from a fleet's detail page, under the AirDetect analytics section.
- Open the fleet and go to AirDetect Analytics.
- If you are an organisation admin, click Enable AirDetect.
- Read the confirmation - it reminds you this is a billed service - and click Confirm & Enable.
- Devices begin BLE detection on their next check-in. There may be a short delay before data appears.
If you are not an admin, you'll see a note explaining that only organisation admins can enable billed services. You can still view analytics once an admin turns it on.
Disabling
Admins can disable AirDetect at any time from Manage subscription → Disable AirDetect.
Disabling stops billing for new usage. Any usage already accrued in the current period still appears on your invoice.
Viewing analytics (Portal)
Once enabled, the AirDetect panel shows analytics for a selectable date range (defaulting to the current calendar month, UTC).
Headline metrics
- Visitors - total visitor sessions detected.
- Unique - distinct visitors, with a returning rate.
- Person-minutes - total presence time, plus median dwell.
- Estimated cost - an estimate for the period. Your monthly invoice is the source of truth.
Costs shown in the portal are estimates calculated from the same usage data. The authoritative charge is computed at invoice time from the billing roll-up.
Analytics tabs
| Tab | Shows |
|---|---|
| Overview | Dwell distribution (mean/median/percentiles), engagement by dwell bucket, proximity breakdown, device ecosystem mix, peak period, and average associated devices per visitor. |
| Trends | Visitor and unique-visitor counts over time, bucketed by an auto-selected granularity. |
| Devices | A per-device leaderboard. Click a device to drill into its own metrics and time series. |
| Sessions | A raw session inspector - individual visits, newest first, with infinite scroll. |
Exporting
Click Export CSV to download the raw sessions for the selected range. The export streams row-by-row, so it stays fast and memory-light regardless of size. If the server reports a partial result, you'll be prompted to retry.
Raw session detail is retained for a limited period (shown in the Session inspector). Aggregated usage used for billing is retained independently.
Using the API
Everything in the portal is backed by a REST API under the fleet path. These endpoints are ideal for automation and integrations - typically driven by a Service Account.
All endpoints require the standard authentication headers and an
X-Organization-ID header (see
Service Accounts → Authentication).
| Method | Path | Purpose | Required entitlement |
|---|---|---|---|
GET | /fleets/{fleetId}/airdetect | Get feature status (returns enabled: false rather than 404 when off) | airdetect_viewer |
PUT | /fleets/{fleetId}/airdetect | Enable / disable (billed action) | airdetect_admin |
GET | /fleets/{fleetId}/airdetect/usage | Period usage, estimated cost, per-device breakdown | airdetect_viewer |
GET | /fleets/{fleetId}/airdetect/usage/detail | Full fleet breakdown: dwell stats, buckets, time series | airdetect_viewer |
GET | /fleets/{fleetId}/airdetect/devices/{deviceId}/usage | Single-device breakdown | airdetect_viewer |
GET | /fleets/{fleetId}/airdetect/sessions | Paginated raw sessions (keyset cursor + filters) | airdetect_viewer |
GET | /fleets/{fleetId}/airdetect/sessions/export | Streaming CSV export of raw sessions | airdetect_viewer |
Status semantics
The status endpoint deliberately returns enabled: false (HTTP 200) when the
feature is off, so a UI can render the toggle state. The usage and analytics
endpoints return 404 when AirDetect is not enabled on the fleet - the
feature is hidden until activated.
Response codes to handle
| Code | Meaning |
|---|---|
200 | Success |
401 | Not authenticated |
402 | Account is suspended or terminated - billing must be resolved |
403 | Caller lacks the required entitlement (e.g. a viewer attempting to enable) |
404 | Fleet not found / not accessible, or AirDetect not enabled |
Common query parameters
For usage, detail, sessions, and export endpoints:
start,end- RFC3339 timestamps. Defaults to the current calendar month (UTC) if omitted.granularity(detail endpoints) - one ofhour,day,week,month. If omitted, granularity is auto-selected from the span (andhouris clamped todayfor spans over 14 days to avoid oversized series).
Sessions and export also accept filters: device_id, visitor_id,
proximity, min_confidence, min_dwell, max_dwell. The sessions endpoint
additionally takes limit (max 500, default 100) and a cursor for keyset
pagination.
Example: check status
curl -sS https://api.admrl.co/v1/fleets/$FLEET_ID/airdetect \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "X-Organization-ID: $ORG_ID"
{
"fleet_id": "550e8400-e29b-41d4-a716-446655440000",
"enabled": true,
"enabled_at": "2024-09-12T14:30:00Z"
}
Example: enable AirDetect (admin only)
curl -X PUT https://api.admrl.co/v1/fleets/$FLEET_ID/airdetect \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "X-Organization-ID: $ORG_ID" \
-H "Content-Type: application/json" \
-d '{"enabled": true}'
A caller without airdetect_admin receives 403.
Example: usage summary
curl -sS "https://api.admrl.co/v1/fleets/$FLEET_ID/airdetect/usage?start=2024-09-01T00:00:00Z&end=2024-09-30T23:59:59Z" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "X-Organization-ID: $ORG_ID"
{
"fleet_id": "550e8400-e29b-41d4-a716-446655440000",
"period_start": "2024-09-01T00:00:00Z",
"period_end": "2024-09-30T23:59:59Z",
"visitor_count": 1284,
"person_minutes": 45200.5,
"estimated_cost_cents": 904,
"devices": [
{
"device_id": "6ba7b810-9dad-11d1-80b4-00c04fd430c8",
"visitor_count": 312,
"person_minutes": 11050.0
}
]
}
estimated_cost_cents is a UI estimate. The authoritative charge is computed at
invoice time.
Example: export sessions to CSV
curl -sS "https://api.admrl.co/v1/fleets/$FLEET_ID/airdetect/sessions/export?start=2024-09-01T00:00:00Z&end=2024-09-30T23:59:59Z" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "X-Organization-ID: $ORG_ID" \
-o airdetect_sessions.csv
The CSV columns are: session_id, organisation_id, fleet_id, device_id,
visitor_id, first_seen, last_seen, dwell_seconds, dwell_bucket,
proximity_bucket, confidence, associated_device_count, within_trial.
The CSV is streamed with a 200 already sent, so it cannot switch to an error
status mid-stream. If a server error occurs partway through, the export is
truncated and a trailing line is written:
# ERROR: export truncated due to server error
Check for this sentinel line and retry if you see it.
Granting API access to a service account
To let a Service Account use AirDetect, attach a policy with the appropriate organisation-level grants:
# Read-only: view status, usage, analytics, and exports
{ "airdetect_viewer", "organisation" }
# Manage: also enable/disable AirDetect (billed action)
{ "airdetect_admin", "organisation" }
Both grants are scoped to the organisation, not to individual fleets - a
service account holding airdetect_viewer can read AirDetect data for any fleet
in the organisation it has access to. Notably, the AirDetect viewer grant alone
is sufficient to read; fleet viewer is not separately required.
For integrations that only read footfall data (dashboards, reporting,
attribution), grant airdetect_viewer only. Reserve airdetect_admin for
automation that genuinely needs to toggle the billed feature.
Privacy
AirDetect is designed for audience insight without surveillance:
- Presence, not identity. Counts and dwell are estimated within the bounds of BLE privacy. Individuals are not identified and individual device locations are not tracked.
- Aggregated by design. Reporting is about how many people are present and for how long - not who they are.
- No cameras, no PII. Presence is derived from anonymised radio signals. There is no imagery, facial data, or personally identifiable information in the pipeline.
Next Steps
- Fleets - manage the fleets AirDetect runs on
- Service Accounts - automate AirDetect access
- IAM, Policies & Access - author and attach the
airdetect_*grants