Event payloads
Every delivery wraps its events in a batch envelope. The shapes below are the objects inside the envelope's Data array. Field names are PascalCase, timestamps are UTC ISO 8601, and null fields are omitted.
To turn the identifiers in these payloads into names, hierarchy, and floor plans, see Resolve event data with GraphQL.
Occupancy
Delivered by an OccupancyChanges webhook. Envelope Type is Occupancy.
{
"Id": "3f1b8f0e-2c44-4a1d-9f52-6b3f0a2d1c77",
"Type": "Occupancy",
"CustomerId": "2b7f9e10-4c3a-4b8e-9a11-7d2e5f6c8b90",
"Created": "2026-06-02T04:17:40Z",
"Sent": "2026-06-02T04:17:41Z",
"Data": [
{
"FloorSpaceId": "ac52e43d-7c21-4464-ab21-d0ace07a94b1",
"OccupancyStatus": "CurrentlyOccupied",
"Headcount": 2,
"CollectedDate": "2026-06-02T04:17:39.1066221Z",
"OccupancyStatusChangeDate": "2026-06-02T04:17:39.1066221Z",
"PreviousOccupancyStatus": "RecentlyOccupied"
}
]
}
| Field | Type | Notes |
|---|---|---|
FloorSpaceId | string (GUID) | The desk, room, or zone. Resolve with floorSpace(id:). |
OccupancyStatus | string | CurrentlyOccupied, RecentlyOccupied, NotOccupied, or Unknown. |
Headcount | integer | People currently detected in the space. |
CollectedDate | string | When the underlying sightings were collected. |
OccupancyStatusChangeDate | string | When OccupancyStatus last changed. Equals CollectedDate on a status change. |
PreviousOccupancyStatus | string | Optional. Absent when there is no prior status. |
OccupancyStatus follows the same 30/60-second state model as the GraphQL field, and FloorSpaceId is a space rather than a sensor. See How occupancy is determined and How sensors map to spaces.
An event is emitted when either the status or the headcount changes. Over 90% of events are headcount-only changes, where OccupancyStatus equals PreviousOccupancyStatus; set ExcludeHeadcountChanges to suppress them.
Floor sightings
Delivered by a FloorSightings webhook. Envelope Type is FloorSightings.
{
"Id": "8a7d5e2c-9f11-4b3a-88c0-2e4f6a1b7d93",
"Type": "FloorSightings",
"CustomerId": "2b7f9e10-4c3a-4b8e-9a11-7d2e5f6c8b90",
"Created": "2026-06-02T07:36:12Z",
"Sent": "2026-06-02T07:36:13Z",
"Data": [
{
"FloorId": "a2961d46-971f-4ce1-a66e-7ee7bdb2a204",
"CollectedDate": "2026-06-02T07:36:11.964156Z",
"Sightings": [
{ "X": 1842, "Y": 971 },
{ "X": 2510, "Y": 1164 },
{ "X": 2732, "Y": 1189 }
],
"Headcount": 3
}
]
}
| Field | Type | Notes |
|---|---|---|
FloorId | string (GUID) | Resolve with floor(id:) for the floor plan and scale. |
CollectedDate | string | Start of the time block the sightings belong to. |
Sightings | array | Anonymous positions, in centimetres from the top-left of the floor plan. |
Headcount | integer | Convenience count, always equal to Sightings.length. |
Each event is a full snapshot of the floor for that time block, not a delta. An empty Sightings array means nobody was detected.
Sightings are floor-level and already merged across sensors, so a position is not attributable to a sensor. To place them on a floor plan, see the coordinate system.
Space sensor readings
Delivered by a SpaceSensorReadings webhook. Envelope Type is SpaceSensorReading.
{
"Id": "c4e2b1a0-7d68-4f5c-9a3b-1e2d3c4b5a69",
"Type": "SpaceSensorReading",
"CustomerId": "2b7f9e10-4c3a-4b8e-9a11-7d2e5f6c8b90",
"Created": "2026-06-02T07:36:12Z",
"Sent": "2026-06-02T07:36:13Z",
"Data": [
{
"Value": "22.4",
"CollectedAt": "2026-06-02T07:36:11.964156Z",
"SpaceSensorId": "8bb1ba0b-6ea8-4635-86ef-3d57a7de4df3",
"CapabilityName": "Temperature"
},
{
"Value": "48.2",
"CollectedAt": "2026-06-02T07:36:11.964156Z",
"SpaceSensorId": "8bb1ba0b-6ea8-4635-86ef-3d57a7de4df3",
"CapabilityName": "Humidity"
}
]
}
| Field | Type | Notes |
|---|---|---|
Value | string | Always a string, including for numeric readings. Parse according to the capability. |
CollectedAt | string | When the sensor took the reading. Note this field is CollectedAt, not CollectedDate. |
SpaceSensorId | string (GUID) | Resolve with spaceSensor(id:). |
CapabilityName | string | The measured property, for example Temperature or Humidity. Discover the set via spaceSensor(id:). |
One event is emitted per capability, so a single sensor reporting several capabilities produces several events in the same batch.