Amazon A+ createMedia 201, 200, 409: retry-safe uploads on Sume
Amazon's createMedia answers 201, 200 or 409 on retry. Pair it with one Sume Idempotency-Key per asset so a retried submit never bills twice.

Amazon's createMedia is idempotent: it answers 201 for a new asset, 200 when the same asset already exists with identical metadata, and 409 when it exists with different metadata. That makes the Amazon side safe to retry. The Sume side needs its own guard: send one Idempotency-Key per asset on the video submit, and a replay returns the original job.
Amazon facts are from its SP-API release notes (September 30, 2026) and A+ media tutorial; Sume facts are from video generation and Jobs and results, read 2026-10-01.
What does createMedia return on a retry?
The A+ Content API v2020-11-01 added createMedia, getMedia, and updateMedia. You first upload the file with the Uploads API (createUploadDestinationForResource) and then call createMedia with the uploadDestinationId. Amazon says a later request that uses the resulting mediaId is treated as the same asset.
| Amazon status | Meaning | Sume equivalent |
|---|---|---|
201 | New asset or pairing created | First submit with a new Idempotency-Key creates a job |
200 | Already exists, identical metadata | Replay with the same key returns the original job |
409 | Exists, metadata differs | Reuse the key with a changed intent only on purpose; change the key to start a new paid job |
How do I key a Sume retry?
Docs: send Idempotency-Key to make retries safe; a replay returns the original job. After a timeout, reuse the same key; the docs say a retried submit then returns the original job instead of billing a second one. Build the key from your own asset identity so it is stable across restarts.
async function submit(slot) {
const res = await fetch("https://api.sume.com/v1/videos", {
method: "POST",
headers: {
Authorization: "Bearer " + process.env.SUME_API_KEY,
"Content-Type": "application/json",
"Idempotency-Key": "a-plus-hero-" + slot + "-v1",
},
body: JSON.stringify({ model: "seedance-2", prompt: "Product turntable, white sweep" }),
});
console.log(res.status, await res.json());
}
submit("B0EXAMPLE01");What about webhook retries?
For webhook mode the docs say receivers must treat job_id as the idempotency key. The same idea as Amazon's 200: seeing the same job twice is normal, so make your handler a no-op the second time. See Shopify event id removed: dedupe on Sume job id.
Does a 409 from Amazon mean I should regenerate?
No. A 409 means the asset exists with different metadata. Fix the metadata or use updateMedia; a new Sume generation costs money and does not change Amazon's stored fields.
Sources
Related posts
More in Developers
- Amazon A+ Content API: mediaUrl is not permanent, keep your own copy
Amazon says A+ getMedia's mediaUrl is non-permanent. Re-fetch it, and keep your own copy of finished Sume clips by downloading from the content URL.
- Amazon A+ video descriptions per locale vs Sume caption language
A+ updateMedia upserts video descriptions by locale, one of title or descriptions per call. Sume's caption language is only a speech-to-text hint.
- Nova Reel start_async_invoke S3 output vs a Sume result URL
Nova Reel's start_async_invoke writes output.mp4 to your S3 bucket and needs IAM. A Sume job returns a result_url and durable media.sume.com links.
- Anam 99.9% uptime SLA vs Sume failed-job retry metadata and refunds
Anam states a 99.9% uptime SLA for Cara-4. Sume documents what a failed avatar job exposes, category and retryability, and refunds the reservation.
Written by Sume