---
title: "Postmortem und Nachbereitung"
description: "Nach einem Vorfall Ursache, Lessons Learned und Maßnahmen festhalten, einen Katalog der Ursachen führen und die Nachbereitung verfolgen."
---

`GET /api/im/causes` · `POST /api/im/causes` · `PATCH /api/im/causes/:id`

`GET /api/im/incidents/:id/postmortem` · `PUT /api/im/incidents/:id/postmortem` · `POST /api/im/incidents/:id/postmortem/complete` · `POST /api/im/incidents/:id/postmortem/reopen`

`GET /api/im/postmortems` · `GET /api/im/postmortems/:id` · `POST /api/im/postmortems/:id/actions` · `PATCH /api/im/postmortems/:id/actions/:actionId` · `DELETE /api/im/postmortems/:id/actions/:actionId`

`GET /api/im/follow-up` · `GET /api/im/quarterly-reviews` · `POST /api/im/quarterly-reviews`

Nach einem gelösten Vorfall schreiben Sie dazu ein Postmortem: Zusammenfassung, Auswirkung, Ursache, eine Ursache aus dem Katalog Ihrer Organisation, Lessons Learned und Maßnahmen. Die Katalog-Ursache macht wiederholte Vorfälle zählbar: Ist NIS-2 eingeschaltet, erscheinen Ursachen, die in mindestens zwei abgeschlossenen Postmortems innerhalb von sechs Monaten vorkommen, als wiederholt (Art. 4 Durchführungsverordnung (EU) 2024/2690). **Uptimeify zählt nur. Ob eine Wiederholung erheblich ist, entscheiden Sie über einen [Meldefall](/de/api/incident-management/report-cases).**

Ein Postmortem hält eine Kopie der Vorfallsdaten. Wird der Vorfall nach 12 Monaten gelöscht, wird `incidentId` zu `null`; das Postmortem bleibt drei Jahre nach dem Abschluss erhalten.

`:id` unter `/incidents` ist die numerische ID eines IM-Incidents. `:id` unter `/postmortems` und `/causes` sowie `:actionId` sind eine `publicId` oder eine numerische `id`.

## Authentifizierung

Postmortem und Maßnahmen gehen mit Sitzung, organisationsweitem API-Token oder Agent-Token, wie die übrigen Incident-Endpunkte. Lesen braucht Zugriff auf den Incident; Schreiben braucht die Mitgliedschaft im Team des Incidents oder die Rolle `admin` (`403 imTeamMembershipRequired`). Ursachen anlegen oder ändern und ein abgeschlossenes Postmortem wieder öffnen brauchen eine Sitzung als Organisations-Admin oder [Meldeverantwortliche](/de/api/incident-management/nis2-settings) (`403 nis2OfficerRequired`). Postmortems gelöschter Incidents sehen ebenfalls nur sie. Ein Incident, Postmortem oder eine Ursache einer anderen Organisation antwortet `404`, wie ein fehlender.

## Ursachen

Der Katalog gilt für alle Postmortems Ihrer Organisation. Lesen geht mit Sitzung oder Token; Ursachen anlegen und ändern braucht eine **angemeldete Sitzung** als Organisations-Admin oder Meldeverantwortliche. API- und Agent-Tokens erhalten dort `403 nis2OfficerRequired`; die Anfragen unten laufen deshalb aus der Dashboard-Sitzung und stehen ohne Token da.

`GET /api/im/causes` antwortet `{ items, total, page, perPage }`, sortiert nach Name.

| Query | Beschreibung |
|-------|--------------|
| `includeArchived` | `true` oder `1` listet auch archivierte Ursachen. Standard `false`. |
| `page` | Standard `1`. |
| `perPage` | Standard `50`, höchstens `200`. |

`POST /api/im/causes` legt eine Ursache an und antwortet `201` mit ihr.

| Feld | Typ | Pflicht | Beschreibung |
|------|-----|---------|--------------|
| `name` | string | Ja | 1 bis 200 Zeichen, je Organisation eindeutig ohne Rücksicht auf Groß/Klein (`409 causeNameTaken`). |
| `description` | string oder null | Nein | Höchstens 2000 Zeichen. |

