WatchFor
API

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.

On this page