Why a Sume output schema is rejected: the strict subset rules
Sume saves an output schema only in the strict subset: object root, additionalProperties false, all properties required, nullable unions, 10 levels.

You paste a JSON Schema into a schedule's Output schema section and Sume refuses it. The reason is that custom schemas must obey a strict subset, the same rules the docs say OpenAI Structured Outputs enforces. When you save, Sume rejects an outside schema and lists the rules it breaks. This post is the checklist.
The rules
- The root is an object.
- Each object sets
"additionalProperties": false. - Each property appears in
required. An optional property uses a nullable union such as"type": ["string", "null"]. - At most 10 nesting levels, 5000 properties and 1000 enum values.
$refmay point only at#/$defs/<name>or the registeredSumeMediaFile#.
Name and strict flag
Schema names accept A-Z a-z 0-9 . _ / - up to 64 characters. When Sume calls the structuring model it rewrites characters outside A-Z a-z 0-9 _ -, because the provider accepts only the narrower set; Sume stores and reports the name you typed, so sume/action-image-v1 stays that on the receipt. Sume accepts strict: false and returns it, but it does not relax the subset.
A schema that fails, and the fix
The first schema below fails twice: additionalProperties is missing and note is not in required. The second fixes both.
{"type":"object","properties":{"title":{"type":"string"},"note":{"type":"string"}},"required":["title"]}
{"type":"object","additionalProperties":false,"properties":{"title":{"type":"string"},"note":{"type":["string","null"]}},"required":["title","note"]}Same contract on Agent Completions
The Agent Completions page says output_schema there is bound with the same contract as Action runs. Check a schema at design time, as in Create a schedule, before you wire it into a CI job.
Sources
Related posts
More in Developers
- Sume queue position and ETA: none exists, poll generation_limits
Sume shows queue counts and remaining capacity, not a per-job position or ETA. Read generation_limits and keep new work inside the headroom formula.
- Sume ratelimit-remaining and retry-after: a fetch wrapper in JS
Sume responses can carry ratelimit-limit, ratelimit-remaining, ratelimit-reset and retry-after. A fetch wrapper that backs off on 429 and keeps submits safe.
- Sume GET /result returns 409 job_not_completed: poll status first
GET /v1/jobs/{id}/result only works after completion and answers 409 job_not_completed otherwise. Poll status until result_ready, then fetch. Curl and JS.
- Sume schedule invoke command: check the host before you paste it
The curl command on a Sume schedule's trigger card uses api.dev.sume.com when you copy it from a *.dev.sume.com dashboard. Check the host before production.
Written by Sume