Sume webhook blocked target is never retried; a DNS miss is

A blocked Sume webhook target fails once and is never retried, while a hostname that does not resolve is retried. What each looks like and how to recover.

4 min readSume
All posts

If a Sume job webhook points at a target the worker considers unsafe, the delivery is marked failed on the first attempt and is never retried. If the hostname simply does not resolve, that counts as a transient error and the worker retries, so the two failures need different fixes.

The difference matters when you debug by waiting. Waiting out the retry window fixes a DNS typo that you corrected in time; it does nothing for a blocked target. The details here come from the delivery code in the repo; the docs describe the delivery statuses and the retry counts.

The two cases side by side

Delivery happens in the worker. Before it connects, it resolves the hostname once and pins the connection to the vetted addresses, so a DNS answer cannot change between the check and the connect.

Delivery outcomes by failure type (read 2026-10-06, from the Sume worker source and docs)
SituationWhat the worker does
Target is localhost, a private or link-local address, or an internal hostnameStatus failed, no next attempt, never retried
Hostname does not resolveTransient error, retried
Receiver answers non-2xx or times out after 10 sRetried, up to 10 attempts, 30 s apart
Receiver answers a 3xx redirectCounts as a failed attempt; redirects are not followed
Receiver answers any 2xxDelivered

Why a blocked target is terminal

Retrying a request to a private address would only repeat the thing the guard exists to stop, so it does not. The status moves to failed immediately rather than to retrying, which is the easiest way to tell the cases apart when you read the job.

How to recover

Fix the URL or the DNS first. Then you have two ways to get the notification you missed.

A practical habit is to test the receiver before you ever submit a paid job. Hit the URL from a machine outside your network with curl and confirm it answers a POST with a 2xx. Then submit a short, cheap job with the webhook set and watch the job's webhook delivery status. If you see failed with no further attempt scheduled, suspect the target rule. If you see retrying, the worker still believes the problem may clear, so check your DNS and your server's logs for the incoming attempts.

  • Call POST /v1/jobs/{id}/webhook/redeliver (needs the jobs:write scope). It sends with a fresh timestamp and does not consume one of the 10 attempts.
  • Or read GET /v1/jobs/{id} and take the result from the job record, which does not depend on the webhook at all.

Tradeoffs

Redelivery depends on you noticing. Pair the webhook with a slow reconciliation poll for any job you have not heard about, so a blocked or exhausted delivery never leaves work sitting unseen.

Sources

Related posts

More in Developers

All Developers posts

Written by Sume