✓ Verified 💻 Development ✓ Enhanced Data

Incidentio

Manage incidents via the incident.io REST API.

Rating
4.5 (476 reviews)
Downloads
30,746 downloads
Version
1.0.0

Overview

Manage incidents via the incident.io REST API.

Complete Documentation

View Source →

Incident.io

Manage incidents, severities, statuses, and post updates via the incident.io REST API.

Setup

  • Create an API key at Settings > API keys in the incident.io dashboard
  • Ensure the key has scopes for managing incidents and viewing organization data
  • Set the environment variable:
bash
export INCIDENTIO_API_KEY="your-api-key"

API Basics

Base URL: https://api.incident.io

Important: The API has a v1/v2 split:

  • v2 — Incidents, incident updates
  • v1 — Severities, incident statuses, incident types
All requests use this auth pattern:

bash
curl -s "https://api.incident.io/v2/..." \
  -H "Authorization: Bearer $INCIDENTIO_API_KEY" \
  -H "Content-Type: application/json"

Rate limit: 1200 requests/minute per API key.

Pagination: Use page_size (max 250) and the after cursor from pagination_meta.after in responses.

List Severities

Severities are organization-specific. Always fetch them before creating an incident to get valid IDs.

bash
curl -s "https://api.incident.io/v1/severities" \
  -H "Authorization: Bearer $INCIDENTIO_API_KEY" | jq '.severities[] | {id, name, rank}'

List Incident Statuses

bash
curl -s "https://api.incident.io/v1/incident_statuses" \
  -H "Authorization: Bearer $INCIDENTIO_API_KEY" | jq '.incident_statuses[] | {id, name, category}'

Status categories: triage, live, learning, closed, declined, merged, canceled.

List Incident Types

bash
curl -s "https://api.incident.io/v1/incident_types" \
  -H "Authorization: Bearer $INCIDENTIO_API_KEY" | jq '.incident_types[] | {id, name, is_default}'

Create an Incident

Required fields: idempotency_key, visibility. A severity_id is needed to open an active incident.

bash
curl -s -X POST "https://api.incident.io/v2/incidents" \
  -H "Authorization: Bearer $INCIDENTIO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "idempotency_key": "unique-key-123",
    "name": "Database connection pool exhaustion",
    "summary": "Primary DB connection pool at 100% causing request failures",
    "severity_id": "SEVERITY_ID",
    "visibility": "public",
    "mode": "standard"
  }' | jq '.incident | {id, reference, name, permalink}'

Optional fields:

  • incident_type_id — set a specific incident type
  • incident_status_id — override the default starting status
  • modestandard (default), retrospective (no Slack announcement), or test (no alerts)
  • visibilitypublic or private
  • custom_field_entries — array of {custom_field_id, values: [{value_link}]}
  • incident_role_assignments — array of {incident_role_id, user: {id}}
  • incident_timestamp_values — array of {incident_timestamp_id, value}
Always generate a unique idempotency_key per incident (e.g. a UUID or descriptive slug).

Get an Incident

bash
curl -s "https://api.incident.io/v2/incidents/INCIDENT_ID" \
  -H "Authorization: Bearer $INCIDENTIO_API_KEY" \
  | jq '.incident | {id, reference, name, summary, status: .incident_status.name, severity: .severity.name, created_at, permalink}'

List Incidents

bash
curl -s "https://api.incident.io/v2/incidents?page_size=25" \
  -H "Authorization: Bearer $INCIDENTIO_API_KEY" \
  | jq '.incidents[] | {id, reference, name, status: .incident_status.name, severity: .severity.name}'

Filter parameters (query string):

  • status_category[one_of]=live — filter by category (triage, live, learning, closed, declined, merged, canceled)
  • status[one_of]=STATUS_ID — filter by exact status ID (repeatable)
  • severity[one_of]=SEVERITY_ID — filter by severity (repeatable)
  • severity[gte]=SEVERITY_ID / severity[lte]=SEVERITY_ID — filter by severity rank
  • created_at[gte]=2024-01-01 / created_at[lte]=2024-12-31 — date range
  • mode[one_of]=standard — filter by mode
  • page_size=N (max 250) and after=CURSOR for pagination

