Runframe
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>
ParameterTypeDescription
incident_numberstringRequired 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/postmortems

incident_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:

CodeMeaning
201Postmortem created
400Required fields missing for your postmortem level
401Authentication failed
404Incident 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"
  }
}