Skip to content
Status
StatusIncidentsSubscribe

Status — Service health, stated plainly.

HelpAPIRSSOperator console

Reference

API

Read what this page publishes, programmatically. Write routes take a bearer token. Every error takes the same shape.

GET /api/health

Whether this deployment is serving.

Authentication
None — public.
ok
Always true when the deployment responds. (boolean)
service
Service identifier. (string)
version
Deployed version. (string)
{
  "ok": true,
  "service": "status-page",
  "version": "1.0.0"
}

GET /api/v1/status

Overall status, every service, open incidents, and upcoming maintenance.

Authentication
None — public.
data.overall
Worst current service status. (operational | degraded | down)
data.services
Named components this page reports on. (Service[])
data.openIncidents
Incidents that are not yet resolved. (Incident[])
data.maintenance
Scheduled or in-progress windows. (Maintenance[])
{
  "data": {
    "overall": "operational",
    "services": [{ "slug": "api", "status": "operational" }],
    "openIncidents": [],
    "maintenance": []
  }
}

GET /api/v1/services

Every service and its current status.

Authentication
None — public.
data
Services in display order. (Service[])
{
  "data": [{ "name": "API", "slug": "api", "status": "operational" }]
}

GET /api/v1/incidents

Incident history, most recent first, with per-incident updates.

Authentication
None — public.
data
Incidents and their update timeline. (Incident[])
{
  "data": [{ "title": "Elevated API latency", "status": "resolved", "updates": [] }]
}

GET /api/v1/incidents/[id]

One incident and every update posted against it.

Authentication
None — public.
data
The incident, its services, and updates. (Incident)
{
  "data": { "id": "…", "status": "investigating", "updates": [] }
}

GET /api/v1/incidents/export

Incident history as CSV (the same file the public page offers).

Authentication
None — public.
(body)
CSV attachment. (text/csv)
id,title,status,severity,created_at,resolved_at,services,latest_update

GET /api/v1/maintenance

Scheduled, in-progress, and past maintenance windows.

Authentication
None — public.
data
Maintenance windows. (Maintenance[])
{
  "data": [{ "title": "Database engine upgrade", "status": "scheduled" }]
}

GET /api/v1/uptime

Per-service uptime for 30, 60, or 90 days. Query: days=30|60|90.

Authentication
None — public.
data
Daily buckets and the window percent. (ServiceUptime[])
{
  "data": [{ "slug": "api", "uptimePercent": 99.91, "days": [] }]
}

GET /api/v1/badges/[slug]

Embeddable SVG badge for a service.

Authentication
None — public.
(body)
A 20px status badge. (image/svg+xml)
<svg xmlns="http://www.w3.org/2000/svg" …>

POST /api/v1/subscribe

Start a GDPR double opt-in. Nothing is sent until the address is confirmed.

Authentication
None — public.
data.message
What to do next. (string)
{
  "data": { "ok": true, "message": "Check your inbox for a confirmation message." }
}

POST /api/v1/subscribe/confirm

Confirm a pending subscription with the token from the email.

Authentication
None — public.
data.confirmed
True when the address is now live. (boolean)
{
  "data": { "confirmed": true }
}

POST /api/v1/unsubscribe

One-click unsubscribe using the token from any message.

Authentication
None — public.
data.unsubscribed
True when mail will stop. (boolean)
{
  "data": { "unsubscribed": true }
}

GET /feed/rss

RSS 2.0 feed of incidents.

Authentication
None — public.
(body)
RSS document. (application/rss+xml)
<rss version="2.0">…</rss>

GET /feed/atom

Atom 1.0 feed of incidents.

Authentication
None — public.
(body)
Atom document. (application/atom+xml)
<feed xmlns="http://www.w3.org/2005/Atom">…</feed>

POST /api/v1/admin/session

Sign in. Sets an HttpOnly session cookie; the JSON body never includes the password.

Authentication
None — public.
data.user
The signed-in operator. (User)
{
  "data": { "user": { "email": "owner@example.com", "role": "owner" } }
}

DELETE /api/v1/admin/session

Sign out and clear the session cookie.

Authentication
Bearer token.
data.ok
Always true when the cookie is cleared. (boolean)
{
  "data": { "ok": true }
}

GET /api/v1/admin/me

The signed-in operator, or the owner represented by a bearer token.

Authentication
Bearer token.
data
id, email, role. (User)
{
  "data": { "email": "owner@example.com", "role": "owner" }
}

GET /api/v1/admin/services

List services for the operator console.

Authentication
Bearer token.
data
Services. (Service[])
{
  "data": []
}

POST /api/v1/admin/services

Register a service.

Authentication
Bearer token.
data
The new service, operational. (Service)
{
  "data": { "slug": "billing", "status": "operational" }
}

PATCH /api/v1/admin/services/[id]

Rename a service or change its status (operational / degraded / down).

