title: "Status Pages API" description: "Manage public status pages and incidents — create pages, post incidents, add updates." last_updated: "2026-05-24"

Status Pages API

Status pages are public-facing summaries of your servers' health. The management API lives under /status-pages; the public read endpoint that powers the published page lives at /status/:slug (see Public routes). Conceptual docs: Status pages.

Pro+

Public status pages require the Pro plan or higher.

All routes below require a bearer token.

List status pages

GET/status-pages
Auth: bearer

Returns all status pages on your account.

Response — 200 OK

{
  "status_pages": [
    {
      "id": "8a3e9c2f-1d6b-4e7a-9c8f-2b5a0d4e6f12",
      "slug": "status-acme",
      "name": "Acme Status",
      "description": "Production health for Acme APIs",
      "logo_url": "https://acme.example/logo.png",
      "servers": [12, 18, 47],
      "theme": "dark",
      "custom_domain": null,
      "enabled": 1,
      "created_at": "2026-04-12T11:23:00Z"
    }
  ],
  "timestamp": "2026-05-24T18:42:11Z"
}

Create status page

POST/status-pages
Auth: bearer

Request body

FieldTypeRequiredNotes
slugstringyesLowercase letters, numbers, and hyphens only. Must be globally unique.
namestringyesDisplay name.
descriptionstringnoSubhead text shown on the page.
logo_urlstringnoAbsolute URL to a logo image.
serversinteger[]noServer IDs to include. All must belong to your account.
themestringnodark (default) or light.
{
  "slug": "status-acme",
  "name": "Acme Status",
  "description": "Production health for Acme APIs",
  "servers": [12, 18, 47],
  "theme": "dark"
}

Response — 201 Created

{
  "status_page": {
    "id": "8a3e9c2f-1d6b-4e7a-9c8f-2b5a0d4e6f12",
    "slug": "status-acme",
    "name": "Acme Status",
    "servers": [12, 18, 47],
    "theme": "dark",
    "enabled": true,
    "created_at": "2026-05-24T18:42:11Z"
  },
  "timestamp": "2026-05-24T18:42:11Z"
}

Errors

  • 400 — Missing slug or name; invalid slug format; one of the servers IDs not owned; or slug already taken (Slug already taken).
  • 403 — Hobby plan (Public status pages are available on Pro and above); or status-page limit reached.

Get status page

GET/status-pages/:id
Auth: bearer

Response — 200 OK

{
  "status_page": {
    "id": "8a3e9c2f-1d6b-4e7a-9c8f-2b5a0d4e6f12",
    "slug": "status-acme",
    "name": "Acme Status",
    "description": "Production health for Acme APIs",
    "logo_url": "https://acme.example/logo.png",
    "servers": [12, 18, 47],
    "theme": "dark",
    "custom_domain": null,
    "enabled": 1,
    "created_at": "2026-04-12T11:23:00Z"
  },
  "timestamp": "2026-05-24T18:42:11Z"
}

Errors

  • 404 — Status page not found.

Update status page

PATCH/status-pages/:id
Auth: bearer

Updatable: name, description, logo_url, servers, theme, enabled. Pass any subset.

Response — 200 OK

{
  "message": "Status page updated",
  "status_page": { "id": "...", "name": "Acme Status v2", "servers": [12, 18, 47, 51] },
  "timestamp": "2026-05-24T18:42:11Z"
}

Errors

  • 400 — No fields to update, or servers contains IDs not owned.
  • 404 — Status page not found.

Delete status page

DELETE/status-pages/:id
Auth: bearer

Response — 200 OK

{ "message": "Status page deleted", "timestamp": "2026-05-24T18:42:11Z" }

Errors

  • 404 — Status page not found.

Create incident

POST/status-pages/:id/incidents
Auth: bearer

Opens an incident on the given status page. The incident's message is also stored as the first incident update so timelines start populated.

Request body

FieldTypeRequiredNotes
titlestringyesHeadline.
messagestringyesFirst update body.
statusstringnoinvestigating (default), identified, monitoring, resolved.
severitystringnominor (default), major, critical. Drives the overall page status.
affected_serversinteger[]noServer IDs affected.
{
  "title": "API latency elevated",
  "message": "Investigating elevated response times on the /v1/* endpoints.",
  "status": "investigating",
  "severity": "major",
  "affected_servers": [12, 18]
}

Response — 201 Created

{
  "incident": {
    "id": "1c2d3e4f-5a6b-7c8d-9e0f-1a2b3c4d5e6f",
    "status_page_id": "8a3e9c2f-1d6b-4e7a-9c8f-2b5a0d4e6f12",
    "title": "API latency elevated",
    "status": "investigating",
    "severity": "major",
    "message": "Investigating elevated response times on the /v1/* endpoints.",
    "affected_servers": [12, 18],
    "created_at": "2026-05-24T18:42:11Z"
  },
  "timestamp": "2026-05-24T18:42:11Z"
}

Errors

  • 400title and message are required.
  • 404 — Status page not found.

Update incident

PATCH/status-pages/incidents/:id
Auth: bearer

Patch the incident itself. Note the path is /status-pages/incidents/:id — not nested under a status-page ID — because the incident ID is unique.

Request body

FieldTypeNotes
titlestringNew headline.
statusstringIf resolved, resolved_at is automatically set to now.
severitystringNew severity.

Response — 200 OK

{ "message": "Incident updated", "timestamp": "2026-05-24T18:42:11Z" }

Errors

  • 400 — No fields to update.
  • 404 — Incident not found.

Add incident update

POST/status-pages/incidents/:id/updates
Auth: bearer

Appends an update to the incident timeline. Optionally moves the incident to a new status — if status is resolved, resolved_at is set to now.

Request body

FieldTypeRequiredNotes
messagestringyesUpdate body.
statusstringnoNew incident status.
{
  "status": "monitoring",
  "message": "Latency back to baseline. Watching for 15 minutes before resolving."
}

Response — 201 Created

{
  "update": {
    "id": "9e8d7c6b-5a4f-3e2d-1c0b-9a8f7e6d5c4b",
    "incident_id": "1c2d3e4f-5a6b-7c8d-9e0f-1a2b3c4d5e6f",
    "status": "monitoring",
    "message": "Latency back to baseline. Watching for 15 minutes before resolving.",
    "created_at": "2026-05-24T18:42:11Z"
  },
  "timestamp": "2026-05-24T18:42:11Z"
}

Errors

  • 400message is required.
  • 404 — Incident not found.

See also

Was this page helpful?