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.

5 min readSume
All posts

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.

Webhook delivery facts for generation jobs (read 2026-10-07)
ItemValue
Automatic attemptsUp to 10
SpacingFixed, 30 seconds by default
Timeout per attempt10 seconds
Redeliver endpointPOST /v1/jobs/{job_id}/webhook/redeliver
Scope for redeliverjobs:write
Delivery statespending, 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

All Developers posts

Written by Sume