<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Denny</title>
    <description>The latest articles on DEV Community by Denny (@dennyriedl).</description>
    <link>https://dev.to/dennyriedl</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4141262%2F0ae78650-aaef-442e-9f14-43a462362fa1.png</url>
      <title>DEV Community: Denny</title>
      <link>https://dev.to/dennyriedl</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dennyriedl"/>
    <language>en</language>
    <item>
      <title>Three Years Later: What Happened to 1,927 Public API Specs</title>
      <dc:creator>Denny</dc:creator>
      <pubDate>Thu, 24 Sep 2026 13:05:36 +0000</pubDate>
      <link>https://dev.to/dennyriedl/three-years-later-what-happened-to-1927-public-api-specs-2oc6</link>
      <guid>https://dev.to/dennyriedl/three-years-later-what-happened-to-1927-public-api-specs-2oc6</guid>
      <description>&lt;p&gt;If you integrated a public API in 2023, you probably read its OpenAPI spec, generated a client from it, and trusted the version number to tell you when the contract changed. The contract most likely did change since then, and the version number most likely kept quiet about it.&lt;/p&gt;

&lt;p&gt;We know this because we measured it. The apis.guru directory stores 1,927 public API specs that point back to a Swagger or OpenAPI file at the provider. In September 2026 we fetched each of those files again and compared it with the copy the directory had kept since 2023. Where a contract had changed in a way that breaks a client, the major version stayed the same nine times out of ten.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we measured
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://github.com/APIs-guru/openapi-directory" rel="noopener noreferrer"&gt;APIs.guru OpenAPI directory&lt;/a&gt; is an open collection of public API descriptions, and it holds more than 2,500 APIs from 676 providers. Its update job last refreshed a spec in April 2023, so the directory is a record of how those APIs described themselves in spring 2023. For every API whose source was a Swagger 2.0 or OpenAPI 3.x file, the directory also records the URL that file came from.&lt;/p&gt;

&lt;p&gt;We fetched those 1,927 URLs once on September 14, 2026, and parsed both the old and the new document. We then compared each pair with the same breaking-change rules that Routebase applies when a team publishes a new version of its own spec. Three limits shape what the numbers can say:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The 2023 side is the directory's copy, which differs from the provider's file in format and in small corrections, so we only count changes a client can observe.&lt;/li&gt;
&lt;li&gt;A spec that pulls definitions from other files can't be compared reliably from one file, so those pairs are set aside.&lt;/li&gt;
&lt;li&gt;The numbers describe public APIs that someone once listed in a directory, not internal APIs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A third of the spec URLs are gone
&lt;/h2&gt;

&lt;p&gt;Before a contract can drift, the file that describes it has to still be there. Of the 1,927 URLs, 1,230 answered with a 200 in 2026, which is 63.8 percent. Another 521, or 27.0 percent, answered with a 404 or a 410, and 122 didn't answer at all.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhg067m9ywxnevekuacq5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhg067m9ywxnevekuacq5.png" alt="Where the 1,927 spec URLs recorded in 2023 led in September 2026. Fewer than two in three still serve a file, and more than a quarter answer that the file is gone. The last row collects server errors, unresolved redirects and a few rare status codes." width="799" height="483"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Where the 1,927 spec URLs recorded in 2023 led in September 2026. Fewer than two in three still serve a file, and more than a quarter answer that the file is gone. The last row collects server errors, unresolved redirects and a few rare status codes.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is a finding about spec URLs and not about the APIs behind them, because a provider can move its description without retiring anything. For a consumer the effect is the same, though. When a build step fetches a provider's spec by URL to generate a client or run a contract test, more than one in three of those steps would fail today.&lt;/p&gt;

&lt;h2&gt;
  
  
  Half of the surviving contracts changed
&lt;/h2&gt;

&lt;p&gt;Of the 1,230 URLs that still answered, 838 returned a document we could parse and pair with its 2023 copy. The 493 pairs that stand on their own, without definitions pulled from other files, carry the numbers in this section.&lt;/p&gt;