Authentication
Bearer token.
data
The updated service. (Service)
{
  "data": { "status": "degraded" }
}

DELETE /api/v1/admin/services/[id]

Remove a service. Owner only.

Authentication
Bearer token.
data.deleted
True when the row is gone. (boolean)
{
  "data": { "deleted": true }
}

GET /api/v1/admin/incidents

List incidents for the operator console.

Authentication
Bearer token.
data
Incidents with updates. (Incident[])
{
  "data": []
}

POST /api/v1/admin/incidents

Open an incident. Pass templateId to prefill from a stored template.

Authentication
Bearer token.
data
The new incident, with its first update. (Incident)
{
  "data": { "status": "investigating" }
}

GET /api/v1/admin/incidents/[id]

One incident as the operator sees it.

Authentication
Bearer token.
data
Incident with updates. (Incident)
{
  "data": { "id": "…" }
}

POST /api/v1/admin/incidents/[id]/updates

Post an update, or resolve the incident.

Authentication
Bearer token.
data
The incident after the update. (Incident)
{
  "data": { "status": "resolved" }
}

GET /api/v1/admin/maintenance

List maintenance windows.

Authentication
Bearer token.
data
Windows. (Maintenance[])
{
  "data": []
}

POST /api/v1/admin/maintenance

Schedule a maintenance window. Confirmed subscribers who opted in are notified.

Authentication
Bearer token.
data
The new window. (Maintenance)
{
  "data": { "status": "scheduled" }
}

PATCH /api/v1/admin/maintenance/[id]

Update or complete a maintenance window.

Authentication
Bearer token.
data
The updated window. (Maintenance)
{
  "data": { "status": "completed" }
}

GET /api/v1/admin/templates

List incident templates.

Authentication
Bearer token.
data
Named starting points for incidents. (Template[])
{
  "data": [{ "name": "Partial outage" }]
}

POST /api/v1/admin/templates

Store an incident template.

Authentication
Bearer token.
data
The new template. (Template)
{
  "data": { "name": "Partial outage" }
}

DELETE /api/v1/admin/templates/[id]

Delete an incident template.

Authentication
Bearer token.
data.deleted
True when the template is gone. (boolean)
{
  "data": { "deleted": true }
}

GET /api/v1/admin/audit

Every status change and incident update, newest first.

Authentication
Bearer token.
data
Who did what, to which row, when. (AuditLog[])
{
  "data": [{ "action": "service.status", "entityType": "service" }]
}

GET /api/v1/admin/keys

List API keys. Secrets are never stored or shown again.

Authentication
Bearer token.
data
Prefix, name, timestamps — never the secret. (ApiKey[])
{
  "data": [{ "prefix": "sk_live_ab12", "name": "CI" }]
}

POST /api/v1/admin/keys

Create an API key. The secret is in this response once.

Authentication
Bearer token.
data.secret
The bearer token. Copy it now. (string)
{
  "data": { "secret": "sk_live_…", "prefix": "sk_live_ab12" }
}

DELETE /api/v1/admin/keys/[id]

Revoke an API key.

Authentication
Bearer token.
data.revoked
True when the key no longer authenticates. (boolean)
{
  "data": { "revoked": true }
}

GET /api/v1/admin/subscribers

List notification subscribers.

Authentication
Bearer token.
data
Addresses and confirmation state. (Subscriber[])
{
  "data": [{ "email": "you@example.com", "status": "confirmed" }]
}

DELETE /api/v1/admin/subscribers/[id]

Delete a subscriber (erasure).

Authentication
Bearer token.
data.deleted
True when the address is gone. (boolean)
{
  "data": { "deleted": true }
}

GET /api/v1/admin/sla

SLA targets and the latest monthly report. Disabled when the add-on flag is off.

Authentication
Bearer token.
data.targets
Per-service uptime targets. (SlaTarget[])
data.latest
Most recently generated report. (SlaReport | null)
{
  "data": { "targets": [{ "uptimePercent": 99.9 }], "latest": null }
}

POST /api/v1/admin/sla

Generate a monthly SLA compliance report from incident and downtime data.

Authentication
Bearer token.
data
Per-service uptime versus target. (SlaReport)
{
  "data": { "period": "2026-08", "rows": [] }
}

PATCH /api/v1/admin/sla/targets

Set a service's monthly uptime target.

Authentication
Bearer token.
data
All targets after the change. (SlaTarget[])
{
  "data": [{ "uptimePercent": 99.5 }]
}

GET /api/v1/admin/sla/export

Export the latest (or specified) SLA report as CSV.

Authentication
Bearer token.
(body)
CSV attachment. (text/csv)
service,target_percent,uptime_percent,downtime_minutes,incident_count,met

Errors

Every failure returns the same envelope, whichever route produced it, so a client can handle errors in one place.

error.code
Stable, machine-readable code. (string)
error.message
One sentence, safe to show a user. (string)
error.reference
Quote this to support. (string)