JSON Schema Batch Validator

Check a whole array or NDJSON stream of records against one JSON Schema. See a pass/fail summary and every failing record's errors with JSON Pointer paths — all locally, no upload.

Try:
Validation report

About this tool

Paste one JSON Schema and a whole batch of records, and this tool validates every record against that schema in one pass. The batch can be a JSON array of records, a single JSON value (treated as one record), or an NDJSON stream (one JSON value per line). You get a PASS/FAIL verdict, a summary of how many records passed and failed, and — for each failing record — the exact errors, each with a JSON Pointer path, the schema keyword that rejected the value, and a human-readable message.

It runs entirely in your browser as WebAssembly: nothing is uploaded, and no network $refs are fetched. Choose the JSON Schema draft label explicitly, or leave it on Auto to detect the draft from the schema's $schema keyword (falling back to Draft 2020-12). Validation is intentionally local and covers the common draft-agnostic keyword subset listed in the limits below.

Worked example

Schema

{"$schema":"http://json-schema.org/draft-07/schema#",
 "type":"object","required":["id","name"],
 "properties":{"id":{"type":"integer"},"name":{"type":"string"}}}

Records (JSON array)

[{"id":1,"name":"Ada"},{"id":"2","name":"Grace"},{"name":"Kay"}]

Result

Batch validation: FAIL
Draft: draft7 (from $schema)    Input: json    Records: 3 (1 passed, 2 failed)
Total errors: 2

Record #1 — 1 error
  /id: "2" is not of type "integer"

Record #2 — 1 error
  (root): "id" is a required property

Record 0 passes. Record 1 fails because id is a string, not an integer. Record 2 fails because the required id property is missing. Switch Output format to JSON for the same result as a machine-readable object you can pipe into another tool.

FAQ

What batch formats can I paste into the records box?

Three shapes are accepted. A JSON array [{...},{...}] validates each element as a record. A single JSON value (object, number, string, …) is validated as one record. NDJSON (also called JSON Lines) is one JSON value per line, with blank lines skipped. Leave Records format on Auto to try whole-document JSON first and fall back to NDJSON, or force json / ndjson when you know the shape.

Which JSON Schema drafts are supported, and how does auto-detect work?

Draft 4, Draft 6, Draft 7, Draft 2019-09, and Draft 2020-12 can be selected for reporting. On Auto, the tool reads the schema's $schema URI and picks the matching draft label; if there is no $schema (or it isn't recognized) it falls back to Draft 2020-12. The validator applies the same local keyword subset for each draft, so use a full validator when you need draft-specific features such as oneOf, conditionals, unevaluated properties, or format assertions.

What does each reported error contain?

Every error carries three things: a JSON Pointer path to the failing value (`` empty / shown as (root) for the record itself, /age for a member, /tags/0 for the first array item), the schema keyword that rejected it (type, required, minimum, enum, pattern, …), and a message. Errors within a record are sorted by path so the output is stable. The per-record and total error counts are always exact, even when the listing is capped.

What is "Max errors to list" for?

It caps how many individual errors are printed across the whole batch (default 50) so a huge, badly broken batch stays readable. Only the listing is capped — the per-record error_count and the batch total_errors are still counted in full, and the report is marked truncated when more errors exist than were shown.

Does it fetch remote schemas or `$ref` URLs?

No. The tool is fully local: it never makes network requests, so external HTTP $refs are not resolved. Internal $refs inside the schema you paste (references within the same document) are resolved normally. If your schema depends on remote definitions, inline them before validating.

Limits & edge cases

Developer & Automation Access

Run it from the terminal

Same engine as this page, headless — via the gizza CLI:

gizza tool json-schema-batch-validate '{"type":"object","required":["id","name"],"properties":{"id":{"type":"integer"},"name":{"type":"string"}}}' 'records=[{"id":1,"name":"Ada"},{"id":"2","name":"Grace"},{"name":"Kay"}]'

New to the CLI? Get gizza →

Open it by URL

Pre-fill and auto-run this tool with query parameters — the names match the API/CLI:

https://gizza.ai/tools/json-schema-batch-validate/?schema=%7B%22type%22%3A%22object%22%2C%22required%22%3A%5B%22id%22%2C%22name%22%5D%2C%22properties%22%3A%7B%22id%22%3A%7B%22type%22%3A%22integer%22%7D%2C%22name%22%3A%7B%22type%22%3A%22string%22%7D%7D%7D&records=%5B%7B%22id%22%3A1%2C%22name%22%3A%22Ada%22%7D%2C%7B%22id%22%3A%222%22%2C%22name%22%3A%22Grace%22%7D%2C%7B%22name%22%3A%22Kay%22%7D%5D&input_format=auto&draft=auto&max_errors=50&output=text

Machine-readable descriptor: tool.json — title + parameters JSON Schema for agents.