Retries & Replay

Repull automatically retries failed webhook deliveries with exponential backoff. You can also manually replay any delivery from the last 7 days.

Retry Schedule

When a delivery fails, Repull retries up to 5 times on the following schedule:

AttemptDelayCumulative
1st retry1 minute1 minute
2nd retry5 minutes6 minutes
3rd retry30 minutes36 minutes
4th retry2 hours~2.5 hours
5th retry24 hours~26.5 hours

What Triggers a Retry

A delivery is considered failed and will be retried if:

  • Your endpoint returns a non-2xx status code (e.g. 500, 502, 503)
  • Your endpoint does not respond within 10 seconds (request timeout)
  • The connection is refused or the DNS lookup fails

Return 200 quickly

Process webhook events asynchronously. Return a 200 status immediately, then handle the event in a background job. This prevents timeouts and duplicate deliveries.

Auto-Disable

After 20 consecutive failed deliveries (across any events), the webhook subscription is automatically disabled. You will receive an email notification when this happens. Re-enable it from the dashboard or via the API after fixing the issue.

Viewing Failed Deliveries

List recent deliveries for a webhook subscription, including status, response code, and timestamps:

curl https://api.repull.dev/v1/webhooks/wh_abc123/deliveries?status=failed \
  -H "Authorization: Bearer sk_live_YOUR_KEY"

Manual Replay

Re-deliver any webhook from the last 7 days. The replayed delivery carries the exact same payload — and the same stable eventId — as the original. The path nests the delivery under the subscription it belongs to:

curl -X POST https://api.repull.dev/v1/webhooks/wh_abc123/deliveries/del_xyz789/replay \
  -H "Authorization: Bearer sk_live_YOUR_KEY"
{
  "id": "del_new456",
  "webhook_id": "wh_abc123",
  "original_delivery_id": "del_xyz789",
  "status": "success",
  "response_code": 200,
  "replayed_at": "2026-06-15T14:30:00Z"
}

A replay is a new delivery, but the same event

Each replay is sent as a brand-new attempt: it gets a fresh X-Repull-Delivery-Id (the id in the response above). The logical event id is unchanged — it arrives in the X-Repull-Event-Id header. Always dedupe on eventId, never on the delivery id, or a replay will be processed twice.
AI