`PATCH /api/im/causes/:id` ändert `name`, `description` oder `archived` (`true` archiviert, `false` holt zurück) und antwortet die Ursache. Eine Ursache einer anderen Organisation oder eine unbekannte antwortet `404 causeNotFound`, ein schon vergebener Name `409 causeNameTaken`. Ursachen werden nie gelöscht: archivierte bleiben an alten Postmortems und zählen für Wiederholungen weiter.

```http
POST /api/im/causes
Content-Type: application/json

{ "name": "Abgelaufenes TLS-Zertifikat" }
```

`201 Created`

```json
{
  "id": 3,
  "publicId": "0b7f1c52-6a0e-4c4f-9d1e-2f7c9a3b8e11",
  "name": "Abgelaufenes TLS-Zertifikat",
  "description": null,
  "archivedAt": null,
  "createdAt": "2026-10-22T09:00:00.000Z",
  "updatedAt": "2026-10-22T09:00:00.000Z"
}
```

| Feld | Beschreibung |
|------|--------------|
| `archivedAt` | `null`, solange aktiv. Archivierte Ursachen fehlen in der Auswahl, bleiben an alten Postmortems und zählen für Wiederholungen weiter. |

## Postmortem eines Incidents

`GET /api/im/incidents/:id/postmortem` antwortet `404 postmortemNotFound`, solange es keins gibt. Ein Incident einer anderen Organisation oder ein unbekannter antwortet `404 imIncidentNotFound`.

`PUT /api/im/incidents/:id/postmortem` legt das Postmortem beim ersten Aufruf an und übernimmt danach die gesendeten Felder (`null` leert, leerer Text wird `null`). Unbekannte Felder oder falsche Typen antworten `400 invalidRequestBody`. Der Incident muss gelöst sein (`409 postmortemIncidentNotResolved`). Ein abgeschlossenes Postmortem nimmt keine Inhaltsänderung an (`409 postmortemCompleted`). `causeId` muss eine Ursache Ihrer Organisation sein (`404 causeNotFound`); eine archivierte Ursache darf am Postmortem bleiben, lässt sich aber nicht neu wählen (`409 causeArchived`).

| Feld | Typ | Beschreibung |
|------|-----|--------------|
| `summary` | string oder null | Höchstens 10000 Zeichen. Pflicht zum Abschließen. |
| `impact` | string oder null | Höchstens 10000 Zeichen. |
| `rootCause` | string oder null | Ursache in Ihren Worten, höchstens 10000 Zeichen. Pflicht zum Abschließen. |
| `causeId` | number oder null | Eine nicht archivierte Ursache aus dem Katalog. Pflicht zum Abschließen. |
| `lessonsLearned` | string oder null | Höchstens 10000 Zeichen. Darf leer bleiben. |

`POST /api/im/incidents/:id/postmortem/complete` schließt ab und zieht die Kopie der Vorfallsdaten neu. Es antwortet `400 postmortemIncomplete` ohne `summary` oder `rootCause`, `400 postmortemCauseRequired` ohne `causeId`, `409 postmortemCompleted`, wenn es schon abgeschlossen ist, und `409 postmortemIncidentNotResolved`, wenn der Incident nicht mehr gelöst ist.

`POST /api/im/incidents/:id/postmortem/reopen` macht es wieder zum Entwurf. Es braucht eine Sitzung als Organisations-Admin oder Meldeverantwortliche (`403 nis2OfficerRequired`), antwortet `404 postmortemNotFound`, wenn es noch kein Postmortem gibt, und ein Postmortem, dessen Incident gelöscht ist, lässt sich nicht wieder öffnen (`409 postmortemOrphaned`). Einen Entwurf wieder zu öffnen ändert nichts. Beide Endpunkte antworten das ganze Postmortem.

```bash
curl -X PUT "$BASE_URL/api/im/incidents/42/postmortem" \
  -H "Authorization: Bearer $API_TOKEN" -H "Content-Type: application/json" \
  -d '{ "summary": "Statusseite 47 Minuten nicht erreichbar", "rootCause": "Zertifikat abgelaufen", "causeId": 3 }'
```

`200 OK`

