Webhooks
Delivery and retries
Atlas sends each event to your endpoint and tries again, on a fixed schedule, when a delivery fails. This page explains what counts as success, when Atlas retries, and how to inspect, replay, and test your deliveries.
Success and failure
A delivery succeeds when your endpoint answers with any 2xx status within 15 seconds. Every other outcome is a failure, and whether Atlas tries again depends on the kind of failure.
- Retried: a
5xxstatus,408,429, no answer within 15 seconds, or a network or connection error. These are usually temporary. With a429or503, aretry-afterheader, in seconds or as a date, holds the next attempt back for as long as it says, up to 24 hours, and never sooner than the schedule below, so a short or zero value does not bring a retry forward. - Final at once: any other
4xxstatus, and any redirect. A4xxusually means the request will never be accepted as it stands, so repeating it would only add load. Atlas does not follow redirects: point the webhook at the final address instead.
Retry schedule
Atlas makes up to 8 attempts. Each wait is counted from the attempt before it, and every attempt is signed again when it is sent, so its timestamp is always current.
| Attempt | When | Time since the event |
|---|---|---|
| First | As soon as the event happens | At once |
| Second | 30 seconds after the previous attempt | 30 seconds |
| Third | 2 minutes after the previous attempt | 2 minutes and 30 seconds |
| Fourth | 10 minutes after the previous attempt | 12 minutes and 30 seconds |
| Fifth | 30 minutes after the previous attempt | 42 minutes and 30 seconds |
| Sixth | 2 hours after the previous attempt | 2 hours and 42 minutes |
| Seventh | 8 hours after the previous attempt | 10 hours and 42 minutes |
| Eighth | 24 hours after the previous attempt | 34 hours and 42 minutes |
The last attempt comes 34 hours and 42 minutes after the first. If it fails too, the delivery is marked dead and kept in your delivery log, where you can replay it once your endpoint is working.
This is the standard schedule: up to 8 attempts, with waits of 30 seconds, 2 minutes, 10 minutes, 30 minutes, 2 hours, 8 hours, and 24 hours, and 15 seconds for your endpoint to answer each one.
Atlas can set a different number of attempts, different waits, or a different timeout for a workspace. Owners and administrators can read the policy in force with GET /v1/workspace/limits, or under Settings, then API access.
Make your receiver idempotent
Atlas-Event-Id of each event you process and skip one you have seen. Every attempt and every replay of an event carries the same event id.Paused webhooks
When every delivery to a webhook has failed for three days, counted from the first failure after its last successful delivery, Atlas pauses the webhook. Nothing more is sent to it until someone turns it back on, so a broken endpoint does not collect failures indefinitely.
Atlas emails the escalation contact set on the webhook, or, when there is none, every owner and administrator of the workspace. The email names the webhook, the address it points to, the last answer from your endpoint, and when the failures began. The pause is also recorded in the audit log.
Settings, then Webhooks, marks the webhook as paused and turns it back on in one step. Through the API, a paused webhook carries pausedAt; sending { "disabled": false } to PATCH /v1/webhooks/{id} resumes it and clears the field. Replay the deliveries you still need from the delivery log once your endpoint is working.
Recovered events
Atlas records every change before it sends the webhook for it. If a delivery was not queued at that moment, for example because a server restarted between the two, Atlas finds the change on its next check, which runs every minute, and queues the event then. After a restart it checks the previous 24 hours. The recovered event has the same Atlas-Event-Id it would have had, so a receiver that deduplicates on the event id processes it once.
Recovery never sends a webhook an event from before you created or last changed it, so a new, edited, or resumed webhook starts from its own moment.
Delivery log
Atlas records every delivery: the request it sent, your response, how long it took, how many attempts it has made, and when the next one is due. Read the log for one webhook or for the whole workspace, or open it from the webhook's page in Settings.
GET /v1/webhooks/{id}/deliveries?limit=50 # one webhook
GET /v1/webhook-deliveries?limit=50 # every webhook in the workspaceReplay and test
Use replay to send a past delivery again, for example after you fix your receiver. The replay is a new delivery with its own delivery id, and it carries the original event with the original event id, signed at the moment it is sent. Use test-delivery to send a subscription.test event and confirm that your endpoint is reachable and verifies signatures.
POST /v1/webhooks/{id}/deliveries/{deliveryId}/replay # send a past delivery again
POST /v1/webhooks/{id}/test-delivery # send a subscription.test eventBoth need a token with the webhooks:manage scope. The request and response shapes are in the webhooks API reference.
Ownership
Give each webhook an owner and an escalation contact, so that anyone who sees a failing delivery knows whom to ask. Set ownerLabel, escalationEmail, and escalationNote when you create or update the webhook. Atlas shows them beside the webhook and its deliveries.