Sume webhook failed 10 times? Redeliver the job event, don't resubmit
After 10 refused attempts a Sume job webhook stops, but the job is done. Read the job, then POST /v1/jobs/{job_id}/webhook/redeliver for a fresh signed event.

When your endpoint was down for a 30-second Seedance or Wan job, call POST /v1/jobs/{job_id}/webhook/redeliver with a key that has jobs:write. Sume re-sends the real terminal event with a fresh timestamp and signature, even after all 10 automatic attempts are spent.
Do not submit the job again. The job reached its real terminal state, and only the delivery failed.
How delivery behaves
Sume makes up to 10 attempts in total, with a fixed delay between them (30 seconds by default) and a 10-second timeout on each. A slow endpoint uses the budget, and Sume retries it. After the tenth refusal the delivery is failed or exhausted, and the job is unchanged.
A manual redeliver does not use one of the 10 automatic attempts, and it never changes the destination URL. A new URL is a new job.
| Item | Value |
|---|---|
| Automatic attempts | Up to 10 |
| Spacing | Fixed, 30 seconds by default |
| Timeout per attempt | 10 seconds |
| Redeliver endpoint | POST /v1/jobs/{job_id}/webhook/redeliver |
| Scope for redeliver | jobs:write |
| Delivery states | pending, retrying, delivered, failed, exhausted |
Find the missed jobs and redeliver
Look at the job first. The job object carries webhook_delivery with its state and attempt count, so you only redeliver what failed. This script lists recent jobs, filters on the delivery state, and posts the redeliver. It reads the first page only; pass next_cursor back as starting_after for more.
import os, requests
BASE = "https://api.sume.com"
H = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"}
jobs = requests.get(f"{BASE}/v1/jobs", headers=H, timeout=30)
jobs.raise_for_status()
for job in jobs.json()["data"]["jobs"]:
delivery = job.get("webhook_delivery") or {}
if delivery.get("status") not in ("failed", "exhausted"):
continue
r = requests.post(f"{BASE}/v1/jobs/{job['id']}/webhook/redeliver",
headers=H, timeout=30)
print(job["id"], r.status_code)Make the receiver safe to hit twice
Use job_id as your idempotency key. Redeliver sends the same event again, so a receiver that copies the video on each delivery will copy it twice. Record the job id in the same transaction that stores the event.
Keep a status poll as a second path. The docs call delivery an optimization and never the only recovery route.
Sources
Related posts
More in Developers
- Sume job webhooks: 10 attempts, 30 seconds apart, at least 270 s
Ten attempts with a fixed 30-second gap cover at least 270 seconds. What that means for your deploys, cold starts and when to fall back to polling a Sume job.
- sume login --no-browser on a remote server: approve the user_code URL
On an SSH box, sume login --no-browser prints the approval URL instead of opening a browser. After you approve the user_code, the CLI stores a CLI-scoped key.
- Sume media tools: which wait for a 200 and which always return 202
Video inspect defaults to sync; trim, filter, detach, compose and timeline to async; frames is always 202. The 30 s wait and where each result is read.
- Sume music job in Python: 30-second wait, then poll, one paid job
Submit a Lyria track to Sume Music Router with a 30-second sync wait, fall back to polling on timeout, and reuse one Idempotency-Key. Runnable Python.
Written by Sume