Webhook Events
Outbound events StatusPal POSTs to your outgoing_webhook.url when configured events fire
Fired when a service transitions to a different status. Emitted per ContainerService,
not per Service — a service that appears in multiple containers (regions) emits one event per
affected container. A Global Service has no container dimension and so produces exactly one
event, with container set to null.
Shared envelope for every outbound webhook event. Concrete events extend this via allOf and pin event / data to their specific shapes.
ISO-8601 timestamp of when the event was emitted (not when it was delivered).
Receiver acknowledged the event. Any 2xx is treated as success.
No content
Any non-2xx response causes a retry (up to 3 attempts).
Payload
{
"event": "service.status_changed",
"occurred_at": "2026-05-21T14:03:12Z",
"status_page": {
"subdomain": "prod-status",
"name": "Production Status",
"url": "https://prod-status.statuspal.io"
},
"data": {
"service": {
"slug": "api",
"name": "API"
},
"container": {
"slug": "eu",
"name": "EU"
},
"old_status": "ok",
"new_status": "major"
}
}Fired when a new notice (incident, maintenance, or info) is created. Emitted for every notice
regardless of published / retroactive / scheduled state — filter on data.notice.type,
data.notice.status, data.notice.published, and data.notice.retroactive if you only care
about a subset.
Shared envelope for every outbound webhook event. Concrete events extend this via allOf and pin event / data to their specific shapes.
ISO-8601 timestamp of when the event was emitted (not when it was delivered).
Receiver acknowledged the event. Any 2xx is treated as success.
No content
Any non-2xx response causes a retry (up to 3 attempts).
Payload
{
"event": "notice.created",
"occurred_at": "2026-05-21T14:03:12Z",
"status_page": {
"subdomain": "prod-status",
"name": "Production Status",
"url": "https://prod-status.statuspal.io"
},
"data": {
"notice": {
"id": "ntc_01h2x4q9k7m4n3v5w6r8t1y0z2",
"title": "Database degraded",
"type": "incident",
"status": "investigating",
"severity": "major",
"published": true,
"retroactive": false,
"lifecycle": "active",
"starts_at": "2026-05-21T14:00:00Z",
"ends_at": null
}
}
}Fired when a new timeline entry (update) is posted to an existing notice. The payload also
includes a service_statuses array listing any container-service statuses changed by this
update. Note data.notice is a trimmed summary — use the management API if you need the
full notice.
Shared envelope for every outbound webhook event. Concrete events extend this via allOf and pin event / data to their specific shapes.
ISO-8601 timestamp of when the event was emitted (not when it was delivered).
Receiver acknowledged the event. Any 2xx is treated as success.
No content
Any non-2xx response causes a retry (up to 3 attempts).
Payload
{
"event": "notice.update_posted",
"occurred_at": "2026-05-21T14:08:47Z",
"status_page": {
"subdomain": "prod-status",
"name": "Production Status",
"url": "https://prod-status.statuspal.io"
},
"data": {
"notice": {
"id": "ntc_01h2x4q9k7m4n3v5w6r8t1y0z2",
"title": "Database degraded",
"type": "incident",
"status": "identified"
},
"update": {
"id": "upd_01h2x4qab8p6m4n3v5w6r8t1y0",
"body": "<p>We've identified the bad query and rolled it back. Recovery in progress.</p>",
"status": "identified",
"posted_at": "2026-05-21T14:08:45Z"
},
"service_statuses": [
{
"service": {
"slug": "api",
"name": "API"
},
"container": {
"slug": "eu",
"name": "EU"
},
"status": "major"
},
{
"service": {
"slug": "dashboard",
"name": "Dashboard"
},
"container": null,
"status": "minor"
}
]
}
}Fired when an existing notice's tracked fields change (status, title, severity, lifecycle,
timestamps, etc.) — independently of timeline updates. A data.changes map lists each
modified field's [old, new] values. Note: posting a timeline update that also flips the
parent notice's status will fire both notice.update_posted and notice.updated.
Shared envelope for every outbound webhook event. Concrete events extend this via allOf and pin event / data to their specific shapes.
ISO-8601 timestamp of when the event was emitted (not when it was delivered).
Receiver acknowledged the event. Any 2xx is treated as success.
No content
Any non-2xx response causes a retry (up to 3 attempts).
Payload
{
"event": "notice.updated",
"occurred_at": "2026-05-21T14:08:47Z",
"status_page": {
"subdomain": "prod-status",
"name": "Production Status",
"url": "https://prod-status.statuspal.io"
},
"data": {
"notice": {
"id": "ntc_01h2x4q9k7m4n3v5w6r8t1y0z2",
"title": "Database degraded",
"type": "incident",
"status": "resolved",
"severity": "major",
"published": true,
"retroactive": false,
"lifecycle": "completed",
"starts_at": "2026-05-21T14:00:00Z",
"ends_at": "2026-05-21T15:30:00Z"
},
"changes": {
"status": [
"identified",
"resolved"
],
"ends_at": [
null,
"2026-05-21T15:30:00Z"
]
}
}
}Last updated