Same Idempotency-Key, two Sume members: two jobs, not one
A Sume Idempotency-Key is unique per workspace and per key owner. Two members who send the same string get two jobs. Namespace your keys by what you generate.

On Sume, an Idempotency-Key is unique per workspace and per member who owns the API key, not across the whole workspace. If two teammates send the same key string, each gets their own job and each is billed. A retry by the same owner with the same key and the same payload returns the original job.
Where the scope comes from
The Jobs docs say a job belongs to its workspace and to the member whose key created it, and that usage is recorded against that member. The job store enforces the key with a unique index over workspace, owner and key, and the replay lookup uses the same three values.
| Sender | Payload | Result |
|---|---|---|
| Same member, same payload | Identical | Original job back, idempotency_hit: true |
| Same member, other payload | Different | 409 idempotency_conflict |
| Different member, same payload | Identical | A new job for that member |
| Same member, second API key | Identical | The original job, per the owner-based index |
What to do about it
A key like test-1 will not collide between two people, which feels safe, but it means a shared script run by two people can bill twice for one intended render. Derive the key from the thing you are making, and decide which one worker or member owns the submit.
- Build the key from your own record id plus a version, for example an order id and an attempt number.
- Use one service key owner for unattended submits, so retries always land in one namespace.
- Never reuse a key for a different prompt: the same owner would get
409 idempotency_conflict.
Check a key without spending
Every job object carries the idempotency_key it was created with. List your own jobs and look for the key before you decide it is unused.
Sources
Related posts
More in Developers
- One Sume voice, a different language: the 409 and the confirm flag
Ask Sume TTS to speak Spanish with an English-tagged voice and you get a 409 before any charge. Retry with confirm_language_mismatch only if you mean it.
- Save a Sume artifact atomically: write a .part file, then rename
A half-written MP4 that looks finished is worse than none. Download a Sume artifact to a .part file, check the length, rename once. Tested in Python.
- Schedule the next Ideogram 4.5 batch wave from ratelimit-reset
Size each wave from ratelimit-remaining and wave_size_hint, and when the write bucket is empty sleep ratelimit-reset seconds. A pure function you can test.
- waitForJob threw SumeJobTimeoutError: resume polling with the job id
The Sume SDK stops waiting after 20 minutes by default, but the job keeps running. Catch SumeJobTimeoutError, read jobId and wait again. TypeScript example.
Written by Sume