Format works in chat but fails over the API? The approval gate
A Sume Format that pauses for approval in chat runs unattended over the API. See what changes, why unattended_blocked appears, and a pre-flight list.

A Format that works in chat can fail over the API because nobody is there to approve anything. In the chat UI, "approve these stills before I make the video" is a quality gate by design. Over the API, Sume tells the run those approvals are already granted, so it goes straight on to the paid step within its spend cap.
When a run really cannot finish without a person, it comes back failed with unattended_blocked, never as a half-finished completed. This post lists what differs between the two modes, using Create a run and Errors and spend.
What changes when you move from chat to the API
The Format's recipe is the same. The caller is different, and so are the guardrails.
| Topic | In the chat UI | Over the API |
|---|---|---|
| Approval gates | A person approves stills, scripts or plans | Treated as already granted |
| Missing input | The run asks you in chat | unattended_blocked, run failed |
| Matching an avatar to the brief | Can ask which avatar | If none matches, unattended_blocked |
| Cost control | You watch the thread | generation_spend_cap_usd, up to $500 |
| Result shape | A person reads the thread | output projected onto your schema |
| Failure | Draft may stay completed | Projection failure is a run failure |
Move every question into input
The most reliable fix is to answer every question the chat would have asked. The input object is caller data, up to 64 top-level keys and 2 MiB, and Sume writes it whole to a file the agent reads. Put the product URL, the host image, the script and the chosen avatar there. Keep instruction for the task itself, since only the first ~4000 characters of it reach the run as prompt text.
Do not paste scraped text into instruction. The docs call the input file a trust boundary, not a sandbox: runs are spend-capped, which limits the blast radius of a hostile payload, but untrusted text should not be passed through on purpose.
Read the receipt in the right order
A run that completed always did real work and always fills artifacts[], but it can still carry output_error when the projection did not match your schema. Check output_error before you read output. On a failed run, primary_output_url is null, so if (run.primary_output_url) stays a safe test for "the deliverable exists".
For unattended_blocked, the structured-output page says the harvested media are intermediates, not the finished cut, and that assembled_deliverable is false. Show them for debugging but do not publish them.
Pre-flight checklist
Run through this once per Format before you call it from code.
- Does the Format ask for a person, an avatar or a file the run cannot find? Supply it in
inputorattachments. - Is
generation_spend_cap_usdset for this run, and is it above what the brief needs? - Does your
output_schemamake optional media nullable, so a partial result is legal? - Is the API call trigger switched on in the Format's API tab, and does your key carry
formats:write? - Is the
Idempotency-Keyderived from your order id and a version you bump on purpose?
Sources
Related posts
More in Formats
- Handing a Format to another team: the API key checklist
Before another workspace calls your Sume Format, check key scope, key type, the API tab, the spend cap and the webhook secret. Lists each 403/409.
- How many Format runs can one API key poll at once?
Read budgets per minute by Sume plan, turned into a count of Format runs you can poll at 5-second and 30-second intervals, and why a bulk queue saves writes.
- Is there an endpoint to list all Format runs? No, build an index
Sume lists runs per Format with a cursor, but there is no GET /v1/format-runs across Formats. Here is the small run index that fills the gap, and what to store.
- Make a partial Format result legal in your output_schema
Sume Format output_schema has no optional properties. Use nullable unions, SumeMediaFile refs and honest nulls so a run that makes 2 of 3 clips still returns.
Written by Sume