README.md
June 16, 2026 · View on GitHub
Command-line tool to compare and detect breaking changes in OpenAPI specs.
Run it locally, in CI via the GitHub Action, or use the hosted PR review workflow at oasdiff.com to approve or reject each change with a CI commit status.
Get started in 30 seconds
No install needed — try it with Docker against two sample specs:
docker run --rm -t tufin/oasdiff changelog \
https://raw.githubusercontent.com/oasdiff/oasdiff/main/data/openapi-test1.yaml \
https://raw.githubusercontent.com/oasdiff/oasdiff/main/data/openapi-test5.yaml
That prints a human-readable changelog of every significant change between the two specs. Swap changelog for breaking to see only breaking changes, or diff for the full machine-readable diff.
Installation
Install with Go
go install github.com/oasdiff/oasdiff@latest
Install on macOS with Brew
brew install oasdiff
Install on macOS and Linux using curl
The install.sh script downloads the latest oasdiff binary into /usr/local/bin:
curl -fsSL https://raw.githubusercontent.com/oasdiff/oasdiff/main/install.sh | sh
To pin a specific version, set the version env var:
curl -fsSL https://raw.githubusercontent.com/oasdiff/oasdiff/main/install.sh | version=1.11.7 sh
Install with asdf
https://github.com/oasdiff/asdf-oasdiff
Download a binary
Pre-built binaries for macOS, Linux, and Windows (both x86_64 and arm64) are on the releases page.
Documentation
Grouped by what you're trying to do. New to oasdiff? Start with Commands.
Commands
The top-level subcommands.
diff— full diff between two OpenAPI specs (output: html, json, markdown, markup, text, or yaml — default yaml)summary— high-level count of changes between two specs (built on the diff engine; same shared options)breaking— only breaking changeschangelog— every significant change, breaking or not, in human-readable formflatten— replaceallOfschemas with a merged equivalentupgrade— canonicalize an OpenAPI 3.0 spec to the latest 3.xvalidate— check a single spec for per-RFC violations (invalid types, missing required fields, bad regex, unresolved$refs)checks— list the rules oasdiff uses to classify changes (customize them)git-diff-driver— run as a git external diff driver sogit log --patchrenders an OpenAPI changelog inline
Inputs
Where specs come from.
- Git revisions — compare against a branch, tag, or commit
- Local files, http/s URLs, YAML or JSON — all handled transparently
Comparison
How oasdiff pairs up base and revision and what counts as a difference.
- Endpoint matching — handles renamed path parameters and duplicate endpoints
- Compare APIs split across multiple files — e.g. an API gateway with one spec per service
- Filter endpoints — narrow the diff to a subset of endpoints
Normalization
Align each spec before diffing so equivalent things line up.
- Merge
allOfschemas - Merge common (path-level) parameters
- Path prefix modification — strip or add a prefix so a moved API still matches
- Case-insensitive header comparison — treat
Content-Typeandcontent-typeas the same header
API lifecycle
Communicate intent across versions.
- Deprecate APIs and parameters
- API stability levels (draft / alpha / beta / stable)
Filtering changes
Choose which kinds of differences are reported.
- Exclude certain kinds of changes — e.g. ignore description-only edits
- Track OpenAPI extensions — opt in to reporting changes in
x-*fields - Exclude specific extension names — when extensions are tracked, skip ones you don't care about
Output
Shape and enrich the report.
- Customize HTML and Markdown changelog templates
- Add OpenAPI-extension attributes to changelog entries
- Source location tracking
- Change fingerprints — stable IDs across commits
- Error reporting
- Localization: en, ru, pt-br, es
How to run
- Docker
- Configuration file
- Embed in a Go program
- GitHub Action for CI — and oasdiff.com for teams, which adds a per-change PR comment with approve/reject and commit-status checks
- MCP server — call oasdiff from an AI assistant (Claude, Cursor, ...) via the hosted server at
https://api.oasdiff.com/mcp
Reference
- OpenAPI 3.1 support — what's supported
- Security: control external
$refloading to prevent SSRF - Usage examples — recipes for common scenarios
- Contributing
Demo
Credits
This project relies on the excellent implementation of OpenAPI 3.0 and 3.1 for Go: kin-openapi.
Feedback
We welcome your feedback.
If you have ideas for improvement or additional needs around APIs, please let us know.