IncidentsPOST /incidents

POST /incidents

Create incident (draft or published)

Request body

{
  "title": "string",
  "severity": "minor",
  "affected_services": [
    "string"
  ],
  "visible_to_customer_ids": [
    "string"
  ],
  "publish": true,
  "initial_message": null,
  "postmortem_url": null
}

Example request

curl -X POST "/api/v1/incidents" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d "{"title":"string","severity":"minor","affected_services":["string"],"visible_to_customer_ids":["string"],"publish":true,"initial_message":null,"postmortem_url":null}"

Responses

200: created

{
  "id": "string",
  "title": "string",
  "type": "Incident",
  "severity": null,
  "state": "draft",
  "published_at": null,
  "resolved_at": null,
  "scheduled_start_at": null,
  "scheduled_end_at": null,
  "actual_start_at": null,
  "actual_end_at": null,
  "canceled_at": null,
  "postmortem_url": null,
  "affected_services": [
    {
      "id": "string",
      "name": "string"
    }
  ],
  "visible_to_customer_ids": [
    "string"
  ],
  "messages": [
    {
      "id": "string",
      "type": "Investigating",
      "description": "string",
      "date": "2026-01-01T00:00:00.000Z"
    }
  ],
  "created_at": "2026-01-01T00:00:00.000Z"
}

400: invalid request

One of:

  • invalid_json — the body is not valid JSON.
  • invalid_titletitle is required.
  • invalid_severityseverity is not one of the accepted values.
  • invalid_postmortem_urlpostmortem_url must be an http(s) URL.

401: missing or invalid bearer token

title: unauthenticated. No bearer token was sent, or the key is invalid or revoked. detail distinguishes the two.

403: missing required scope

title: forbidden. The key is valid but does not carry write:incidents.

429: rate limit exceeded

title: rate_limited. A burst or daily limit was exceeded; detail names which. The body carries retry_after in seconds.

500: internal error

title: internal_error. An unhandled server error. Safe to retry.

Every error is an RFC 7807 problem detail served as application/problem+json:

{
  "type": "https://observer.example/problems/forbidden",
  "title": "forbidden",
  "status": 403,
  "detail": "missing scope: write:incidents"
}

Branch on title, not on detail. See Errors and status codes for the full catalogue and the rate-limit headers.