Skip to main content
AtlaSent can send an HTTP 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

The v1-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:
You see the signing_secret only in this response. Store it in your secrets manager right away. If you lose it, call rotate_secret to get a new one.
The response also shows the max_attempts and timeout_seconds values that apply to the subscription.

What a delivery looks like

Each delivery is a POST 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:
Your receiver must:
  1. Read the raw body before you parse any JSON. Parsing and re-serializing changes the bytes and breaks the signature.
  2. Rebuild the signed string from the X-Atlasent-Timestamp header and the raw body.
  3. Compare digests in constant time.
  4. Reject the delivery if the timestamp is too old. You choose the window. Five minutes is a common choice.
  5. Return a 2xx status only after the signature checks pass.
If the check fails, return 401 and do not process the event.

Retries and failed deliveries

A 2xx 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:
The response is { "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.