Postmortem und Nachbereitung
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.
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 (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.
POST /api/im/causes
Content-Type: application/json
{ "name": "Abgelaufenes TLS-Zertifikat" }201 Created
{
"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.
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
{
"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.
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 (Standard Europe/Berlin). Die Antwort nennt sie als timezone, dazu postmortemMinSeverity und den Berechnungszeitpunkt asOf.
GET /api/im/follow-up200 OK
{
"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 publicIds) 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.
POST /api/im/quarterly-reviews
Content-Type: application/json
{ "quarter": "2026-Q3", "note": "Mit dem ISMS-Team geprüft" }201 Created
{
"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
Ausgehende Integrationen
Incident-Management-Ereignisse an Slack, Microsoft Teams, Discord, Jira, PagerDuty, Opsgenie oder einen generischen Webhook weiterleiten, Zustellungen einsehen und erneut senden.
Meldefälle (NIS-2)
Einen NIS-2-Meldefall führen: Kriterien, Entscheidung zur Meldepflicht, Zeitpunkt der Kenntnis, Fristen, Berichtsentwürfe und das Protokoll Ihrer Abgaben im BSI-Portal.