Open workbench
API CONTRACT REVIEWZero-upload IndexedDB engine

Know exactly which JSON changes will break your consumers.

DriftMap infers a structural contract from real payload samples and classifies every drift as breaking, warning, safe, or info — so you review risk, not formatting noise.

Secure Team CI CloudPrivate Schema Gating

Quick start · no global install

Node.js
npx driftmap diff --baseline main.json --candidate candidate.json

Compare two JSON samples directly from your terminal.

OpenAPI 3.0 JSON & YAMLLocal-first, cloud optionalIndexedDB · no upload by default
SCHEMA VERSION TIMELINE SCRUBBER
Comparing:v1.0.0➔v2.0-rc1 · 8be931c

v2.0-rc1: 6 changes · fields removed, retyped, or newly required. Comparing v1.0.0 to v2.0-rc1.

HOW DRIFT IS FOUNDorder.shipped · v1.0.0 → v2.0-rc1
6 breaking10 warning
Path & telemetry
Type shift
Drift classification
Presence
/data/currencyRULE_REQUIRED_FIELD_REMOVED
stringmissing
Breaking · removed
3/3
/data/discount_centsRULE_REQUIRED_FIELD_REMOVED
numbermissing
Breaking · removed
1/3
/data/total_centsRULE_REQUIRED_FIELD_REMOVED
numbermissing
Breaking · removed
3/3
/data/customer/emailRULE_REQUIRED_FIELD_REMOVED
stringmissing
Breaking · removed
3/3
/data/shipping/tracking_numberRULE_REQUIRED_FIELD_REMOVED
stringmissing
Breaking · removed
3/3
/data/items/*/unit_price_centsRULE_REQUIRED_FIELD_REMOVED
numbermissing
Breaking · removed
3/3
/schema_versionRULE_OPTIONAL_FIELD_ADDED
absentstring
Warning · added required
3/3
/data/fulfillmentRULE_OPTIONAL_FIELD_ADDED
absentobject
Warning · added required
3/3
/data/totalRULE_OPTIONAL_FIELD_ADDED
absentobject
Warning · added required
3/3
/data/fulfillment/location_idRULE_OPTIONAL_FIELD_ADDED
absentstring
Warning · added required
3/3
/data/shipping/trackingRULE_OPTIONAL_FIELD_ADDED
absentstring
Warning · added required
3/3
/data/total/amountRULE_OPTIONAL_FIELD_ADDED
absentnumber
Warning · added required
3/3
/data/total/currencyRULE_OPTIONAL_FIELD_ADDED
absentstring
Warning · added required
3/3
/data/items/*/unit_priceRULE_OPTIONAL_FIELD_ADDED
absentobject
Warning · added required
3/3
/data/items/*/unit_price/amountRULE_OPTIONAL_FIELD_ADDED
absentnumber
Warning · added required
3/3
/data/items/*/unit_price/currencyRULE_OPTIONAL_FIELD_ADDED
absentstring
Warning · added required
3/3
Candidate snippet:{ "order_id": "ORD-1004", "status": "shipped", "total": { "amount": 129, "currency": "USD" } }
SELECTED PATH EVIDENCE

/data/currency

