Sume Format run image attachments: 30 images, 30 MB, 500 MB
A Sume Format run takes up to 30 images, 30 MB each and 500 MB per run, in JPEG, PNG, WebP, GIF, or AVIF. Here is what invalid_attachment means.

A Sume Format run accepts up to 30 image attachments, each up to 30 MB, with 500 MB across the run, in JPEG, PNG, WebP, GIF, or AVIF. Break a limit and the call returns 400 invalid_attachment.
Attachments are images only. For other material, such as a document or a data table, put the content in the input object, or refer to media by URL there within the media budget.
The limits are generous for most product work. The common failure is not the count; it is a stray camera original that is far over 30 MB, or a format such as HEIC that is not on the list.
The limits
The Call a Format page sets the rules. The whole request body is capped at 4 MiB, and a larger one returns 413 payload_too_large. The Content-Type must be JSON, or the call returns 415. These limits interact: if attachments travel inside the JSON body, a handful of large photos can hit the 4 MiB body limit long before the 500 MB per-run limit. When the per-run limit matters, send URLs instead of embedded data.
Media URLs inside input share their own budget: 30 files in total, at most 30 images, 10 videos, and 10 audio files.
| Limit | Value | Error |
|---|---|---|
| Attached images | 30, 30 MB each | 400 invalid_attachment |
| Total attachment size | 500 MB per run | 400 invalid_attachment |
| Formats | JPEG, PNG, WebP, GIF, AVIF | 400 invalid_attachment |
| Media URLs in input | 30 files, 30 images, 10 videos, 10 audio | 400 invalid_attachment |
| Request body | 4 MiB | 413 payload_too_large |
| Content-Type | JSON only | 415 |
Choosing between attachments and input
Use attachments for reference photos you want the run to see, such as a product from several angles. Use input for structured facts and for media that you reference by URL. Input is written whole to a JSON file, up to 64 top-level keys and 2 MiB, and is treated as data.
A call must name at least one of instruction, input, previous_run_id, or attachments, or it returns 400.
A reasonable default is three to six images per run: a hero shot, two angles, and a detail. More images do not always help, and they raise the chance that one of them is the file that breaks the call.
Preparing images
Resize photos to what the video needs before sending. A product photo of 3000 pixels on a side is rarely better than 2000, and smaller files make retries cheap. Convert unusual formats first, because a format outside the five listed is refused. Keep the original in your own storage so a revision run can use it again.
For a bulk queue, every item is a full request, and a bad item fails the whole create with details.index naming it. Validate image counts and sizes in code before you submit so you find the problem early.
Log the byte size of every file you attach. When a call fails, the log shows at once whether it was the size, the count, or the type.
What a failure looks like
invalid_attachment is a 400 at create time, so no run exists and nothing is charged. Fix the input and send it again. Because the request never produced a run, the idempotency key is released and you can reuse it.
Sources
Related posts
More in Formats
- Does your Format webhook receiver pass OWASP's checklist?
Check a Sume Format webhook receiver against OWASP's webhook cheat sheet: raw body, HMAC, five-minute window, dedupe on request_id, and where docs are silent.
- Which failed Format runs can you retry without paying twice?
A decision table for failed Sume Format runs: which codes mean retry, which mean continue with previous_run_id, and which mean fix your input first.
- Which Format version ran my API call? Check the receipt
Every Sume Format run receipt carries format.version. Read it after you edit a package, so a bulk batch or schedule is never judged against the wrong version.
- Ready-made Formats for product video: the Sume Format catalog
Sume ships ready-made Formats for product and UGC-style video and images, each callable from your backend with one HTTP request at the reserved sume handle.
Written by Sume