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.

5 min readSume
All posts

Before another team calls your Sume Format over the API, check five things: the key carries formats:write, it is a user key and not a service-account key, it was created in the workspace that owns the Format if that is a team, the owner left the Format's API trigger on, and the run has a spend cap you chose. Each missing item has a distinct error, so you can test the hand-off with one dry call.

The facts are from Create a run and Errors and spend. I list the error for each gap so a contractor can diagnose their own first failure.

Gap by gap

Run this table top to bottom with the person who will hold the key. The status codes are the ones the docs give for each case.

Hand-off gaps and the error each one returns (Create a run page, read 2026-10-10)
GapWhat the caller seesFix
Key predates the Formats API, so it lacks the scopes403 insufficient_scope, never a 404Mint a new key and rotate to it
Service-account key403 insufficient_scope, reason service_account_format_runs_unsupportedUse a user key
Team Format, personal key403 workspace_key_required, details.workspace_id names the workspaceCreate the key in that team workspace
Format status inactive, or API trigger off409 format_inactive or format_api_trigger_disabledThe owner changes it on the Format's API tab
Shared Format, wrong workspace404, indistinguishable from an unknown handleAccept the grant in the caller's workspace
Empty body400 invalid request: needs instruction, input, previous_run_id or attachmentsSend at least one

Who pays and who decides

Billing follows the key. A team Format's runs bill the team wallet and count against the team's generation concurrency, which is why a personal key is refused for it. The docs add that, in the past, a personal key produced runs that made a real video and then reported output_schema_unsatisfied with nothing harvested.

When you share a Format with another workspace, the owner still decides whether the Format accepts API calls. Its status and API-call trigger apply to every caller, including the workspaces you shared it with, and the caller's key lists only its own runs.

Set the money limits on purpose

A Format has a default generation spend cap of $400 when it never named one. A call can set generation_spend_cap_usd per run, up to $500, and zero is rejected. Tell the contractor which number to send, because a run that tries to spend past its cap fails with the generic format_run_failed.

Add an Idempotency-Key rule to the hand-off too. The docs scope a key to one Format and recommend deriving it from the item the run makes plus a version, so a retry never double-bills.

Results without polling

Give the caller the webhook options early. A format.run.terminal delivery needs a public HTTPS endpoint and a signing secret, and the caller verifies the signature over the raw body. Send a test delivery before the first real run so a wrong secret shows up on a free call. Canceled and skipped runs never deliver, so the caller still needs a status poll as a fallback.

Finish with one real run on a cheap input, and check three fields on the receipt: status, usage.debited_usd_micros, and output.

Sources

Related posts

More in Formats

All Formats posts

Written by Sume