```json
{
  "id": 5,
  "publicId": "6f0c1c1e-3c55-4b55-9d7e-1f2a3b4c5d6e",
  "organizationId": 7,
  "incidentId": 42,
  "originalIncidentId": 42,
  "incidentTitle": "Statusseite nicht erreichbar",
  "incidentSeverity": "sev2",
  "incidentTriggeredAt": "2026-10-20T08:00:00.000Z",
  "incidentResolvedAt": "2026-10-20T08:47:00.000Z",
  "summary": "Statusseite 47 Minuten nicht erreichbar",
  "impact": null,
  "rootCause": "Zertifikat abgelaufen",
  "causeId": 3,
  "causeName": "Abgelaufenes TLS-Zertifikat",
  "lessonsLearned": null,
  "status": "draft",
  "completedBy": null,
  "completedAt": null,
  "createdBy": null,
  "createdAt": "2026-10-22T09:05:00.000Z",
  "updatedAt": "2026-10-22T09:05:00.000Z",
  "actions": [
    {
      "id": 11,
      "publicId": "a3c1e9d2-7b4f-4e0a-8c5d-1f2e3a4b5c6d",
      "title": "Zertifikatsablauf überwachen",
      "ownerUserId": "u_8f2c",
      "ownerName": "Jana Weber",
      "dueOn": "2026-11-30",
      "status": "open",
      "doneAt": null,
      "isOverdue": false,
      "createdAt": "2026-10-22T09:06:00.000Z"
    }
  ]
}
```

| Feld | Beschreibung |
|------|--------------|
| `incidentId` | `null`, sobald der Incident gelöscht ist (nach 12 Monaten). |
| `originalIncidentId` | Der Incident, zu dem das Postmortem gehört. Bleibt nach dem Löschen des Incidents erhalten. |
| `incidentTitle`, `incidentSeverity`, `incidentTriggeredAt`, `incidentResolvedAt` | Kopie der Vorfallsdaten, beim Abschließen neu gezogen. |
| `status` | `draft` oder `completed`. |
| `createdBy`, `completedBy` | Nutzer-ID, `null` bei Schreiben mit API- oder Agent-Token. |
| `actions[].isOverdue` | `true`, wenn die Maßnahme `open` ist und `dueOn` vor dem heutigen Tag in der Zeitzone Ihrer Organisation liegt. |

## Postmortems per ID

`GET /api/im/postmortems` listet Postmortems, neuester Incident zuerst, in der Form `{ items, total, page, perPage }`. Postmortems gelöschter Incidents erscheinen nur für Organisations-Admins und Meldeverantwortliche.

| Query | Beschreibung |
|-------|--------------|
| `status` | `draft` oder `completed`. |
| `page` | Standard `1`. |
| `perPage` | Standard `50`, höchstens `200`. |

Jeder Eintrag hat `id`, `publicId`, `incidentId`, `originalIncidentId`, `incidentTitle`, `incidentSeverity`, `incidentTriggeredAt`, `status`, `causeId`, `causeName`, `completedAt` und `updatedAt`.

`GET /api/im/postmortems/:id` liefert ein Postmortem in derselben Form wie oben, auch nachdem sein Incident gelöscht ist (dann nur für Organisations-Admins und Meldeverantwortliche). Unbekannt, fremd oder nicht sichtbar: `404 postmortemNotFound`.

## Maßnahmen

Maßnahmen lassen sich auch nach dem Abschluss des Postmortems anlegen und ändern. Schreiben braucht dieselben Rechte wie das Schreiben des Postmortems.

`POST /api/im/postmortems/:id/actions` antwortet `201` mit der Maßnahme.

| Feld | Typ | Pflicht | Beschreibung |
|------|-----|---------|--------------|
| `title` | string | Ja | 1 bis 500 Zeichen. |
| `ownerUserId` | string oder null | Nein | Ein Nutzer Ihrer Organisation (`400 postmortemActionOwnerInvalid`). |
| `dueOn` | string oder null | Nein | Kalendertag `YYYY-MM-DD`, kein Zeitpunkt (`400 invalidRequestBody`). Offene Maßnahmen nach diesem Tag sind `isOverdue`. |

