Synthesia callbackId vs Sume Idempotency-Key for per-recipient videos

Synthesia suggests a customer email in callbackId to tie videos to requests. On Sume the per-recipient tag is your Idempotency-Key plus your own table.

5 min readSume
All posts

Synthesia's create-video request accepts a callbackId string whose documented use is linking a video to your request, and the reference suggests a customer email for personalization. The Sume pages I checked have no field of that name on Format runs or video jobs (some jobs, such as music, take a caller metadata field; check the model's page). To tie a rendered video to one recipient on Sume, send a stable Idempotency-Key per recipient and keep the mapping from job or run id to recipient in your own table. Webhooks repeat request_id, which is what you dedupe on.

Synthesia details come from its create-video reference and API overview, read 2026-10-04.

What callbackId does

The field is an opaque string you choose. The reference positions it as the link between a video and the request that made it, so a completion notification can be matched to a row without a lookup by video id. The page does not describe length limits or uniqueness rules, so treat it as a plain label.

What Sume offers for the same job

Sume splits the work into three handles. The Idempotency-Key header on a create call makes a retry safe: replaying a spent key returns the original acceptance rather than a second paid render. The job or run id that comes back is the durable handle. A per-item webhook URL, on Format runs, delivers one signed terminal event for that item.

For batches, bulk runs take 1 to 100 items with a concurrency of 1 to 16. The queue object has no webhook of its own, so each item carries its own communication.webhook_url, and the batch itself takes one fresh idempotency key per batch, so the per-recipient mapping stays in your own table keyed by each child run id.

Matching a finished video to a recipient (read 2026-10-04)
NeedSynthesiaSume
Label sent with the requestcallbackIdYour own table keyed by job id or run id
Retry safety on createNot described on the reference pageIdempotency-Key header, or idempotency_key in a bulk body
Completion noticeWebhook configured for the accountjob.completed for model jobs; format.run.terminal for Format runs
Dedupe key on a noticeNot describedrequest_id, repeated on every retry

A recipient-keyed pattern

Derive the key from something stable that is not the raw email. A hash of campaign, version and recipient id works: the same triple always reuses the same key, and a new script version gets a new one. Write the intent row before you submit, so a crash between submit and save cannot orphan a paid job.

  • Key = hash(campaign, version, recipient id).
  • Row = key, job or run id, status, media URL.
  • On webhook, look up by request_id and ignore a second delivery.
  • Never put a plain email in a URL or key.

What to watch

Changing the body under an existing key is a conflict, not a silent overwrite, so change the key when the script changes. Also remember a webhook can arrive twice; the receiver must be idempotent. The run webhooks page lists the delivery rules and the cookbook has receivers in Node and Python.

Sources

Related posts

More in Comparisons

All Comparisons posts

Written by Sume