<?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: Aviad Shakargy</title>
    <description>The latest articles on DEV Community by Aviad Shakargy (@shakargy).</description>
    <link>https://dev.to/shakargy</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3944913%2Fd149c8a2-52c2-4ab1-95ca-78577227792b.png</url>
      <title>DEV Community: Aviad Shakargy</title>
      <link>https://dev.to/shakargy</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shakargy"/>
    <language>en</language>
    <item>
      <title>I Monitored 15 Popular APIs for 7 Days. 73% Changed While Nobody Was Watching.</title>
      <dc:creator>Aviad Shakargy</dc:creator>
      <pubDate>Thu, 21 May 2026 22:40:39 +0000</pubDate>
      <link>https://dev.to/shakargy/i-monitored-15-popular-apis-for-7-days-73-changed-while-nobody-was-watching-8ij</link>
      <guid>https://dev.to/shakargy/i-monitored-15-popular-apis-for-7-days-73-changed-while-nobody-was-watching-8ij</guid>
      <description>&lt;p&gt;Every backend depends on a graveyard of third-party APIs. Stripe for billing, Twilio for SMS, OpenAI for inference, that internal auth service from two teams over that nobody remembers who owns.&lt;/p&gt;

&lt;p&gt;Ask any backend engineer to list every external HTTP call their service makes and you'll get half the list. The other half lives in a forgotten cron job, a legacy integration, or a vendor your predecessor added and never documented.&lt;/p&gt;

&lt;p&gt;I wanted to know: &lt;strong&gt;how often do these APIs actually change?&lt;/strong&gt; Not the big announcements that hit Hacker News - the quiet ones. The field that becomes required. The header that gets renamed. The deprecation notice buried in page 4 of a changelog.&lt;/p&gt;

&lt;p&gt;So I built a system to find out.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Experiment
&lt;/h2&gt;

&lt;p&gt;I pointed my monitoring engine at the changelogs and release notes of 15 widely-used APIs:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stripe&lt;/strong&gt; · &lt;strong&gt;OpenAI&lt;/strong&gt; · &lt;strong&gt;Twilio&lt;/strong&gt; · &lt;strong&gt;GitHub&lt;/strong&gt; · &lt;strong&gt;Auth0&lt;/strong&gt; · &lt;strong&gt;SendGrid&lt;/strong&gt; · &lt;strong&gt;Slack&lt;/strong&gt; · &lt;strong&gt;Shopify&lt;/strong&gt; · &lt;strong&gt;Cloudflare&lt;/strong&gt; · &lt;strong&gt;Vercel&lt;/strong&gt; · &lt;strong&gt;Supabase&lt;/strong&gt; · &lt;strong&gt;Notion&lt;/strong&gt; · &lt;strong&gt;Firebase&lt;/strong&gt; · &lt;strong&gt;HubSpot&lt;/strong&gt; · &lt;strong&gt;Datadog&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every 6 hours, a worker fetches each changelog URL, extracts the text, computes a content hash, diffs it against the previous snapshot, and runs the diff through a severity classifier that scans for keywords like &lt;code&gt;breaking change&lt;/code&gt;, &lt;code&gt;deprecated&lt;/code&gt;, &lt;code&gt;removed&lt;/code&gt;, &lt;code&gt;security&lt;/code&gt;, &lt;code&gt;end of life&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I let it run for a week with zero manual intervention. No tweaking, no hand-holding. Just the pipeline doing its job.&lt;/p&gt;

