REST API incidents
List, acknowledge, and resolve incidents from code.
curl "https://api.drumbeats.io/v1/incidents?project_id=<project-id>&status=OPEN" \
-H "X-API-Key: dk_live_<key>"curl "https://api.drumbeats.io/v1/incidents?project_id=<project-id>&status=OPEN" \
-H "X-API-Key: dk_live_<key>"List incidents#
GET /v1/incidents?project_id=<project-id>GET /v1/incidents?project_id=<project-id>| Parameter | Required | Notes |
|---|---|---|
project_id | yes | Project to list for |
status | no | OPEN, ACKNOWLEDGED, or RESOLVED |
event | no | MISSED, FAILED, DURATION_HIGH, DURATION_LOW, or SSL_EXPIRING |
monitor_id | no | One monitor, which must belong to the project |
page | no | Default 1 |
limit | no | Default 20, max 200 |
status and event each take several values, comma-separated. This is how you ask for everything still outstanding:
curl "https://api.drumbeats.io/v1/incidents?project_id=<id>&status=OPEN,ACKNOWLEDGED" \
-H "X-API-Key: dk_live_<key>"curl "https://api.drumbeats.io/v1/incidents?project_id=<id>&status=OPEN,ACKNOWLEDGED" \
-H "X-API-Key: dk_live_<key>"An unrecognised value fails the whole request with 400 and a message listing what is accepted.
{
"data": [
{
"id": "<incident-uuid>",
"monitor_id": "<monitor-uuid>",
"project_id": "<project-uuid>",
"monitor": {
"id": "<monitor-uuid>",
"name": "Daily backup job",
"slug": "daily-backup",
"project_id": "<project-uuid>"
},
"event": "MISSED",
"cause": "Missed check-in",
"status": "OPEN",
"started_at": "2026-08-01T02:10:00.000Z",
"acknowledged_at": null,
"acknowledged_by": null,
"resolved_at": null,
"resolved_by": null
}
],
"pagination": { "page": 1, "limit": 20, "total": 1, "total_pages": 1, "has_next": false, "has_prev": false }
}{
"data": [
{
"id": "<incident-uuid>",
"monitor_id": "<monitor-uuid>",
"project_id": "<project-uuid>",
"monitor": {
"id": "<monitor-uuid>",
"name": "Daily backup job",
"slug": "daily-backup",
"project_id": "<project-uuid>"
},
"event": "MISSED",
"cause": "Missed check-in",
"status": "OPEN",
"started_at": "2026-08-01T02:10:00.000Z",
"acknowledged_at": null,
"acknowledged_by": null,
"resolved_at": null,
"resolved_by": null
}
],
"pagination": { "page": 1, "limit": 20, "total": 1, "total_pages": 1, "has_next": false, "has_prev": false }
}The status enum is OPEN, ACKNOWLEDGED, RESOLVED. There is no separate recovered state. A success ping moves an incident straight to RESOLVED and flips the monitor UP.
Get one incident#
GET /v1/incidents/<incident-id>GET /v1/incidents/<incident-id>Returns the incident with its embedded monitor summary and any acknowledge or resolve metadata.
Acknowledge an incident#
POST /v1/incidents/<incident-id>/acknowledgePOST /v1/incidents/<incident-id>/acknowledgeNeeds MEMBER or higher. Moves OPEN to ACKNOWLEDGED and records who did it.
curl -X POST https://api.drumbeats.io/v1/incidents/<incident-id>/acknowledge \
-H "X-API-Key: dk_live_<key>"curl -X POST https://api.drumbeats.io/v1/incidents/<incident-id>/acknowledge \
-H "X-API-Key: dk_live_<key>"Acknowledging pauses the paging so the rotation stops being nudged while someone works the problem. It does not resolve anything. The monitor still needs a success ping. See alert logic.
| Error | Meaning |
|---|---|
400 | The incident is not OPEN |
403 | The key lacks MEMBER on this project |
404 | Not found, or not visible to this key |
Resolve an incident#
Needs MEMBER or higher. Moves OPEN or ACKNOWLEDGED to RESOLVED, recorded against resolved_by.
| Error | Meaning |
|---|---|
400 | The incident is already RESOLVED |
403 | The key lacks MEMBER on this project |
404 | Not found |
Next#
Incidents for the lifecycle and what each state means. Alert logic for what acknowledging changes. REST API monitors for GET /v1/monitors/<id>/incidents, the monitor-scoped view.