Every JSON Schema keyword explained with types, constraints, examples, and validation rules.
$schemaCore / Metaapplies to: rootDeclares the JSON Schema dialect version
{ "$schema": "https://json-schema.org/draft/2020-12/schema" }ℹ Always include at root to declare the dialect
$idCore / Metaapplies to: anySets the base URI for the schema
{ "$id": "https://example.com/schemas/user.json" }titleCore / Metaapplies to: anyHuman-readable title for the schema or property
{ "title": "User", "type": "object" }descriptionCore / Metaapplies to: anyHuman-readable description of the schema's purpose
{ "description": "A registered user account", "type": "object" }$commentCore / Metaapplies to: anyDeveloper comment — not rendered to users
{ "$comment": "Added 2024-01 to support OAuth users" }$defs / definitionsCore / Metaapplies to: rootRepository for reusable sub-schemas
{ "$defs": { "email": { "type": "string", "format": "email" } } }ℹ $defs is draft 2020-12+; use definitions in draft-07
$refCore / Metaapplies to: anyReference to another schema by URI or JSON Pointer
{ "$ref": "#/$defs/email" }ℹ Can reference internal (#/$defs/…) or external schemas
type: stringTypesapplies to: stringValue must be a JSON string
{ "type": "string" }type: numberTypesapplies to: numberValue must be a JSON number (integer or float)
{ "type": "number" }type: integerTypesapplies to: numberValue must be a whole number (no fractional part)
{ "type": "integer" }type: booleanTypesapplies to: booleanValue must be true or false
{ "type": "boolean" }type: nullTypesapplies to: nullValue must be JSON null
{ "type": "null" }type: arrayTypesapplies to: arrayValue must be a JSON array
{ "type": "array" }type: objectTypesapplies to: objectValue must be a JSON object
{ "type": "object" }type: [multiple]Typesapplies to: anyValue may be one of the listed types
{ "type": ["string", "null"] }ℹ Useful for optional/nullable fields
minLength / maxLengthStringsapplies to: stringMinimum and maximum number of Unicode code points
{ "type": "string", "minLength": 1, "maxLength": 100 }patternStringsapplies to: stringValue must match a ECMA 262 regular expression
{ "type": "string", "pattern": "^[a-z0-9_]+$" }ℹ Partial match — use ^ and $ to anchor
formatStringsapplies to: stringSemantic validation hint (implementation-dependent)
{ "type": "string", "format": "email" }ℹ Common values: email, uri, uuid, date, date-time, ipv4, ipv6, hostname
enumStringsapplies to: anyValue must be one of the listed values
{ "type": "string", "enum": ["active", "inactive", "pending"] }constStringsapplies to: anyValue must exactly equal the given value
{ "const": "v1" }ℹ Equivalent to enum with a single value
minimum / maximumNumbersapplies to: numberInclusive lower and upper bounds
{ "type": "number", "minimum": 0, "maximum": 100 }exclusiveMinimum / exclusiveMaximumNumbersapplies to: numberExclusive lower and upper bounds (value < max, value > min)
{ "type": "number", "exclusiveMinimum": 0 }ℹ In draft-07 these were booleans; draft 2019+ they are numbers
multipleOfNumbersapplies to: numberValue must be a multiple of the given number
{ "type": "integer", "multipleOf": 5 }propertiesObjectsapplies to: objectSchema for each named property
{ "type": "object", "properties": { "name": { "type": "string" }, "age": { "type": "integer" } } }requiredObjectsapplies to: objectArray of property names that must be present
{ "type": "object", "required": ["id", "email"] }additionalPropertiesObjectsapplies to: objectSchema or boolean controlling unknown properties
{ "type": "object", "additionalProperties": false }ℹ false = no extra properties allowed; a schema validates extra properties
patternPropertiesObjectsapplies to: objectSchemas applied to properties whose name matches the regex key
{ "patternProperties": { "^S_": { "type": "string" } } }minProperties / maxPropertiesObjectsapplies to: objectMin/max number of properties in the object
{ "type": "object", "minProperties": 1, "maxProperties": 10 }items (draft-07)Arraysapplies to: arraySchema for all items (or tuple schemas as array)
{ "type": "array", "items": { "type": "string" } }ℹ In draft-2020-12, items applies to all remaining items after prefixItems
prefixItems (2020-12)Arraysapplies to: arrayPer-index schemas for a tuple
{ "type": "array", "prefixItems": [{ "type": "string" }, { "type": "number" }] }ℹ Replaces tuple form of items from draft-07
minItems / maxItemsArraysapplies to: arrayMin/max number of array elements
{ "type": "array", "minItems": 1, "maxItems": 50 }uniqueItemsArraysapplies to: arrayAll items must be unique
{ "type": "array", "items": { "type": "string" }, "uniqueItems": true }containsArraysapplies to: arrayAt least one item must match the given schema
{ "type": "array", "contains": { "const": "admin" } }ℹ Use minContains / maxContains to control how many must match
allOfCompositionapplies to: anyValue must be valid against ALL listed schemas
{ "allOf": [{ "type": "string" }, { "minLength": 5 }] }ℹ Intersection — use for schema composition/extension
anyOfCompositionapplies to: anyValue must be valid against AT LEAST ONE listed schema
{ "anyOf": [{ "type": "string" }, { "type": "number" }] }oneOfCompositionapplies to: anyValue must be valid against EXACTLY ONE listed schema
{ "oneOf": [{ "type": "string" }, { "type": "number" }] }ℹ Validates all and ensures exactly one matches — slower than anyOf
notCompositionapplies to: anyValue must NOT be valid against the given schema
{ "not": { "type": "null" } }if / then / elseCompositionapplies to: anyConditional validation: if condition matches, then/else applies
{ "if": { "properties": { "type": { "const": "email" } } }, "then": { "required": ["email"] }, "else": { "required": ["phone"] } }{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://example.com/schemas/user.json",
"title": "User",
"description": "A registered user account",
"type": "object",
"required": ["id", "email", "role"],
"properties": {
"id": {
"type": "integer",
"minimum": 1
},
"email": {
"type": "string",
"format": "email",
"maxLength": 255
},
"name": {
"type": ["string", "null"],
"maxLength": 100
},
"role": {
"type": "string",
"enum": ["admin", "editor", "viewer"]
},
"tags": {
"type": "array",
"items": { "type": "string" },
"uniqueItems": true,
"maxItems": 20
},
"createdAt": {
"type": "string",
"format": "date-time"
}
},
"additionalProperties": false
}{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$defs": {
"address": {
"type": "object",
"required": ["street", "city", "country"],
"properties": {
"street": { "type": "string" },
"city": { "type": "string" },
"zip": { "type": "string", "pattern": "^[0-9]{5}$" },
"country":{ "type": "string", "minLength": 2, "maxLength": 2 }
}
}
},
"type": "object",
"properties": {
"billing": { "$ref": "#/$defs/address" },
"shipping": { "$ref": "#/$defs/address" }
}
}JSON Schema is a vocabulary that allows you to annotate and validate JSON documents. A JSON Schema is itself a JSON document that describes the structure, constraints, and documentation of another JSON document. It is widely used for API request/response validation, configuration file validation, and form validation.
Draft-07 (2018) is the most widely supported version, used by Ajv, Java's everit-org, and Python jsonschema by default. Draft-2020-12 introduced $defs (replacing definitions), prefixItems for array tuples, the unevaluatedProperties/unevaluatedItems keywords, and dynamic references ($dynamicRef). Most validators support opt-in for the newer draft.
allOf requires a value to be valid against ALL listed schemas (intersection). anyOf requires it to be valid against AT LEAST ONE schema (union). oneOf requires it to be valid against EXACTLY ONE schema (exclusive). Use allOf for composing schemas, anyOf for accepting multiple types, and oneOf when exactly one branch must match.
Define reusable schemas under the $defs (draft 2020-12) or definitions (draft-07) keyword, then reference them with $ref: '#/$defs/MyType'. You can also reference external schemas by full URI: $ref: 'https://example.com/schemas/address.json'. Circular references are supported by most validators.