A v2 webhook receives an HTTPS POST for each event it subscribes to. This page lists
every event and its payload. How to create webhooks, verify signatures and handle retries is on the
Webhooks page.
The delivery id, d_ + 32 hex characters. Same as the HT-Delivery header; stable across retries and redeliveries. Deduplicate on it.
event
string
The event name (case-sensitive).
occurredAt
integer
When the event happened, Unix seconds (not when this attempt was sent).
apiVersion
string
Always "v2".
data
object
The event’s payload - see below.
Members with no value are omitted. New members may be added; ignore ones you do not know.
Headers: HT-Event, HT-Delivery, HT-Webhook, HT-Attempt, HT-Signature, and the Standard Webhooks trio
webhook-id, webhook-timestamp, webhook-signature, plus any custom headers you configured.
An alert-grade down transition - after recheck confirmation and any alert delay.
webhooks whose scope covers the monitor
yes
monitor.up
The matching recovery.
scope
yes
monitor.repeatedlyDown
The “still down” reminder tier is reached.
scope
yes
incident.opened
A down episode opens - every episode, including one inside a maintenance window.
scope
yes
incident.closed
The episode resolves.
scope
yes
monitor.created
A monitor is created (one event per monitor, including each one in a bulk create).
scope
no
monitor.updated
A monitor’s configuration changes (one per monitor, including bulk updates).
scope
no
monitor.deleted
A monitor is deleted (one per monitor, including bulk deletes).
scope
no
maintenance.ended
A maintenance window ends on schedule (endedEarly: false) or is cancelled while active (endedEarly: true).
scope
on schedule: yes; cancel: no
certificate.expiring
An SSL certificate check crosses a warning threshold.
scope
yes
domain.expiring
A domain expiry check crosses a warning threshold.
scope
yes
contact.confirmed
A contact becomes confirmed.
every enabled webhook of the account subscribed to it (scope does not apply)
no
contact.updated
A contact’s configuration changes, including bulk updates and a create that resolves to an existing contact.
account-wide, as above
no
job.completed
An async job reaches succeeded, partial, failed or cancelled. Callback only.
the webhook named in the job request’s callback
no
job.progress
A running job reports progress (throttled). Callback only, with callback.on: "progress".
the callback webhook
no
There is no maintenance.started event. GET /webhook returns the live catalogue in summary.eventTypes, and the
OpenAPI document (/openapi/v2.json) publishes each payload schema under webhooks.
contact.confirmed: contactId, type (email, sms, …), address, confirmedAt, via (code - a code
was entered; inherit - the address was already confirmed on the account).
contact.updated: data is the full contact, as GET /contact/{id} returns it. This event is the only way to hear
about contact edits - GET /contact?updatedSince= does not show them.