Headers
Every POST carries:Top-level body
incident.opened, incident.acknowledged, incident.resolved, or test. Always present.When the event happened, UTC, millisecond precision.
The workspace that owns the monitor.
The monitor the event is about. Always present. For
test, it’s a synthetic demo monitor.The incident this event belongs to. Present on
incident.opened, incident.acknowledged, and incident.resolved. null on test.The latest check result behind the event. Present on incident events,
null on test.org
Stable identifier for the workspace.
The workspace name as shown in the dashboard.
The URL-safe slug. Resolves to
<slug>.tallwatch.com for the public status page.monitor
Stable identifier for the monitor. Use this to correlate the opened and resolved events for one outage.
The display name the user gave the monitor.
One of
http, tcp, ping, dns, ssl, keyword, heartbeat.Present for
http and keyword monitors. Omitted for the others, which carry no URL. For protocol-specific details on other types, query the API rather than expecting them here.incident
Identifies this specific incident event. The opened and resolved events for one outage carry different ids, so use it as a dedup key, not to correlate the two. The same id is never delivered to the same channel twice.
open, acknowledged, or resolved. Tracks event: open on incident.opened, acknowledged on incident.acknowledged, resolved on incident.resolved.When the incident first opened. Present on both events.
When a user acknowledged in the dashboard, or
null if no one has yet. Set on the incident.acknowledged event and carried through on the resolved event.When the incident resolved.
null on incident.opened, set on incident.resolved.Seconds between
opened_at and resolved_at. null on incident.opened.Regions that voted the monitor down when the event fired. Codes are
fra1, iad1, hil1, sgp1, syd1, gru1. Empty on incident.resolved.check
Latency of the latest probe, in milliseconds, or
null if none recorded.A stable error category like
timeout, dns_resolve, tls_cert_invalid, or http_status. null on resolve.A human-readable detail string.
null on resolve.Example: incident.opened
Example: incident.resolved
Example: test
Fires when you click Send test alert on the channel form. The monitor is a synthetic demo, and incident and check are null, so your receiver can branch on event === "test" and short-circuit.
Deduplicating on your side
alert_dispatches guarantees Tallwatch sends each (incident_event_id, channel_id) once. But an inline retry after your receiver times out mid-response can still land the same POST twice, so make your receiver idempotent.
- Cheap: keep the last N
incident.idvalues in a TTL’d set and reject repeats. - Proper: upsert on
incident.idso any number of retries converge to one row.
With a Handlebars template
The body becomes whatever your template renders. The variables mirror this shape ({{monitor.name}}, {{incident.failing_regions}}, and so on). See Templates.