Skip to main content

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"
}
]
}
FieldTypeNotes
FloorSpaceIdstring (GUID)The desk, room, or zone. Resolve with floorSpace(id:).
OccupancyStatusstringCurrentlyOccupied, RecentlyOccupied, NotOccupied, or Unknown.
HeadcountintegerPeople currently detected in the space.
CollectedDatestringWhen the underlying sightings were collected.
OccupancyStatusChangeDatestringWhen OccupancyStatus last changed. Equals CollectedDate on a status change.
PreviousOccupancyStatusstringOptional. 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
}
]
}
FieldTypeNotes
FloorIdstring (GUID)Resolve with floor(id:) for the floor plan and scale.
CollectedDatestringStart of the time block the sightings belong to.
SightingsarrayAnonymous positions, in centimetres from the top-left of the floor plan.
HeadcountintegerConvenience 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"
}
]
}
FieldTypeNotes
ValuestringAlways a string, including for numeric readings. Parse according to the capability.
CollectedAtstringWhen the sensor took the reading. Note this field is CollectedAt, not CollectedDate.
SpaceSensorIdstring (GUID)Resolve with spaceSensor(id:).
CapabilityNamestringThe 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.