API Reference
Postmortems
Runframe V1 postmortems API. Create and retrieve postmortems for incidents.
Use this surface to create postmortems and fetch the existing postmortem for an incident.
Get Postmortem
GET /api/v1/postmortems?incident_number=<incident_number>| Parameter | Type | Description |
|---|---|---|
incident_number | string | Required incident number such as INC-2026-001 |
Response:
{
"success": true,
"data": {
"postmortem_number": "PM-2026-001",
"incident_number": "INC-2026-001",
"level": "standard",
"status": "draft",
"summary": "Short summary",
"root_cause": "Database failover saturation",
"resolution": "Scaled failover pool and tuned connection caps",
"impact": {
"duration": "27 minutes",
"users_affected": "320",
"services_affected": ["api", "dashboard"],
"revenue_impact": null
},
"impact_html": null,
"timeline": [
{
"timestamp": "2026-04-19T12:00:00.000Z",
"description": "Primary database failed over"
}
],
"timeline_html": null,
"action_items": [
{
"text": "Add replica saturation alerting",
"owner_email": "owner@example.com",
"due_date": "2026-04-26",
"status": "pending"
}
],
"action_items_html": null,
"contributing_factors": "Insufficient failover headroom",
"detection_path": "Synthetic check alerted in Slack",
"monitoring_gaps": "No queue-depth alert",
"response_timeline": {
"time_to_acknowledge": "3m",
"time_to_identify": "8m",
"time_to_resolve": "27m"
},
"response_timeline_html": null,
"five_whys": "Why 1... Why 5...",
"executive_summary": "Short executive summary",
"prevented_recurrence": "Failover capacity expanded",
"created_at": "2026-04-19T12:00:00.000Z"
}
}If a legacy postmortem section is stored as HTML instead of structured JSON, the corresponding *_html field is populated and the structured field is returned as null.
Create Postmortem
POST /api/v1/postmortemsincident_number is required. Other fields depend on your organization's configured postmortem level.
Example body:
{
"incident_number": "INC-2026-001",
"summary": "Summary of the incident",
"root_cause": "Root cause analysis",
"resolution": "Resolution summary",
"impact": {
"duration": "27 minutes",
"users_affected": "320",
"services_affected": ["api", "dashboard"]
},
"timeline": [
{
"timestamp": "2026-04-19T12:00:00.000Z",
"description": "Primary database failed over"
}
],
"action_items": [
{
"text": "Add replica saturation alerting",
"owner_email": "owner@example.com",
"due_date": "2026-04-26",
"status": "pending"
}
],
"contributing_factors": "Insufficient failover headroom",
"detection_path": "Synthetic check alerted in Slack",
"monitoring_gaps": "No queue-depth alert",
"response_timeline": {
"time_to_acknowledge": "3m",
"time_to_identify": "8m",
"time_to_resolve": "27m"
},
"five_whys": "Why 1... Why 5...",
"executive_summary": "Short executive summary",
"prevented_recurrence": "Failover capacity expanded"
}Status codes:
| Code | Meaning |
|---|---|
201 | Postmortem created |
400 | Required fields missing for your postmortem level |
401 | Authentication failed |
404 | Incident not found |
Create response:
{
"success": true,
"data": {
"postmortem_number": "PM-2026-001",
"incident_number": "INC-2026-001",
"level": "standard",
"status": "draft",
"created_at": "2026-04-19T12:00:00.000Z"
}
}