`PATCH /api/im/postmortems/:id/actions/:actionId` ändert `title`, `ownerUserId`, `dueOn` oder `status` (`open`, `done`, `dropped`) und antwortet die Maßnahme. `done` setzt `doneAt`. `DELETE /api/im/postmortems/:id/actions/:actionId` antwortet `204` ohne Body; ein zweites `DELETE` antwortet `404 postmortemActionNotFound`, ebenso eine Maßnahme eines anderen Postmortems.

```bash
curl -X POST "$BASE_URL/api/im/postmortems/5/actions" \
  -H "Authorization: Bearer $API_TOKEN" -H "Content-Type: application/json" \
  -d '{ "title": "Zertifikatsablauf überwachen", "dueOn": "2026-11-30" }'
```

`201 Created` mit der Maßnahme in der Form von `actions[]` oben.

## Nachbereitung (NIS-2)

`GET /api/im/follow-up` braucht eingeschaltetes NIS-2 (`403 nis2NotEnabled`) und eine **angemeldete Sitzung** als Organisations-Admin oder Meldeverantwortliche. API- und Agent-Tokens und andere Nutzer bekommen `403 nis2OfficerRequired`; die Anfragen in diesem Abschnitt laufen deshalb aus der Dashboard-Sitzung und stehen ohne Token da. Die Antwort enthält vier Teile:

| Feld | Beschreibung |
|------|--------------|
| `notFollowedUp` | Gelöste Incidents, die ein Postmortem brauchen (Severity mindestens `postmortemMinSeverity` oder ein verknüpfter Meldefall) und kein abgeschlossenes haben. Test- und zusammengeführte Incidents zählen nie. `postmortemStatus` ist `none` oder `draft`. |
| `openActions` | Offene Maßnahmen mit `isOverdue`, früheste Fälligkeit zuerst. |
| `repeatedCauses` | Ursachen mit mindestens zwei abgeschlossenen Postmortems, deren Incidents in den letzten sechs Kalendermonaten begannen, mit den Incidents (auch gelöschten, aus der Kopie im Postmortem; dann ist `incidentId` `null`). Zusammengeführte Incidents zählen nicht. |
| `dueQuarter` | Das Vorquartal, solange es nicht abgezeichnet ist, sonst `null`. |

Quartale und Fälligkeiten rechnen in der Zeitzone aus den [NIS-2-Einstellungen](/de/api/incident-management/nis2-settings) (Standard `Europe/Berlin`). Die Antwort nennt sie als `timezone`, dazu `postmortemMinSeverity` und den Berechnungszeitpunkt `asOf`.

```http
GET /api/im/follow-up
```

`200 OK`

```json
{
  "asOf": "2026-10-22T09:00:00.000Z",
  "timezone": "Europe/Berlin",
  "postmortemMinSeverity": "sev2",
  "dueQuarter": "2026-Q3",
  "notFollowedUp": [
    { "incidentId": 812, "title": "Checkout antwortet 502", "severity": "sev1", "triggeredAt": "2026-10-20T07:12:00.000Z", "resolvedAt": "2026-10-20T08:01:00.000Z", "hasReportCase": true, "postmortemStatus": "draft" }
  ],
  "openActions": [
    { "id": 17, "publicId": "5d1e2f3a-4b5c-4d6e-8f70-81a2b3c4d5e6", "title": "Ablauf der Zertifikate überwachen", "ownerUserId": "u_8f2c", "ownerName": "Jana Weber", "dueOn": "2026-10-15", "isOverdue": true, "postmortemPublicId": "6f0c1c1e-3c55-4b55-9d7e-1f2a3b4c5d6e", "incidentId": 790, "incidentTitle": "TLS-Handshake schlägt fehl" }
  ],
  "repeatedCauses": [
    {
      "causeId": 3,
      "causePublicId": "0b7f1c52-6a0e-4c4f-9d1e-2f7c9a3b8e11",
      "causeName": "Abgelaufenes TLS-Zertifikat",
      "causeArchivedAt": null,
      "incidentCount": 2,
      "incidents": [
        { "postmortemPublicId": "6f0c1c1e-3c55-4b55-9d7e-1f2a3b4c5d6e", "incidentId": 790, "originalIncidentId": 790, "incidentTitle": "TLS-Handshake schlägt fehl", "incidentTriggeredAt": "2026-09-14T22:40:00.000Z" },
        { "postmortemPublicId": "9a8b7c6d-1e2f-4a3b-8c4d-5e6f7a8b9c0d", "incidentId": null, "originalIncidentId": 655, "incidentTitle": "API-Zertifikat abgelaufen", "incidentTriggeredAt": "2026-05-02T06:05:00.000Z" }
      ]
    }
  ]
}
```

