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.
Public status pages require the Pro plan or higher.
All routes below require a bearer token.
List status pages
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
Request body
| Field | Type | Required | Notes |
|---|---|---|---|
slug | string | yes | Lowercase letters, numbers, and hyphens only. Must be globally unique. |
name | string | yes | Display name. |
description | string | no | Subhead text shown on the page. |
logo_url | string | no | Absolute URL to a logo image. |
servers | integer[] | no | Server IDs to include. All must belong to your account. |
theme | string | no | dark (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— Missingslugorname; invalid slug format; one of theserversIDs 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
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
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, orserverscontains IDs not owned.404— Status page not found.
Delete status page
Response — 200 OK
{ "message": "Status page deleted", "timestamp": "2026-05-24T18:42:11Z" }Errors
404— Status page not found.
Create incident
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
| Field | Type | Required | Notes |
|---|---|---|---|
title | string | yes | Headline. |
message | string | yes | First update body. |
status | string | no | investigating (default), identified, monitoring, resolved. |
severity | string | no | minor (default), major, critical. Drives the overall page status. |
affected_servers | integer[] | no | Server 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
400—title and message are required.404— Status page not found.
Update incident
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
| Field | Type | Notes |
|---|---|---|
title | string | New headline. |
status | string | If resolved, resolved_at is automatically set to now. |
severity | string | New 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
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
| Field | Type | Required | Notes |
|---|---|---|---|
message | string | yes | Update body. |
status | string | no | New 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
400—message is required.404— Incident not found.
See also
- Status pages — conceptual overview
- Public routes —
/status/:slug(the consumer-facing endpoint)