How long does a Sume Idempotency-Key last? The docs don't say

The Sume docs describe Idempotency-Key replay and the 409 conflict but give no lifetime. What is documented, what is not, and a safe way to design around it.

3 min readSume
All posts

The Sume docs do not state how long an Idempotency-Key is remembered. They do say the header is supported on submit routes, that a retry with the same key returns the original job, and that the same key with a different payload returns 409 idempotency_conflict.

So do not build anything that depends on a specific window. Treat a key as safe for the short retry loop after a submit that timed out, and track your own job ids for anything longer.

What is documented

Everything below is stated in the docs or visible in the API behavior they describe.

Idempotency-Key behavior (read 2026-10-06, Sume docs)
QuestionAnswer
Where is the header supported?Submit routes
Same key, same payloadReturns the original job
Same key, different payload409 idempotency_conflict
Which errors are safe to retry with the same key?429 queue_full, provider_capacity_exceeded, 503
How long is a key remembered?Not stated in the docs

Designing without a stated lifetime

Persist the job id the moment a submit returns, keyed by your own record such as an order or shot id. If your process restarts, look the id up first and poll it; submit again only when you have no id at all.

Derive the key from something stable, such as the order id plus a hash of the payload, so a deliberate change in the request gets a new key and avoids the 409.

What not to assume

Do not assume a key from last week still protects you from a duplicate, and do not assume it has expired either. If you need to know, ask Sume support and write down the answer with the date, since it is not in the public docs on the read date above.

There is a cost to being cautious in either direction. If you assume keys expire quickly and always generate a fresh key on every retry, you give up the one protection that stops a duplicate paid job after a lost response. If you assume keys live forever and reuse an old key for a new request with a slightly different body, you hit 409 idempotency_conflict, which is at least a loud failure rather than a silent charge. The conservative middle path is a key per logical request, a ledger of the job ids you got back, and no key reuse across different payloads.

Tradeoffs

A local ledger of job ids is more work than relying on the header, but it is the only thing that survives a long outage. The header covers the short window where the response was lost; the ledger covers everything else.

Sources

Related posts

More in Developers

All Developers posts

Written by Sume