OpenRouter video webhooks vs Sume callback_url, signing, retries
OpenRouter's video guide points to a webhooks cookbook. On Sume, pass an HTTPS callback_url, verify x-sume-webhook-signature, retry with Idempotency-Key.

OpenRouter's video guide mentions a cookbook covering handling webhooks. On Sume, the same job accepts a per-request callback_url (HTTPS only); Sume POSTs its standard job webhook envelope once the job is terminal, signed with x-sume-webhook-signature, and you retry safely by sending Idempotency-Key.
OpenRouter's side is a one-line mention in its guide, so this post does not describe its payloads. Sume facts are from the video generation docs, read 2026-10-01.
What does Sume send to my callback?
Pass callback_url in the request body. Sume POSTs to it when the job reaches a terminal state. The payload is Sume's job webhook envelope, not OpenRouter's video.generation.* envelope, so a handler written for OpenRouter's events needs its own branch.
How is it signed?
Sume signs the raw JSON body and sends x-sume-webhook-timestamp and x-sume-webhook-signature headers. Verify against the raw bytes you received, not a re-serialized object, and refuse to run if your signing secret is empty. The exact verification steps are in the webhooks guide linked from the docs.
| Item | Sume behavior |
|---|---|
| Where set | callback_url in the request body |
| Scheme | HTTPS only |
| Signature header | x-sume-webhook-signature |
| Timestamp header | x-sume-webhook-timestamp |
| Envelope | Sume's standard job webhook envelope |
How do I retry safely?
Send Idempotency-Key on the create request; a replay returns the original job instead of starting a second paid one. Polling remains available beside webhooks: GET /v1/jobs/{id}/status and GET /v1/jobs/{id}/result.
What should I do?
Treat the webhook as a signal, then read the result from GET /v1/jobs/{id}/result so a missed delivery does not lose the result. Event-name mapping is covered in OpenRouter video webhook events vs Sume job events.
Sources
Related posts
More in Developers
- OpenRouter weight_exceeds_budget: never retry; Sume queue_full
OpenRouter's weight_exceeds_budget 402 will not clear on retry; in_flight_budget_exhausted will. Sume splits the same way: queue_full retries, 402 does not.
- Pipedream 750-second timeout: poll loop or Sume webhook?
Pipedream paid plans allow 750 seconds per run. Submit the Sume video job, then finish in a second workflow triggered by the webhook not a long poll loop.
- Polly async needs an S3 bucket; Sume gives a status URL and webhook
Polly's StartSpeechSynthesisTask writes audio to your S3 bucket and can notify an SNS topic. Sume TTS returns a status URL, or a signed webhook on completion.
- Polly speech marks need a separate request; Sume returns timings
Polly returns speech marks instead of audio when you ask for them: sentence, word and viseme metadata. Sume TTS returns words[] timings on the same job result.
Written by Sume