Status Pages
Create and manage public status pages. Associate monitors and customize appearance.
Status pages provide a public-facing view of your service health. Associate monitors and cron jobs to display their status to your users.
GET /api/v1/status-pages
Returns the status pages for your team. This endpoint is paginated; see Pagination for how to page through the full list.
Required scope: status-pages:read
Query Parameters
perPageintegerResults per page, 1-200 (default: 50)
cursorstringPage to fetch, taken from a
Linkheader
The list leaves out each page's monitors and cron jobs; fetch a single status page to see them.
The cursors for this page arrive in meta.pagination:
meta.pagination.nextstring | nullCursor for the following page,
nullon the lastmeta.pagination.prevstring | nullCursor for the preceding page,
nullon the firstmeta.pagination.perPageintegerResults this page was built with
meta.pagination.totalintegerStatus pages matching, across every page
Errors (3)
| Status | Type | Meaning |
|---|---|---|
| 400 | bad-request | The request is malformed |
| 401 | unauthorized | The API key is missing or invalid |
| 403 | forbidden | The API key lacks the required scope |
Response fields (200)
dataobjectRequiredShow nested fields
statusPagesStatusPage[]RequiredShow nested fields
idstringRequirednamestringRequiredslugstringRequiredtitlestringRequireddescriptionstring | nullRequiredlogoUrlstring | nullRequiredcustomDomainstring | nullRequiredisPublicbooleanRequiredshowOverallStatusbooleanRequiredcreatedAtintegerRequiredEpoch milliseconds
updatedAtintegerRequiredEpoch milliseconds
metaobjectRequiredShow nested fields
requestIdstringRequiredFormat: uuid.
timestampstringRequiredFormat: date-time.
paginationobjectRequiredShow nested fields
nextstring | nullRequiredCursor of the following page
prevstring | nullRequiredCursor of the preceding page
perPageintegerRequiredtotalinteger
cURL
Response
{
"data": {
"statusPages": [
{
"id": "sp_abc123",
"name": "Production Status",
"slug": "production-status",
"title": "Production Status",
"description": "Real-time status of our production services",
"logoUrl": "https://example.com/logo.png",
"customDomain": "status.example.com",
"isPublic": true,
"showOverallStatus": true,
"createdAt": 1770710400000,
"updatedAt": 1771079400000
}
]
},
"meta": {
"requestId": "3f2504e0-4f89-11d3-9a0c-0305e82c3301",
"timestamp": "2026-02-14T12:00:00.000Z",
"pagination": {
"next": "eyJkIjoiYWZ0ZXIi",
"prev": null,
"perPage": 25,
"total": 28
}
}
}POST /api/v1/status-pages
Creates a new status page.
Required scope: status-pages:write
Request Body
namestringRequiredInternal name (1-255 characters)
slugstringRequiredURL-friendly identifier (lowercase letters, numbers, hyphens only)
titlestringDisplay title (1-255 characters, defaults to
name)descriptionstringPage description (max 500 characters)
logoUrlstringURL to your logo image
customDomainstringCustom domain for the status page
isPublicbooleanWhether the page is publicly accessible (default:
true)showOverallStatusbooleanWhether to display the overall status indicator (default:
true)
Errors (7)
| Status | Type | Meaning |
|---|---|---|
| 400 | validation-error | The request failed validation |
| 400 | idempotency-key-invalid | The Idempotency-Key header is not valid |
| 401 | unauthorized | The API key is missing or invalid |
| 403 | forbidden | The API key lacks the required scope |
| 409 | conflict | The resource's state prevents this request |
| 409 | idempotency-key-in-use | A request with this idempotency key is still being processed |
| 422 | idempotency-key-reused | This idempotency key was already used for a different request |
Response fields (201)
dataobjectRequiredShow nested fields
statusPageobjectRequiredShow nested fields
idstringRequirednamestringRequiredslugstringRequiredtitlestringRequireddescriptionstring | nullRequiredlogoUrlstring | nullRequiredcustomDomainstring | nullRequiredisPublicbooleanRequiredshowOverallStatusbooleanRequiredcreatedAtintegerRequiredEpoch milliseconds
updatedAtintegerRequiredEpoch milliseconds
metaobjectRequiredShow nested fields
requestIdstringRequiredFormat: uuid.
timestampstringRequiredFormat: date-time.
cURL
Response
Returns 201 Created. Attach monitors and cron jobs afterwards with PUT /api/v1/status-pages/:id/monitors.
{
"data": {
"statusPage": {
"id": "sp_abc123",
"name": "Production Status",
"slug": "production-status",
"title": "Service Status",
"description": "Real-time status of our production services",
"logoUrl": "https://example.com/logo.png",
"customDomain": null,
"isPublic": true,
"showOverallStatus": true,
"createdAt": 1770710400000,
"updatedAt": 1770710400000
}
},
"meta": {
"requestId": "3f2504e0-4f89-11d3-9a0c-0305e82c3301",
"timestamp": "2026-02-14T12:00:00.000Z"
}
}GET /api/v1/status-pages/:id
Returns a single status page with the ids of its attached HTTP monitors and cron jobs.
Required scope: status-pages:read
Path Parameters
idstringThe status page ID
Errors (4)
| Status | Type | Meaning |
|---|---|---|
| 400 | validation-error | The request failed validation |
| 401 | unauthorized | The API key is missing or invalid |
| 403 | forbidden | The API key lacks the required scope |
| 404 | not-found | The resource does not exist |
Response fields (200)
dataobjectRequiredShow nested fields
statusPageobjectRequiredShow nested fields
idstringRequirednamestringRequiredslugstringRequiredtitlestringRequireddescriptionstring | nullRequiredlogoUrlstring | nullRequiredcustomDomainstring | nullRequiredisPublicbooleanRequiredshowOverallStatusbooleanRequiredcreatedAtintegerRequiredEpoch milliseconds
updatedAtintegerRequiredEpoch milliseconds
monitorsstring[]RequiredcronJobsstring[]Required
metaobjectRequiredShow nested fields
requestIdstringRequiredFormat: uuid.
timestampstringRequiredFormat: date-time.
cURL
Response
{
"data": {
"statusPage": {
"id": "sp_abc123",
"name": "Production Status",
"slug": "production-status",
"title": "Service Status",
"description": "Real-time status of our production services",
"logoUrl": "https://example.com/logo.png",
"customDomain": "status.example.com",
"isPublic": true,
"showOverallStatus": true,
"createdAt": 1770710400000,
"updatedAt": 1771079400000,
"monitors": ["mon_def456", "mon_ghi789"],
"cronJobs": ["cron_jkl012"]
}
},
"meta": {
"requestId": "3f2504e0-4f89-11d3-9a0c-0305e82c3301",
"timestamp": "2026-02-14T12:00:00.000Z"
}
}PATCH /api/v1/status-pages/:id
Updates an existing status page with a JSON merge patch.
Required scope: status-pages:write
Path Parameters
idstringThe status page ID
Request Body
All fields from POST /api/v1/status-pages are accepted, with the same limits. Include only the fields you want to change; fields outside this table are ignored. null clears description, logoUrl and customDomain, sets title back to name, and resets isPublic and showOverallStatus to true; name and slug cannot be removed.
namestringInternal name (1-255 characters)
slugstringURL-friendly identifier (lowercase letters, numbers, hyphens only)
titlestringDisplay title (1-255 characters);
nullsets it tonamedescriptionstringPage description (max 500 characters);
nullclears itlogoUrlstringURL to your logo image;
nullclears itcustomDomainstringCustom domain for the status page;
nullclears itisPublicbooleanWhether the page is publicly accessible;
nullresets totrueshowOverallStatusbooleanWhether to display the overall status indicator;
nullresets it
Update With PUT
PUT /api/v1/status-pages/:id takes the same fields, for integrations written before PATCH existed. A field you leave out keeps its value, and null clears description, logoUrl and customDomain; null on any other field is refused.
Required scope: status-pages:write
Errors (5)
| Status | Type | Meaning |
|---|---|---|
| 400 | validation-error | The request failed validation |
| 401 | unauthorized | The API key is missing or invalid |
| 403 | forbidden | The API key lacks the required scope |
| 404 | not-found | The resource does not exist |
| 409 | conflict | The resource's state prevents this request |
Response fields (200)
dataobjectRequiredShow nested fields
statusPageobjectRequiredShow nested fields
idstringRequirednamestringRequiredslugstringRequiredtitlestringRequireddescriptionstring | nullRequiredlogoUrlstring | nullRequiredcustomDomainstring | nullRequiredisPublicbooleanRequiredshowOverallStatusbooleanRequiredcreatedAtintegerRequiredEpoch milliseconds
updatedAtintegerRequiredEpoch milliseconds
monitorsstring[]RequiredcronJobsstring[]Required
metaobjectRequiredShow nested fields
requestIdstringRequiredFormat: uuid.
timestampstringRequiredFormat: date-time.
cURL
Response
The updated status page, with the ids of its attached HTTP monitors and cron jobs.
{
"data": {
"statusPage": {
"id": "sp_abc123",
"name": "Production Status",
"slug": "production-status",
"title": "Updated Service Status",
"description": "Current status of all our services",
"logoUrl": "https://example.com/logo.png",
"customDomain": "status.example.com",
"isPublic": true,
"showOverallStatus": true,
"createdAt": 1770710400000,
"updatedAt": 1771084800000,
"monitors": [],
"cronJobs": []
}
},
"meta": {
"requestId": "3f2504e0-4f89-11d3-9a0c-0305e82c3301",
"timestamp": "2026-02-14T12:00:00.000Z"
}
}DELETE /api/v1/status-pages/:id
Deletes a status page and its monitor and cron job attachments.
Required scope: status-pages:write
Path Parameters
idstringThe status page ID
Errors (4)
| Status | Type | Meaning |
|---|---|---|
| 400 | validation-error | The request failed validation |
| 401 | unauthorized | The API key is missing or invalid |
| 403 | forbidden | The API key lacks the required scope |
| 404 | not-found | The resource does not exist |
Response fields (200)
dataobjectRequiredShow nested fields
deletedtrueRequired
metaobjectRequiredShow nested fields
requestIdstringRequiredFormat: uuid.
timestampstringRequiredFormat: date-time.
cURL
Response
Returns 200 OK:
{
"data": {
"deleted": true
},
"meta": {
"requestId": "3f2504e0-4f89-11d3-9a0c-0305e82c3301",
"timestamp": "2026-02-14T12:00:00.000Z"
}
}PUT /api/v1/status-pages/:id/monitors
Replaces the HTTP monitors and cron jobs attached to a status page. The lists you send become the page's full set of attachments: a list you omit, or send empty, detaches everything of that kind.
Required scope: status-pages:write
Path Parameters
idstringThe status page ID
Request Body
monitorIdsarrayHTTP monitor ids (
mon_…) to attach (default:[])cronJobIdsarrayCron job ids (
cron_…) to attach (default:[])
An id listed more than once is attached once.
Errors (4)
| Status | Type | Meaning |
|---|---|---|
| 400 | validation-error | The request failed validation |
| 401 | unauthorized | The API key is missing or invalid |
| 403 | forbidden | The API key lacks the required scope |
| 404 | not-found | The resource does not exist |
Response fields (200)
dataobjectRequiredShow nested fields
statusPageobjectRequiredShow nested fields
idstringRequirednamestringRequiredslugstringRequiredtitlestringRequireddescriptionstring | nullRequiredlogoUrlstring | nullRequiredcustomDomainstring | nullRequiredisPublicbooleanRequiredshowOverallStatusbooleanRequiredcreatedAtintegerRequiredEpoch milliseconds
updatedAtintegerRequiredEpoch milliseconds
monitorsstring[]RequiredcronJobsstring[]Required
metaobjectRequiredShow nested fields
requestIdstringRequiredFormat: uuid.
timestampstringRequiredFormat: date-time.
cURL
Response
The status page, with the attached ids beside it in monitors and cronJobs.
{
"data": {
"statusPage": {
"id": "sp_abc123",
"name": "Production Status",
"slug": "production-status",
"title": "Service Status",
"description": "Real-time status of our production services",
"logoUrl": "https://example.com/logo.png",
"customDomain": "status.example.com",
"isPublic": true,
"showOverallStatus": true,
"createdAt": 1770710400000,
"updatedAt": 1771079400000
},
"monitors": ["mon_def456", "mon_ghi789"],
"cronJobs": ["cron_jkl012"]
},
"meta": {
"requestId": "3f2504e0-4f89-11d3-9a0c-0305e82c3301",
"timestamp": "2026-02-14T12:00:00.000Z"
}
}Response Fields
| Field | Type | Description |
|---|---|---|
id | string | Unique status page identifier |
name | string | Internal name |
slug | string | URL-friendly identifier |
title | string | Display title |
description | string | null | Page description |
logoUrl | string | null | URL to the logo image |
customDomain | string | null | Custom domain if configured |
isPublic | boolean | Whether the page is publicly accessible |
showOverallStatus | boolean | Whether the overall status indicator is displayed |
createdAt | integer | Unix timestamp in milliseconds of creation |
updatedAt | integer | Unix timestamp in milliseconds of the last update |
monitors | array | Attached HTTP monitor ids, on a single status page |
cronJobs | array | Attached cron job IDs, on a single status page |