## Quartalsprüfung (NIS-2)

Gleicher Zugriff wie bei der Nachbereitung: NIS-2 eingeschaltet (`403 nis2NotEnabled`), Sitzung als Organisations-Admin oder Meldeverantwortliche (`403 nis2OfficerRequired`).

`POST /api/im/quarterly-reviews` mit `{ "quarter": "2026-Q3", "note": "Mit dem ISMS-Team geprüft" }` zeichnet ein abgelaufenes Quartal ab (vorher `409 quarterlyReviewNotDue`) und antwortet `201`. Das früheste Quartal ist `2023-Q1` (NIS-2-Richtlinie in Kraft seit 16.01.2023); ein früheres antwortet `400 invalidRequestBody`. Jedes Quartal lässt sich einmal abzeichnen (`409 quarterlyReviewExists`), auch später nachgeholt. Die Antwort trägt einen beim Abzeichnen eingefrorenen `snapshot`: wiederholte Ursachen zum Quartalsende, offene und überfällige Maßnahmen (Anzahl und `publicId`s) und nicht nachbereitete Incidents zum Zeitpunkt des Abzeichnens. Abzeichnungen lassen sich weder ändern noch löschen und werden drei Jahre aufbewahrt. Zu Beginn jedes Quartals bekommen die Meldeverantwortlichen (ohne Verantwortliche die Organisations-Admins) eine Mail, dass die Prüfung fällig ist.

| Feld | Typ | Pflicht | Beschreibung |
|------|-----|---------|--------------|
| `quarter` | string | Ja | Kalenderquartal in der Zeitzone Ihrer Organisation, `JJJJ-QN` wie `2026-Q3`, frühestens `2023-Q1`. |
| `note` | string oder null | Nein | Höchstens 5000 Zeichen. Leerer Text wird `null`. |

Ein anderes Format, ein Quartal vor `2023-Q1`, eine zu lange Notiz oder ein unbekanntes Feld antwortet `400 invalidRequestBody`.

```http
POST /api/im/quarterly-reviews
Content-Type: application/json

{ "quarter": "2026-Q3", "note": "Mit dem ISMS-Team geprüft" }
```

`201 Created`

```json
{
  "id": 1,
  "publicId": "2c9e4f1a-8b3d-4e6f-a1c2-3d4e5f6a7b8c",
  "quarter": "2026-Q3",
  "reviewedBy": "u_8f2c",
  "reviewerName": "Jana Weber",
  "reviewedAt": "2026-10-02T08:30:00.000Z",
  "note": "Mit dem ISMS-Team geprüft",
  "snapshot": {
    "asOf": "2026-09-30T21:59:59.999Z",
    "repeatedCauses": [{ "causeId": 3, "causeName": "Abgelaufenes TLS-Zertifikat", "incidentCount": 2, "postmortemPublicIds": ["6f0c1c1e-3c55-4b55-9d7e-1f2a3b4c5d6e", "9a8b7c6d-1e2f-4a3b-8c4d-5e6f7a8b9c0d"] }],
    "openActionCount": 1,
    "openActionPublicIds": ["5d1e2f3a-4b5c-4d6e-8f70-81a2b3c4d5e6"],
    "overdueActionCount": 0,
    "overdueActionPublicIds": [],
    "notFollowedUpIncidentIds": []
  }
}
```

`GET /api/im/quarterly-reviews?page=1&perPage=50` listet die Abzeichnungen, neuestes Quartal zuerst, als `{ items, total, page, perPage }` (`perPage` höchstens 200). Jeder Eintrag hat die Form oben.

## Häufige Fehler

Siehe [Fehlercodes von Postmortem und Nachbereitung](/de/api/error-codes-and-known-pitfalls#fehlercodes-von-postmortem-und-nachbereitung).
