<?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: Abhinav Sharma</title>
    <description>The latest articles on DEV Community by Abhinav Sharma (@abhinavs1920).</description>
    <link>https://dev.to/abhinavs1920</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%2F4172137%2Fcb4823c7-005a-4e2f-a5c6-63eab5e6510a.png</url>
      <title>DEV Community: Abhinav Sharma</title>
      <link>https://dev.to/abhinavs1920</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/abhinavs1920"/>
    <language>en</language>
    <item>
      <title>Ten checks to run before you merge an API change</title>
      <dc:creator>Abhinav Sharma</dc:creator>
      <pubDate>Wed, 21 Oct 2026 20:43:29 +0000</pubDate>
      <link>https://dev.to/abhinavs1920/ten-checks-to-run-before-you-merge-an-api-change-2jfp</link>
      <guid>https://dev.to/abhinavs1920/ten-checks-to-run-before-you-merge-an-api-change-2jfp</guid>
      <description>&lt;p&gt;Most API breakage does not come from a dramatic rewrite. It comes from a small change that looked safe in the pull request. Here are ten checks I run before merging any change to a REST API. Each one is about the consumer, not the spec, because a spec diff tells you what changed and not who will feel it.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Renamed or removed response fields
&lt;/h2&gt;

&lt;p&gt;A rename is a removal plus an addition, from the point of view of every consumer. Search downstream code for the old field name, not just the new one. Optional fields are the worst case: the spec allows them to be absent, but some consumer has started to depend on them.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Type and format changes
&lt;/h2&gt;

&lt;p&gt;String to integer is obvious. Date to datetime is not. Strict deserializers fail even when the values look the same to a human.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. New required parameters or fields
&lt;/h2&gt;

&lt;p&gt;Any new required input breaks every caller that does not send it yet. Make it optional first, or version the endpoint.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Enum and constant changes
&lt;/h2&gt;

&lt;p&gt;Adding a value breaks clients that validate exhaustively. Removing one breaks clients that rely on it. Check both directions.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Status code and error shape changes
&lt;/h2&gt;

&lt;p&gt;Callers branch on status codes and parse error bodies. Change either and behaviour changes, even if the happy path is identical.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Authentication and authorization changes
&lt;/h2&gt;

&lt;p&gt;A new scope, a shorter token lifetime or a stricter role fails at runtime, not in review. Adding an API key requirement to an endpoint is a good example: the diff is one line, and every keyless caller gets a 401.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Pagination and defaults
&lt;/h2&gt;

&lt;p&gt;A different default page size, sort order or filter changes results for every consumer that relied on the old default without ever saying so.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Deprecation and sunset signals
&lt;/h2&gt;

&lt;p&gt;If you plan to remove something, send Deprecation and Sunset headers first, then confirm someone actually saw them before the removal date.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. A consumer inventory before merge
&lt;/h2&gt;

&lt;p&gt;Know which services, jobs and third parties call the endpoint you are changing. Missing data is not zero usage. If you cannot list the consumers, treat that as a review task.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. A migration window and a rollback path
&lt;/h2&gt;

&lt;p&gt;There is no universal number of weeks. Agree the window with the teams affected and keep a way back.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using it
&lt;/h2&gt;

&lt;p&gt;Print the list, or copy it into your pull request template. The ones that bite most often in my own small test cases are 1 (optional fields) and 6 (auth), which a spec diff tends to report as informational.&lt;/p&gt;

&lt;p&gt;I put the same list in a one-page PDF: &lt;a href="https://impactgate.in/api-change-safety-checklist.pdf" rel="noopener noreferrer"&gt;https://impactgate.in/api-change-safety-checklist.pdf&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I am building Impact Gate, a warn-only pull request check that lists which consumers an API change can affect, with file and line. There is a read-only demo at &lt;a href="https://impactgate.in" rel="noopener noreferrer"&gt;https://impactgate.in&lt;/a&gt; .&lt;/p&gt;

&lt;p&gt;Which check would you add as number 11?&lt;/p&gt;

</description>
      <category>api</category>
      <category>webdev</category>
      <category>backend</category>
      <category>openapi</category>
    </item>
    <item>
      <title>The two API changes oasdiff let through, and why consumers still break</title>
      <dc:creator>Abhinav Sharma</dc:creator>
      <pubDate>Fri, 16 Oct 2026 07:49:22 +0000</pubDate>
      <link>https://dev.to/abhinavs1920/the-two-api-changes-oasdiff-let-through-and-why-consumers-still-break-3h80</link>
      <guid>https://dev.to/abhinavs1920/the-two-api-changes-oasdiff-let-through-and-why-consumers-still-break-3h80</guid>
      <description>&lt;p&gt;Last week I ran oasdiff on 13 labelled API change cases I wrote. It caught 8 of the 10 breaking ones (oasdiff v1.33.0, default ERR-level gate) and missed 2. This post is about those 2, because they point at a gap that a spec check alone does not cover: the difference between a change that is breaking in the spec and a change that breaks someone.&lt;/p&gt;

