API

Push status updates from your own scripts

A real REST API, not a stub - create incidents, post updates, and flip a component's status from CI/CD, a cron job, or your own internal tooling. One key per site, included on every plan.

POST /api/v1/incidents
Authorization: Bearer ssk_live_...

{
  "title": "Checkout errors",
  "impact": "MAJOR"
}

→ 201 Created

Three endpoints, one key

Generate a key from a site's Settings page, then send it as a bearer token. No SDK required - plain HTTPS and JSON.

POST/api/v1/incidents

Create an incident

Same effect as clicking "New incident" in the dashboard - fires the same AI summary refresh and subscriber emails a manually-created incident does.

FieldTypeRequired
titlestringRequired
impact"MINOR" | "MAJOR" | "CRITICAL"defaults to MINOROptional
componentIdstringleave unset for an unlinked incidentOptional
messagestringposts an initial INVESTIGATING updateOptional
Request
curl -X POST https://api.statusspy.com/api/v1/incidents \
  -H "Authorization: Bearer ssk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Elevated error rates on checkout",
    "impact": "MAJOR",
    "message": "Investigating a spike in 500s from the payments service."
  }'
Response
{
  "id": "a1b2c3d4-...",
  "title": "Elevated error rates on checkout",
  "impact": "MAJOR",
  "status": "INVESTIGATING",
  "createdAt": "2026-09-11T14:02:00.000Z"
}
POST/api/v1/incidents/:incidentId/updates

Post an incident update

Adds a new timeline entry and moves the incident to the given status - post RESOLVED to close it, same as the last update in the dashboard's timeline.

FieldTypeRequired
messagestringRequired
status"INVESTIGATING" | "IDENTIFIED" | "MONITORING" | "RESOLVED"Required
Request
curl -X POST https://api.statusspy.com/api/v1/incidents/a1b2c3d4-.../updates \
  -H "Authorization: Bearer ssk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "message": "Deploy rolled back, error rates back to normal.",
    "status": "RESOLVED"
  }'
Response
{
  "id": "e5f6a7b8-...",
  "message": "Deploy rolled back, error rates back to normal.",
  "status": "RESOLVED",
  "postedAt": "2026-09-11T14:18:00.000Z"
}
POST/api/v1/components/:componentId/status

Set a component's status

For a component your own internal check knows more about than a public ping - setting a status by hand turns off auto-sync-from-monitors for it, same as doing it from the dashboard.

FieldTypeRequired
status"OPERATIONAL" | "DEGRADED_PERFORMANCE" | "PARTIAL_OUTAGE" | "MAJOR_OUTAGE" | "UNDER_MAINTENANCE"Required
Request
curl -X POST https://api.statusspy.com/api/v1/components/c9d0e1f2-.../status \
  -H "Authorization: Bearer ssk_live_..." \
  -H "Content-Type: application/json" \
  -d '{ "status": "UNDER_MAINTENANCE" }'
Response
{
  "id": "c9d0e1f2-...",
  "name": "Payments API",
  "status": "UNDER_MAINTENANCE"
}

Frequently asked questions

Generate a key and try it

Sign up, open a site's Settings tab, and generate an API key - no waitlist, no separate application.