&lt;p&gt;Within three years, 48.9 percent of those contracts changed in a way a client can observe. An endpoint, a parameter or a field was added or removed, or a type changed, while edits to descriptions and examples don't count. Two thirds of the changed contracts, 66.8 percent, contain at least one breaking change.&lt;/p&gt;

&lt;p&gt;The breaking changes are not exotic. An endpoint disappeared in 45.3 percent of the affected specs, and a response field was removed in 44.1 percent. These are exactly the changes that turn into a missing route or a null value in someone else's code on the day the provider deploys.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Breaking change&lt;/th&gt;
&lt;th&gt;Share of specs with a breaking change&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Endpoint removed&lt;/td&gt;
&lt;td&gt;45.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Response field removed&lt;/td&gt;
&lt;td&gt;44.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Parameter removed&lt;/td&gt;
&lt;td&gt;36.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Response type changed&lt;/td&gt;
&lt;td&gt;36.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Required field added to the request body&lt;/td&gt;
&lt;td&gt;17.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Endpoint path changed&lt;/td&gt;
&lt;td&gt;15.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Nine in ten breaking changes arrive without a major bump
&lt;/h2&gt;

&lt;p&gt;Semantic versioning makes a simple promise, which is that a breaking change raises the major version. Among the 161 specs with a breaking change, 143 kept their major version, which is 88.8 percent. In 86 of them, or 53.4 percent, the version string didn't change at all.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fran2jmpjm4srwtdrk61y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fran2jmpjm4srwtdrk61y.png" alt="The 161 contracts with at least one breaking change, grouped by what their version number did between 2023 and 2026. Only the major bump is the signal semantic versioning promises, and it covers 18 of them. More than half kept the exact same version string, and fifteen carry a lower number today than they did in 2023." width="800" height="547"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The 161 contracts with at least one breaking change, grouped by what their version number did between 2023 and 2026. Only the major bump is the signal semantic versioning promises, and it covers 18 of them. More than half kept the exact same version string, and fifteen carry a lower number today than they did in 2023.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Some of the rest moved in directions semantic versioning has no word for. Fifteen specs carry a lower version number today than in 2023, and eight use version strings that aren't semantic versions at all.&lt;/p&gt;

&lt;p&gt;The consequence is practical. A client that pins a major version, or a dependency bot that waits for one, would have been warned about 18 of these 161 breaking changes. It would have met the other 143 without any warning from the version number.&lt;/p&gt;

&lt;h2&gt;
  
  
  It was always like this
&lt;/h2&gt;

&lt;p&gt;The directory's git history lets us look further back than one comparison. Between 2015 and 2023, its update job committed 106,083 new revisions of existing spec files, and we compared each of them with the revision before it. Of the pairs we could compare, 26.7 percent changed the contract structurally, and 30.8 percent of those changes broke a client.&lt;/p&gt;

&lt;p&gt;The directory stores every declared version in a folder of its own, so a new version is a new file, and nearly all of these pairs share one version number. That follows from how the directory is organised and is not a finding in itself. The finding is what providers change inside a version they have already published, which is more than one structural change in four, with almost one in three of those breaking a client.&lt;/p&gt;

&lt;h2&gt;
  
  
  Weighting doesn't move the headline
&lt;/h2&gt;

&lt;p&gt;Four providers with hundreds of specs each hold more than half of the directory, so a share across the whole corpus risks describing those four and nobody else. We therefore computed every number with each provider weighted equally, and again without those four providers at all.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Share of re-fetched contracts&lt;/th&gt;
&lt;th&gt;Raw&lt;/th&gt;
&lt;th&gt;Each provider weighted equally&lt;/th&gt;
&lt;th&gt;Without the four largest providers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Contract changed&lt;/td&gt;
&lt;td&gt;48.9%&lt;/td&gt;
&lt;td&gt;42.0%&lt;/td&gt;
&lt;td&gt;50.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Of those, with a breaking change&lt;/td&gt;
&lt;td&gt;66.8%&lt;/td&gt;
&lt;td&gt;70.8%&lt;/td&gt;
&lt;td&gt;66.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Breaking changes without a major bump&lt;/td&gt;
&lt;td&gt;88.8%&lt;/td&gt;
&lt;td&gt;87.7%&lt;/td&gt;
&lt;td&gt;88.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In every column, between 42 and 50 percent of the contracts changed, and about two thirds of those changes broke something. Close to nine in ten of those breaks kept the major version, whichever way you count.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a spec looks like before it drifts
&lt;/h2&gt;

