Skip to content

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.

  • 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.

Failed deliveries are retried with exponential backoff:

AttemptDelay before retry
1(initial)
230 seconds
32 minutes
410 minutes
51 hour
66 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.

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.

GET /api/v1/webhooks/{id}/deliveries?limit=25

Response:

{
"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.

  • 502 or 503 on retries only. Your endpoint is up but slow. Return 2xx immediately 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_id for idempotency.