Breaking · removed
BASELINE (v1)
string · required
Sample: "USD"
CANDIDATE (v2.0-rc1)
— missing
No sample recorded
SPLIT JSON AST DIFF · /data/currency Line-level pointer slice
BASELINE AST (v1)
01{
02 data: {
03 "currency": "USD"
04 }
CANDIDATE AST (v2.0-rc1)
01{
02 data: {
03- // "currency" removed
04 }
COMPATIBILITY RULE (100% presence)RULE_REQUIRED_FIELD_REMOVED

The field existed in the baseline contract but is absent from all candidate samples. For event compatibility this is classified as breaking.

Event payload: removed fields are treated as breaking.

Row 1 of 16 · Use ↑/↓ or J/K

Press for the command palette, or ↑/↓ and J/K to move through findings.

HOW IT WORKS

From samples to ranked findings in three steps

No custom DSL or manual JSON Schema authoring required. Drop raw response bodies or OpenAPI documents and let evidence guide the review.

01 · INPUTJSON / YAML ≤ 2 MB

Add samples

Paste raw JSON payloads or import OpenAPI 3.0 specs in JSON or YAML. Group samples into baseline and candidate sets inside a local workspace.

WORKSPACE INPUTS✓ Validated
baseline_orders_v1.json3 samples
candidate_orders_v2.yamlOpenAPI 3.0
02 · INFERENCENormalized pointers

Infer the contract

DriftMap merges every sample into a normalized path tree, recording observed types, nullability, and whether each field was always present.

INFERRED CONTRACT TREEWildcard /*
/customer/emailstring · req (3/3)
/items/*/skustring|number · req
03 · CLASSIFICATIONRanked by risk

Review classified drift

Every difference between baseline and candidate is scored by compatibility rules and surfaced with before/after evidence you can filter and export.

SEMANTIC VERDICTAction required
Breaking (2)Warning (1)Safe (1)
CAPABILITIES

Evidence, classification, and exports — in one review

Built specifically for backend and platform engineers reviewing payload changes before merging pull requests.

PATH NORMALIZATION & UNION TYPES

Contract inference from samples

Builds a structural contract from one or many JSON payloads or an OpenAPI 3.0 document. Array items collapse into wildcard paths like /items/*/id so heterogeneous elements are compared together.

Raw observed array indices
/items/0/id"sku_01"
/items/1/id10492
/items/2/idnull
Normalized contract node
/items/*/id
type: string | number
status: required · nullable
4-TIER RISK TAXONOMY

Semantic drift classification

Separates breaking changes (removed fields, narrowed types) from warnings (new nullability, required-to-optional shifts), safe additions, and informational notes.

breakingField removed · Type narrowed
warningBecame nullable · Req → Opt
safeOptional field added
infoUnchanged baseline contract
3D SPATIAL ARCHITECTURE·CLICK PLANE TO FOCUS

Interactive 3D isometric contract stack

Click any plane below to pop it forward flat at 0° for crystal-clear reading, or view the stepped 3D cascade to see how raw JSON samples collapse into a normalized wildcard tree and emit semantic drift verdicts.

Showing all 3 stepped planes in isometric cascade — click any plane to pop forward at 0°.

PLANE 01 · RAW JSON PAYLOADSIndexedDB local
v1_sample_1.json
"email": "a@b.co"
v2_candidate.json
"sku": 1042
Evidence: sample count per sideClick to pop 0° flat ↗
PLANE 02 · NORMALIZED WILDCARD TREE (`/*`)AST pointer merge
/customer/emailstring · req
/items/*/skustring ➔ number
Wildcard collapse activeClick to pop 0° flat ↗
PLANE 03 · CLASSIFIED SEMANTIC DIFFCompatibility verdict
/customer/emailBREAKING · REMOVED
/customer/ageWARNING · NULLABLE
PR report ready✓ Zero false formatting diffs
PR-READY ARTIFACTS

Markdown & workspace exports

Copy a clean Markdown summary for pull requests or incident threads, or export and re-import the full workspace as JSON to share a review session.

MARKDOWN PR SUMMARY PREVIEW
### DriftMap Contract Review (`Order API v1 → v2`)
| Severity | Path | Rule | Before → After |
| :--- | :--- | :--- | :--- |
| 🔴 **BREAKING** | `/customer/email` | `FIELD_REMOVED` | `string (req)` → `missing` |
| 🟡 **WARNING** | `/customer/age` | `NULLABLE_ADDED` | `string` → `string | null` |
ZERO DEFAULT TELEMETRY

Local-first privacy

Payloads stay in your browser via IndexedDB by default. Nothing is uploaded unless you sign in and explicitly sync a workspace.

Browser storage engineIndexedDB (`contract-atlas`)
Outbound payload calls0 requests (offline-ready)
DOCUMENT IMPORT CAP2.0 MB MAX PER SPEC
READ THE CHANGE, NOT JUST THE DIFF

Every finding keeps its context

Line-by-line text diffs bury the real question: will existing clients fail when they parse this response? DriftMap pairs each path with the exact rule that fired and the sample evidence behind it.

  • 1Filter findings by severity or search by JSON-pointer path across deeply nested objects.
  • 2Inspect before and after types, requiredness, and observed sample values side by side.
  • 3See the compatibility rule and plain-language explanation for every classification.
FINDING INSPECTOR
/customer/emailBreaking · removed
RULE_REQUIRED_FIELD_REMOVED
BASELINE CONTRACT (v1)
string · required
Present in every baseline sample
Observed: "taylor@example.com"
CANDIDATE CONTRACT (v2)
— missing from payload
Absent from every candidate sample
Observed: undefined (key omitted)
Why this breaks consumers

Field /customer/email was present in every baseline sample (required) and is absent from the candidate samples. Consumers that read payload.data.customer.email without an optional check will see a missing key rather than a string.

LIMITATIONS & ENGINEERING SCOPE

What it doesn't do yet

DriftMap is built for fast, honest contract triage. Know the exact boundaries of sample-based inference before integrating it into your release checklist.

01

Evidence-based inference, not a formal schema validator

Inference is evidence-based, not a formal schema validator — rare fields missing from your samples won't appear in the inferred contract.

02

No fuzzy field rename matching

Field renames appear as a removal plus an addition; fuzzy rename matching is not performed.

03

OpenAPI 3.0 only (JSON & YAML)

OpenAPI 3.0 only (JSON and YAML); OpenAPI 3.1 and Swagger 2.0 are not parsed, and external $ref URLs are rejected.

04

2 MB document import ceiling

Imports are capped at 2 MB per payload or specification document to keep in-browser parsing responsive.

05

Heuristic compatibility guidance

Classifications are heuristic compatibility guidance, not a guarantee of runtime safety.

06

Browser-scoped IndexedDB persistence

Local data lives in your browser's IndexedDB unless you explicitly sign in and sync.

TEAM / CI CLOUD

Start local. Add shared baselines when your team needs them.

Review API changes locally today, then bring private schema gating and shared baselines into your team CI workflow with Team CI Cloud. Team CI Cloud is currently in early access.

PRIVATE · LOCAL REVIEW

Local review

Review payload changes in your browser with files you provide.

  • ✓In-browser workbench saved to IndexedDB
  • ✓Inspect baseline and candidate contracts in your browser
  • ✓Export review findings for your team workflows
PRO · TEAM CLOUD BASELINE
Early access

For teams

Shared contract history for teams that want CI to find the baseline automatically.

  • ◷Shared baseline tracked from the default branch
  • ◷Automatic pull request comparisons across branches
  • ◷Team review history for contract changes
Already have an account? Sign in for Cloud Workspace Sync

Team baseline tracking is planned; pricing and availability have not been announced.

Make contract changes easy to review.

Check your next payload change before it ships.

No account required. Paste two samples and see the inferred contract diff in seconds.

Sign in to sync workspaces
DriftMap — API Contract Review & Semantic Drift Engine