Format io is null on older Formats: pick by your own input kind
On Sume's Format list, the io block is null for Formats saved before the field existed. Do not route on it alone; read input_kind and output_kind when present.

On GET /v1/formats, the io block is null for Formats saved before the field existed. If your router picks a Format by io.input_kind and io.output_kind, an older Format will fall through unless you handle the null. Treat null as unknown, not as a mismatch.
What io says when it is present
io describes what a Format takes and makes. input_kind is url, text, image or product, and output_kind is video, image or text. The list item also carries profile, for example url_to_video.
| Field | Values |
|---|---|
| io.profile | A short profile name such as url_to_video |
| io.input_kind | url, text, image or product |
| io.output_kind | video, image or text |
| io | null on Formats saved before this field existed |
Routing a product feed safely
A holiday feed of 100 products with a product URL each is a url input and a video output. Filter the list on those, but keep a second path for the Formats where io is null.
- Read the Format's
showcase(a real output made at registration, ornull) before you spend on it. - Open the call sheet at
https://docs.sume.com/formats/{handle}/{slug}for the curl, scopes and poll loop; it shows nothing from the Format body. - Pin the Format you chose by
invoke_url(theskl_path), which survives a rename.
A router that tolerates null
Write the filter so that io === null is its own branch. In that branch, fall back to the Format title, the call sheet, or a quick manual check, and record which Formats took that path so you can fix the metadata where you own it.
For Formats by Sume, the list shows them at the reserved sume handle, and any key with the right scopes can call them. The run, its media and its spend belong to the key that made the call.
Treat a null io as unknown rather than as empty. Read the Format's own description and your own input kind to choose, and send a small test run before you commit a whole batch to it.
Tradeoff
Metadata saves you a trial run, but it is the author's description of the Format, not a promise about every input. Run one SKU before you queue 100, and read the status and api_trigger_enabled fields with care: a Format never run over the API can show them as inactive and false and still run.
Sources
Related posts
More in Formats
- Sume Format output_schema: strict false does not loosen the rules
Setting strict to false in a Sume Format output_schema does not relax the OpenAI-strict subset. Fix the schema instead. Responses-style text.format is refused.
- 400 previous_run_format_mismatch: continue a run on its own Format
Continuing a Format run on a different Format returns 400 previous_run_format_mismatch. Call the Format where the run started, or start a new run.
- Sume Format run idempotency key: order id plus version, not uuidgen
Derive the Sume Format run Idempotency-Key from your order id plus a version. A fresh uuidgen per request makes the header do nothing and double-bills retries.
- List Sume Format runs: cursor pages, newest first, one Format only
Sume lists Format runs per Format, newest first, limit 1 to 100 and a next_cursor. There is no cross-Format list, so keep your own index of run ids.
Written by Sume