&lt;p&gt;The 2023 snapshot also shows the state these contracts were in before they changed. Only 47.6 percent of the 2,481 specs define a 4xx error response on even one endpoint, so for most of them the error format is something a consumer finds out at runtime. More than a quarter, 27.8 percent, attach no security requirement to any endpoint, and 20.5 percent define no security scheme at all.&lt;/p&gt;

&lt;p&gt;Even the version numbers start on shaky ground, because only 31.8 percent of them follow the x.y.z shape that semantic versioning expects. We also ran the neutral core of our own built-in style guide rules, which leaves casing and other house style aside. By that measure, 98.1 percent of the specs have at least one finding, and the median spec has 13. These are Routebase's rules and therefore a convention rather than a standard.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to catch this in your own APIs
&lt;/h2&gt;

&lt;p&gt;The providers in this study aren't careless. A contract changes because the code behind it changes, and nothing in a typical release process compares the new contract with the one consumers already rely on. That comparison is cheap once it runs automatically, and it belongs in two places, at the moment a new version is published and while the API is running.&lt;/p&gt;

&lt;p&gt;When you publish a new version in Routebase, it compares the spec with the previous version using the same breaking-change rules this study used, and it suggests the version bump those changes call for. A branch that removes a field or adds a required parameter is flagged as breaking on its merge request, and you can require an Admin or Owner to approve it before it merges. The rules and what counts as breaking are explained in &lt;a href="https://routebase.dev/guides/api-versioning/api-breaking-changes/" rel="noopener noreferrer"&gt;API breaking changes&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For the changes that ship without a new spec version at all, drift monitors compare the live API with the published spec field by field. Contract tests run from the same spec as well. When the spec says a product carries a &lt;code&gt;currency&lt;/code&gt; field and the live API doesn't return one, the test goes red in CI before a consumer sees the gap. The production side is covered in &lt;a href="https://routebase.dev/guides/api-monitoring/api-contract-drift/" rel="noopener noreferrer"&gt;contract drift monitoring&lt;/a&gt;, and agents that work on the spec over MCP pass through the same checks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Method
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Corpus.&lt;/strong&gt; &lt;a href="https://github.com/APIs-guru/openapi-directory" rel="noopener noreferrer"&gt;APIs-guru/openapi-directory&lt;/a&gt; at commit &lt;code&gt;f04b8d0bcd39c52e1cf3ad7a5fe744709832ae49&lt;/code&gt;, with the directory's &lt;code&gt;list.json&lt;/code&gt; read on September 14, 2026. Contributed definitions are CC0, and definitions taken from public sources are listed under fair use.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Re-fetch.&lt;/strong&gt; Every origin URL whose source format is Swagger 2.0 or OpenAPI 3.x, fetched once on September 14, 2026, with a 20-second timeout and no retries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Engine.&lt;/strong&gt; The parser, style guide rules and breaking-change detection of the Routebase product, run from a console harness without a database.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comparison.&lt;/strong&gt; Path placeholders are compared by position and local references are inlined before the diff, because a renamed placeholder or a moved schema is invisible on the wire. Pairs that reference other documents are left out.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weighting.&lt;/strong&gt; Every share is reported raw and with each provider weighted equally.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review.&lt;/strong&gt; Ten breaking-change verdicts drawn at random were read by hand against both documents, and the comparison rules above come from that review.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data.&lt;/strong&gt; Tables, pseudonymised raw data and the aggregation script are in &lt;a href="https://github.com/routebase-dev/openapi-corpus-study" rel="noopener noreferrer"&gt;routebase-dev/openapi-corpus-study&lt;/a&gt;. Data and tables are CC BY 4.0, and the script is MIT.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>openapi</category>
      <category>api</category>
      <category>versioning</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