Edit an Incident

Only provided fields are updated; omitted fields remain unchanged.

bash
curl -s -X POST "https://api.incident.io/v2/incidents/INCIDENT_ID/actions/edit" \
  -H "Authorization: Bearer $INCIDENTIO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "incident": {
      "summary": "Root cause identified: memory leak in connection pooler",
      "severity_id": "NEW_SEVERITY_ID"
    },
    "notify_incident_channel": true
  }' | jq '.incident | {id, reference, name, severity: .severity.name}'

Editable fields inside incident:

  • name, summary, severity_id, incident_status_id
  • call_url, slack_channel_name_override
  • custom_field_entries, incident_role_assignments, incident_timestamp_values
Set notify_incident_channel: true to alert responders of the change.

Close an Incident

Closing is done by setting incident_status_id to a status with category closed. First, find the closed status ID:

bash
curl -s "https://api.incident.io/v1/incident_statuses" \
  -H "Authorization: Bearer $INCIDENTIO_API_KEY" \
  | jq '.incident_statuses[] | select(.category == "closed") | {id, name}'

Then update the incident:

bash
curl -s -X POST "https://api.incident.io/v2/incidents/INCIDENT_ID/actions/edit" \
  -H "Authorization: Bearer $INCIDENTIO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "incident": {
      "incident_status_id": "CLOSED_STATUS_ID"
    },
    "notify_incident_channel": true
  }' | jq '.incident | {id, reference, name, status: .incident_status.name}'

Post an Incident Update

bash
curl -s -X POST "https://api.incident.io/v2/incident_updates" \
  -H "Authorization: Bearer $INCIDENTIO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "incident_id": "INCIDENT_ID",
    "message": "Rolling restart in progress. Monitoring connection pool metrics."
  }' | jq '.incident_update | {id, message, created_at}'

List Incident Updates

bash
curl -s "https://api.incident.io/v2/incident_updates?incident_id=INCIDENT_ID&page_size=25" \
  -H "Authorization: Bearer $INCIDENTIO_API_KEY" \
  | jq '.incident_updates[] | {id, message, created_at}'

Common Workflows

Declare and manage an incident end-to-end

  • Fetch severitiesGET /v1/severities to get valid severity IDs
  • Create incidentPOST /v2/incidents with name, severity, visibility
  • Post updatesPOST /v2/incident_updates as investigation progresses
  • Escalate if needed — Edit the incident to raise severity via POST /v2/incidents/{id}/actions/edit
  • Resolve — Edit the incident status to a closed-category status

Triage active incidents

  • List live incidentsGET /v2/incidents?status_category[one_of]=live
  • Get detailsGET /v2/incidents/{id} for each incident
  • Check updatesGET /v2/incident_updates?incident_id={id} for latest status

Notes

  • IDs are ULIDs (e.g. 01FCNDV6P870EA6S7TK1DSYDG0)
  • Severities, statuses, and types are organization-specific — always query them dynamically rather than hardcoding
  • The idempotency_key on create prevents duplicate incidents; use a unique value per request
  • mode: "test" creates test incidents that do not alert responders
  • The edit endpoint wraps fields inside an incident object, unlike the create endpoint
  • Rate limit: 1200 req/min per API key
  • Pagination: use the after cursor from pagination_meta.after in responses

Installation

Terminal bash

openclaw install incidentio
    
Copied!

💻Code Examples

-H "Content-Type: application/json"

--h-content-type-applicationjson.txt
Rate limit: 1200 requests/minute per API key.

Pagination: Use `page_size` (max 250) and the `after` cursor from `pagination_meta.after` in responses.

## List Severities

Severities are organization-specific. Always fetch them before creating an incident to get valid IDs.

-H "Authorization: Bearer $INCIDENTIO_API_KEY" | jq '.incident_statuses[] | {id, name, category}'

--h-authorization-bearer-incidentioapikey--jq-incidentstatuses--id-name-category.txt
Status categories: `triage`, `live`, `learning`, `closed`, `declined`, `merged`, `canceled`.

