External alert incidents
Create and update incidents from external alert payloads.
Alert systems can drive the incident lifecycle in Status by posting an alert and its state. The endpoint takes two shapes: a normalized alert, and a provider's own webhook body for Status to normalize.
/api/external-alertsThe normalized shape. provider and externalId together are a stable
organization-scoped identity for the alert, which is what makes a repeated
delivery a repeat rather than a second incident. Unknown fields are rejected.
providerstringverplichtWhich system raised the alert. Half of the alert's identity.
externalIdstringverplichtThe provider's own identifier for this alert. The other half — send the stable one, not one generated per delivery.
stateenumverplichtWhether the condition is currently true. This is what drives the transition; see Lifecycle behavior.
titlestringverplichtBecomes the incident's title when the alert opens one.
messagestringverplichtThe first public update on the incident.
severityenumoptioneelThe incident's impact level.
majormonitorIdsstring[]optioneelMonitors the alert concerns. Every one must belong to the key's organization.
[]regelup to 100 UUIDs, deduplicatedlabelsobjectoptioneelProvider metadata, kept on the incident for responders and used for grouping. Values may be strings, numbers or booleans; nested objects are dropped.
{}regelup to 20 entries; names 60 chars, values 200occurredAtstringoptioneelWhen the alert fired, if that differs from when you are delivering it.
ingestion timeregelISO 8601 with an offsetproviderenumverplichtSend the vendor's own payload and Status normalizes it into the same lifecycle. One webhook may carry several alerts, and each is applied in turn.
payloadunknownverplichtThe raw webhook body, exactly as the provider sent it.
monitorIdsstring[]optioneelCorrelations applied to every alert in the payload.
[]regelup to 100 UUIDs{
"incident": {
"id": "1f2e3d4c-5b6a-4788-9c0d-1e2f3a4b5c6d",
"status": "investigating",
"title": "Database unavailable",
"severity": "critical"
},
"transition": "create"
}A firing alert on an already-open incident, or a resolve. transition is
reopen, resolve or duplicate.
{
"incident": { "id": "1f2e3d4c-…", "status": "resolved" },
"transition": "resolve"
}A resolve for something that was never open, an alert the grouping rules ignored, or a provider payload — which is applied as a batch and reports counts rather than one incident.
{ "accepted": 3, "results": [{ "transition": "create" }] }Neither shape validated, a batch exceeded 100 alerts, or a correlated monitor does not belong to the organization.
Counted per organization and key. Retry-After and the RateLimit-* headers
are on the response.
curl -X POST https://status.example.com/api/external-alerts \
-H "Authorization: Bearer $STATUS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"provider": "alertmanager",
"externalId": "PABC123",
"state": "firing",
"title": "Database unavailable",
"message": "The primary connection check is failing.",
"severity": "critical",
"monitorIds": ["5a75c040-9383-4fe3-8c08-aa66c5f149d4"]
}'Lifecycle behavior
Ingestion is idempotent:
- the first firing creates an Investigating incident;
- another firing while active returns the existing incident without another update;
- a resolved event resolves the active incident;
- another resolved event is a no-op;
- a later firing reopens the same incident, clears acknowledgement, and preserves its history;
- a resolution received before any firing is acknowledged as ignored.
Every correlated monitor must belong to the key owner. Correlated status-page components are derived from those monitors, so the external incident appears on the same public surfaces as a manually or automatically declared incident. Timeline entries are public and attributed to the integration source.
External-alert ingestion is limited to 120 requests per minute per account. See API rate limits.
Group provider alerts
Use Incidents → Manage → Alert grouping to collapse noisy provider alerts
into one incident. A rule can apply to one provider or all providers and match
the normalized provider, state, severity, title, message, or labels.<name>.
Conditions can nest all, any, and none groups and use equality, set, substring,
prefix/suffix, regular-expression, numeric comparison, existence, and boolean
operators.
A matching rule can keep one incident per alert or group alerts by selected labels for a bounded time window. Grouping makes the selected label values the stable correlation key; alerts missing those values cannot join an unrelated group. Rules can also inhibit a downstream alert when a selected dependency monitor is unhealthy. Lower numeric priority wins.
The wizard's Preview tab accepts sample provider webhook bodies and shows exactly which alerts would open an incident, join a group, resolve one, or be inhibited. Use it before wiring a sender to confirm field and label normalization.