Synthesia video.completed webhook: the download URL is time-limited
Synthesia sends video.completed and video.failed, and its download URL is time-limited. Sume sends job.completed, job.failed and job.canceled with durable URLs.

Synthesia's webhook has two event types, video.completed and video.failed, and the download field in the payload is a time-limited URL, available only when the status is complete. So copy the file to your own storage when the event arrives. Sume sends terminal events named job.completed, job.failed and job.canceled, and its media URLs do not expire.
Synthesia details are from its webhook events page, read 2026-10-01. Sume details are from the OpenAPI document, Format runs and Structured output.
What does the Synthesia payload contain?
The envelope has a type and a data object. The page lists status values in_progress, complete, error and rejected. The captions and thumbnail objects also carry time-limited URLs. The page does not give a lifetime for them, so do not assume one.
| Synthesia | Sume | |
|---|---|---|
| Events | video.completed, video.failed | job.completed, job.failed, job.canceled |
| Result URL | Time-limited download | Durable media.sume.com URL, does not expire |
| Expiry field | Not given a lifetime | expires_at is null for durable URLs |
| Progress callbacks | Only the two events listed | None; terminal-only, keep polling as backup |
What does a Sume webhook delivery guarantee?
The OpenAPI description says delivery is terminal-only, with no progress or partial callbacks, and that you should keep status_url polling available as a backup. Handle a missed callback by polling, not by waiting. Retry behavior is in the webhook retry schedule.
Do Sume media URLs expire?
No. The docs say media URLs are durable media.sume.com HTTPS URLs that do not expire, are public to anyone holding the URL, and are served as public, max-age=31536000, immutable. You can store the URL against your own record. If you need per-customer access control, proxy or copy the file.
What should I store from each?
For Synthesia, store the video id and copy the file out of the time-limited URL promptly. For Sume, store the job id and the result URL. In both cases, make the handler idempotent: assume an event can arrive more than once, so a retry should not create a second record.
Sources
Related posts
More in Developers
- Take It Down Act 48-hour removal for AI video apps and URLs
The FTC enforces a 48-hour removal duty on covered platforms. If your AI video app serves generated MP4s from durable public URLs, here is what to plan for.
- Per-task cost in the API response: Runway vs Sume usage.cost
Runway task responses carry a credit cost, estimated while running and final on completion. On Sume, read usage.cost on the job, a USD billable amount.
- Temporal Activity ID policies are not a Sume Idempotency-Key
Temporal's Conflict and Reuse policies dedupe Activity IDs inside Temporal. They never reach Sume, so a paid submit still needs its own Idempotency-Key.
- Temporal Maximum Attempts 1 and a paid Sume submit
Standalone Activities default to at-least-once retries. Maximum Attempts 1 gives at-most-once, but a Sume Idempotency-Key lets you keep retries safely.
Written by Sume