Sume mode webhook without a webhook_url: no delivery is armed
On a Sume Format run, communication.mode is descriptive; only a webhook_url arms delivery. Send the URL, then keep status_url as your backup.

Setting communication.mode to webhook does not turn on webhooks for a Sume Format run. The field is descriptive only: the URL arms delivery. A run with mode: "webhook" and no webhook_url has nothing to deliver to, so you must poll status_url.
What each field does
communication.mode is async (the default) or webhook. communication.webhook_url is a public HTTPS URL of up to 2048 characters, and callback_url is an accepted alias. Top-level webhook_url, callback_url and mode are fal-shaped aliases that Sume folds into communication; the same value on both layers is fine, but values that disagree return 400 invalid_request.
| Field | Effect |
|---|---|
| communication.webhook_url | Arms one terminal delivery |
| communication.callback_url | Alias for webhook_url; send one or the other |
| communication.mode | async or webhook; descriptive only |
| Top-level webhook_url / callback_url / mode | Normalized into communication; conflicts are 400 |
What arrives and what does not
When the URL is set, Sume sends one signed format.run.terminal POST when the run completes or fails. A canceled run and a skipped run send nothing. The create receipt shows webhook_delivery.status as not_armed until the run is terminal, which is normal.
- Always keep
status_urlandresult_url; a webhook is an alternative to a poll loop, not a replacement for being able to poll. - After you cancel, read the cancel response and poll
status_url. Do not wait for a POST. - If you missed a delivery,
POST /v1/format-runs/{run_id}/webhook/redeliverwithformats:writere-sends it.
Verifying on the create response
The create receipt is the cheapest test. Look for webhook_delivery.url and a status of not_armed, which means the URL is stored and no delivery is due yet. If the block is absent or the URL is empty, fix the body before you wait on a POST that cannot come.
On the receiving side, answer any 2xx within 10 seconds. Sume makes up to 10 attempts with backoff, honors a Retry-After on 429 or 503, and never follows redirects, so register the final URL.
For bulk queues the same rule applies per item: the queue has no webhook, so each child needs its own communication.webhook_url. If you forget it on some items, those children never deliver, and your batch counter will stay short even though the runs finished.
Tradeoff
Because the mode is only a label, a wrong value fails silently. Check webhook_delivery.url on the create receipt: if it is missing, no URL was stored and no POST will come.
Sources
Related posts
More in Developers
- Sume idempotency: JSON key order is ignored, array order is not
Resending a Sume job with the same fields in a different JSON key order still returns the original job. Changing an array's order or a value gives a 409.
- How long does a Sume Idempotency-Key last? The docs don't say
The Sume docs describe Idempotency-Key replay and the 409 conflict but give no lifetime. What is documented, what is not, and a safe way to design around it.
- Sume job.canceled and job.failed webhooks both say status ERROR
A Sume job.failed and a job.canceled webhook both carry status ERROR and an error object. Branch on the event name, not on status, to tell them apart.
- Sume job status logs_available is false: read events_url instead
A Sume job status carries logs_available, false while diagnostics live behind events_url. Read the events timeline for the lifecycle, not inline logs.
Written by Sume