## List Incident Types

-H "Authorization: Bearer $INCIDENTIO_API_KEY" | jq '.incident_types[] | {id, name, is_default}'

--h-authorization-bearer-incidentioapikey--jq-incidenttypes--id-name-isdefault.txt
## Create an Incident

Required fields: `idempotency_key`, `visibility`. A `severity_id` is needed to open an active incident.

}' | jq '.incident | {id, reference, name, permalink}'

---jq-incident--id-reference-name-permalink.txt
Optional fields:
- `incident_type_id` — set a specific incident type
- `incident_status_id` — override the default starting status
- `mode` — `standard` (default), `retrospective` (no Slack announcement), or `test` (no alerts)
- `visibility` — `public` or `private`
- `custom_field_entries` — array of `{custom_field_id, values: [{value_link}]}`
- `incident_role_assignments` — array of `{incident_role_id, user: {id}}`
- `incident_timestamp_values` — array of `{incident_timestamp_id, value}`

Always generate a unique `idempotency_key` per incident (e.g. a UUID or descriptive slug).

## Get an Incident

| jq '.incidents[] | {id, reference, name, status: .incident_status.name, severity: .severity.name}'

--jq-incidents--id-reference-name-status-incidentstatusname-severity-severityname.txt
Filter parameters (query string):
- `status_category[one_of]=live` — filter by category (`triage`, `live`, `learning`, `closed`, `declined`, `merged`, `canceled`)
- `status[one_of]=STATUS_ID` — filter by exact status ID (repeatable)
- `severity[one_of]=SEVERITY_ID` — filter by severity (repeatable)
- `severity[gte]=SEVERITY_ID` / `severity[lte]=SEVERITY_ID` — filter by severity rank
- `created_at[gte]=2024-01-01` / `created_at[lte]=2024-12-31` — date range
- `mode[one_of]=standard` — filter by mode
- `page_size=N` (max 250) and `after=CURSOR` for pagination

## Edit an Incident

Only provided fields are updated; omitted fields remain unchanged.

}' | jq '.incident | {id, reference, name, severity: .severity.name}'

---jq-incident--id-reference-name-severity-severityname.txt
Editable fields inside `incident`:
- `name`, `summary`, `severity_id`, `incident_status_id`
- `call_url`, `slack_channel_name_override`
- `custom_field_entries`, `incident_role_assignments`, `incident_timestamp_values`

Set `notify_incident_channel: true` to alert responders of the change.

## Close an Incident

Closing is done by setting `incident_status_id` to a status with category `closed`. First, find the closed status ID:
example.sh
curl -s "https://api.incident.io/v2/..." \
  -H "Authorization: Bearer $INCIDENTIO_API_KEY" \
  -H "Content-Type: application/json"
example.sh
curl -s -X POST "https://api.incident.io/v2/incidents" \
  -H "Authorization: Bearer $INCIDENTIO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "idempotency_key": "unique-key-123",
    "name": "Database connection pool exhaustion",
    "summary": "Primary DB connection pool at 100% causing request failures",
    "severity_id": "SEVERITY_ID",
    "visibility": "public",
    "mode": "standard"
  }' | jq '.incident | {id, reference, name, permalink}'
example.sh
curl -s "https://api.incident.io/v2/incidents/INCIDENT_ID" \
  -H "Authorization: Bearer $INCIDENTIO_API_KEY" \
  | jq '.incident | {id, reference, name, summary, status: .incident_status.name, severity: .severity.name, created_at, permalink}'
example.sh
curl -s "https://api.incident.io/v2/incidents?page_size=25" \
  -H "Authorization: Bearer $INCIDENTIO_API_KEY" \
  | jq '.incidents[] | {id, reference, name, status: .incident_status.name, severity: .severity.name}'

Tags

#coding_agents-and-ides #api

Quick Info

Category Development
Model Claude 3.5
Complexity One-Click
Author jensastrup
Last Updated 3/10/2026
🚀
Optimized for
Claude 3.5
🧠

Ready to Install?

Get started with this skill in seconds

openclaw install incidentio