Sume run webhook retries: ten attempts span about 3 hours

Ten delivery attempts with 30-second doubling backoff capped at one hour add up to 11,010 seconds before jitter. The timeline, and what to do after exhaustion.

5 min readSume
All posts

Sume retries a run webhook up to 10 attempts in total. Using the documented backoff of 30 seconds doubling per attempt and capped at one hour, the nine waits between attempts add up to 11,010 seconds, about 3 hours 3 minutes, before jitter, any Retry-After header, and the 10-second timeout of each attempt.

The documented delivery behavior

The run webhooks page gives the delivery table. Success is any 2xx. Each attempt times out after 10 seconds. Redirects are not followed, so a 3xx counts as a failed attempt. After 10 attempts, webhook_delivery.status is exhausted. The backoff is min(max(30s x 2^(attempt-1) with jitter, Retry-After), 1h).

The arithmetic

Ignoring jitter and Retry-After, the wait after each failed attempt is 30 seconds times 2 to the power of the attempt number minus one, capped at 3,600 seconds.

Backoff after each failed attempt, computed from the documented formula (read 2026-10-08)
After attemptFormulaWait (s)Running total (s)
130 x 2^03030
230 x 2^16090
330 x 2^2120210
430 x 2^3240450
530 x 2^4480930
630 x 2^59601,890
730 x 2^61,9203,810
830 x 2^7 = 3,840, capped3,6007,410
930 x 2^8 = 7,680, capped3,60011,010

What this means for an outage

If your receiver is down for longer than about 3 hours, the delivery can be exhausted even though the run is fine. The docs are explicit that a delivery outcome does not change the run: you have a failed delivery and a run that is still completed. Fetch the receipt from result_url.

A slow endpoint is the quieter risk. Each attempt has a 10-second budget, so a handler that does heavy work before returning a 2xx burns attempts. Record the event, return 2xx, then process.

After exhaustion

For Format runs, Sume documents a redeliver call, POST /v1/format-runs/{run_id}/webhook/redeliver, that needs the formats:write scope and does not use one of the automatic 10. The Redeliver control on the dashboard row works the same way. The page documents this for Format runs specifically, so for an Agent Completion or schedule run, poll status_url or result_url as your backup. A canceled run never delivers a webhook, and a skipped run does not either.

Checklist

The points that matter here, in the order you will hit them:

  • Keep status_url polling as a backup for runs that matter.
  • Dedupe on request_id; it is stable across retries.
  • Alert when webhook_delivery.status is exhausted.
  • Do not follow redirects in your own router; Sume will not.

Worst-case time in flight

The 11,010 seconds above counts only the waits. Each attempt can also run for up to 10 seconds before it times out, and there are ten of them, adding at most 100 seconds. The worst case is therefore about 11,110 seconds, or 3 hours 5 minutes 10 seconds, before jitter and any Retry-After value. Retry-After can only lengthen a wait, because the formula takes the maximum of the backoff and the header, and the result is still capped at one hour.

Sources

Related posts

More in Developers

All Developers posts

Written by Sume