openapi-spec-validator-rs
A fast, drop-in Rust companion to openapi-spec-validator.
It validates Swagger 2.0 and OpenAPI 3.0, 3.1 and 3.2 documents with the same rules as openapi-spec-validator, returns the same verdicts, and runs 40 to 145 times faster on large specs. It ships as a command-line tool, a Python package with the same API, and a pre-commit hook. It is an independent project, not affiliated with or endorsed by the maintainers of openapi-spec-validator.
Command-line run time of the native binary, including start-up and parsing, on an Apple M4 (mean of 10 runs; the range is openapi-spec-validator with its jsonschema-rs backend and with its default backend):
| Spec | openapi-spec-validator-rs | openapi-spec-validator | Speed-up |
|---|---|---|---|
| GitHub (OpenAPI 3.0, JSON, 13.5 MB) | 57 ms | 6.41 s – 8.18 s | 113–144× |
| GitHub (OpenAPI 3.0, YAML, 10.3 MB) | 152 ms | 6.45 s – 8.20 s | 42–54× |
| Stripe (OpenAPI 3.0, JSON, 8.3 MB) | 31 ms | 1.80 s – 2.82 s | 59–92× |
| Kubernetes (Swagger 2.0, JSON, 4.3 MB) | 20 ms | 762 ms – 2.13 s | 39–109× |
The pip-installed command runs the same validator behind a Python entry point, which adds
about 25 ms of interpreter start-up per run: 45 ms for Kubernetes and 80 ms for GitHub's
JSON, 17 to 100 times faster than openapi-spec-validator.
Why
openapi-spec-validator is the standard OpenAPI validator in the Python ecosystem, but on large documents it takes seconds: most of the time goes into walking the document in Python, and its optional jsonschema-rs backend only speeds up a small part of that. This project ports the whole validator to Rust, rule for rule, so CI pipelines, pre-commit hooks and test suites get the same answers without the wait.
"Same answers" is checked, not assumed:
- Every check is ported. Each keyword validator in openapi-spec-validator's
keywords.pyhas a counterpart; COMPATIBILITY.md lists them, along with every known difference. - Real-world agreement. On all 4,138 specs in the APIs.guru directory, the verdict (valid, or which error class) and the first line of output match openapi-spec-validator 0.9.0 100% of the time, including the 482 specs it rejects.
- Upstream's own test suite runs against the Python package, unmodified; the 17 of its 136 tests that cannot pass (argparse's wording, upstream's internal settings and caches) are listed with their reasons.
- The quirks too. JSON and YAML are parsed exactly as PyYAML parses them,
patterns follow Python'srerules, and errors are reported with the same messages, in the same order.
Install
pip install openapi-spec-validator-rs
This installs the openapi-spec-validator-rs command and the openapi_spec_validator_rs
Python package (wheels for Linux, glibc and musl, macOS and Windows; Python 3.10+). The command is also
available on its own, without Python, as a Rust binary:
cargo install openapi-spec-validator-rs-cli --locked
Command line
Use it exactly like openapi-spec-validator:
openapi-spec-validator-rs openapi.yaml
openapi.yaml: OK
It accepts the same arguments (--schema {detect,2.0,3.0,3.1,3.2},
--validation-errors {first,all}, --subschema-errors {best-match,all}, - for standard
input), prints the same messages and exits with the same status: 0 when valid, 1 for a
validation or read error, 2 for any other error. Several files are validated in parallel
and reported in order. $refs to other files and to http(s):// URLs are followed as
upstream follows them: the pip-installed command fetches with Python's urllib (or
requests, when installed) like upstream, the Rust binary with a built-in client that
uses the operating system's certificate store and the HTTPS_PROXY/NO_PROXY variables.
Python
The package mirrors openapi-spec-validator's API:
from openapi_spec_validator_rs import validate, validate_path, validate_url
from openapi_spec_validator_rs import OpenAPIV31SpecValidator, OpenAPIValidationError
validate(spec_dict) # raises the first error
validate_path("openapi.yaml") # reads the file like the command line
validate_url("https://example.com/openapi.json")
errors = list(OpenAPIV31SpecValidator(spec_dict).iter_errors())
Errors are OpenAPIValidationError (or one of its subclasses: DuplicateOperationIDError,
ParameterDuplicateError, UnresolvableParameterError, ExtraParametersError) with the
same attributes and messages as upstream's. Moving over is usually a matter of changing the
import from openapi_spec_validator to openapi_spec_validator_rs. Code that catches
exception classes by their upstream names must catch this package's instead: its
OpenAPIValidationError is not a jsonschema.exceptions.ValidationError, and failures
that stop validation (an unresolvable $ref, for example) raise
ValidationAbortedError rather than referencing's or Python's own exceptions; see
COMPATIBILITY.md for the mapping.
Validate your FastAPI schema in CI
FastAPI builds its OpenAPI document at runtime, so check it in your test suite:
# tests/test_openapi.py
from openapi_spec_validator_rs import validate
from myapp.main import app
def test_openapi_schema_is_valid():
validate(app.openapi())
Run it in CI like any other test:
# .github/workflows/ci.yml
- run: pip install -e . pytest openapi-spec-validator-rs
- run: pytest tests/test_openapi.py
pre-commit
# .pre-commit-config.yaml
repos:
- repo: local
hooks:
- id: openapi-spec-validator-rs
name: openapi-spec-validator-rs
entry: openapi-spec-validator-rs
language: python
additional_dependencies: [openapi-spec-validator-rs==0.2.0]
files: .*(openapi|swagger).*\.(json|yaml|yml)$
Adjust files: to match your spec files. The repository also ships a
.pre-commit-hooks.yaml, so the hook can be referenced as
repo: https://github.com/Arjun-Aravind/openapi-spec-validator-rs with a rev instead,
but pre-commit then builds the package from source, which needs a Rust toolchain on every
machine that runs it; the form above installs the prebuilt wheel.
Benchmarks
Calling validate(spec_dict) from Python on an already-loaded document (what a test that
validates FastAPI's app.openapi() does), median of 5 runs:
| Spec | openapi-spec-validator-rs | openapi-spec-validator, jsonschema-rs backend | openapi-spec-validator, default backend |
|---|---|---|---|
| GitHub (13.5 MB) | 33 ms | 4.67 s (143× slower) | 6.38 s (196× slower) |
| Stripe (8.3 MB) | 16 ms | 0.89 s (55× slower) | 1.91 s (119× slower) |
| Kubernetes (4.3 MB) | 11 ms | 0.33 s (29× slower) | 1.70 s (149× slower) |
It also needs about a quarter of the memory on JSON specs: 81 MiB instead of 290 MiB for
GitHub's (98 MiB through the pip-installed command).
Validating every spec in the APIs.guru directory that openapi-spec-validator accepts (3,646 files, 535 MB of YAML) takes 1.6 s instead of 202–332 s.
See BENCHMARKS.md for the method, every measurement and how to reproduce them.
How it works
The validator is a Rust library (crates/openapi-spec-validator-rs) with a CLI and
PyO3 bindings on top. It follows the reference implementation step by step:
- Load: JSON goes through serde_json when libyaml would read it the same way; anything else goes through libyaml (the parser inside PyYAML) with PyYAML's YAML 1.1 rules, then through the same JSON round trip.
- Meta-schema: the whole document is validated against the official schema for its
version with the
jsonschemacrate. - Walk: the document is walked like
keywords.py, following$refs (into other files and over HTTP, fetched when first reached), checking every reachable schema against its dialect,defaultvalues against their schemas, and operation IDs, parameters, path templates and tags.
Python-specific behaviour (re syntax, str.format parsing of path templates, repr in
messages, format checks) is reproduced by small modules tested against CPython.
Compatibility
See COMPATIBILITY.md. In short: verdicts match openapi-spec-validator
0.9.0's default installation, $refs to other files and to http(s):// URLs included; a
handful of pathological inputs (schemas nested over 120 levels deep, NaN literals) behave
differently.
License
Apache-2.0, like openapi-spec-validator, which this project ports. See LICENSE and NOTICE.
Metadata
Release files for openapi-spec-validator-rs 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| openapi_spec_validator_rs-0.2.0.tar.gz | 224.7 kB | With provenance | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| openapi_spec_validator_rs-0.2.0-cp310-abi3-win_amd64.whl | CPython 3.10 | abi3 | Windows x86-64 | Details |
| openapi_spec_validator_rs-0.2.0-cp310-abi3-musllinux_1_2_x86_64.whl | CPython 3.10 | abi3 | Linux musl 1.2+ x86-64 | Details |
| openapi_spec_validator_rs-0.2.0-cp310-abi3-musllinux_1_2_aarch64.whl | CPython 3.10 | abi3 | Linux musl 1.2+ ARM64 | Details |
| openapi_spec_validator_rs-0.2.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | CPython 3.10 | abi3 | Linux glibc 2.17+ x86-64 | Details |
| openapi_spec_validator_rs-0.2.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl | CPython 3.10 | abi3 | Linux glibc 2.17+ ARM64 | Details |
| openapi_spec_validator_rs-0.2.0-cp310-abi3-macosx_11_0_arm64.whl | CPython 3.10 | abi3 | macOS 11.0+ ARM64 | Details |
| openapi_spec_validator_rs-0.2.0-cp310-abi3-macosx_10_12_x86_64.whl | CPython 3.10 | abi3 | macOS 10.12+ x86-64 | Details |
Total release size: 22.9 MB
Release files / openapi_spec_validator_rs-0.2.0.tar.gz
| Download URL | openapi_spec_validator_rs-0.2.0.tar.gz |
|---|---|
| Size | 224.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
33995223d637db02b6c9e183ca9e5ddc1e31e3dd24de6e8812f35443de2a788f
|
|
BLAKE2b-256 checksum How to use checksums |
734a02e824f3452e8356ca4ccd51eb700010614786e0ef15d3f464739cb79af1
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 24, 2026.
Transparency logRelease files / openapi_spec_validator_rs-0.2.0-cp310-abi3-win_amd64.whl
| Download URL | openapi_spec_validator_rs-0.2.0-cp310-abi3-win_amd64.whl |
|---|---|
| Size | 3.1 MB |
| Tags | CPython 3.10 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
9f73d7295f88ffe91de6cc824be27d98063b518ecf4e14654f79da768b3cf816
|
|
BLAKE2b-256 checksum How to use checksums |
088780e8d22f305e4888ee02cd50b5f25402906e0b1a0351f9bebf670429aa75
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 24, 2026.
Transparency logRelease files / openapi_spec_validator_rs-0.2.0-cp310-abi3-musllinux_1_2_x86_64.whl
| Download URL | openapi_spec_validator_rs-0.2.0-cp310-abi3-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 3.5 MB |
| Tags | CPython 3.10 Linux musl 1.2+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
15b51b24511f42dbb8241d770943d6989613eb659cf46503e8010487048aae8d
|
|
BLAKE2b-256 checksum How to use checksums |
0d657ee0e55345993a303ae043424981bac3d0a0cec03dee3bcb4b5633509982
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 24, 2026.
Transparency logRelease files / openapi_spec_validator_rs-0.2.0-cp310-abi3-musllinux_1_2_aarch64.whl
| Download URL | openapi_spec_validator_rs-0.2.0-cp310-abi3-musllinux_1_2_aarch64.whl |
|---|---|
| Size | 3.3 MB |
| Tags | CPython 3.10 Linux musl 1.2+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
cf86d6a195013c90f9bf876f529fc81f0e1e1116bc1baf59dac34621f99a9feb
|
|
BLAKE2b-256 checksum How to use checksums |
e69539bcd3ce307d843c1204ab6592556610039b2cc862c97b7c5a19ae184674
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 24, 2026.
Transparency logRelease files / openapi_spec_validator_rs-0.2.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | openapi_spec_validator_rs-0.2.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 3.3 MB |
| Tags | CPython 3.10 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
62661b193541971d14732961e09be01f69a8c6f091ed9721c57deab505d2e904
|
|
BLAKE2b-256 checksum How to use checksums |
e079246c34f31f5d7383de70082bf9b1871dbe5cdcff2e3eeaec32bce1dcbf8f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 24, 2026.
Transparency logRelease files / openapi_spec_validator_rs-0.2.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | openapi_spec_validator_rs-0.2.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 3.2 MB |
| Tags | CPython 3.10 Linux glibc 2.17+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
497d57bbfdd68db2451c5488aa7ad4272ec5f6f1498ddbddc13828521204a314
|
|
BLAKE2b-256 checksum How to use checksums |
f462c9aa26e6a8ec612158ce837aed0a0ae7ddb3fcbd51113a8b9361c4412b03
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 24, 2026.
Transparency logRelease files / openapi_spec_validator_rs-0.2.0-cp310-abi3-macosx_11_0_arm64.whl
| Download URL | openapi_spec_validator_rs-0.2.0-cp310-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 3.0 MB |
| Tags | CPython 3.10 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
def0f6b26871d9de044f11f1419df4c694f29be1b195c29e9ccba253828acb02
|
|
BLAKE2b-256 checksum How to use checksums |
98620f097e0908039682ec5314df47e8c933b961cb2b316892134460c8af30e3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 24, 2026.
Transparency logRelease files / openapi_spec_validator_rs-0.2.0-cp310-abi3-macosx_10_12_x86_64.whl
| Download URL | openapi_spec_validator_rs-0.2.0-cp310-abi3-macosx_10_12_x86_64.whl |
|---|---|
| Size | 3.2 MB |
| Tags | CPython 3.10 abi3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
15a719cb22d2bf32647911bf536df3682bbd493a9292d8687e363276a9b9d68f
|
|
BLAKE2b-256 checksum How to use checksums |
8fa2019838c71eada443af6003c678502fc8eca1fe5fb870c793eeb327766572
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 24, 2026.
Transparency logSecurity for openapi-spec-validator-rs 0.2.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 8 files in this release have been uploaded with provenance metadata.
Attestation for openapi_spec_validator_rs-0.2.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 24, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.