&lt;p&gt;Quick context on the cases, so you can judge how much weight to put on this. They are synthetic. One small Orders API, 13 before/after OpenAPI specs, seven made-up consumer services, labels written by me. 10 are breaking changes, 3 are controls (a new optional field, a new endpoint, a renamed path parameter). oasdiff v1.33.0 with &lt;code&gt;--fail-on ERR&lt;/code&gt; raised no false alarms. Everything is public: &lt;a href="https://github.com/impact-gate/impact-gate-benchmarks" rel="noopener noreferrer"&gt;https://github.com/impact-gate/impact-gate-benchmarks&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The two it let through
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Removing an optional response field.&lt;/strong&gt;&lt;br&gt;
In the spec, a field that is optional in a response is allowed to be absent. So removing it can reasonably be reported as informational. But if a consumer reads that field, for example to show a customer's phone number, the consumer now gets nothing where it used to get a value. The spec said "optional". The consumer treated it as "there".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Adding an API key requirement to an operation.&lt;/strong&gt;&lt;br&gt;
Adding a security requirement is also reported as info by oasdiff, and that is a defensible choice for a diff tool: the spec changed, the API did what it was told. But a consumer that calls the endpoint without a key now gets a 401. For that consumer, the change was breaking on the day it shipped.&lt;/p&gt;

&lt;p&gt;Neither report is wrong. A spec diff answers "what changed in the contract". The question a reviewer actually has on a pull request is different: "who will this hurt?"&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters on a pull request
&lt;/h2&gt;

&lt;p&gt;When you review an API change, the spec diff tells you the shape of the change. It does not tell you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which other services call this endpoint,&lt;/li&gt;
&lt;li&gt;which of them read the field you are removing,&lt;/li&gt;
&lt;li&gt;which of them call without the header you are about to require.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In a small team you carry that in your head. In a larger one, you find out after the deploy.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Impact Gate does about this
&lt;/h2&gt;

&lt;p&gt;Impact Gate is a warn-only check that comments on the pull request with the services and code that depend on the endpoint you are changing. Each consumer it lists comes with the file and line where it was found.&lt;/p&gt;

&lt;p&gt;There is a live demo on real pull requests you can open yourself: &lt;a href="https://impactgate.in" rel="noopener noreferrer"&gt;https://impactgate.in&lt;/a&gt; . No signup is needed to look around.&lt;/p&gt;

&lt;p&gt;I want to be careful about claims. Scoring Impact Gate itself on these 13 cases is not published yet, so I am not claiming it catches the two above. Automated consumer scoring and real-project cases are next*.&lt;/p&gt;

&lt;p&gt;* Planned, not available yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I would like to be wrong
&lt;/h2&gt;

&lt;p&gt;If you disagree with a label, open an issue on the repo. If you have a case where a spec diff passes and a consumer still breaks, I would like to add it. And if you run a different tool against the cases, the runner is &lt;code&gt;TOOL_CMD="your-tool" bash scripts/run.sh&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Question for people who maintain more than one service: how do you find out today who depends on an endpoint before you change it?&lt;/p&gt;

</description>
      <category>openapi</category>
      <category>api</category>
      <category>devtools</category>
    </item>
    <item>
      <title>I built 13 labelled OpenAPI breaking-change cases, and oasdiff missed 2 of them</title>
      <dc:creator>Abhinav Sharma</dc:creator>
      <pubDate>Fri, 09 Oct 2026 06:23:43 +0000</pubDate>
      <link>https://dev.to/abhinavs1920/i-built-13-labelled-openapi-breaking-change-cases-and-oasdiff-missed-2-of-them-1jmp</link>
      <guid>https://dev.to/abhinavs1920/i-built-13-labelled-openapi-breaking-change-cases-and-oasdiff-missed-2-of-them-1jmp</guid>
      <description>&lt;p&gt;I'm working on Impact Gate, a warn-only PR check that tells you which consumers an API change can affect. Before claiming anything about it, I wanted a public set of cases anyone can run. So I wrote one: github.com/impact-gate/impact-gate-benchmarks.&lt;/p&gt;

&lt;p&gt;What it is: 13 before/after OpenAPI specs on one small Orders API, each with a label (breaking or not) and two made-up consumers, one of which is affected or neither is. 10 breaking changes, 3 controls (a new optional field, a new endpoint, a renamed path parameter).&lt;/p&gt;

&lt;p&gt;What I ran: oasdiff v1.33.0 with --fail-on ERR. It caught 8, missed 2, raised no false alarms. The misses: removing an optional response field, and adding an API key requirement to an operation. oasdiff reports both as info, which is a defensible choice for a spec diff. But a consumer that reads that field, or calls without a key, breaks all the same. That gap between spec-level breaking and consumer-level breaking is what I want to measure.&lt;/p&gt;

&lt;p&gt;Limits, plainly: the cases are synthetic, I wrote the labels myself, and 13 cases proves nothing about real-world accuracy. Next: real-project cases and automated consumer scoring. If you disagree with a label, open an issue, I'd like to be wrong in public. To score your own tool: TOOL_CMD="your-tool" bash scripts/run.sh.&lt;/p&gt;

</description>
      <category>openapi</category>
      <category>api</category>
      <category>opensource</category>
      <category>testing</category>
    </item>
  </channel>
</rss>
