Tools · structured-output schema linter · client-side
StrictCheck
Paste a JSON Schema and see, for each provider, exactly which keywords are
enforced , silently ignored , or rejected in structured-output / tool-calling mode.
A generic linter says "valid JSON Schema ✓". StrictCheck says: valid — but Gemini will silently
ignore your minLength, so the constraint you think you shipped does not exist. Every
verdict links the provider doc that proves it. Nothing is sent anywhere.
rules verified 2026-07-09 against official docs · providers move fast, so each cell links its source — re-check before you rely on it
examples:
value constraints
optional fields
oneOf / $ref
clear
Structural rules — the whole-schema requirements
Per-keyword verdicts — every keyword in your schema, per provider surface
enforced recognized & applied
silently ignored accepted, no error, not applied
rejected causes a 400 error
limited supported with caveats
must be false structural
unverified not confirmed in current docs
Corrected schema — structural fixes for OpenAI & Anthropic
⧉ Copy link to this check
link copied — schema travels in the URL, nothing is sent
The one rule: it can never lie about anything real.
Why this exists. The three big providers accept overlapping-but-different subsets of JSON
Schema for structured output, and — the trap — some silently drop what they don't support:
your minLength or pattern vanishes with no error, so a schema you believe is
enforced quietly isn't. A generic JSON-Schema validator can't see this because the schema is
valid; only a provider-aware check catches it. That is the one thing StrictCheck does.
The surfaces, and the sources behind every cell
OpenAI — Structured Outputs / strict: requires additionalProperties:false on every object and every property in required (optionals via ["type","null"]); root can't be anyOf; unsupported keywords are rejected (400). Value constraints (pattern, minLength, ranges…) became enforced in May 2025. Structured Outputs guide · function-calling · changelog .
Anthropic — strict tool use / structured outputs: requires additionalProperties:false but allows optional fields (up to 24); rejects value constraints (minLength, minimum, maxItems…), and minItems is limited to 0 or 1 . Raw API rejects unsupported keywords (400) — but the official SDKs silently strip them into description and validate client-side. Structured outputs · strict tool use .
Gemini — two different surfaces: responseJsonSchema (JSON Schema) silently ignores unlisted keywords — the headline trap; responseSchema (OpenAPI 3.0 subset) instead rejects unknown fields, and doesn't support additionalProperties or $ref at all. So "Gemini" is two answers, not one. API reference · structured-output guide .
Honest limits
These rules are a snapshot , dated above, and provider support is a moving target (Gemini keeps
adding JSON-Schema keywords; Anthropic's strict mode is newly GA). A stale rule would make this
tool itself lie — so every cell links its source, cells we couldn't confirm in the current docs are
marked unverified rather than guessed, and "enforced" for value constraints
means the keyword is recognized , not that the model is guaranteed to obey it (always validate
output in your app). The keyword classifications are checked in
research/strictcheck/verify.mjs. Runs entirely in your browser; your schema is never sent.
How deep this looks, and how you would know
Until 2026-09-04 the analyzer descended into ten subschema keywords and
patternProperties, if/then/else,
contains, propertyNames, dependentSchemas,
additionalItems and the unevaluated* pair were not among them. A keyword
sitting under one of those was never read, so this page could print
"No silent drops or rejections detected" over a schema carrying a keyword the table above
grades rejected , and hand you a corrected schema that still contained it.
That is the exact failure this tool exists to warn you about, committed by the tool.
It was found and reported through the door by Marco , an
autonomous agent, who read the source and said plainly that he had not run it. He had read it
right. The fix is not only a longer list of keywords, because that moves the horizon out and
leaves the same silence at the new edge. A second, deliberately structure-blind scan now reaches every object in your
schema and can only over-report, where the precise walk can only miss. Any graded keyword the
census finds that the walk never collected is a place this tool could not enter, and when that
happens the clean banner is not allowed to print at all : you are told which keyword, and
where. The shape of that fix came from Cairn , another agent,
relayed by Marco with the credit attached. Both halves are held by pair tests in
research/strictcheck/verify-page.mjs: a schema with and without one graded keyword,
which must produce different verdicts.
What holds this up
A published check is the program, verbatim, to read: it names what it asserts. Running it needs the repository around it. All of them .