Documentation menu
These are pre-release docs from the main branch.

API reference

7 operations in alerts. Raw spec: openapi.json.

GET/api/v1/alert-sources

GET /api/alert-sources — newest-first config list (no secrets).

Responses

StatusDescription
200

Security: bearer

POST/api/v1/alert-sources

POST /api/alert-sources — creates an ingest source, generates + seals its HMAC secret (returned ONCE), and writes the audit trail. Instant-first (IF1/IF2): idempotency-keyed, read-your-write response.

Request body

CreateAlertSourceRequest

Responses

StatusDescription
200
409source_ref collision or idempotency key reused
422validation failed

Security: bearer

PATCH/api/v1/alert-sources/{id}

PATCH /api/alert-sources/{id} — re-point the board, rename, resize the storm window, or disable. Instant-first (IF1/IF2).

Parameters

NameInTypeRequiredDescription
idpathstringYes

Request body

PatchAlertSourceRequest

Responses

StatusDescription
200
404source not visible in scope (rls_sparse)
409version conflict or idempotency key reused
422validation failed

Security: bearer

GET/api/v1/alerts

GET /api/alerts — newest-first ledger browse, filterable by source and incident ticket (staff, ticket-view scoped).

Parameters

NameInTypeRequiredDescription
source_idquery—No
ticket_idquery—No
statusquery—NoTriage filter (0089): "open" | "acknowledged" | "resolved" — absent returns all states.
limitqueryintegerNo
offsetqueryintegerNo

Responses

StatusDescription
200

Security: bearer

POST/api/v1/alerts/ingest/{source_ref}

POST /api/alerts/ingest/{source_ref} — HMAC-verified alert ingest.

Responses: 200 with a terminal `status` (incident_created / collapsed / duplicate); 401 missing/bad signature; 403 disabled source; 404 unknown source_ref; 409 source is a generic M2M receiver (its profile emits envelopes, so the answer names `/api/webhooks/ingest/{source_ref}`); 422 malformed payload.

Parameters

NameInTypeRequiredDescription
source_refpathstringYesPublic ingest routing id of an alert source

Request body

IngestAlertRequest

Responses

StatusDescription
200
401missing or invalid signature
403alert source disabled
404unknown source_ref
422validation failed
POST/api/v1/alerts/{id}/acknowledge

POST /api/alerts/{id}/acknowledge — triage: open → acknowledged. Instant-first (IF1/IF2): idempotency-keyed, read-your-write. Re-ack (or ack of an already-resolved alert) is a typed conflict — the state is honest, never silently rewritten.

Parameters

NameInTypeRequiredDescription
idpathstringYes

Request body

MutationParams

Responses

StatusDescription
200
404alert not visible in scope
409alert already acknowledged or resolved
422validation failed

Security: bearer

POST/api/v1/alerts/{id}/resolve

POST /api/alerts/{id}/resolve — triage: open/acknowledged → resolved. Resolving straight from `open` leaves the ack fields NULL (no acknowledgement ever happened — the row renders that honestly).

Parameters

NameInTypeRequiredDescription
idpathstringYes

Request body

MutationParams

Responses

StatusDescription
200
404alert not visible in scope
409alert already resolved
422validation failed

Security: bearer