Status pages
Create and manage status pages and publish incident announcements via the API.
The status page object:
{
"id": "9a1d…",
"object": "status_page",
"slug": "acme",
"name": "Acme Cloud Status",
"description": "Live status of all Acme services",
"public": true,
"password_protected": false,
"auto_publish_incidents": true,
"dim_untracked_days": false,
"theme": "auto",
"url": "https://watchfor.io/stats/acme",
"component_count": 6,
"created_at": "2026-07-01T08:00:00.000Z",
"updated_at": "2026-08-20T16:45:00.000Z"
}List / get status pages
GET /v1/status-pages — all pages. GET /v1/status-pages/{id} — one
page including its components (name, position, monitor ids/tags).
curl https://watchfor.io/api/v1/status-pages \
-H "Authorization: Bearer wf_live_YOUR_KEY"Create a status page
POST /v1/status-pages — requires write scope. Body: slug (required,
globally unique, 3–50 chars), name (required), description,
isPublic (default true), autoPublishIncidents (default true),
dimUntrackedDays, theme (light|dark|auto), and optional
components — each { name, description?, monitorIds?, monitorTags? }.
Password protection and logo upload stay in the dashboard. Supports
Idempotency-Key.
curl -X POST https://watchfor.io/api/v1/status-pages \
-H "Authorization: Bearer wf_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"slug": "acme",
"name": "Acme Cloud Status",
"components": [
{ "name": "Website", "monitorTags": ["prod"] },
{ "name": "API", "monitorIds": ["0b0f6a41-…"] }
]
}'Returns 201; a taken slug returns 409. Your plan's status-page limit
applies.
Update / delete a status page
PATCH /v1/status-pages/{id} — partial: slug, name, description,
isPublic, autoPublishIncidents, dimUntrackedDays, theme.
DELETE /v1/status-pages/{id} → 204. Both require write scope; the
public page cache refreshes immediately.
Announcements
Manual incident notices on the page — the classic use is announcing a problem (and the all-clear) straight from your incident tooling.
GET /v1/status-pages/{id}/announcements — list (newest first).
POST /v1/status-pages/{id}/announcements — requires write scope.
Body: title (required), body (required), status
(investigating|identified|monitoring|resolved, default
investigating), severity (minor|major|critical, default minor),
affectedComponentIds.
curl -X POST https://watchfor.io/api/v1/status-pages/9a1d…/announcements \
-H "Authorization: Bearer wf_live_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"title": "Degraded API performance",
"body": "We are investigating elevated error rates.",
"severity": "major"
}'PATCH /v1/status-pages/{id}/announcements/{announcementId} — post an
update: { "body": "…", "status": "monitoring" } appends to the public
timeline and moves the status; status: "resolved" closes it.
DELETE …/{announcementId} — removes the notice from the public page.
Maintenance-type notices are created by maintenance windows, not here.