For the complete documentation index, see llms.txt. This page is also available as Markdown.

Webhook Events

Outbound events StatusPal POSTs to your outgoing_webhook.url when configured events fire

Service status changed

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.

Payload

Shared envelope for every outbound webhook event. Concrete events extend this via allOf and pin event / data to their specific shapes.

eventstring · enumRequiredPossible values:
occurred_atstring · date-timeRequired

ISO-8601 timestamp of when the event was emitted (not when it was delivered).

Responses
2XX

Receiver acknowledged the event. Any 2xx is treated as success.

No content

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"
  }
}

Notice created

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.

Payload

Shared envelope for every outbound webhook event. Concrete events extend this via allOf and pin event / data to their specific shapes.

eventstring · enumRequiredPossible values:
occurred_atstring · date-timeRequired

ISO-8601 timestamp of when the event was emitted (not when it was delivered).

Responses
2XX

Receiver acknowledged the event. Any 2xx is treated as success.

No content

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
    }
  }
}

Notice update posted

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.

Payload

Shared envelope for every outbound webhook event. Concrete events extend this via allOf and pin event / data to their specific shapes.

eventstring · enumRequiredPossible values:
occurred_atstring · date-timeRequired

ISO-8601 timestamp of when the event was emitted (not when it was delivered).

Responses
2XX

Receiver acknowledged the event. Any 2xx is treated as success.

No content

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"
      }
    ]
  }
}

Notice changed

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.

Payload

Shared envelope for every outbound webhook event. Concrete events extend this via allOf and pin event / data to their specific shapes.

eventstring · enumRequiredPossible values:
occurred_atstring · date-timeRequired

ISO-8601 timestamp of when the event was emitted (not when it was delivered).

Responses
2XX

Receiver acknowledged the event. Any 2xx is treated as success.

No content

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