Retries and delivery log
Every event is delivered with retries. This page documents the schedule, the auto-disable rule, and the delivery log endpoint you can use to debug.
What counts as a failure
Section titled “What counts as a failure”- The endpoint did not answer within 10 seconds.
- The endpoint returned a non-2xx status.
- The TCP connection was refused, reset, or timed out.
Anything else is a success and the delivery is marked done.
Retry schedule
Section titled “Retry schedule”Failed deliveries are retried with exponential backoff:
| Attempt | Delay before retry |
|---|---|
| 1 | (initial) |
| 2 | 30 seconds |
| 3 | 2 minutes |
| 4 | 10 minutes |
| 5 | 1 hour |
| 6 | 6 hours |
After the sixth attempt the delivery is abandoned and the event is dead-lettered. The webhook subscription itself is unaffected by a single dead-lettered event.
Auto-disable
Section titled “Auto-disable”If a subscription accumulates five failed deliveries within a rolling one-hour window, is_enabled is set to false and auto_disabled_at is timestamped. Nothing is delivered until you re-enable via PATCH /webhooks/{id} with {"is_enabled": true}. Fix the endpoint first.
Auto-disable does not delete pending retries. Once you re-enable, queued retries resume.
Delivery log
Section titled “Delivery log”GET /api/v1/webhooks/{id}/deliveries?limit=25Response:
{ "object": "list", "data": [ { "object": "webhook_delivery", "id": "whd_9c2b1a3f4d5e6708", "event_id": "evt_2b3c4d5e6f708", "event_type": "content.published", "attempt": 2, "status": "delivered", "status_code": 200, "duration_ms": 132, "delivered_at": "2026-07-19T13:00:34Z" }, { "object": "webhook_delivery", "id": "whd_8b1a0e2c3d4f5", "event_id": "evt_2b3c4d5e6f708", "event_type": "content.published", "attempt": 1, "status": "failed", "status_code": 502, "response_body": "<html>...bad gateway...</html>", "duration_ms": 1204, "delivered_at": "2026-07-19T13:00:04Z" } ], "has_more": true}response_body is truncated to 8 KB. status is delivered, failed, or pending_retry.
Debugging tips
Section titled “Debugging tips”- 502 or 503 on retries only. Your endpoint is up but slow. Return
2xximmediately and process asynchronously. - Every attempt returns 401. Verifier is rejecting the signature. Confirm you are hashing the raw body, not the parsed JSON.
- Duplicates. Not a bug. Use
event_idfor idempotency.