REST API incidents

List, acknowledge, and resolve incidents from code.

bash
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#

http
GET /v1/incidents?project_id=<project-id>
GET /v1/incidents?project_id=<project-id>
ParameterRequiredNotes
project_idyesProject to list for
statusnoOPEN, ACKNOWLEDGED, or RESOLVED
eventnoMISSED, FAILED, DURATION_HIGH, DURATION_LOW, or SSL_EXPIRING
monitor_idnoOne monitor, which must belong to the project
pagenoDefault 1
limitnoDefault 20, max 200

status and event each take several values, comma-separated. This is how you ask for everything still outstanding:

bash
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.

json
{
  "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#

http
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#

http
POST /v1/incidents/<incident-id>/acknowledge
POST /v1/incidents/<incident-id>/acknowledge

Needs MEMBER or higher. Moves OPEN to ACKNOWLEDGED and records who did it.

bash
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.

ErrorMeaning
400The incident is not OPEN
403The key lacks MEMBER on this project
404Not found, or not visible to this key

Resolve an incident#

Needs MEMBER or higher. Moves OPEN or ACKNOWLEDGED to RESOLVED, recorded against resolved_by.

ErrorMeaning
400The incident is already RESOLVED
403The key lacks MEMBER on this project
404Not 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.