POST to your endpoint when an event occurs in your
organization. Use webhooks to alert on-call engineers, feed a SIEM, or start a
downstream workflow without polling the API.
Webhooks are notifications. A webhook delivery is not a permit and does not
authorize anything. Your protected actions must still verify a permit before
they execute. See Permit verification.
Manage subscriptions
Thev1-webhooks endpoint manages subscriptions. Every call is a POST to
the same endpoint. The action field in the JSON body selects the operation.
Calls need an API key with the webhooks:write scope. Any IP allowlist on the
key applies.
Create a subscription
name must be unique in your organization and url must start with
http:// or https://. You can also send event_types (an array of event
type strings) to limit the events you receive, plus max_attempts,
timeout_seconds and is_active.
The response contains the subscription and its signing_secret:
max_attempts and timeout_seconds values that
apply to the subscription.
What a delivery looks like
Each delivery is aPOST with a JSON body and these headers:
The body has this shape:
Verify the signature
The signature is an HMAC-SHA256 of the timestamp header value, a period, and the raw request body:- Read the raw body before you parse any JSON. Parsing and re-serializing changes the bytes and breaks the signature.
- Rebuild the signed string from the
X-Atlasent-Timestampheader and the raw body. - Compare digests in constant time.
- Reject the delivery if the timestamp is too old. You choose the window. Five minutes is a common choice.
- Return a
2xxstatus only after the signature checks pass.
401 and do not process the event.
Retries and failed deliveries
A2xx response marks the delivery as delivered. Any other status, a network
error or a timeout counts as a failure. AtlaSent retries failed deliveries up
to the subscription’s max_attempts. After the last attempt fails, the
delivery moves to the dead-letter queue and no more automatic retries happen.
Because a delivery can arrive more than once, use X-Atlasent-Delivery to
drop duplicates.
To inspect failed deliveries, call list_deliveries or use the Console. To
send one again, call replay with its delivery_id. See
Webhook dead-letter queue for the Console workflow.
Test the integration
Queue a test delivery to a subscription:{ "queued": true, "delivery_id": "…" }. A test delivery
ignores the subscription’s event_types filter. It is signed the same way as
a real delivery, so your receiver’s signature check runs on it.