Download OpenAPI specification:
The Pemberton Digital API enables programmatic access to sensor data collected by Pemberton Digital devices.
Please refer to the Terms of Service before using this service. For support, please contact your account manager.
You must be a registered user to access the API, with Pemberton Digital sensors deployed in your environment. To purcase sensors or register for an account, please contact sales@pemberton.digital for more information.
Access to the API is controlled via an API key, which can be obtained from the Pemberton Digital dashboard at https://app.pemberton.digital/. Once logged in, navigate to Organisation Settings -> API Keys to create and manage your API keys.
Send the API key in the Authorization header of each request, using the
Bearer auth scheme:
curl --request GET \
--url https://api.pemberton.digital/client/URL \
--header 'Authorization: Bearer xxxxxxxxxxxxxxxx yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy' \
--header 'Accept: application/json'
Return a list of available organisations and sites that this client may query.
[- {
- "organisation_code": "a2bcd",
- "organisation_name": "Demo organisation",
- "site_slug": "liverpool-street",
- "site_name": "Liverpool Street"
}, - {
- "organisation_code": "a2bcd",
- "organisation_name": "Demo organisation",
- "site_slug": "bethnal-green",
- "site_name": "Bethnal Green"
}, - {
- "organisation_code": "a2bcd",
- "organisation_name": "Demo organisation",
- "site_slug": "st-pauls",
- "site_name": "St. Pauls"
}
]Return footfall data for a site. All devices in the site with capability entry/exit tracking are summed for entries.
An entry is recorded when a tracked person crosses any configured virtual gate on a device in the positive direction.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| bucket_interval | integer (Bucket Interval) Default: 5 The bucket size in minutes. |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
[- {
- "x": "2025-10-14T13:00:00+00:00",
- "y": 1
}, - {
- "x": "2025-10-14T13:05:00+00:00",
- "y": 0
}, - {
- "x": "2025-10-14T13:10:00+00:00",
- "y": 2
}
]Return calendar-week footfall data for the most recently completed week.
Always returns exactly one week of data (Monday-Sunday) for the previous complete calendar week. If average > 1, returns the bucket-by-bucket average of the previous n weeks.
| bucket_interval | integer (Bucket Interval) Default: 60 The bucket size in minutes. |
| average | integer (Average) Default: 1 Number of previous weeks to average. Defaults to 1 (no averaging). |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
[- {
- "x": "2025-10-06T00:00:00+00:00",
- "y": 142
}, - {
- "x": "2025-10-06T01:00:00+00:00",
- "y": 98
}, - {
- "x": "2025-10-06T02:00:00+00:00",
- "y": 45
}
]Return footfall data for a site. All devices in the site with capability entry/exit tracking are summed for entries, and the total count over the requested time range is returned.
An entry is recorded when a tracked person crosses any configured virtual gate on a device in the positive direction.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| bucket_interval | integer (Bucket Interval) Default: 5 The bucket size in minutes. |
| precise_counts | boolean (Precise Counts) Default: false If false, return a pair of numbers indicating the minimum and maximum possible values based on the expected sensor error rate. This response is intended for dashboard display. If true, return the exact number of entries recorded. |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
[- 25,
- 30
]Return footfall data for a site. All devices in the site with capability entry/exit tracking are summed for entries over the requested period, and the percentage change (% increase or % decrease) on the previous period is returned.
An entry is recorded when a tracked person crosses any configured virtual gate on a device in the positive direction.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| bucket_interval | integer (Bucket Interval) Default: 5 The bucket size in minutes. |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
92.3076923076923Return occupancy counts over time for a site. For each bucket interval, the average number of people seen over the bucket is individually calculated for each device with capability customer flow but without capability entry/exit tracking.
The per-device averages are then summed to produce a site-wide occupancy value for each bucket.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| bucket_interval | integer (Bucket Interval) Default: 5 The bucket size in minutes. |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
[- {
- "x": "2025-10-14T13:00:00+00:00",
- "y": 2.3096492710382
}, - {
- "x": "2025-10-14T13:05:00+00:00",
- "y": 2.4529247583921
}, - {
- "x": "2025-10-14T13:10:00+00:00",
- "y": 3.1927592902186
}
]Return occupancy counts over time for a site. For each bucket interval, the average number of people seen over the bucket is individually calculated for each device with capability customer flow but without capability entry/exit tracking.
The per-device averages are then summed to produce a site-wide occupancy value for each bucket.
Finally, the series is scaled so the minimum series value is equal to the 10th percentile of the trailing 5 periods, and the maximum value is equal to the 95th percentile, and the output value is normalised to a floating-point number between 0 and 100.
This endpoint is intended for use as a high-level "is it more or less busy than usual" metric; busy and quiet periods will be indicated on the chart.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| bucket_interval | integer (Bucket Interval) Default: 5 The bucket size in minutes. |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
[- {
- "x": "2025-10-14T13:00:00+00:00",
- "y": 78.3096492710382
}, - {
- "x": "2025-10-14T13:05:00+00:00",
- "y": 75.4529247583921
}, - {
- "x": "2025-10-14T13:10:00+00:00",
- "y": 72.1927592902186
}
]Return occupancy data grouped by zone. Each zone returns a time-series of average occupancy values across all devices configured for that zone.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| bucket_interval | integer (Bucket Interval) Default: 5 The bucket size in minutes. |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
{- "birds_and_reptile": {
- "colour": "#ff0000",
- "data": [
- {
- "x": "2025-10-14T13:00:00+00:00",
- "y": 3
}, - {
- "x": "2025-10-14T13:05:00+00:00",
- "y": 5
}
]
}, - "aquarium": {
- "colour": "#0000ff",
- "data": [
- {
- "x": "2025-10-14T13:00:00+00:00",
- "y": 2
}, - {
- "x": "2025-10-14T13:05:00+00:00",
- "y": 4
}
]
}
}Return path statistics grouped by zone. Analyzes all tracked paths at the site and calculates how many unique paths entered each zone and the total number of path points within each zone.
This is a long-running endpoint that uses keepalive streaming for large datasets.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| floorplan_width required | integer (Floorplan Width) The display width of the floorplan image in pixels. |
| floorplan_height required | integer (Floorplan Height) The display height of the floorplan image in pixels. |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
{- "birds_and_reptile": {
- "colour": "#ff0000",
- "total_unique_paths": 142,
- "total_path_points": 3847
}, - "aquarium": {
- "colour": "#0000ff",
- "total_unique_paths": 98,
- "total_path_points": 2156
}
}Return queue length data for a site. The occupancy of each device with the QUEUE capability at the site is averaged over each bucket, then summed across all devices.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| bucket_interval | integer (Bucket Interval) Default: 5 The bucket size in minutes. |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
[- {
- "x": "2025-10-14T13:00:00+00:00",
- "y": 5
}, - {
- "x": "2025-10-14T13:05:00+00:00",
- "y": 8
}, - {
- "x": "2025-10-14T13:10:00+00:00",
- "y": 3
}
]Return average time spent in the site queue. Calculated by combining queue length data with exit counts to derive average queue time in minutes.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| bucket_interval | integer (Bucket Interval) Default: 5 The bucket size in minutes. |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
[- {
- "x": "2025-10-14T13:00:00+00:00",
- "y": 2.5
}, - {
- "x": "2025-10-14T13:05:00+00:00",
- "y": 3.2
}, - {
- "x": "2025-10-14T13:10:00+00:00",
- "y": 1.8
}
]Return wait time data for a site. Devices with customer flow capability but without entry/exit tracking are used to calculate average wait time based on occupancy divided by entries.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| bucket_interval | integer (Bucket Interval) Default: 5 The bucket size in minutes. |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
[- {
- "x": "2025-10-14T13:00:00+00:00",
- "y": 4.5
}, - {
- "x": "2025-10-14T13:05:00+00:00",
- "y": 3.2
}, - {
- "x": "2025-10-14T13:10:00+00:00"
}
]Return site-wide heatmap aggregated across all devices. Device heatmaps are transformed to floorplan coordinates, weighted by distance, and aggregated onto a common grid. The result is scaled to 0-100 range for visualization.
Optionally apply logarithmic scaling for better visualization of low-intensity areas.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| floorplan_width required | integer (Floorplan Width) The display width of the floorplan image in pixels. |
| floorplan_height required | integer (Floorplan Height) The display height of the floorplan image in pixels. |
| grid_x required | integer (Grid X) The number of grid squares on the x axis. |
| grid_y required | integer (Grid Y) The number of grid squares on the y axis. |
| scaling | number (Scaling) Default: 1 Scaling multiplier: all values will be scaled by this amount, for consistent comparison between time ranges. |
| offset | number (Offset) Default: 0 Scaling offset: all values will be offset by this amount, for consistent comparison between time ranges. |
| log | boolean (Log) Default: false Use a logarithmic scale. |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
{- "scaling": 2.5,
- "offset": -1.2,
- "data": [
- 0,
- 5.2,
- 12.4,
- 8.3,
- 3.1,
- 1.5,
- 2.3,
- 15.7,
- 28.4,
- 22.1,
- 9.6,
- 4.2,
- 1.1,
- 8.9,
- 19.3,
- 16.8,
- 7.2,
- 3
]
}Return total dwell intensity for each zone. Generates a site-wide heatmap on a 100x100 grid, then sums the values within each zone's boundary to calculate zone-specific dwell metrics.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| floorplan_width required | integer (Floorplan Width) The display width of the floorplan image in pixels. |
| floorplan_height required | integer (Floorplan Height) The display height of the floorplan image in pixels. |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
{- "birds_and_reptile": 3847.2,
- "aquarium": 2156.8,
- "entrance": 5234.1
}Return path tracking data for all devices at a site, transformed to floorplan coordinates. Device paths are scaled, rotated, and translated to align with the site floorplan layout.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| floorplan_width required | integer (Floorplan Width) The display width of the floorplan image in pixels. |
| floorplan_height required | integer (Floorplan Height) The display height of the floorplan image in pixels. |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
[- [
- [
- 120,
- 340
], - [
- 125,
- 345
], - [
- 130,
- 350
], - [
- 135,
- 355
]
], - [
- [
- 450,
- 260
], - [
- 455,
- 265
], - [
- 460,
- 270
]
], - [
- [
- 200,
- 410
], - [
- 205,
- 415
], - [
- 210,
- 420
], - [
- 215,
- 425
], - [
- 220,
- 430
]
]
]Get average occupancy for each seat at the site, bucketed by time intervals.
Args: site: Site slug/name organisation: Organisation code since: Start timestamp (unix timestamp in seconds) until: End timestamp (unix timestamp in seconds) bucket_interval: Bucket size in minutes (default 5)
Returns: List of buckets with average occupancy per seat
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| bucket_interval | integer (Bucket Interval) Default: 5 The bucket size in minutes. |
| min_occupied_minutes | integer (Min Occupied Minutes) Default: 0 The minimum number of minutes a seat must be occupied to be included in the results. |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
[- {
- "bucket_start": 1728914400,
- "bucket_end": 1728914700,
- "seats": {
- "desk-1": {
- "avg_occupancy": 0.85,
- "data_points": 5,
- "total_occupancy_minutes": 4.25,
- "seat_type": "desk",
- "max_occupancy": 1
}, - "desk-2": {
- "avg_occupancy": 0.42,
- "data_points": 5,
- "total_occupancy_minutes": 2.1,
- "seat_type": "desk",
- "max_occupancy": 1
}
}, - "seat_groups": {
- "booth-1": {
- "occupancy_percent": 75,
- "group_type": "booth",
- "occupied_count": 3,
- "total_count": 4,
- "avg_occupancy": 2.8
}, - "booth-2": {
- "occupancy_percent": 50,
- "group_type": "booth",
- "occupied_count": 2,
- "total_count": 4,
- "avg_occupancy": 1.5
}
}
}
]Get time series of total occupied seats at the site, bucketed by time intervals.
Returns list of {"x": timestamp, "y": count} where timestamp is in Europe/London timezone and count is the number of unique occupied seats in that bucket.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| bucket_interval | integer (Bucket Interval) Default: 5 The bucket size in minutes. |
| min_occupied_minutes | integer (Min Occupied Minutes) Default: 2 The minimum number of minutes a seat must be occupied to be included in the results. |
| count_groups_as_single | boolean (Count Groups As Single) Default: false If true, all seats in a group are counted as occupied if any seat in the group is occupied. If false, only physically occupied seats are counted. |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
[- {
- "x": "2025-10-14T13:00:00+01:00",
- "y": 12
}, - {
- "x": "2025-10-14T13:05:00+01:00",
- "y": 15
}, - {
- "x": "2025-10-14T13:10:00+01:00",
- "y": 14
}
]Get time series of total occupied seats at the site grouped by seat type, bucketed by time intervals.
Each seat type returns a separate time series showing the count of occupied seats of that type. Seats without a seat type are grouped under the "none" key.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| bucket_interval | integer (Bucket Interval) Default: 5 The bucket size in minutes. |
| min_occupied_minutes | integer (Min Occupied Minutes) Default: 2 The minimum number of minutes a seat must be occupied to be included in the results. |
| count_groups_as_single | boolean (Count Groups As Single) Default: false If true, all seats in a group are counted as occupied if any seat in the group is occupied. If false, only physically occupied seats are counted. |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
{- "desk": [
- {
- "x": "2025-10-14T13:00:00+01:00",
- "y": 8
}, - {
- "x": "2025-10-14T13:05:00+01:00",
- "y": 10
}, - {
- "x": "2025-10-14T13:10:00+01:00",
- "y": 9
}
], - "meeting_room": [
- {
- "x": "2025-10-14T13:00:00+01:00",
- "y": 4
}, - {
- "x": "2025-10-14T13:05:00+01:00",
- "y": 5
}, - {
- "x": "2025-10-14T13:10:00+01:00",
- "y": 5
}
]
}Return time series of seat occupancy as a percentage.
Uses the same hysteresis-based span calculation as average-stay-length to handle intermittent occupancy data. For each seat, computes occupied spans using min_occupied_minutes and min_unoccupied_minutes thresholds. Then for each bucket, calculates the percentage of seats that have spans overlapping that bucket.
This avoids the issue where raw 1-minute rollups showing intermittent occupancy (1/0/0/1/0/1) would incorrectly show low occupancy - hysteresis treats this as a single continuous occupied span.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| bucket_interval | integer (Bucket Interval) Default: 5 The bucket size in minutes. |
| min_occupied_minutes | integer (Min Occupied Minutes) Default: 2 Minimum consecutive minutes of occupancy required to transition to occupied state (hysteresis threshold). |
| min_unoccupied_minutes | integer (Min Unoccupied Minutes) Default: 2 Minimum consecutive minutes of non-occupancy required to transition to unoccupied state (hysteresis threshold). |
| count_groups_as_single | boolean (Count Groups As Single) Default: false If true, all seats in a group are counted as occupied if any seat in the group is occupied. If false, only physically occupied seats are counted. |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
[- {
- "x": "2025-10-14T13:00:00+01:00",
- "y": 65.5
}, - {
- "x": "2025-10-14T13:05:00+01:00",
- "y": 72.3
}, - {
- "x": "2025-10-14T13:10:00+01:00",
- "y": 58.1
}
]Calculate average stay length for seats at a site over time.
Converts 1-minute rollup data into occupied spans using hysteresis thresholds, then calculates average span length for each bucket. Returns Europe/London timezone.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| bucket_interval | integer (Bucket Interval) Default: 5 The bucket size in minutes. |
| min_occupied_minutes | integer (Min Occupied Minutes) Default: 2 Minimum consecutive minutes to consider a seat occupied. |
| min_unoccupied_minutes | integer (Min Unoccupied Minutes) Default: 2 Minimum consecutive minutes to consider a seat unoccupied. |
| min_span_length | integer (Min Span Length) Default: 0 Minimum span length in minutes to include in calculations. Spans shorter than this are discarded. Default 0 (disabled). |
| include_ongoing | boolean (Include Ongoing) Default: false If true, include spans still ongoing at query end (truncated to query end time). If false, only completed spans are included. Default false. |
| debug | boolean (Debug) Default: false If true, include raw span data for each bucket in the response for debugging. |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
[- {
- "x": "2025-10-14T13:00:00+00:00",
- "y": 45.5
}, - {
- "x": "2025-10-14T13:05:00+00:00",
- "y": 52.3
}
]Calculate average group size for occupied seats at a site over time.
For each time bucket, this endpoint calculates group statistics based on seat occupancy. A "group" is defined as:
Returns time-series data with total number of groups and min/max/avg/median group sizes per bucket.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| bucket_interval | integer (Bucket Interval) Default: 5 The bucket size in minutes. |
| min_occupied_minutes | integer (Min Occupied Minutes) Default: 2 The minimum number of minutes a seat must be occupied to be included in the results. |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
[- {
- "x": "2025-10-14T13:00:00+01:00",
- "total_groups": 8,
- "min_group_size": 1,
- "max_group_size": 4,
- "avg_group_size": 2.1,
- "median_group_size": 2
}, - {
- "x": "2025-10-14T13:05:00+01:00",
- "total_groups": 10,
- "min_group_size": 1,
- "max_group_size": 3,
- "avg_group_size": 1.9,
- "median_group_size": 2
}
]Return all key site metrics in a single API call.
Combines total footfall, footfall percentage change, and seat occupancy metrics into a single response, reducing the number of API calls required for report generation.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| min_occupied_minutes | integer (Min Occupied Minutes) Default: 1 Minimum consecutive minutes of occupancy required to transition to occupied state (hysteresis threshold). |
| min_unoccupied_minutes | integer (Min Unoccupied Minutes) Default: 6 Minimum consecutive minutes of non-occupancy required to transition to unoccupied state (hysteresis threshold). |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
{- "site": "liverpool-street",
- "total_footfall": 1234,
- "footfall_percent_change": 12.5,
- "seat_metrics": {
- "max_seats": 45,
- "avg_occupancy_percent": 45.2,
- "avg_occupancy_percent_change": 5.1
}, - "period": {
- "since": "2025-10-01T00:00:00+00:00",
- "until": "2025-10-31T23:59:59+00:00",
- "days": 31
}
}Return pre-calculated average footfall by weekday for a historical period.
Eliminates the need for the dashboard to fetch 56+ days of raw data and calculate averages client-side. Averages are calculated as: sum of all entries on that weekday divided by count of that weekday in the period.
| weeks | integer (Weeks) [ 1 .. 52 ] Default: 8 Number of historical weeks to average (max: 52). |
| before | integer (Before) Unix timestamp - calculate averages for weeks before this date. Defaults to current time. |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
{- "weekday_averages": {
- "monday": 142.5,
- "tuesday": 138.2,
- "wednesday": 156.8,
- "thursday": 149.3,
- "friday": 187.4,
- "saturday": 203.1,
- "sunday": 98.7
}, - "period": {
- "weeks_analysed": 8,
- "start_date": "2025-08-05",
- "end_date": "2025-09-29"
}, - "sample_counts": {
- "monday": 8,
- "tuesday": 8,
- "wednesday": 8,
- "thursday": 8,
- "friday": 8,
- "saturday": 8,
- "sunday": 8
}
}Return footfall data for a site. All devices in the site with capability entry/exit tracking are summed for entries.
An entry is recorded when a tracked person crosses any configured virtual gate on a device in the positive direction.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| bucket_interval | integer (Bucket Interval) Default: 5 The bucket size in minutes. |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
[- {
- "x": "2025-10-14T13:00:00+00:00",
- "y": 1
}, - {
- "x": "2025-10-14T13:05:00+00:00",
- "y": 0
}, - {
- "x": "2025-10-14T13:10:00+00:00",
- "y": 2
}
]Return calendar-week footfall data for the most recently completed week.
Always returns exactly one week of data (Monday-Sunday) for the previous complete calendar week. If average > 1, returns the bucket-by-bucket average of the previous n weeks.
| bucket_interval | integer (Bucket Interval) Default: 60 The bucket size in minutes. |
| average | integer (Average) Default: 1 Number of previous weeks to average. Defaults to 1 (no averaging). |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
[- {
- "x": "2025-10-06T00:00:00+00:00",
- "y": 142
}, - {
- "x": "2025-10-06T01:00:00+00:00",
- "y": 98
}, - {
- "x": "2025-10-06T02:00:00+00:00",
- "y": 45
}
]Return footfall data for a site. All devices in the site with capability entry/exit tracking are summed for entries, and the total count over the requested time range is returned.
An entry is recorded when a tracked person crosses any configured virtual gate on a device in the positive direction.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| bucket_interval | integer (Bucket Interval) Default: 5 The bucket size in minutes. |
| precise_counts | boolean (Precise Counts) Default: false If false, return a pair of numbers indicating the minimum and maximum possible values based on the expected sensor error rate. This response is intended for dashboard display. If true, return the exact number of entries recorded. |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
[- 25,
- 30
]Return footfall data for a site. All devices in the site with capability entry/exit tracking are summed for entries over the requested period, and the percentage change (% increase or % decrease) on the previous period is returned.
An entry is recorded when a tracked person crosses any configured virtual gate on a device in the positive direction.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| bucket_interval | integer (Bucket Interval) Default: 5 The bucket size in minutes. |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
92.3076923076923Return footfall data for an organisation. All devices in the organisation with capability entry/exit tracking are summed for entries.
An entry is recorded when a tracked person crosses any configured virtual gate on a device in the positive direction.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| bucket_interval | integer (Bucket Interval) Default: 5 The bucket size in minutes. |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
[- {
- "x": "2025-10-14T13:00:00+00:00",
- "y": 1
}, - {
- "x": "2025-10-14T13:05:00+00:00",
- "y": 0
}, - {
- "x": "2025-10-14T13:10:00+00:00",
- "y": 2
}
]Return footfall data for an organisation. All devices in the organisation with capability entry/exit tracking are summed for entries, and the total count across all sites at the organisation over the requested time range is returned.
An entry is recorded when a tracked person crosses any configured virtual gate on a device in the positive direction.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| bucket_interval | integer (Bucket Interval) Default: 5 The bucket size in minutes. |
| precise_counts | boolean (Precise Counts) Default: false If false, return a pair of numbers indicating the minimum and maximum possible values based on the expected sensor error rate. This response is intended for dashboard display. If true, return the exact number of entries recorded. |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
[- 25,
- 30
]Return footfall data across all sites at an organisation. All devices in the organisation with capability entry/exit tracking are summed for entries over the requested period, and the percentage change (% increase or % decrease) on the previous period is returned.
An entry is recorded when a tracked person crosses any configured virtual gate on a device in the positive direction.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| bucket_interval | integer (Bucket Interval) Default: 5 The bucket size in minutes. |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
92.3076923076923Return pre-calculated average footfall by weekday for a historical period.
Eliminates the need for the dashboard to fetch 56+ days of raw data and calculate averages client-side. Averages are calculated as: sum of all entries on that weekday divided by count of that weekday in the period.
| weeks | integer (Weeks) [ 1 .. 52 ] Default: 8 Number of historical weeks to average (max: 52). |
| before | integer (Before) Unix timestamp - calculate averages for weeks before this date. Defaults to current time. |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
{- "weekday_averages": {
- "monday": 142.5,
- "tuesday": 138.2,
- "wednesday": 156.8,
- "thursday": 149.3,
- "friday": 187.4,
- "saturday": 203.1,
- "sunday": 98.7
}, - "period": {
- "weeks_analysed": 8,
- "start_date": "2025-08-05",
- "end_date": "2025-09-29"
}, - "sample_counts": {
- "monday": 8,
- "tuesday": 8,
- "wednesday": 8,
- "thursday": 8,
- "friday": 8,
- "saturday": 8,
- "sunday": 8
}
}Return footfall data for an organisation. All devices in the organisation with capability entry/exit tracking are summed for entries.
An entry is recorded when a tracked person crosses any configured virtual gate on a device in the positive direction.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| bucket_interval | integer (Bucket Interval) Default: 5 The bucket size in minutes. |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
[- {
- "x": "2025-10-14T13:00:00+00:00",
- "y": 1
}, - {
- "x": "2025-10-14T13:05:00+00:00",
- "y": 0
}, - {
- "x": "2025-10-14T13:10:00+00:00",
- "y": 2
}
]Return footfall data for an organisation. All devices in the organisation with capability entry/exit tracking are summed for entries, and the total count across all sites at the organisation over the requested time range is returned.
An entry is recorded when a tracked person crosses any configured virtual gate on a device in the positive direction.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| bucket_interval | integer (Bucket Interval) Default: 5 The bucket size in minutes. |
| precise_counts | boolean (Precise Counts) Default: false If false, return a pair of numbers indicating the minimum and maximum possible values based on the expected sensor error rate. This response is intended for dashboard display. If true, return the exact number of entries recorded. |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
[- 25,
- 30
]Return footfall data across all sites at an organisation. All devices in the organisation with capability entry/exit tracking are summed for entries over the requested period, and the percentage change (% increase or % decrease) on the previous period is returned.
An entry is recorded when a tracked person crosses any configured virtual gate on a device in the positive direction.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| bucket_interval | integer (Bucket Interval) Default: 5 The bucket size in minutes. |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
92.3076923076923Return occupancy data for all sites in an organisation. All devices with customer flow capability across all sites are aggregated for occupancy.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| bucket_interval | integer (Bucket Interval) Default: 5 The bucket size in minutes. |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
[- {
- "x": "2025-10-14T13:00:00+00:00",
- "y": 42
}, - {
- "x": "2025-10-14T13:05:00+00:00",
- "y": 38
}, - {
- "x": "2025-10-14T13:10:00+00:00",
- "y": 45
}
]Return wait time data for all sites in an organisation. Aggregates wait time across all devices with customer flow capability.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| bucket_interval | integer (Bucket Interval) Default: 5 The bucket size in minutes. |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
[- {
- "x": "2025-10-14T13:00:00+00:00",
- "y": 4.5
}, - {
- "x": "2025-10-14T13:05:00+00:00",
- "y": 3.8
}, - {
- "x": "2025-10-14T13:10:00+00:00"
}
]Return metrics for the entire organisation AND all individual sites in a single API call.
This is the primary endpoint for report generation, eliminating the need to call the site endpoint repeatedly. Organisation-level seat metrics are weighted averages across all sites with seats.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| min_occupied_minutes | integer (Min Occupied Minutes) Default: 1 Minimum consecutive minutes of occupancy required to transition to occupied state (hysteresis threshold). |
| min_unoccupied_minutes | integer (Min Unoccupied Minutes) Default: 6 Minimum consecutive minutes of non-occupancy required to transition to unoccupied state (hysteresis threshold). |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
{- "organisation": {
- "code": "demo1",
- "total_footfall": 12450,
- "footfall_percent_change": 8.3,
- "seat_metrics": {
- "max_seats": 107,
- "avg_occupancy_percent": 42.1,
- "avg_occupancy_percent_change": 3.7
}
}, - "sites": [
- {
- "site": "liverpool-street",
- "total_footfall": 4520,
- "footfall_percent_change": 12.5,
- "seat_metrics": {
- "max_seats": 45,
- "avg_occupancy_percent": 48.2,
- "avg_occupancy_percent_change": 5.1
}
}, - {
- "site": "warehouse-entrance",
- "total_footfall": 4040,
- "footfall_percent_change": 4.2
}
], - "period": {
- "since": "2025-10-01T00:00:00+00:00",
- "until": "2025-10-31T23:59:59+00:00",
- "days": 31
}
}Return occupancy counts over time for a site. For each bucket interval, the average number of people seen over the bucket is individually calculated for each device with capability customer flow but without capability entry/exit tracking.
The per-device averages are then summed to produce a site-wide occupancy value for each bucket.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| bucket_interval | integer (Bucket Interval) Default: 5 The bucket size in minutes. |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
[- {
- "x": "2025-10-14T13:00:00+00:00",
- "y": 2.3096492710382
}, - {
- "x": "2025-10-14T13:05:00+00:00",
- "y": 2.4529247583921
}, - {
- "x": "2025-10-14T13:10:00+00:00",
- "y": 3.1927592902186
}
]Return occupancy counts over time for a site. For each bucket interval, the average number of people seen over the bucket is individually calculated for each device with capability customer flow but without capability entry/exit tracking.
The per-device averages are then summed to produce a site-wide occupancy value for each bucket.
Finally, the series is scaled so the minimum series value is equal to the 10th percentile of the trailing 5 periods, and the maximum value is equal to the 95th percentile, and the output value is normalised to a floating-point number between 0 and 100.
This endpoint is intended for use as a high-level "is it more or less busy than usual" metric; busy and quiet periods will be indicated on the chart.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| bucket_interval | integer (Bucket Interval) Default: 5 The bucket size in minutes. |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
[- {
- "x": "2025-10-14T13:00:00+00:00",
- "y": 78.3096492710382
}, - {
- "x": "2025-10-14T13:05:00+00:00",
- "y": 75.4529247583921
}, - {
- "x": "2025-10-14T13:10:00+00:00",
- "y": 72.1927592902186
}
]Return occupancy data grouped by zone. Each zone returns a time-series of average occupancy values across all devices configured for that zone.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| bucket_interval | integer (Bucket Interval) Default: 5 The bucket size in minutes. |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
{- "birds_and_reptile": {
- "colour": "#ff0000",
- "data": [
- {
- "x": "2025-10-14T13:00:00+00:00",
- "y": 3
}, - {
- "x": "2025-10-14T13:05:00+00:00",
- "y": 5
}
]
}, - "aquarium": {
- "colour": "#0000ff",
- "data": [
- {
- "x": "2025-10-14T13:00:00+00:00",
- "y": 2
}, - {
- "x": "2025-10-14T13:05:00+00:00",
- "y": 4
}
]
}
}Return occupancy data for all sites in an organisation. All devices with customer flow capability across all sites are aggregated for occupancy.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| bucket_interval | integer (Bucket Interval) Default: 5 The bucket size in minutes. |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
[- {
- "x": "2025-10-14T13:00:00+00:00",
- "y": 42
}, - {
- "x": "2025-10-14T13:05:00+00:00",
- "y": 38
}, - {
- "x": "2025-10-14T13:10:00+00:00",
- "y": 45
}
]Return occupancy data grouped by zone. Each zone returns a time-series of average occupancy values across all devices configured for that zone.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| bucket_interval | integer (Bucket Interval) Default: 5 The bucket size in minutes. |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
{- "birds_and_reptile": {
- "colour": "#ff0000",
- "data": [
- {
- "x": "2025-10-14T13:00:00+00:00",
- "y": 3
}, - {
- "x": "2025-10-14T13:05:00+00:00",
- "y": 5
}
]
}, - "aquarium": {
- "colour": "#0000ff",
- "data": [
- {
- "x": "2025-10-14T13:00:00+00:00",
- "y": 2
}, - {
- "x": "2025-10-14T13:05:00+00:00",
- "y": 4
}
]
}
}Return path statistics grouped by zone. Analyzes all tracked paths at the site and calculates how many unique paths entered each zone and the total number of path points within each zone.
This is a long-running endpoint that uses keepalive streaming for large datasets.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| floorplan_width required | integer (Floorplan Width) The display width of the floorplan image in pixels. |
| floorplan_height required | integer (Floorplan Height) The display height of the floorplan image in pixels. |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
{- "birds_and_reptile": {
- "colour": "#ff0000",
- "total_unique_paths": 142,
- "total_path_points": 3847
}, - "aquarium": {
- "colour": "#0000ff",
- "total_unique_paths": 98,
- "total_path_points": 2156
}
}Return total dwell intensity for each zone. Generates a site-wide heatmap on a 100x100 grid, then sums the values within each zone's boundary to calculate zone-specific dwell metrics.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| floorplan_width required | integer (Floorplan Width) The display width of the floorplan image in pixels. |
| floorplan_height required | integer (Floorplan Height) The display height of the floorplan image in pixels. |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
{- "birds_and_reptile": 3847.2,
- "aquarium": 2156.8,
- "entrance": 5234.1
}Return path statistics grouped by zone. Analyzes all tracked paths at the site and calculates how many unique paths entered each zone and the total number of path points within each zone.
This is a long-running endpoint that uses keepalive streaming for large datasets.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| floorplan_width required | integer (Floorplan Width) The display width of the floorplan image in pixels. |
| floorplan_height required | integer (Floorplan Height) The display height of the floorplan image in pixels. |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
{- "birds_and_reptile": {
- "colour": "#ff0000",
- "total_unique_paths": 142,
- "total_path_points": 3847
}, - "aquarium": {
- "colour": "#0000ff",
- "total_unique_paths": 98,
- "total_path_points": 2156
}
}Return raw path tracking data for a specific device. Each path represents the trajectory of a tracked person through the sensor's field of view.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| device required | string (Device) Examples: device=a2bcd The 5-character device code, printed on the back of the device. |
[- [
- [
- 10,
- 20
], - [
- 15,
- 25
], - [
- 20,
- 30
], - [
- 25,
- 35
]
], - [
- [
- 50,
- 60
], - [
- 55,
- 65
], - [
- 60,
- 70
]
], - [
- [
- 100,
- 110
], - [
- 105,
- 115
], - [
- 110,
- 120
], - [
- 115,
- 125
], - [
- 120,
- 130
]
]
]Return path tracking data for all devices at a site, transformed to floorplan coordinates. Device paths are scaled, rotated, and translated to align with the site floorplan layout.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| floorplan_width required | integer (Floorplan Width) The display width of the floorplan image in pixels. |
| floorplan_height required | integer (Floorplan Height) The display height of the floorplan image in pixels. |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
[- [
- [
- 120,
- 340
], - [
- 125,
- 345
], - [
- 130,
- 350
], - [
- 135,
- 355
]
], - [
- [
- 450,
- 260
], - [
- 455,
- 265
], - [
- 460,
- 270
]
], - [
- [
- 200,
- 410
], - [
- 205,
- 415
], - [
- 210,
- 420
], - [
- 215,
- 425
], - [
- 220,
- 430
]
]
]Return queue length data for a site. The occupancy of each device with the QUEUE capability at the site is averaged over each bucket, then summed across all devices.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| bucket_interval | integer (Bucket Interval) Default: 5 The bucket size in minutes. |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
[- {
- "x": "2025-10-14T13:00:00+00:00",
- "y": 5
}, - {
- "x": "2025-10-14T13:05:00+00:00",
- "y": 8
}, - {
- "x": "2025-10-14T13:10:00+00:00",
- "y": 3
}
]Return average time spent in the site queue. Calculated by combining queue length data with exit counts to derive average queue time in minutes.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| bucket_interval | integer (Bucket Interval) Default: 5 The bucket size in minutes. |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
[- {
- "x": "2025-10-14T13:00:00+00:00",
- "y": 2.5
}, - {
- "x": "2025-10-14T13:05:00+00:00",
- "y": 3.2
}, - {
- "x": "2025-10-14T13:10:00+00:00",
- "y": 1.8
}
]Return wait time data for a site. Devices with customer flow capability but without entry/exit tracking are used to calculate average wait time based on occupancy divided by entries.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| bucket_interval | integer (Bucket Interval) Default: 5 The bucket size in minutes. |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
[- {
- "x": "2025-10-14T13:00:00+00:00",
- "y": 4.5
}, - {
- "x": "2025-10-14T13:05:00+00:00",
- "y": 3.2
}, - {
- "x": "2025-10-14T13:10:00+00:00"
}
]Return wait time data for all sites in an organisation. Aggregates wait time across all devices with customer flow capability.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| bucket_interval | integer (Bucket Interval) Default: 5 The bucket size in minutes. |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
[- {
- "x": "2025-10-14T13:00:00+00:00",
- "y": 4.5
}, - {
- "x": "2025-10-14T13:05:00+00:00",
- "y": 3.8
}, - {
- "x": "2025-10-14T13:10:00+00:00"
}
]Return averaged heatmap for a specific device. Heatmap grid squares are averaged over the specified time interval. Values are scaled relative to all devices at the site for consistent comparison, with sensor data automatically decompressed from logarithmic scale.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| device required | string (Device) Examples: device=a2bcd The 5-character device code, printed on the back of the device. |
[- 0,
- 2.3,
- 5.1,
- 3.4,
- 1.2,
- 0.8,
- 1.5,
- 8.2,
- 12.4,
- 9.3,
- 4.1,
- 2,
- 0.3,
- 3.7,
- 7.8,
- 6.5,
- 2.9,
- 1.1,
- 0.1,
- 1.4,
- 4.2,
- 3.8,
- 1.7,
- 0.6,
- 0,
- 0.9,
- 2.1,
- 1.9,
- 0.8,
- 0.3,
- 0,
- 0.2,
- 0.5,
- 0.4,
- 0.2,
- 0.1
]Return raw path tracking data for a specific device. Each path represents the trajectory of a tracked person through the sensor's field of view.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| device required | string (Device) Examples: device=a2bcd The 5-character device code, printed on the back of the device. |
[- [
- [
- 10,
- 20
], - [
- 15,
- 25
], - [
- 20,
- 30
], - [
- 25,
- 35
]
], - [
- [
- 50,
- 60
], - [
- 55,
- 65
], - [
- 60,
- 70
]
], - [
- [
- 100,
- 110
], - [
- 105,
- 115
], - [
- 110,
- 120
], - [
- 115,
- 125
], - [
- 120,
- 130
]
]
]Return averaged heatmap for a specific device. Heatmap grid squares are averaged over the specified time interval. Values are scaled relative to all devices at the site for consistent comparison, with sensor data automatically decompressed from logarithmic scale.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| device required | string (Device) Examples: device=a2bcd The 5-character device code, printed on the back of the device. |
[- 0,
- 2.3,
- 5.1,
- 3.4,
- 1.2,
- 0.8,
- 1.5,
- 8.2,
- 12.4,
- 9.3,
- 4.1,
- 2,
- 0.3,
- 3.7,
- 7.8,
- 6.5,
- 2.9,
- 1.1,
- 0.1,
- 1.4,
- 4.2,
- 3.8,
- 1.7,
- 0.6,
- 0,
- 0.9,
- 2.1,
- 1.9,
- 0.8,
- 0.3,
- 0,
- 0.2,
- 0.5,
- 0.4,
- 0.2,
- 0.1
]Return site-wide heatmap aggregated across all devices. Device heatmaps are transformed to floorplan coordinates, weighted by distance, and aggregated onto a common grid. The result is scaled to 0-100 range for visualization.
Optionally apply logarithmic scaling for better visualization of low-intensity areas.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| floorplan_width required | integer (Floorplan Width) The display width of the floorplan image in pixels. |
| floorplan_height required | integer (Floorplan Height) The display height of the floorplan image in pixels. |
| grid_x required | integer (Grid X) The number of grid squares on the x axis. |
| grid_y required | integer (Grid Y) The number of grid squares on the y axis. |
| scaling | number (Scaling) Default: 1 Scaling multiplier: all values will be scaled by this amount, for consistent comparison between time ranges. |
| offset | number (Offset) Default: 0 Scaling offset: all values will be offset by this amount, for consistent comparison between time ranges. |
| log | boolean (Log) Default: false Use a logarithmic scale. |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
{- "scaling": 2.5,
- "offset": -1.2,
- "data": [
- 0,
- 5.2,
- 12.4,
- 8.3,
- 3.1,
- 1.5,
- 2.3,
- 15.7,
- 28.4,
- 22.1,
- 9.6,
- 4.2,
- 1.1,
- 8.9,
- 19.3,
- 16.8,
- 7.2,
- 3
]
}Return total dwell intensity for each zone. Generates a site-wide heatmap on a 100x100 grid, then sums the values within each zone's boundary to calculate zone-specific dwell metrics.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| floorplan_width required | integer (Floorplan Width) The display width of the floorplan image in pixels. |
| floorplan_height required | integer (Floorplan Height) The display height of the floorplan image in pixels. |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
{- "birds_and_reptile": 3847.2,
- "aquarium": 2156.8,
- "entrance": 5234.1
}Get average occupancy for each seat at the site, bucketed by time intervals.
Args: site: Site slug/name organisation: Organisation code since: Start timestamp (unix timestamp in seconds) until: End timestamp (unix timestamp in seconds) bucket_interval: Bucket size in minutes (default 5)
Returns: List of buckets with average occupancy per seat
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| bucket_interval | integer (Bucket Interval) Default: 5 The bucket size in minutes. |
| min_occupied_minutes | integer (Min Occupied Minutes) Default: 0 The minimum number of minutes a seat must be occupied to be included in the results. |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
[- {
- "bucket_start": 1728914400,
- "bucket_end": 1728914700,
- "seats": {
- "desk-1": {
- "avg_occupancy": 0.85,
- "data_points": 5,
- "total_occupancy_minutes": 4.25,
- "seat_type": "desk",
- "max_occupancy": 1
}, - "desk-2": {
- "avg_occupancy": 0.42,
- "data_points": 5,
- "total_occupancy_minutes": 2.1,
- "seat_type": "desk",
- "max_occupancy": 1
}
}, - "seat_groups": {
- "booth-1": {
- "occupancy_percent": 75,
- "group_type": "booth",
- "occupied_count": 3,
- "total_count": 4,
- "avg_occupancy": 2.8
}, - "booth-2": {
- "occupancy_percent": 50,
- "group_type": "booth",
- "occupied_count": 2,
- "total_count": 4,
- "avg_occupancy": 1.5
}
}
}
]Get time series of total occupied seats at the site, bucketed by time intervals.
Returns list of {"x": timestamp, "y": count} where timestamp is in Europe/London timezone and count is the number of unique occupied seats in that bucket.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| bucket_interval | integer (Bucket Interval) Default: 5 The bucket size in minutes. |
| min_occupied_minutes | integer (Min Occupied Minutes) Default: 2 The minimum number of minutes a seat must be occupied to be included in the results. |
| count_groups_as_single | boolean (Count Groups As Single) Default: false If true, all seats in a group are counted as occupied if any seat in the group is occupied. If false, only physically occupied seats are counted. |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
[- {
- "x": "2025-10-14T13:00:00+01:00",
- "y": 12
}, - {
- "x": "2025-10-14T13:05:00+01:00",
- "y": 15
}, - {
- "x": "2025-10-14T13:10:00+01:00",
- "y": 14
}
]Get time series of total occupied seats at the site grouped by seat type, bucketed by time intervals.
Each seat type returns a separate time series showing the count of occupied seats of that type. Seats without a seat type are grouped under the "none" key.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| bucket_interval | integer (Bucket Interval) Default: 5 The bucket size in minutes. |
| min_occupied_minutes | integer (Min Occupied Minutes) Default: 2 The minimum number of minutes a seat must be occupied to be included in the results. |
| count_groups_as_single | boolean (Count Groups As Single) Default: false If true, all seats in a group are counted as occupied if any seat in the group is occupied. If false, only physically occupied seats are counted. |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
{- "desk": [
- {
- "x": "2025-10-14T13:00:00+01:00",
- "y": 8
}, - {
- "x": "2025-10-14T13:05:00+01:00",
- "y": 10
}, - {
- "x": "2025-10-14T13:10:00+01:00",
- "y": 9
}
], - "meeting_room": [
- {
- "x": "2025-10-14T13:00:00+01:00",
- "y": 4
}, - {
- "x": "2025-10-14T13:05:00+01:00",
- "y": 5
}, - {
- "x": "2025-10-14T13:10:00+01:00",
- "y": 5
}
]
}Return time series of seat occupancy as a percentage.
Uses the same hysteresis-based span calculation as average-stay-length to handle intermittent occupancy data. For each seat, computes occupied spans using min_occupied_minutes and min_unoccupied_minutes thresholds. Then for each bucket, calculates the percentage of seats that have spans overlapping that bucket.
This avoids the issue where raw 1-minute rollups showing intermittent occupancy (1/0/0/1/0/1) would incorrectly show low occupancy - hysteresis treats this as a single continuous occupied span.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| bucket_interval | integer (Bucket Interval) Default: 5 The bucket size in minutes. |
| min_occupied_minutes | integer (Min Occupied Minutes) Default: 2 Minimum consecutive minutes of occupancy required to transition to occupied state (hysteresis threshold). |
| min_unoccupied_minutes | integer (Min Unoccupied Minutes) Default: 2 Minimum consecutive minutes of non-occupancy required to transition to unoccupied state (hysteresis threshold). |
| count_groups_as_single | boolean (Count Groups As Single) Default: false If true, all seats in a group are counted as occupied if any seat in the group is occupied. If false, only physically occupied seats are counted. |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
[- {
- "x": "2025-10-14T13:00:00+01:00",
- "y": 65.5
}, - {
- "x": "2025-10-14T13:05:00+01:00",
- "y": 72.3
}, - {
- "x": "2025-10-14T13:10:00+01:00",
- "y": 58.1
}
]Calculate average stay length for seats at a site over time.
Converts 1-minute rollup data into occupied spans using hysteresis thresholds, then calculates average span length for each bucket. Returns Europe/London timezone.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| bucket_interval | integer (Bucket Interval) Default: 5 The bucket size in minutes. |
| min_occupied_minutes | integer (Min Occupied Minutes) Default: 2 Minimum consecutive minutes to consider a seat occupied. |
| min_unoccupied_minutes | integer (Min Unoccupied Minutes) Default: 2 Minimum consecutive minutes to consider a seat unoccupied. |
| min_span_length | integer (Min Span Length) Default: 0 Minimum span length in minutes to include in calculations. Spans shorter than this are discarded. Default 0 (disabled). |
| include_ongoing | boolean (Include Ongoing) Default: false If true, include spans still ongoing at query end (truncated to query end time). If false, only completed spans are included. Default false. |
| debug | boolean (Debug) Default: false If true, include raw span data for each bucket in the response for debugging. |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
[- {
- "x": "2025-10-14T13:00:00+00:00",
- "y": 45.5
}, - {
- "x": "2025-10-14T13:05:00+00:00",
- "y": 52.3
}
]Calculate average group size for occupied seats at a site over time.
For each time bucket, this endpoint calculates group statistics based on seat occupancy. A "group" is defined as:
Returns time-series data with total number of groups and min/max/avg/median group sizes per bucket.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| bucket_interval | integer (Bucket Interval) Default: 5 The bucket size in minutes. |
| min_occupied_minutes | integer (Min Occupied Minutes) Default: 2 The minimum number of minutes a seat must be occupied to be included in the results. |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
[- {
- "x": "2025-10-14T13:00:00+01:00",
- "total_groups": 8,
- "min_group_size": 1,
- "max_group_size": 4,
- "avg_group_size": 2.1,
- "median_group_size": 2
}, - {
- "x": "2025-10-14T13:05:00+01:00",
- "total_groups": 10,
- "min_group_size": 1,
- "max_group_size": 3,
- "avg_group_size": 1.9,
- "median_group_size": 2
}
]Return all key site metrics in a single API call.
Combines total footfall, footfall percentage change, and seat occupancy metrics into a single response, reducing the number of API calls required for report generation.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| min_occupied_minutes | integer (Min Occupied Minutes) Default: 1 Minimum consecutive minutes of occupancy required to transition to occupied state (hysteresis threshold). |
| min_unoccupied_minutes | integer (Min Unoccupied Minutes) Default: 6 Minimum consecutive minutes of non-occupancy required to transition to unoccupied state (hysteresis threshold). |
| site required | string (Site) Examples: site=liverpool site=main-office The site identifier (from the Site Settings page). |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
{- "site": "liverpool-street",
- "total_footfall": 1234,
- "footfall_percent_change": 12.5,
- "seat_metrics": {
- "max_seats": 45,
- "avg_occupancy_percent": 45.2,
- "avg_occupancy_percent_change": 5.1
}, - "period": {
- "since": "2025-10-01T00:00:00+00:00",
- "until": "2025-10-31T23:59:59+00:00",
- "days": 31
}
}Return metrics for the entire organisation AND all individual sites in a single API call.
This is the primary endpoint for report generation, eliminating the need to call the site endpoint repeatedly. Organisation-level seat metrics are weighted averages across all sites with seats.
| since required | integer (Since) A unix timestamp indicating the query start, in UTC seconds. |
| until required | integer (Until) A unix timestamp indicating the query end, in UTC seconds. |
| min_occupied_minutes | integer (Min Occupied Minutes) Default: 1 Minimum consecutive minutes of occupancy required to transition to occupied state (hysteresis threshold). |
| min_unoccupied_minutes | integer (Min Unoccupied Minutes) Default: 6 Minimum consecutive minutes of non-occupancy required to transition to unoccupied state (hysteresis threshold). |
| organisation required | string (Organisation) Examples: organisation=a2bcd The 5-character organisation code. |
{- "organisation": {
- "code": "demo1",
- "total_footfall": 12450,
- "footfall_percent_change": 8.3,
- "seat_metrics": {
- "max_seats": 107,
- "avg_occupancy_percent": 42.1,
- "avg_occupancy_percent_change": 3.7
}
}, - "sites": [
- {
- "site": "liverpool-street",
- "total_footfall": 4520,
- "footfall_percent_change": 12.5,
- "seat_metrics": {
- "max_seats": 45,
- "avg_occupancy_percent": 48.2,
- "avg_occupancy_percent_change": 5.1
}
}, - {
- "site": "warehouse-entrance",
- "total_footfall": 4040,
- "footfall_percent_change": 4.2
}
], - "period": {
- "since": "2025-10-01T00:00:00+00:00",
- "until": "2025-10-31T23:59:59+00:00",
- "days": 31
}
}