Replicate webhook URL custom id vs Sume job_id as the key
Replicate suggests a query param like customId on the webhook URL. Sume bodies carry request_id and job_id, and job_id is the receiver's idempotency key.

Replicate's tip is to add query params to the webhook URL, such as https://example.com/replicate-webhook?customId=123, to carry an internal id. With Sume, the body of each delivery already has request_id and job_id, and the docs say receivers must treat job_id as the idempotency key.
Replicate's example is from its webhook setup page; Sume's behavior is from Webhooks, read 2026-10-01.
How do I tie a Sume callback to my own record?
Store your record id next to the job_id when you submit, then look the record up from the job_id in the delivery body. The payload shown in the docs includes event (job.completed, job.failed or job.canceled), request_id, job_id and status.
| Approach | Replicate | Sume |
|---|---|---|
| Id in the URL | Query param such as customId, per Replicate's tip | Possible, but the docs do not describe it as the key |
| Id in the body | Prediction object | job_id and request_id in the payload |
| Dedupe key | Your choice | job_id, per the docs |
Why not rely on the URL alone?
Redeliver re-POSTs the job's real terminal event with a fresh timestamp and signature, on the same URL. The docs say it does not change the destination URL: a new URL is a new job. So a per-job URL is fixed at submit time, and the same job can arrive more than once. Keying on job_id makes the second delivery a no-op.
What does a deduplicating receiver look like?
Verify the signature first (see debug Sume webhook delivery), then insert the job_id once.
const seen = new Set<string>(); // use a database unique key in production
export function handle(body: { event: string; job_id: string }) {
if (seen.has(body.job_id)) return { duplicate: true };
seen.add(body.job_id);
// load your record by job_id, then act on body.event
return { duplicate: false };
}Should the receiver also poll?
It can. Reading GET /v1/jobs/{job_id}/status is a read, so it is safe to repeat, and it reports the job's current status.
Sources
Related posts
More in Developers
- Retool concurrency 100, burst 200, and Sume bulk runs
Retool cloud workflows list concurrency 100 and burst 200. Sume bulk runs take 1-100 items at concurrency 1-16, so one bulk call fits a Retool budget.
- Retool resource block 10-minute limit and Sume async jobs
Retool async resource blocks stop at 10 minutes. Submit the Sume job in async or webhook mode, return the job id, and finish in a separate step or workflow.
- Rime Arcana retired: use Coda; Sume TTS Router model_not_found
Rime retired Arcana on 2026-08-15 and serves arcana ids with Coda. Sume's TTS Router fails unknown model ids with 400 model_not_found; check the catalog.
- Rime Coda 180 s audio limit vs Sume TTS 1200 s limit
Rime Coda 1.0.5 uses a 180-second maximum audio duration. Sume TTS 1.0 fails audio past 1200 seconds with tts_duration_exceeded; join parts for longer audio.
Written by Sume