Skip to content

Retries & replays

A delivery counts as successful only on a 2xx response. Anything else (a non-2xx status, a connection error, or a timeout) is retried on a backoff schedule:

1 min → 5 min → 30 min → 2 h → 5 h → 10 h → 24 h → 24 h → 24 h → 24 h

Each delay carries jitter, and the schedule spreads retries over roughly four days, so an endpoint that’s down through even a long deploy catches up on its own. Events are delivered at least once: design your handler to be idempotent (deduplicate on the event’s content, e.g. email_id + type).

  • GET /webhooks/{id}/events: recent events for an endpoint (type, payload, timestamp).
  • GET /webhooks/{id}/events/{eventId}/attempts: every delivery attempt for one event, with status code, success flag, and error detail.

POST /webhooks/{id}/events/{eventId}/replay re-delivers any event on demand, useful after fixing a handler bug, without waiting for the next scheduled retry.