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.

To make a partial result legal in a Sume Format output_schema, list every property in required and make the uncertain ones nullable unions such as "type": ["string", "null"]. A run that made two of three clips can then return null for the third instead of failing the whole projection.
Sume's Structured output page says there is no optional property: each declared property must be present. The page also notes that this rule causes problems for more ported schemas than any other.
Rejected and accepted shapes
A property that is declared but missing from required is rejected with required_completeness when you save the schema. The accepted fix is a nullable union, where null reads as "the run had nothing to put here".
| Pattern | Verdict | Why |
|---|---|---|
subtitle declared, not in required | Rejected | No optional properties |
subtitle: ["string","null"], in required | Accepted | Always present, may be null |
hero_image: {"$ref":"SumeMediaFile#"} | Accepted | Sume's media shape; all fields required, all but type and url nullable |
| Assembled video field filled with one scene's file | Rejected by the gate | A part is not the deliverable |
url of an uploaded file | Fails the whole output | Only generated media passes the URL gate |
if/then, dependentRequired | Not supported | Use anyOf or validate yourself |
Design for the run you can actually get
The docs describe what the gate does with a partial run: report the parts you made and leave the assembled field null, or report the real status of the assembly. So give each scene its own status field and make the final file a nullable media ref. A schema that demands an assembled video for a run that could not assemble one can only fail.
Be careful with array limits. minItems and maxItems are supported, but a minItems of three on a list of clips turns a two-clip run into a failure. That is my design advice rather than a documented rule: set minItems only when fewer items would truly make the result useless.
What the gate checks
Before output reaches you, Sume checks every URL against the media the run actually produced, using exact string equality, so placeholders like "none" do not slip through. A duration_ms in a media file must agree with the recorded length within 10% when a length was recorded. Everything else, such as labels and captions, comes from the run's own report and is not verified.
On an API run, a projection failure makes the run failed, and the receipt says why. The page also states the result: a completed run returns output that agrees with your schema and has real media URLs, or output: null with a reason, and never a schema-shaped guess.
Test it before you ship it
Save the schema and read the validation error codes, since they name the rule (required_completeness, unsupported_ref). Then run the Format once with an input you know is too thin, and check that the nullable fields come back null rather than the run failing. If you want the media without designing a schema, the built-in schema is filled deterministically from the generated media and the final text, with no model involved.
Sources
Related posts
More in Formats
- Re-run a Format on purpose: version the Idempotency-Key
How Sume Format idempotency works, why a fresh uuid per request defeats it, and how an order id plus a version number gives safe retries and deliberate re-runs.
- Sume Format instruction limit: why long briefs belong in input
A Format instruction accepts 8000 characters but only about the first 4000 reach the prompt. Put long briefs in the input field, which is stored whole as data.
- 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.
- 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.
Written by Sume