&lt;p&gt;Here's what came back.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Results
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;7 days. 15 APIs. 58 change events detected.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;11 out of 15 APIs - &lt;strong&gt;73%&lt;/strong&gt; - shipped at least one change to their changelog or docs during a single week.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;API&lt;/th&gt;
&lt;th&gt;Changes Detected&lt;/th&gt;
&lt;th&gt;Risk Keywords Found&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GitHub&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;security, deprecated, removed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vercel&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;security, deprecated, beta&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloudflare&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;security, vulnerability, removed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shopify&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;deprecated, removed, beta&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Datadog&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;shutdown, breaking change, vulnerability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Slack&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;breaking change, deprecated, renamed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Firebase&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;breaking change, vulnerability, renamed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Supabase&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;breaking change, deprecated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auth0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;end of life, breaking change&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenAI&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;breaking change, deprecated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HubSpot&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;beta&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stripe&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Twilio&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SendGrid&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Notion&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Let that sink in. In one week, the classifier flagged entries containing high-risk terms like &lt;code&gt;breaking change&lt;/code&gt;, &lt;code&gt;deprecated&lt;/code&gt;, &lt;code&gt;removed&lt;/code&gt;, and &lt;code&gt;end of life&lt;/code&gt; across 11 different APIs. Cloudflare, Datadog, and Firebase had &lt;code&gt;vulnerability&lt;/code&gt; mentions. Auth0 had an &lt;code&gt;end of life&lt;/code&gt; notice. Datadog's changelog contained &lt;code&gt;shutdown&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Not every flagged entry means something broke. But each one is the kind of change worth reviewing before your next deploy - and in a normal week, most teams probably would not have seen them in time.&lt;/p&gt;

&lt;p&gt;And this is just what's in the public changelogs. This is vendors doing the responsible thing and documenting their changes. How many don't?&lt;/p&gt;

&lt;h3&gt;
  
  
  Methodology note
&lt;/h3&gt;

&lt;p&gt;This experiment tracked visible changes in public changelog and release-note pages. It does not prove that every detected change was breaking, only that the monitored source changed and contained risk-related language worth reviewing.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Surprised Me
&lt;/h2&gt;

&lt;h3&gt;
  
  
  During this week, GitHub changed almost every 12 hours
&lt;/h3&gt;

&lt;p&gt;14 change events in 7 days. During this monitoring period, GitHub's blog changelog updated almost twice a day with deprecations, security patches, and feature removals. If your CI/CD pipeline, your auth flow, or your webhook integrations depend on GitHub's API - and they probably do - things are moving under your feet constantly.&lt;/p&gt;

&lt;h3&gt;
  
  
  The "stable" APIs really are stable
&lt;/h3&gt;

&lt;p&gt;Stripe, Twilio, SendGrid, and Notion had &lt;strong&gt;zero&lt;/strong&gt; detected changes all week. That's not boring - that's a signal. These teams invest heavily in API stability. When you're choosing between vendors, this kind of data matters.&lt;/p&gt;

&lt;h3&gt;
  
  
  Most detected changes carried high-risk keywords
&lt;/h3&gt;

&lt;p&gt;A large share of the 58 events contained keywords like &lt;code&gt;security&lt;/code&gt;, &lt;code&gt;deprecated&lt;/code&gt;, or &lt;code&gt;removed&lt;/code&gt;. That doesn't mean every change was production-breaking - it means these were the changes most worth reviewing. Changelog entries tend to cluster around consequential updates. Nobody updates their changelog to say "we fixed a typo in an error message." When an entry appears, it usually matters.&lt;/p&gt;

&lt;h3&gt;
  
  
  Auth0 dropped an "end of life" notice
&lt;/h3&gt;

&lt;p&gt;One event, one week, but the keywords were: &lt;code&gt;end of life&lt;/code&gt;, &lt;code&gt;breaking change&lt;/code&gt;, &lt;code&gt;deprecated&lt;/code&gt;, &lt;code&gt;removed&lt;/code&gt;, &lt;code&gt;renamed&lt;/code&gt;. If you integrate with Auth0 and you didn't read their changelog this week, you might have missed a deprecation that affects your auth flow.&lt;/p&gt;




&lt;h2&gt;
  
  
  How It Works Under The Hood
&lt;/h2&gt;

&lt;p&gt;This isn't a cron job running &lt;code&gt;curl&lt;/code&gt; and &lt;code&gt;diff&lt;/code&gt;. It's the same detection engine that powers &lt;a href="https://www.api-graveyard.com" rel="noopener noreferrer"&gt;API Graveyard&lt;/a&gt;, my API dependency intelligence platform, running against real vendor data in production.&lt;/p&gt;

