---
title: "Backfill Incident"
description: "Records a past, already resolved incident with its real times on status pages, without notifying anyone."
---

`POST /api/incidents/backfill`

Records an incident that is already over, like "Backfill incident" on Atlassian Statuspage: an outage you handled without the status page, or before it existed. You give the real start and end and, optionally, timeline updates with their own times. The incident is created resolved and appears on the named status pages:

- in the incident history of every layout, with its updates,
- in the uptime bars of the affected **manual** components (layout `statusboard`), when its impact is `partial_outage` or `major_outage` (`degraded` and `maintenance` do not count as downtime). Monitor components keep the bars measured by their monitor.

It is recorded **silently**: no email, webhook, Slack or Teams notification, and no entry in the RSS/Atom feed, regardless of the pages' subscription settings. Later changes follow the normal endpoints (for example [Post Incident Update](/api/monitoring/post-incident-update) with its own `notifySubscribers`).

This is what "Backfill incident" in the status pages module and the MCP tool `backfill_incident` do. Not idempotent: a repeated call records a second incident.

## Authentication

Requires role `admin` or `editor` (or an organization API token). Every page in `statusPageIds` must belong to your organization (otherwise `404 statusPageNotFound`) and be within your customer scope; without `customerId` the incident belongs to the organization, so a customer-scoped login or token gets `403 forbidden`. Needs the status pages module (`403 statusPagesModuleDisabled`).

- Header: `Authorization: Bearer <token>`

## Request Body

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `title` | string | yes | Headline, 1 to 200 characters. |
| `severity` | string | yes | `minor`, `major`, `critical` or `maintenance`. |
| `startedAt` | string | yes | ISO 8601 start, in the past. |
| `resolvedAt` | string | yes | ISO 8601 end, in the past and after `startedAt`. |
| `statusPageIds` | array | yes | Status pages (id or publicId), 1 to 10. A page without one of `componentIds` gets the incident page-wide. |
| `componentIds` | array | no | Affected components (id or publicId), at most 100; each must belong to one of `statusPageIds`. |
| `impact` | string | no | `degraded`, `partial_outage`, `major_outage` or `maintenance`. Default from `severity` as in [Create Manual Incident](/api/monitoring/create-manual-incident). |
| `componentImpacts` | array | no | Impact of single components, `[{ "componentId": 8, "impact": "major_outage" }]`; each must also be in `componentIds`. |
| `customerId` | integer | no | Customer the incident belongs to. With it, only pages without a customer or of that customer. |
| `summary` | string | no | Up to 5,000 characters. |
| `updates` | array | no | Up to 50 timeline updates `{ "status", "body", "createdAt" }`: `status` is `investigating`, `identified`, `monitoring` or `resolved`, `body` 1 to 5,000 characters, `createdAt` an ISO 8601 time between `startedAt` and `resolvedAt`. |

**Time rules:** `startedAt` must be before `resolvedAt` and every update time between them (`400 invalidDateRange`); no time may be in the future (`400 backfillInFuture`); `startedAt` may be at most 90 days before the oldest of the named pages was created, the span the uptime bars cover (`400 backfillTooOld`). Unknown fields are rejected with `400 invalidRequestBody`.

## Example (cURL)

```bash
curl -X POST "$BASE_URL/api/incidents/backfill" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Payments failed",
    "severity": "major",
    "startedAt": "2026-10-20T08:10:00Z",
    "resolvedAt": "2026-10-20T09:25:00Z",
    "statusPageIds": [12],
    "componentIds": [44],
    "impact": "major_outage",
    "updates": [
      { "status": "investigating", "body": "Card payments fail.", "createdAt": "2026-10-20T08:15:00Z" },
      { "status": "resolved", "body": "The provider fixed the outage.", "createdAt": "2026-10-20T09:25:00Z" }
    ]
  }'
```

## Response

`201 Created`

```json
{
  "incident": {
    "id": 5188,
    "publicId": "c1d6e0b2-7a4f-4f1e-8b33-0e9a5d2c7f18"
  }
}
```

## Common Errors

- `400 Bad Request` (`invalidRequestBody`) when a required field is missing, a value has the wrong type, `componentImpacts` names a component outside `componentIds`, or an unknown field is sent
- `400 Bad Request` (`invalidDateRange`) when `startedAt` is not before `resolvedAt` or an update time is outside them
- `400 Bad Request` (`backfillInFuture`) when a time is in the future
- `400 Bad Request` (`backfillTooOld`) when `startedAt` is more than 90 days before the oldest named page was created
- `400 Bad Request` (`statusPageComponentNotOnPage`, `statusPageCustomerMismatch`, `invalidIdentifier`) for components or pages that do not fit
- `401 Unauthorized` when not authenticated
- `403 Forbidden` (`forbidden`, `statusPagesModuleDisabled`) when your role or scope does not allow it or the module is off
- `404 Not Found` (`statusPageNotFound`, `statusPageComponentNotFound`) when a page or component does not exist in your organization
