Webhook Payload Reference
The versioned JSON payload Fleetera posts to your webhook endpoint.
Every webhook delivery is an HTTP POST with a Content-Type: application/json body. The body is a versioned object: the top-level v field is the payload schema version, currently 1. Fleetera will not make breaking changes to a published version — new fields may be added, but existing fields keep their meaning. If the schema ever changes incompatibly, the version number changes with it.
Write your receiver to tolerate additional fields it does not recognize, and to branch on the top-level type (alert.triggered vs. alert.resolved). This keeps your integration working as Fleetera adds detail to the payload over time.
Example: alert triggered
{
"v": 1,
"type": "alert.triggered",
"id": "9f2a7c1b-3e84-4d56-9a0f-1c7b2e5d8a40",
"timestamp": "2026-06-10T09:42:17.512Z",
"tenantId": "7c1e0b8f-2c6f-4f57-bb20-0a1e4d9a9d3a",
"alert": {
"eventId": "5d8a40f2-9f2a-4c1b-3e84-2e5d1c7b9a0f",
"status": "triggered",
"severity": "critical",
"triggeredAt": "2026-06-10T09:42:17.000Z",
"resolvedAt": null,
"triggerValue": 87.4,
"threshold": 80,
"rule": {
"id": "1c7b2e5d-9a0f-4d56-3e84-9f2a7c1b8a40",
"name": "Gearbox over-temp",
"type": "threshold"
},
"labels": {
"assetId": "2e5d1c7b-5d8a-40f2-9f2a-4c1b3e849a0f",
"variableKey": "gearbox_temp",
"siteId": "8a40f29f-2a7c-1b3e-849a-0f1c7b2e5d8a",
"assetCategoryAlias": "ambient_system",
"connectorId": "4d569f2a-7c1b-3e84-9a0f-1c7b2e5d8a40",
"unit": "degC"
}
}
}Example: alert resolved
An alert.resolved message is sent when the alert clears, if the channel has resolved notifications enabled. It carries the same id-as-idempotency-key contract and the same labels, with status: "resolved" and a non-null resolvedAt:
{
"v": 1,
"type": "alert.resolved",
"id": "c3b9e2d7-a4f1-4c8b-0c5b-3f9a7c2b8e1d",
"timestamp": "2026-06-10T10:05:44.218Z",
"tenantId": "7c1e0b8f-2c6f-4f57-bb20-0a1e4d9a9d3a",
"alert": {
"eventId": "5d8a40f2-9f2a-4c1b-3e84-2e5d1c7b9a0f",
"status": "resolved",
"severity": "critical",
"triggeredAt": "2026-06-10T09:42:17.000Z",
"resolvedAt": "2026-06-10T10:05:43.000Z",
"triggerValue": 76.1,
"threshold": 80,
"rule": {
"id": "1c7b2e5d-9a0f-4d56-3e84-9f2a7c1b8a40",
"name": "Gearbox over-temp",
"type": "threshold"
},
"labels": {
"assetId": "2e5d1c7b-5d8a-40f2-9f2a-4c1b3e849a0f",
"variableKey": "gearbox_temp",
"siteId": "8a40f29f-2a7c-1b3e-849a-0f1c7b2e5d8a",
"assetCategoryAlias": "ambient_system",
"connectorId": "4d569f2a-7c1b-3e84-9a0f-1c7b2e5d8a40",
"unit": "degC"
}
}
}Top-level fields
| Field | Type | Description |
|---|---|---|
v | number | Payload schema version. Currently 1. |
type | string | The event type: alert.triggered or alert.resolved. Matches the X-Fleetera-Event header. |
id | string | The delivery ID. This is also the idempotency key — see below. Matches the X-Fleetera-Delivery header. |
timestamp | string | ISO-8601 instant at which Fleetera dispatched this delivery. |
tenantId | string | The Fleetera organization (tenant) the alert belongs to. |
alert | object | The alert detail. See Alert object. |
The id field is your idempotency key
id identifies the delivery, and it is stable across retries: if Fleetera retries a delivery after a transient failure, the retried request carries the same id (and the same X-Fleetera-Delivery header). Your receiver may therefore see the same id more than once.
Deduplicate on id. Record the IDs you have already processed and treat a repeat as a no-op (or make your handler idempotent some other way). This guarantees that a retry never results in a duplicate ticket, page, or message. Do not dedupe on alert.eventId alone — a trigger and its later resolve share the same eventId.
Alert object
The alert object describes the alert event itself.
| Field | Type | Description |
|---|---|---|
eventId | string | The alert event ID. The same eventId is shared by an alert's trigger and its later resolve. |
status | string | triggered or resolved. |
severity | string | The alert severity: info, warning, or critical. |
triggeredAt | string | ISO-8601 instant the alert first triggered. |
resolvedAt | string | null | ISO-8601 instant the alert resolved, or null while the alert is still active. |
triggerValue | number | null | The measured value that drove the event, when applicable. null for rules where a single value does not apply. |
threshold | number | null | The configured threshold the value was compared against, when applicable. null for rule types without a single threshold. |
rule | object | The rule that produced the alert. See Rule object. |
labels | object | Routing and identity labels for the alert. See Labels object. |
Rule object
| Field | Type | Description |
|---|---|---|
id | string | The alert rule's ID. |
name | string | The human-readable rule name, as configured in Fleetera. |
type | string | The rule type: threshold, duration, multi_condition, rate_of_change, pattern, or staleness. |
Labels object
The labels object carries the identity of the asset and signal the alert fired on. These are the same labels Fleetera routes on internally, so a receiver that forwards alerts into another system (such as PagerDuty or Opsgenie) can re-route on the same identifiers.
| Field | Type | Description |
|---|---|---|
assetId | string | The asset the alert fired on. Always present. |
variableKey | string | The variable (signal) key the alert evaluated. Always present. |
siteId | string | null | The site the asset belongs to. May be null if unknown for the rule. |
assetCategoryAlias | string | null | The asset category alias (for example, ambient_system). May be null. |
connectorId | string | null | The connector that supplied the data. May be null. |
unit | string | null | The unit of the measured value (for example, degC). May be null. |
assetId and variableKey are always present — they are the per-instance identity of the alert. The remaining labels are nullable: a label can be absent for an older or inline rule. Always handle null for siteId, assetCategoryAlias, connectorId, and unit.