Event Catalog
Every webhook delivery contains a single event object. This page documents the event envelope structure and the payload for each event type.
Event Envelope
All events share the same top-level structure:
{
"id": "evt_abc123",
"type": "asset.created",
"organizationId": "o-xxxx",
"created": 1771911526,
"data": {
"object": { },
"previousAttributes": { }
},
"livemode": true
}
| Field | Type | Description |
|---|---|---|
id | string | Unique event identifier. Use this for idempotency. Format: evt_ prefix + random string. |
type | string | The event type (e.g., asset.created). Determines the shape of data.object. |
organizationId | string | The organization where the event occurred. |
created | integer | Unix timestamp (seconds) when the event was generated. |
data.object | object | The full resource at the time of the event. |
data.previousAttributes | object | For .updated and .status.changed events only. Contains the fields that changed, with their previous values. |
isTest | boolean | Present and true only on test events (webhook.test). Absent on real events. |
livemode | boolean | true for real events, false for test events. |
The previousAttributes field makes it easy to detect exactly what changed without diffing the entire object. For .created events, this field is absent.
Asset Events
asset.created
Fired when a new asset is added to the organization.
{
"id": "evt_ast_001",
"type": "asset.created",
"organizationId": "o-xxxx",
"created": 1771911526,
"data": {
"object": {
"id": "ast-a1b2c3d4",
"name": "HVAC Unit #12",
"assetTypeId": "at-cooling",
"locationId": "loc-building-a",
"status": "Online",
"metadata": {
"manufacturer": "Daikin",
"model": "VRV-IV",
"serialNumber": "DK-2024-00412"
},
"created": 1771911526,
"updated": 1771911526
}
},
"livemode": true
}
asset.updated
Fired when any asset property is modified.
{
"id": "evt_ast_002",
"type": "asset.updated",
"organizationId": "o-xxxx",
"created": 1771912000,
"data": {
"object": {
"id": "ast-a1b2c3d4",
"name": "HVAC Unit #12 (Lobby)",
"assetTypeId": "at-cooling",
"locationId": "loc-building-a",
"status": "Online",
"metadata": {
"manufacturer": "Daikin",
"model": "VRV-IV",
"serialNumber": "DK-2024-00412"
},
"created": 1771911526,
"updated": 1771912000
},
"previousAttributes": {
"name": "HVAC Unit #12"
}
},
"livemode": true
}
asset.deleted
Fired when an asset is removed.
{
"id": "evt_ast_003",
"type": "asset.deleted",
"organizationId": "o-xxxx",
"created": 1771913000,
"data": {
"object": {
"id": "ast-a1b2c3d4",
"deleted": true
}
},
"livemode": true
}
asset.status.changed
Fired when an asset's operational status changes (e.g., Online to Offline, or to Maintenance).
{
"id": "evt_ast_004",
"type": "asset.status.changed",
"organizationId": "o-xxxx",
"created": 1771914000,
"data": {
"object": {
"id": "ast-a1b2c3d4",
"name": "HVAC Unit #12 (Lobby)",
"status": "Offline",
"created": 1771911526,
"updated": 1771914000
},
"previousAttributes": {
"status": "Online"
}
},
"livemode": true
}
Work Order Events
workorder.created
Fired when a new work order is opened.
{
"id": "evt_wo_001",
"type": "workorder.created",
"organizationId": "o-xxxx",
"created": 1771920000,
"data": {
"object": {
"id": "wo-x1y2z3",
"title": "Fix leaking pipe in B2 washroom",
"description": "Water leaking from ceiling pipe near sink area",
"status": "Open",
"priority": "High",
"locationId": "loc-building-b",
"assigneeId": "usr-tech-01",
"reportedBy": "usr-fm-manager",
"slaResponseDeadline": 1771927200,
"slaResolutionDeadline": 1771963200,
"created": 1771920000,
"updated": 1771920000
}
},
"livemode": true
}
workorder.updated
Fired when a work order's details are modified (title, description, priority, assignee, etc.).
{
"id": "evt_wo_002",
"type": "workorder.updated",
"organizationId": "o-xxxx",
"created": 1771921000,
"data": {
"object": {
"id": "wo-x1y2z3",
"title": "Fix leaking pipe in B2 washroom",
"status": "Open",
"priority": "Critical",
"locationId": "loc-building-b",
"assigneeId": "usr-tech-02",
"created": 1771920000,
"updated": 1771921000
},
"previousAttributes": {
"priority": "High",
"assigneeId": "usr-tech-01"
}
},
"livemode": true
}
workorder.status.changed
Fired when a work order transitions to a new status.
{
"id": "evt_wo_003",
"type": "workorder.status.changed",
"organizationId": "o-xxxx",
"created": 1771925000,
"data": {
"object": {
"id": "wo-x1y2z3",
"title": "Fix leaking pipe in B2 washroom",
"status": "InProgress",
"priority": "Critical",
"created": 1771920000,
"updated": 1771925000
},
"previousAttributes": {
"status": "Open"
}
},
"livemode": true
}
workorder.completed
Fired when a work order is marked as completed.
{
"id": "evt_wo_004",
"type": "workorder.completed",
"organizationId": "o-xxxx",
"created": 1771940000,
"data": {
"object": {
"id": "wo-x1y2z3",
"title": "Fix leaking pipe in B2 washroom",
"status": "Completed",
"priority": "Critical",
"completedAt": 1771940000,
"completedBy": "usr-tech-02",
"created": 1771920000,
"updated": 1771940000
},
"previousAttributes": {
"status": "InProgress"
}
},
"livemode": true
}
Booking Events
booking.created
Fired when a new booking is made.
{
"id": "evt_bk_001",
"type": "booking.created",
"organizationId": "o-xxxx",
"created": 1771950000,
"data": {
"object": {
"id": "bk-m1n2o3",
"resourceId": "res-meeting-room-5a",
"resourceName": "Meeting Room 5A",
"locationId": "loc-building-a",
"bookedBy": "usr-john",
"startTime": 1771963200,
"endTime": 1771966800,
"status": "Confirmed",
"created": 1771950000
}
},
"livemode": true
}
booking.cancelled
Fired when a booking is cancelled.
{
"id": "evt_bk_002",
"type": "booking.cancelled",
"organizationId": "o-xxxx",
"created": 1771955000,
"data": {
"object": {
"id": "bk-m1n2o3",
"resourceId": "res-meeting-room-5a",
"status": "Cancelled",
"cancelledBy": "usr-john",
"cancelledAt": 1771955000,
"created": 1771950000
},
"previousAttributes": {
"status": "Confirmed"
}
},
"livemode": true
}
booking.checked_in
Fired when a guest checks in for their booking.
{
"id": "evt_bk_003",
"type": "booking.checked_in",
"organizationId": "o-xxxx",
"created": 1771963500,
"data": {
"object": {
"id": "bk-m1n2o3",
"resourceId": "res-meeting-room-5a",
"status": "CheckedIn",
"checkedInAt": 1771963500,
"created": 1771950000
},
"previousAttributes": {
"status": "Confirmed"
}
},
"livemode": true
}
Visitor Events
visitor.registered
Fired when a new visitor is pre-registered.
{
"id": "evt_vis_001",
"type": "visitor.registered",
"organizationId": "o-xxxx",
"created": 1771970000,
"data": {
"object": {
"id": "vis-p1q2r3",
"name": "Jane Smith",
"email": "jane.smith@example.com",
"company": "Acme Corp",
"hostId": "usr-john",
"locationId": "loc-building-a",
"expectedArrival": 1771984800,
"status": "Registered",
"created": 1771970000
}
},
"livemode": true
}
visitor.checked_in
Fired when a visitor checks in at the location.
{
"id": "evt_vis_002",
"type": "visitor.checked_in",
"organizationId": "o-xxxx",
"created": 1771984900,
"data": {
"object": {
"id": "vis-p1q2r3",
"name": "Jane Smith",
"status": "CheckedIn",
"checkedInAt": 1771984900,
"created": 1771970000
},
"previousAttributes": {
"status": "Registered"
}
},
"livemode": true
}
visitor.checked_out
Fired when a visitor checks out.
{
"id": "evt_vis_003",
"type": "visitor.checked_out",
"organizationId": "o-xxxx",
"created": 1771999200,
"data": {
"object": {
"id": "vis-p1q2r3",
"name": "Jane Smith",
"status": "CheckedOut",
"checkedOutAt": 1771999200,
"created": 1771970000
},
"previousAttributes": {
"status": "CheckedIn"
}
},
"livemode": true
}
SOR Events (Schedule of Rates)
sor.schedule.published
Fired when a SOR schedule is published and made active.
{
"id": "evt_sor_001",
"type": "sor.schedule.published",
"organizationId": "o-xxxx",
"created": 1772000000,
"data": {
"object": {
"id": "sor-sch-a1b2c3",
"name": "FY2026 Maintenance Rates",
"status": "Published",
"effectiveFrom": 1772000000,
"effectiveTo": 1803536000,
"itemCount": 245,
"publishedBy": "usr-fm-manager",
"publishedAt": 1772000000,
"created": 1771900000
},
"previousAttributes": {
"status": "Draft"
}
},
"livemode": true
}
sor.quotation.submitted
Fired when a SOR quotation is submitted for approval.
{
"id": "evt_sor_002",
"type": "sor.quotation.submitted",
"organizationId": "o-xxxx",
"created": 1772010000,
"data": {
"object": {
"id": "sor-qt-d4e5f6",
"scheduleId": "sor-sch-a1b2c3",
"workOrderId": "wo-x1y2z3",
"status": "Submitted",
"totalAmountCents": 1250000,
"lineItemCount": 8,
"submittedBy": "usr-contractor-01",
"submittedAt": 1772010000,
"created": 1772005000
},
"previousAttributes": {
"status": "Draft"
}
},
"livemode": true
}
Money values are always in integer cents. 1250000 = $12,500.00.
sor.quotation.approved
Fired when a SOR quotation is approved.
{
"id": "evt_sor_003",
"type": "sor.quotation.approved",
"organizationId": "o-xxxx",
"created": 1772020000,
"data": {
"object": {
"id": "sor-qt-d4e5f6",
"scheduleId": "sor-sch-a1b2c3",
"workOrderId": "wo-x1y2z3",
"status": "Approved",
"totalAmountCents": 1250000,
"approvedBy": "usr-fm-manager",
"approvedAt": 1772020000,
"created": 1772005000
},
"previousAttributes": {
"status": "Submitted"
}
},
"livemode": true
}
Test Events
webhook.test
Sent when you click "Send Test" in the dashboard or call the test endpoint. Use this to verify your endpoint is reachable and your signature verification works.
{
"id": "evt_test_xyz789",
"type": "webhook.test",
"organizationId": "o-xxxx",
"created": 1771911600,
"data": {
"object": {
"message": "This is a test webhook event from Infodeck"
}
},
"isTest": true,
"livemode": false
}
Test events have livemode: false and isTest: true. Your handler should process them normally but avoid triggering side effects (e.g., do not create real records from test events).