Reports
A running incident report with a shareable status page. Write it in Markdown from the phone while the incident is still going.
A report belongs to a project and optionally labels one alert. It gets an unguessable public URL at /public/reports/{uuid} on the service’s host, and can be put behind a password.
POST /v1/projects/{id}/reports
{
"title": "Checkout degraded, 2026-09-01",
"description": "Gateway timeouts from 03:12 UTC. Payments retried; no orders lost.",
"alert_id": "…",
"view_password": "correct-horse"
}
| Field | Meaning |
|---|---|
title | Up to 256 characters. |
description | Up to 4096. |
alert_id | Optional. Must name a live alert when the report is created. |
view_password | Optional. Readers of the public page must enter it. On update: omitted keeps it, "" clears it, a value replaces it. |
The response carries public_uuid and password_protected. POST /v1/projects/{id}/reports/{rid}/rotate-uuid invalidates every link handed out so far and mints a new one.
Entries
Entries are the timeline. Each is Markdown, rendered once to sanitized HTML at write time.
POST /v1/projects/{id}/reports/{rid}/entries
{ "title": "Root cause", "content_md": "Upstream gateway rotated its TLS cert …", "entry_type": "analysis" }
entry_type is update, analysis or resolution, default update. PUT and DELETE …/entries/{eid} edit and remove.
The public page
GET /public/reports/{uuid} renders the report and its entries without any credential. A password-protected report shows a prompt; POST /public/reports/{uuid}/authenticate with the password unlocks it. Deleting the report, or its project, makes the page stop resolving.
In the app: Reports → New, then Share for the link.