video.generation.completed on Sume? The webhook event map
OpenRouter sends video.generation.* events; Sume sends job.completed, job.failed or job.canceled with a signed body. What to change in a receiver.

A receiver written for video.generation.completed will not match on Sume: a video job with callback_url gets Sume's standard job envelope, with events job.completed, job.failed or job.canceled, signed with x-sume-webhook-signature. Map the event names and swap the verification.
Which events does each side send?
OpenRouter's page names four events, including video.generation.expired. Sume's webhooks page lists three terminal job events.
| OpenRouter page | Closest Sume event |
|---|---|
| video.generation.completed | job.completed |
| video.generation.failed | job.failed |
| video.generation.cancelled | job.canceled |
| video.generation.expired | No matching event listed |
How do I register a callback?
Pass callback_url in the /v1/videos body; it must be HTTPS. Sume POSTs once the job reaches a terminal state.
curl -X POST https://api.sume.com/v1/videos \
-H "Authorization: Bearer $SUME_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: hook-001" \
-d '{"model":"seedance-2","prompt":"A time-lapse of a flower blooming","callback_url":"https://example.com/hooks/sume"}'How is the delivery signed?
Sume signs the raw JSON body and sends x-sume-webhook-timestamp and x-sume-webhook-signature; the docs show the sume-v1=<hex> format and a verifier on the webhooks page. It is not OpenRouter's envelope, so do not reuse an OpenRouter verifier.
Should I still poll?
Keep the polling_url as a backup. See the Webhooks docs and video docs.
What else differs from OpenRouter on this route?
Sume's differences table lists the webhook envelope, idempotency and job lifecycle as deltas. Billing is reserved on submit at provider list times 1.25, and the poll response reports usage.cost as the Sume billable amount. Sending an Idempotency-Key makes retries safe, because a replay returns the original job.
The same job is also visible at GET /v1/jobs/{id}/status and GET /v1/jobs/{id}/result, which is what to poll if a delivery never arrives.
Sources
Related posts
More in Developers
- Paper edit by API: build a rough cut from transcript lines
Premiere 26.5 added Paper Edit. To do the same by API, transcribe with sentence segments, pick the lines you keep, then render those ranges as a Timeline.
- Pipedream 30-second timeout: call Sume in async mode, not sync
Pipedream HTTP workflows time out at 30 seconds by default. Sume sync waits up to 30 seconds too, so submit async and take the result by webhook or poll.
- Pipedream 512KB body limit and Sume run webhook payloads
Pipedream limits HTTP trigger bodies to 512KB by default. Sume run webhooks can carry up to 1 MiB, so plan for a slim relay or the result_url fetch.
- Remove filler words from a talking video with an API
Sume has no one-call filler remover. Transcribe with video inspect for word timings, then cut the clean ranges with video trim at $0.02 per job.
Written by Sume