← All breaking-change reports

Three more providers, 49 spec pairs, zero unexplained gaps

vercel · report · 2026-07-30 · source: change database

After the Stripe corridor, we ran the same head-to-head harness across three more providers: Twilio (20 pairs across five API families), PayPal (18 pairs across thirteen API families) and Vercel (11 pairs of the SDK OpenAPI spec). Same two engines — oasdiff, the mature Apache-2.0 comparator run as a vendored release binary, and specdiff, the zero-dependency engine inside mendapi. 49 adjacent published spec pairs, 0 engine errors, 0 timeouts. This is the full accounting.

The accounting identity

Units are anchor-plus-kind findings after taxonomy normalization. Both sides decompose exactly:

- oasdiff reported 658 breaking units: 181 matched by specdiff at the same anchor, plus 477 oasdiff-only units. 181 + 477 = 658. - specdiff reported 317 breaking units: the same 181 matched, plus 136 reported only by specdiff at the unit level. 181 + 136 = 317.

Every oasdiff-only unit has a name

The headline number is not the 477. It is the zero behind it: after classifying every one of those 477 oasdiff-only units from oasdiff's own finding texts, the count of unexplained detection gaps is 0, on all three corpora. Every unit landed in a named disposition bucket — format-only churn, object-to-any type widening, oneOf composition changes, annotation backfill, property relocation, and so on. Twilio's largest bucket is format-only churn (169 units); PayPal needed 12 distinct buckets; Vercel is dominated by oneOf composition additions (74 units) from Speakeasy's SDK generator.

To be precise about what that zero means: cite it as "0 unexplained detection gaps after disposition", not as "specdiff detects everything oasdiff does". Several buckets are deliberate silences. A false-positive-rate-first engine chooses not to page you about a format annotation being backfilled or a response union gaining a branch, and each such choice is documented per bucket in the classification files.

The 136 units on the other side

specdiff reported 136 units that oasdiff did not report at the same normalized anchor. The Twilio entries were human-verified as true removals; the PayPal and Vercel entries were spot-verified as detection kinds were added, but were not systematically re-adjudicated pair by pair the way the Stripe corridor exhibits were. So we cite them exactly that way: reported only by specdiff at the unit level — not a blanket accuracy claim.

What we are not claiming

Honesty notes, verbatim from the evidence file: these corridors measure cached published spec histories for three providers, and we do not extrapolate parity claims beyond these corpora and versions. oasdiff is a mature, excellent engine; the remaining differences are taxonomy and severity conventions plus deliberate silencing choices, not detection failures. Unlike the Stripe corridor, these three corpora had zero oasdiff timeouts and zero loader errors in the final rerun.

Check your own repo against these corridors

Every breaking unit from these corridors is in the change database behind this site, with a fixability verdict. To find out whether your repo is exposed — file and line number, no code leaving your machine:

npx mendapi scan --repo .

The per-provider timelines live on the Twilio, PayPal and Vercel breaking-change guides. The Stripe corridor that started this series has its own write-up, and the engine comparison methodology is documented on the when to use mendapi page.

Detected and tracked by mendapi — Dependabot for every API you depend on. Scans run locally; your code never leaves your machine.

Related

Change data is recorded from upstream provider releases, changelogs and OpenAPI spec diffs; every article names its source.