Incidents API
Read incidents and automate them over the Servor API — create incidents, post updates and resolve them with an incidents:read or incidents:write token.
Read incidents and drive incident automation programmatically. The Incidents API is the one place where the Servor API does more than read: you can create incidents, post updates as things develop, and resolve them when the issue is fixed. That makes it ideal for wiring your own alerting or runbooks into Servor.
Reading incidents requires the incidents:read scope. Creating
incidents and posting updates requires incidents:write.
/v1/incidentsScope: incidents:readList incidents
Example request
curl https://api.servor.app/v1/incidents \
-H "Authorization: Bearer sv_live_..."Example response
[
{
"id": "uuid",
"title": "API degraded",
"status": "investigating",
"impact": "major",
"statusPageId": "uuid",
"isMaintenance": false,
"startedAt": "2026-08-20T10:00:00.000Z",
"resolvedAt": null,
"createdAt": "2026-08-20T10:00:00.000Z"
}
]/v1/incidentsScope: incidents:writeCreate an incident
Request body
titlestringrequiredShort incident title.
statusinvestigating | identified | monitoring | resolvedrequiredimpactnone | minor | major | criticalrequiredmessagestringrequiredFirst update posted with the incident.
statusPageIduuidoptionalAttach the incident to a status page.
componentIdsuuid[]optionalAffected components.
Example request
curl -X POST https://api.servor.app/v1/incidents \
-H "Authorization: Bearer sv_live_..." \
-H "Content-Type: application/json" \
-d '{"title":"<string>","status":"<investigating | identified | monitoring | resolved>","impact":"<none | minor | major | critical>","message":"<string>"}'Example response
{
"id": "uuid",
"title": "API degraded",
"status": "investigating"
}/v1/incidents/{id}Scope: incidents:readGet an incident with its timeline
Parameters
iduuidpath · requiredThe incident id.
Example request
curl https://api.servor.app/v1/incidents/:id \
-H "Authorization: Bearer sv_live_..."Example response
{
"id": "uuid",
"title": "API degraded",
"status": "identified",
"impact": "major",
"statusPageId": "uuid",
"isMaintenance": false,
"startedAt": "2026-08-20T10:00:00.000Z",
"resolvedAt": null,
"createdAt": "2026-08-20T10:00:00.000Z",
"updates": [
{
"id": "uuid",
"status": "investigating",
"message": "Looking into it.",
"createdAt": "2026-08-20T10:05:00.000Z"
}
]
}/v1/incidents/{id}/updatesScope: incidents:writePost an update (resolve with status=resolved)
Parameters
iduuidpath · requiredThe incident id.
Request body
statusinvestigating | identified | monitoring | resolvedrequiredUse "resolved" to close the incident.
messagestringrequirednotifySubscribersbooleanoptionalEmail/webhook subscribers (default true).
Example request
curl -X POST https://api.servor.app/v1/incidents/:id/updates \
-H "Authorization: Bearer sv_live_..." \
-H "Content-Type: application/json" \
-d '{"status":"<investigating | identified | monitoring | resolved>","message":"<string>"}'Example response
{
"id": "uuid",
"status": "resolved"
}Read vs. write
incidents:read— list incidents, read a single incident and its update timeline. Enough for dashboards, exports or a mirror in your own tooling.incidents:write— create incidents and post updates (including the update that resolves them). Grant it only to tokens that actually need to write.
Least privilege
If a token only needs to display incidents, give it incidents:read alone.
Keep write access on separate tokens you can revoke independently. See
scopes.
Creating an incident
An incident has a title, a status, an impact level and an opening message. You can optionally tie it to a status page and its components so it shows up publicly and notifies subscribers.
curl -X POST https://api.servor.app/v1/incidents \
-H "Authorization: Bearer sv_live_..." \
-H "Content-Type: application/json" \
-d '{
"title": "Elevated API error rate",
"status": "investigating",
"impact": "major",
"message": "We are investigating a spike in 5xx responses."
}'The response contains the new incident's id, which you use to post updates.
Posting updates and resolving
As the situation evolves, post updates to the same incident. Each update carries a
status and a message; both are added to the public timeline and notify
subscribers on the linked status page.
curl -X POST https://api.servor.app/v1/incidents/inc_123/updates \
-H "Authorization: Bearer sv_live_..." \
-H "Content-Type: application/json" \
-d '{
"status": "monitoring",
"message": "A fix has been deployed. We are watching error rates."
}'To resolve an incident, post an update with status set to resolved:
curl -X POST https://api.servor.app/v1/incidents/inc_123/updates \
-H "Authorization: Bearer sv_live_..." \
-H "Content-Type: application/json" \
-d '{
"status": "resolved",
"message": "Error rates are back to normal. Incident resolved."
}'Resolving is an update
There is no separate "close" call. An incident is resolved by posting an update
whose status is resolved — the timeline keeps the full history.
Automatic incidents
Incidents don't have to be created by hand. Servor can open one automatically when
a monitor transitions to down. See
automatic incidents for how detection works and
report an incident for the manual flow in the
dashboard — report an incident in Servor. Whichever way an incident is opened, you can post updates to it and
resolve it over the API.
A typical automation
Detect the problem
Your own alerting (or a monitor) decides something is wrong.
Open an incident
POST /v1/incidents with a title, status: "investigating" and an impact
level, tied to your status page.
Keep people posted
POST /v1/incidents/{id}/updates at each milestone — identified, monitoring,
and so on.
Resolve it
Post a final update with status: "resolved" once the issue is fixed.
Notes
- Incident updates are public on the linked status page and notify subscribers — write messages your users will read.
- A
403means your token is missing the scope for the action:incidents:readto read,incidents:writeto create or update. See errors. - A
422means the payload failed validation (for example a missingtitleor an unknownstatus); the responsedetailssay which field.