Music job timed out? Retry with the same key: one $0.125, not two
A Sume music submit that times out can be retried with the same Idempotency-Key and returns the original job. Without a key, a blind retry is a second $0.125.

If a Sume music submit times out on your side, retry the same request with the same Idempotency-Key and Sume returns the original job instead of billing a second one. Music is a flat $0.125 per generation, so an unkeyed blind retry that produces a second job costs $0.25 for one track.
The rule is from the Sume jobs and results guide, which says to retry the submit itself with the same key and not to submit a new paid job for the same intent, and from the API catalog (read 2026-10-09).
The sequence
Send the generate request with a key you made before the call, such as one derived from the project and the take number. If the response is a 2xx with a job id, poll GET /v1/jobs/:id/status and then GET /v1/jobs/:id/result; when the sync wait budget ends, the guide says to keep polling and not to submit again. If you got no response at all, resend the same body with the same key.
Use the same key again only for the same operation and payload. If you change the prompt, that is a different operation and needs a new key.
| What you did | What happens | Cost |
|---|---|---|
| Retry with the same key and body | Returns the original job | $0.125 total |
| Retry with no key | Can create a second job | Up to $0.25 |
| Change the prompt, reuse the key | Not the same operation; do not do this | Avoid |
| Change the prompt, new key | A new job | $0.125 more |
Wait budget is not job length
The wait_timeout_seconds value is clamped to 0 to 30 and limits how long the HTTP request blocks, not how long the job can take. For music, submit with mode: "async" and poll, or use a webhook, instead of a long synchronous wait. A music job that has not finished at 30 seconds has not failed.
Cancelling
POST /v1/jobs/:id/cancel cancels a job before generation starts. After generation starts it returns 409 job_generation_already_started. Canceling a job that is already canceled is idempotent. The catalog's reservation policy refunds failed or pre-generation canceled jobs before capture, so a quick cancel on a mistaken submit is worth trying.
Building the key
A good key names the intent: project id, scene number and take number, for example proj-42-scene-3-music-take-1. Store it with the request before you send it, so a crash does not lose it. A random key made at send time defeats the purpose, since the retry would not know it.
The same rule works for TTS and the other paid routes. The jobs guide gives the example of a date-and-counter key such as hero-shot-2026-08-03-001.
Finally, record the job id as soon as you have it. If your process restarts, you can poll the stored id instead of submitting again, and you never need the idempotency key to find a job you already hold.
Sources
Related posts
More in Developers
- Music router 400 negative_prompt_unsupported: the fix and its cost
A non-empty negative_prompt on Sume's music router returns 400 negative_prompt_unsupported. Move the exclusions into prompt; a rejected call is not billed.
- Nano Banana 2.1 inpainting: Google's prompt template, no mask on Sume
Google edits one region of an image by prompt on Nano Banana 2.1. Sume has no mask_url for it, which is GPT Image 2.5 only. The template, and when to switch.
- Alert when a pricing_skus rate moves: a nightly diff of the model list
Save GET /v1/videos/models rates each night and diff them. A one-cent-per-second move costs $0.30 on a 30 s clip and $300 over 1,000 of them. Python, 25 lines.
- Nightly GitHub Actions smoke test for the Sume API: $0.125 a run
A scheduled workflow submits a 2 s Wan 3.0 480p clip, polls and downloads it. $0.125 a night is $3.75 a month. Full YAML with curl and jq.
Written by Sume