OpenAI structured outputs: 5000 properties, 10 levels, vs Sume
OpenAI caps strict schemas at 5000 properties and 10 nesting levels. Sume's output_schema uses the same numbers but counts enums and strings differently.

OpenAI's Structured Outputs guide allows up to 5000 object properties and 10 levels of nesting in a schema. Sume's output_schema uses the same two numbers, rejecting an over-limit schema with max_properties or max_depth, but its enum and string-length limits are counted differently, so a schema that fits on OpenAI can still trip a Sume limit.
Both numbers below come from vendor pages read on 2026-10-02: OpenAI's guide and Sume's Structured output page. Where the two pages describe a limit in different words, this post quotes each rather than assuming they match.
What are the four limits on each side?
OpenAI's guide lists limits on nesting depth and size, on total string size and on enum size. Sume lists four named violations.
| Limit | OpenAI guide | Sume docs |
|---|---|---|
| Properties | Up to 5000 object properties total | 5000, counted across the whole document (max_properties) |
| Nesting | Up to 10 levels | 10 levels (max_depth) |
| String length | 120,000 characters over property names, definition names, enum values and const values | 120,000 characters summed over every property name, key and string value in the document (max_string_length) |
| Enum values | Up to 1000 across all enum properties | 1000 per enum (max_enum_values) |
Where can a schema pass on one and fail on the other?
The string budget is the likeliest gap. Sume describes it as a document-wide budget rather than a per-field cap, and says long description annotations on a large schema can exhaust it even when no single string is remarkable. OpenAI's wording lists names and enum and const values, not descriptions, so a schema with heavy descriptions is worth measuring before you assume it ports.
The enum limit reads differently too: OpenAI's is a total across all enum properties, Sume's is per enum. Count your enums against both before you port a large classifier schema.
Does a self-referencing definition use up the depth?
On Sume, no. The page says the depth limit counts literal nesting in the document, so a $defs entry that refers to itself does not consume it. Recursion must go through a named #/$defs/* target; $ref: "#" is rejected.
How do I find out which limit I hit?
Send the schema. A rejected output_schema returns 400 output_schema_invalid with details.violations[], and every problem is listed, not only the first. Each entry has a path, a stable rule such as max_depth, and a message. Nothing runs and nothing is charged.
If the schema is large because the object is large, split it: have the run fill a smaller object and keep the rest of your record on your own side, keyed by the run id.
Sources
Related posts
More in Developers
- OpenRouter output_modalities=video vs Sume /v1/videos/models
OpenRouter lists video models three ways. Sume has a /v1/videos/models endpoint with the same shape plus a catalog. Fields to read before you submit.
- OpenRouter video is ZDR-ineligible: what Sume says about retention
OpenRouter says video generation cannot use Zero Data Retention because output is held for retrieval. Sume has no ZDR toggle; what to tell your security team.
- Pace bulk Sume submits with generation_limits, not wave_size_hint
Size in-flight work as concurrency minus active minus queued, capped by queue capacity. A short Node pacer that reads generation_limits from each submit.
- Pin a TTS model id: sonic-latest or sonic-3.6 on Sume
Voice vendors move aliases under you. How sonic-latest and sonic-3.6 behave on the Sume TTS router, and why to send an explicit id in production.
Written by Sume