Development Status
- 4 - Beta
Intended Audience
- Developers
License
- OSI Approved :: BSD License
Operating System
- OS Independent
Programming Language
- Python :: 3
- Python :: 3.10
- Python :: 3.11
- Python :: 3.12
- Python :: 3.13
- Python :: 3.14
Topic
- Software Development :: Libraries
- Software Development :: Libraries :: Python Modules
Typing
- Typed
About
openapi-schema-validator is a Python library that validates schemas against:
OpenAPI Schema Specification v3.0 which is an extended subset of the JSON Schema Specification Wright Draft 00.
OpenAPI Schema Specification v3.1 which is an extended superset of the JSON Schema Specification Draft 2020-12.
OpenAPI Schema Specification v3.2 using the published OAS 3.2 JSON Schema dialect resources.
Documentation
Check documentation to see more details about the features. All documentation is in the “docs” directory and online at openapi-schema-validator.readthedocs.io
Installation
Recommended way (via pip):
pip install openapi-schema-validator
Alternatively you can download the code and install from the repository:
pip install "git+https://github.com/python-openapi/openapi-schema-validator.git"
Usage
validate call signature is:
validate(
instance,
schema,
cls=OAS32Validator,
allow_remote_references=False,
check_schema=True,
**kwargs,
)
The first argument is always the value you want to validate. The second argument is always the OpenAPI schema object. The cls keyword argument is optional and defaults to OAS32Validator. Use cls when you need a specific validator version/behavior.
from openapi_schema_validator import OAS30Validator
from openapi_schema_validator import OAS31Validator
from openapi_schema_validator import validate
# OpenAPI 3.0 behavior
validate(instance, schema, cls=OAS30Validator)
# OpenAPI 3.1 behavior
validate(instance, schema, cls=OAS31Validator)
# OpenAPI 3.2 behavior (default)
validate(instance, schema)
Common forwarded keyword arguments include registry (reference context) and format_checker (format validation behavior). By default, validate uses a local-only empty registry to avoid implicit remote $ref retrieval. To resolve external references, pass an explicit registry. Set allow_remote_references=True only if you explicitly accept jsonschema’s default remote retrieval behavior.
check_schema defaults to True and validates the schema before validating an instance. For trusted pre-validated schemas in hot paths, set check_schema=False to skip schema checking.
The validate helper keeps an internal compiled-validator cache. You can control cache size using the OPENAPI_SCHEMA_VALIDATOR_COMPILED_VALIDATOR_CACHE_MAX_SIZE environment variable (default: 128). The value is loaded once at first use and reused for the lifetime of the process.
To validate an OpenAPI schema:
from openapi_schema_validator import validate
# A sample schema
schema = {
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string"
},
"age": {
"type": ["integer", "null"],
"format": "int32",
"minimum": 0,
},
"birth-date": {
"type": "string",
"format": "date",
},
"address": {
"type": 'array',
"prefixItems": [
{ "type": "number" },
{ "type": "string" },
{ "enum": ["Street", "Avenue", "Boulevard"] },
{ "enum": ["NW", "NE", "SW", "SE"] }
],
"items": False,
}
},
"additionalProperties": False,
}
# If no exception is raised by validate(), the instance is valid.
validate({"name": "John", "age": 23, "address": [1600, "Pennsylvania", "Avenue"]}, schema)
validate({"name": "John", "city": "London"}, schema)
Expected failure output:
Traceback (most recent call last):
...
ValidationError: Additional properties are not allowed ('city' was unexpected)
By default, the latest OpenAPI schema syntax is expected.
Default dialect resolution
The OpenAPI 3.1 and 3.2 base dialect URIs are registered for jsonschema.validators.validator_for resolution. Schemas declaring "$schema" as either "https://spec.openapis.org/oas/3.1/dialect/base" or "https://spec.openapis.org/oas/3.2/dialect/2025-09-17" resolve directly to OAS31Validator and OAS32Validator without unresolved-metaschema fallback warnings.
from jsonschema.validators import validator_for
from openapi_schema_validator import OAS31Validator
from openapi_schema_validator import OAS32Validator
schema = {
"$schema": "https://spec.openapis.org/oas/3.1/dialect/base",
"type": "object",
}
schema32 = {
"$schema": "https://spec.openapis.org/oas/3.2/dialect/2025-09-17",
"type": "object",
}
assert validator_for(schema) is OAS31Validator
assert validator_for(schema32) is OAS32Validator
Binary Data Semantics
The handling of binary-like payloads differs between OpenAPI versions.
OpenAPI 3.0
OpenAPI 3.0 keeps historical format: binary / format: byte usage on type: string.
- OAS30Validator (default - compatibility behavior)
type: string accepts str
type: string, format: binary accepts Python bytes and strings
useful when validating Python-native runtime data
- OAS30StrictValidator
type: string accepts str only
type: string, format: binary uses strict format validation
use when you want strict, spec-oriented behavior for 3.0 schemas
OpenAPI 3.1+
OpenAPI 3.1+ follows JSON Schema semantics for string typing in this library.
type: string accepts str only (not bytes)
format: binary and format: byte are not treated as built-in formats
for base64-in-JSON, model with contentEncoding: base64 (optionally contentMediaType)
for raw binary payloads, model via media type (for example application/octet-stream) rather than schema string formats
Regex Behavior
By default, pattern handling follows host Python regex behavior. For ECMAScript-oriented regex validation and matching (via regress), install the optional extra:
pip install "openapi-schema-validator[ecma-regex]"
For more details read about Validation.