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 CreatedGenerate a key from a site's Settings page, then send it as a bearer token. No SDK required - plain HTTPS and JSON.
/api/v1/incidentsSame effect as clicking "New incident" in the dashboard - fires the same AI summary refresh and subscriber emails a manually-created incident does.
| Field | Type | Required |
|---|---|---|
| title | string | Required |
| impact | "MINOR" | "MAJOR" | "CRITICAL"defaults to MINOR | Optional |
| componentId | stringleave unset for an unlinked incident | Optional |
| message | stringposts an initial INVESTIGATING update | Optional |
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."
}'{
"id": "a1b2c3d4-...",
"title": "Elevated error rates on checkout",
"impact": "MAJOR",
"status": "INVESTIGATING",
"createdAt": "2026-09-11T14:02:00.000Z"
}/api/v1/incidents/:incidentId/updatesAdds 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.
| Field | Type | Required |
|---|---|---|
| message | string | Required |
| status | "INVESTIGATING" | "IDENTIFIED" | "MONITORING" | "RESOLVED" | Required |
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"
}'{
"id": "e5f6a7b8-...",
"message": "Deploy rolled back, error rates back to normal.",
"status": "RESOLVED",
"postedAt": "2026-09-11T14:18:00.000Z"
}/api/v1/components/:componentId/statusFor 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.
| Field | Type | Required |
|---|---|---|
| status | "OPERATIONAL" | "DEGRADED_PERFORMANCE" | "PARTIAL_OUTAGE" | "MAJOR_OUTAGE" | "UNDER_MAINTENANCE" | Required |
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" }'{
"id": "c9d0e1f2-...",
"name": "Payments API",
"status": "UNDER_MAINTENANCE"
}Sign up, open a site's Settings tab, and generate an API key - no waitlist, no separate application.