&lt;p&gt;The pipeline:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Celery Beat&lt;/strong&gt; dispatches fetch jobs every 6 hours for each monitored source&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Worker&lt;/strong&gt; fetches the changelog URL, extracts text, and computes a content hash&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Diff engine&lt;/strong&gt; compares against the previous snapshot - if the hash changed, it generates a diff&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Severity classifier&lt;/strong&gt; scans the diff for risk keywords and assigns a severity level (critical / high / medium / low)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Risk events&lt;/strong&gt; are created and surfaced on the dashboard with severity, timestamp, and source attribution&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Public API&lt;/strong&gt; serves the data through unauthenticated read-only endpoints - no login, no paywall&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The whole thing runs on a single Docker Compose stack: FastAPI backend, React frontend, PostgreSQL, Redis, Celery workers. Deployed to a GCP Compute Engine instance via GitHub Actions. Total infra cost: less than the price of one Datadog alert channel.&lt;/p&gt;

&lt;p&gt;Some engineering choices that matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hash-based change detection&lt;/strong&gt; means we don't store raw changelog HTML (copyright-safe) - we only store diffs when something actually changes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keyword classifier&lt;/strong&gt; is intentionally simple (pattern matching, not ML) because false negatives are worse than false positives here - I'd rather flag something that isn't breaking than miss something that is&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Each vendor is an isolated adapter&lt;/strong&gt; (~40 lines each). When Stripe redesigns their docs site - and they will - only the Stripe adapter breaks. The other 14 keep running.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SSRF protection&lt;/strong&gt; on the fetch layer blocks private IP ranges and localhost - because this system fetches arbitrary URLs from a database, and that's exactly the kind of thing that gets you in trouble if you're not careful&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;Most teams find out about breaking API changes one of three ways:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A deploy breaks in production.&lt;/strong&gt; The Slack channel lights up at 2 AM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Someone happens to read the changelog.&lt;/strong&gt; Usually the one person who's subscribed to the vendor's blog, and they mention it casually in standup two days later.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A quarterly dependency audit catches it.&lt;/strong&gt; Three months late, during a sprint nobody wanted.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;None of these are good. The first one costs you an incident. The second one depends on luck. The third one is always too late.&lt;/p&gt;

&lt;p&gt;What I learned from this week of data is that &lt;strong&gt;the problem is worse than most people think&lt;/strong&gt;. 73% of the APIs we commonly depend on are changing every single week. Not every change is breaking, but the ones that are? They're buried in changelogs that nobody reads, mixed in with dozens of other entries.&lt;/p&gt;

&lt;p&gt;For teams that depend on multiple external APIs, automated monitoring is quickly becoming less of a nice-to-have and more of a safety net. It's the difference between catching a deprecation notice on Tuesday and debugging a production outage on Saturday.&lt;/p&gt;




&lt;h2&gt;
  
  
  See It Live
&lt;/h2&gt;

&lt;p&gt;The public dashboard is running right now at &lt;strong&gt;&lt;a href="https://www.api-graveyard.com/api-health" rel="noopener noreferrer"&gt;www.api-graveyard.com/api-health&lt;/a&gt;&lt;/strong&gt; - no login, no signup, no paywall. Real data from real APIs, updated every 6 hours.&lt;/p&gt;

&lt;p&gt;The source code for the case study (architecture diagrams, screenshots, SDK links) is on GitHub: &lt;a href="https://github.com/Shakargy/api-graveyard-case-study" rel="noopener noreferrer"&gt;github.com/Shakargy/api-graveyard-case-study&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This case study only monitors public changelogs. The full product goes one layer deeper: discovering the actual APIs your services call from live traffic, mapping dependency risk across your entire stack, and alerting when something changes. One-line SDK integration for &lt;a href="https://github.com/Shakargy/api-graveyard-python" rel="noopener noreferrer"&gt;Python&lt;/a&gt;, &lt;a href="https://github.com/Shakargy/api-graveyard-go" rel="noopener noreferrer"&gt;Go&lt;/a&gt;, and &lt;a href="https://github.com/Shakargy/api-graveyard-node" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt; - check it out at &lt;a href="https://www.api-graveyard.com" rel="noopener noreferrer"&gt;www.api-graveyard.com&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built by the solo developer behind &lt;a href="https://www.api-graveyard.com" rel="noopener noreferrer"&gt;API Graveyard&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
