<?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>Forem: Liudas</title>
    <description>The latest articles on Forem by Liudas (@liudasjan).</description>
    <link>https://forem.com/liudasjan</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%2F3690294%2F310fa4b4-8338-49ee-9a08-c9cd4beff0e8.jpg</url>
      <title>Forem: Liudas</title>
      <link>https://forem.com/liudasjan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/liudasjan"/>
    <language>en</language>
    <item>
      <title>New Rentgen Release v1.20.0 🚀</title>
      <dc:creator>Liudas</dc:creator>
      <pubDate>Mon, 06 Apr 2026 17:23:51 +0000</pubDate>
      <link>https://forem.com/liudasjan/new-rentgen-release-v1200-4he7</link>
      <guid>https://forem.com/liudasjan/new-rentgen-release-v1200-4he7</guid>
      <description>&lt;p&gt;Release v1.20.0 🚀 &lt;/p&gt;

&lt;p&gt;👉 Project export / import (this is the main one)&lt;br&gt;
No accounts. No cloud. No data leaving your machine.&lt;br&gt;
Export your project → get a file → put it anywhere: Dropbox, GitHub or any shared folder. Your team (5, 100 or 10 000 people) just takes it and uses it. At 0 cost. And No sync back to server. No logins. No vendor lock-in. No data exposure. Just a file. Full control.&lt;/p&gt;

&lt;p&gt;👉 New test: invalid token. We take your Authorization and break it.&lt;br&gt;
Expected: 401&lt;br&gt;
Reality: often not.&lt;/p&gt;

&lt;p&gt;👉 Response time. Now visible per request and per test. No extra tools. No guessing. &lt;/p&gt;

&lt;p&gt;Paste a request. See what breaks. Automation before automation.&lt;/p&gt;

&lt;p&gt;New release Rentgen.io&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.amazonaws.com%2Fuploads%2Farticles%2Fvdap97tpjrzx7rbfop5z.gif" 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.amazonaws.com%2Fuploads%2Farticles%2Fvdap97tpjrzx7rbfop5z.gif" alt=" " width="1897" height="972"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>rentgen</category>
      <category>api</category>
      <category>testing</category>
      <category>devtool</category>
    </item>
    <item>
      <title>Good breakdown and read on medium of a problem most teams don’t even realize they have</title>
      <dc:creator>Liudas</dc:creator>
      <pubDate>Wed, 01 Apr 2026 14:26:20 +0000</pubDate>
      <link>https://forem.com/liudasjan/good-breakdown-and-read-on-medium-of-a-problem-most-teams-dont-even-realize-they-have-9g5</link>
      <guid>https://forem.com/liudasjan/good-breakdown-and-read-on-medium-of-a-problem-most-teams-dont-even-realize-they-have-9g5</guid>
      <description>&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.amazonaws.com%2Fuploads%2Farticles%2Flraxr7w0hhq6j3ou58v2.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.amazonaws.com%2Fuploads%2Farticles%2Flraxr7w0hhq6j3ou58v2.png" alt=" " width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;APIs pass tests. CI is green. Everything looks fine. But production still breaks — not because of complex bugs, but because of simple things nobody tested.&lt;br&gt;
👉 missing auth&lt;br&gt;
👉 invalid inputs&lt;br&gt;
👉 unexpected formats&lt;br&gt;
👉 edge cases that never made it into tests&lt;/p&gt;

&lt;p&gt;The article explains this gap really well — between “what we test” and “what actually breaks”. That’s exactly where Rentgen sits:&lt;br&gt;
👉 not replacing tests&lt;br&gt;
👉 but showing what you didn’t think to test&lt;/p&gt;

&lt;p&gt;Paste one request → see what breaks.&lt;br&gt;
Worth a read 👇&lt;br&gt;
&lt;a href="https://medium.com/@berastis/your-api-passed-all-tests-rentgen-found-47-bugs-anyway-df0be5e1d0f3" rel="noopener noreferrer"&gt;https://medium.com/@berastis/your-api-passed-all-tests-rentgen-found-47-bugs-anyway-df0be5e1d0f3&lt;/a&gt;&lt;/p&gt;

</description>
      <category>rentgen</category>
      <category>api</category>
      <category>qa</category>
      <category>apitest</category>
    </item>
    <item>
      <title>This meme is so far from reality</title>
      <dc:creator>Liudas</dc:creator>
      <pubDate>Thu, 19 Mar 2026 09:09:55 +0000</pubDate>
      <link>https://forem.com/liudasjan/this-meme-is-so-far-from-reality-436h</link>
      <guid>https://forem.com/liudasjan/this-meme-is-so-far-from-reality-436h</guid>
      <description>&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.amazonaws.com%2Fuploads%2Farticles%2Fwyvd3rz9aalmq9c52ffm.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.amazonaws.com%2Fuploads%2Farticles%2Fwyvd3rz9aalmq9c52ffm.png" alt=" " width="384" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I saw this meme and honestly it’s so far from reality.&lt;/p&gt;

&lt;p&gt;We keep talking about shift-left, testing earlier, bringing QA into development and then we share memes like this, implying API testing somehow doesn’t make sense. First of all, API itself can be the product. Second: even if it’s not - API always needs to be tested separately. Different bugs. Different rules. Different risks. You don’t test API like a user clicks a UI.&lt;/p&gt;

&lt;p&gt;You test: success paths, validation errors, auth mechanisms, rate limiting, performance, edge cases and many others.&lt;/p&gt;

&lt;p&gt;Most of which you can’t even properly test through the UI. That’s the whole point.&lt;/p&gt;

&lt;p&gt;And this is exactly why we built Rentgen.io&lt;/p&gt;

&lt;p&gt;To take care of these boring, but critical checks instantly - without setup, without writing tests, without pretending clicking buttons will somehow cover your backend.&lt;/p&gt;

&lt;p&gt;Automation before automation.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>AI and Rentgen are best friends</title>
      <dc:creator>Liudas</dc:creator>
      <pubDate>Mon, 16 Mar 2026 16:53:39 +0000</pubDate>
      <link>https://forem.com/liudasjan/ai-and-rentgen-are-best-friends-4jcl</link>
      <guid>https://forem.com/liudasjan/ai-and-rentgen-are-best-friends-4jcl</guid>
      <description>&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.amazonaws.com%2Fuploads%2Farticles%2Fti381cbngr8k21rikqa2.gif" 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.amazonaws.com%2Fuploads%2Farticles%2Fti381cbngr8k21rikqa2.gif" alt=" " width="841" height="806"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;AI generates code and APIs faster than humans can realistically validate them.&lt;/p&gt;

&lt;p&gt;More APIs → more drift → more regressions. That’s exactly why Rentgen exists.&lt;/p&gt;

&lt;p&gt;Rentgen helps teams quickly understand how their APIs behave under real-world input: before writing tests, before CI, before production incidents.&lt;br&gt;
As AI accelerates software creation, the need for fast API diagnostics only grows.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://rentgen.io" rel="noopener noreferrer"&gt;rentgen.io&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Automation before automation. Find API bugs when you have no tests.&lt;/p&gt;

&lt;p&gt;ps.: Rentgen CLI soon. Rentgen CI/CD tests when you have no CI/CD tests.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Automation Before Automation: Finding API Bugs When You Have Zero Tests</title>
      <dc:creator>Liudas</dc:creator>
      <pubDate>Thu, 26 Feb 2026 13:45:23 +0000</pubDate>
      <link>https://forem.com/liudasjan/automation-before-automation-finding-api-bugs-when-you-have-zero-tests-261o</link>
      <guid>https://forem.com/liudasjan/automation-before-automation-finding-api-bugs-when-you-have-zero-tests-261o</guid>
      <description>&lt;p&gt;“Regression testing without tests” sounds like marketing nonsense. If someone told me that a year ago, I’d probably roll my eyes and move on. So let’s unpack what this actually means, using a real workflow.&lt;/p&gt;

&lt;p&gt;Rentgen introduced what I call regression out of the box. You don’t need a predefined test suite. You don’t need an OpenAPI file. You don’t need CI configured. You don’t even need existing assertions. All you need is one working request.&lt;/p&gt;

&lt;p&gt;The idea is conceptually similar to how Open Diffy at Twitter compared responses across environments. But here you don’t need traffic mirroring or complex infrastructure. You import a real cURL request — ideally something you already know works in production — and run it in Rentgen.&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.amazonaws.com%2Fuploads%2Farticles%2F56dspc3kor6ufrbva55b.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.amazonaws.com%2Fuploads%2Farticles%2F56dspc3kor6ufrbva55b.PNG" alt=" " width="800" height="514"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If the request is successful, you map the fields. That means you tell Rentgen what each field represents: an ID, a timestamp, a numeric value, an enum, something dynamic, something stable. This step is critical because it gives context to the engine. After that, you press “Generate and Run”.&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.amazonaws.com%2Fuploads%2Farticles%2F6wf72ynd65iq4p7e8h9k.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.amazonaws.com%2Fuploads%2Farticles%2F6wf72ynd65iq4p7e8h9k.PNG" alt=" " width="800" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At this point, Rentgen automatically generates dozens — sometimes hundreds — of structured tests from that single request. It mutates inputs, checks structural consistency, validates error handling, and evaluates response behavior. You didn’t write a single test case manually. There’s no collection to maintain. No assertion scripts.&lt;/p&gt;

&lt;p&gt;When the run finishes, you press “Select for Compare”.&lt;/p&gt;

&lt;p&gt;Now you switch the environment. For example, from PROD to TEST. &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.amazonaws.com%2Fuploads%2Farticles%2F46dnedi9ahjjdol7h7rr.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.amazonaws.com%2Fuploads%2Farticles%2F46dnedi9ahjjdol7h7rr.PNG" alt=" " width="800" height="523"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You send the exact same request again, map the fields again (because different environments may return slightly different values), and press “Generate and Run” once more.&lt;/p&gt;

&lt;p&gt;After the second run is complete, you click “Compare with Selected”.&lt;/p&gt;

&lt;p&gt;This is where things get interesting.&lt;/p&gt;

&lt;p&gt;If everything behaves consistently, you get a clean green result. &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.amazonaws.com%2Fuploads%2Farticles%2F5h5d42x56le2xta8yl1w.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.amazonaws.com%2Fuploads%2Farticles%2F5h5d42x56le2xta8yl1w.png" alt=" " width="800" height="192"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But if something changed — and it shouldn’t have — Rentgen highlights it clearly. Not as raw JSON noise. Not as a giant diff dump. It shows what changed, where it changed, and why it might be a bug.&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.amazonaws.com%2Fuploads%2Farticles%2F8xj9axrd12ti14j25as8.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.amazonaws.com%2Fuploads%2Farticles%2F8xj9axrd12ti14j25as8.png" alt=" " width="800" height="257"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Traditional automated regression requires predefined expectations. You have to decide up front what is correct. But in real life, especially early in a project or during migration, you often don’t have that luxury. You just want to know: did something drift between environments? Did the new deployment introduce structural inconsistency? Did error handling degrade?&lt;/p&gt;

&lt;p&gt;That’s what I mean by Automation Before Automation.&lt;/p&gt;

&lt;p&gt;This does not replace your test suite. It doesn’t compete with Postman, Playwright, or your CI pipeline. It sits one layer earlier. It answers a diagnostic question before you invest time in writing and maintaining formal tests.&lt;/p&gt;

&lt;p&gt;You can still inspect full drift if you want. There’s a toggle to see all differences, including raw structural changes. Nothing is hidden. But by default, Rentgen filters noise and surfaces potential issues that matter.&lt;/p&gt;

&lt;p&gt;The important part is this: you can detect API bugs even when you have zero tests written.&lt;/p&gt;

&lt;p&gt;No framework setup. No CI integration. No collection maintenance.&lt;/p&gt;

&lt;p&gt;Just one real request.&lt;/p&gt;

&lt;p&gt;That’s regression out of the box.&lt;/p&gt;

&lt;p&gt;Find out more: &lt;a href="https://rentgen.io" rel="noopener noreferrer"&gt;https://rentgen.io&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>api</category>
    </item>
    <item>
      <title>546 Tests. 0 Failures. API Still Burning🔥</title>
      <dc:creator>Liudas</dc:creator>
      <pubDate>Thu, 26 Feb 2026 05:12:38 +0000</pubDate>
      <link>https://forem.com/liudasjan/546-tests-0-failures-api-still-burning-hd6</link>
      <guid>https://forem.com/liudasjan/546-tests-0-failures-api-still-burning-hd6</guid>
      <description>&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.amazonaws.com%2Fuploads%2Farticles%2Fku5j2d7fagwe74epr79y.jpeg" 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.amazonaws.com%2Fuploads%2Farticles%2Fku5j2d7fagwe74epr79y.jpeg" alt=" " width="600" height="314"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Everyone loves a green test summary.&lt;/p&gt;

&lt;p&gt;546 tests.&lt;br&gt;
0 failures.&lt;br&gt;
100% successful.&lt;/p&gt;

&lt;p&gt;Meanwhile, the API is quietly burning in the background.This is the part nobody likes to admit.&lt;/p&gt;

&lt;p&gt;You can have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;perfect automation coverage&lt;/li&gt;
&lt;li&gt;beautiful dashboards&lt;/li&gt;
&lt;li&gt;CI pipelines glowing green&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And still ship broken API behavior.&lt;/p&gt;

&lt;p&gt;Because business logic can pass.&lt;br&gt;
Happy paths can pass.&lt;br&gt;
Regression suites can pass.&lt;/p&gt;

&lt;p&gt;And yet:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;wrong status codes&lt;/li&gt;
&lt;li&gt;broken error handling&lt;/li&gt;
&lt;li&gt;missing headers&lt;/li&gt;
&lt;li&gt;inconsistent contracts&lt;/li&gt;
&lt;li&gt;silent structural drift&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Automation is doing exactly what you told it to do. The problem is — you didn’t tell it enough.&lt;/p&gt;

&lt;p&gt;This is why “automation before automation” matters.&lt;/p&gt;

&lt;p&gt;Before writing 500 tests…&lt;br&gt;
Before building another collection…&lt;br&gt;
Before maintaining another brittle suite…&lt;/p&gt;

&lt;p&gt;Ask one question: What actually happens if we stress this endpoint from the outside?&lt;/p&gt;

&lt;p&gt;When you run diagnostics before writing tests, you often find things you didn’t even think to test.&lt;/p&gt;

&lt;p&gt;That’s not anti-automation. That’s making automation meaningful.&lt;/p&gt;

&lt;p&gt;Rentgen is built for that first layer.&lt;/p&gt;

&lt;p&gt;Find API bugs when you have no tests.&lt;br&gt;
Find blind spots before your pipeline goes green.&lt;br&gt;
Find structural problems before they become production incidents.&lt;/p&gt;

&lt;p&gt;Automation is great.&lt;/p&gt;

&lt;p&gt;But sometimes, automation before automation shows you more than you expected.&lt;/p&gt;

&lt;p&gt;And that’s where real API quality starts.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>I Spent Two Minutes Testing Amazon’s API. It Was Enough.</title>
      <dc:creator>Liudas</dc:creator>
      <pubDate>Tue, 24 Feb 2026 18:27:26 +0000</pubDate>
      <link>https://forem.com/liudasjan/i-spent-two-minutes-testing-amazons-api-it-was-enough-2m1b</link>
      <guid>https://forem.com/liudasjan/i-spent-two-minutes-testing-amazons-api-it-was-enough-2m1b</guid>
      <description>&lt;p&gt;There’s something oddly comforting about large tech companies. You assume that somewhere, deep in the labyrinth of their infrastructure, there are teams of very serious engineers making sure everything behaves exactly as it should.  &lt;/p&gt;

&lt;p&gt;So when I decided to test one Amazon endpoint, I picked the most boring one I could find.  &lt;/p&gt;

&lt;p&gt;Not payments. Not checkout. Not anything involving money.&lt;/p&gt;

&lt;p&gt;Just this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PUT /custom/profilepickerserviceapicontracts/marketplaces/{id}/members/{memberId}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All it does is update a child profile name. You send "name": "Kids3", and life goes on. Or at least, that’s the theory.&lt;/p&gt;

&lt;p&gt;I captured the real browser request, pasted it into Rentgen, pressed run, and went to make coffee. Two minutes later I had a certificate score: 16 out of 100.  &lt;/p&gt;

&lt;p&gt;Sixteen.  &lt;/p&gt;

&lt;p&gt;Now, this wasn’t a penetration test. I didn’t try to break the system. I didn’t throw SQL injections at it. I didn’t spin up some exotic fuzzing setup.  &lt;/p&gt;

&lt;p&gt;I just asked very boring questions.  &lt;/p&gt;

&lt;p&gt;What happens if authentication is missing?&lt;br&gt;
Apparently not 401 — but 400. With a generic “Sorry, we are experiencing issues right now.” Which is comforting, in the same way that a smoke alarm yelling “Something is wrong somewhere” is comforting.  &lt;/p&gt;

&lt;p&gt;What happens if you use an unsupported HTTP method?&lt;br&gt;
You get 403. As if the method exists but you’re not important enough to use it.  &lt;/p&gt;

&lt;p&gt;What happens if you uppercase the path?&lt;br&gt;
You get HTML. Yes. A full CloudFront “Website Temporarily Unavailable” page — from a JSON API. Because apparently, sometimes your structured contract just takes the day off.  &lt;/p&gt;

&lt;p&gt;And then the fun one: send a 10MB payload. Not malicious. Just large. Instead of a clean 413 Payload Too Large, the request travels deep enough into the stack to come back confused with a 404.  &lt;/p&gt;

&lt;p&gt;All of this. From renaming a child profile.  &lt;/p&gt;

&lt;p&gt;This isn’t about “Amazon is broken.” It’s about what happens when systems grow faster than their contract discipline. Status codes drift. Edge layers leak. Validation happens too late.  &lt;/p&gt;

&lt;p&gt;The scary part isn’t that these things exist.  &lt;/p&gt;

&lt;p&gt;It’s how quickly they surface when you look.  &lt;/p&gt;

&lt;p&gt;Full breakdown here:&lt;br&gt;
&lt;a href="https://rentgen.io/api-stories/amazon-profile-update-api-testing-case-study.html" rel="noopener noreferrer"&gt;https://rentgen.io/api-stories/amazon-profile-update-api-testing-case-study.html&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;Automation before automation. Find API bugs when you have no tests.  &lt;/p&gt;

</description>
      <category>api</category>
      <category>rentgen</category>
      <category>rest</category>
      <category>aws</category>
    </item>
    <item>
      <title>Your API “Won’t Grow”? That’s How Outages Are Born.</title>
      <dc:creator>Liudas</dc:creator>
      <pubDate>Sun, 22 Feb 2026 05:32:42 +0000</pubDate>
      <link>https://forem.com/liudasjan/your-api-wont-grow-thats-how-outages-are-born-1mk1</link>
      <guid>https://forem.com/liudasjan/your-api-wont-grow-thats-how-outages-are-born-1mk1</guid>
      <description>&lt;p&gt;There’s a dangerous sentence in API design: “Don’t worry, it won’t be that many records.”  &lt;/p&gt;

&lt;p&gt;That’s how unpaginated collection endpoints get shipped.  &lt;/p&gt;

&lt;p&gt;GET /users&lt;br&gt;
Returns a JSON array.&lt;br&gt;
No limit? No page? No cursor?&lt;/p&gt;

&lt;p&gt;Works perfectly.  &lt;/p&gt;

&lt;p&gt;Until production data grows.  &lt;/p&gt;

&lt;p&gt;Then latency grows. Memory grows. Payload size grows.&lt;br&gt;
And suddenly your “simple” endpoint becomes a scaling liability.  &lt;/p&gt;

&lt;p&gt;Rentgen flags this pattern automatically:&lt;br&gt;
• GET endpoint&lt;br&gt;
• JSON array response&lt;br&gt;
• No pagination or limit parameters&lt;/p&gt;

&lt;p&gt;It’s not a failure.&lt;br&gt;
It’s a warning about future technical debt.  &lt;/p&gt;

&lt;p&gt;Because unbounded lists don’t break immediately.&lt;br&gt;
They break when your product succeeds.  &lt;/p&gt;

&lt;p&gt;Full breakdown here: &lt;a href="https://rentgen.io/api-stories/array-list-without-pagination.html" rel="noopener noreferrer"&gt;https://rentgen.io/api-stories/array-list-without-pagination.html&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;Fix it while it’s boring.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Testing Proton Pass API Without Knowing Its Architecture</title>
      <dc:creator>Liudas</dc:creator>
      <pubDate>Thu, 19 Feb 2026 15:42:09 +0000</pubDate>
      <link>https://forem.com/liudasjan/testing-proton-pass-api-without-knowing-its-architecture-1bje</link>
      <guid>https://forem.com/liudasjan/testing-proton-pass-api-without-knowing-its-architecture-1bje</guid>
      <description>&lt;p&gt;I took a real Proton Pass API request straight from the browser and ran it through Rentgen.  &lt;/p&gt;

&lt;p&gt;No architecture knowledge. No configs. No scripts. Just import cURL → generate tests → wait a minute.  &lt;/p&gt;

&lt;p&gt;The result? A 46% structural score and several interesting protocol-level signals — including large payload handling and auth gate sequencing.  &lt;/p&gt;

&lt;p&gt;This isn’t a “security drama” post. Proton builds serious products. But even mature APIs can benefit from deterministic hygiene checks before automation ever starts.  &lt;/p&gt;

&lt;p&gt;Full breakdown here:&lt;a href="https://rentgen.io/api-stories/protonpass-api-under-rentgen.html" rel="noopener noreferrer"&gt;https://rentgen.io/api-stories/protonpass-api-under-rentgen.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>rentgen</category>
      <category>apitesting</category>
      <category>testingapi</category>
    </item>
    <item>
      <title>Your API Returns 400 for Huge Payloads? Congratulations. You Just Built a Polite DoS Gateway</title>
      <dc:creator>Liudas</dc:creator>
      <pubDate>Thu, 19 Feb 2026 03:00:40 +0000</pubDate>
      <link>https://forem.com/liudasjan/your-api-returns-400-for-huge-payloads-congratulations-you-just-built-a-polite-dos-gateway-46</link>
      <guid>https://forem.com/liudasjan/your-api-returns-400-for-huge-payloads-congratulations-you-just-built-a-polite-dos-gateway-46</guid>
      <description>&lt;p&gt;There’s a special kind of bug that looks completely harmless. You send a massive request body. The API calmly replies:  &lt;/p&gt;

&lt;p&gt;400 Bad Request.  &lt;/p&gt;

&lt;p&gt;Nothing crashes. No alarms. Everyone shrugs.  &lt;/p&gt;

&lt;p&gt;And that’s exactly the problem.  &lt;/p&gt;

&lt;p&gt;When an oversized payload hits your API, the only correct response is 413 Payload Too Large. HTTP already solved this years ago. If you return 400, you’re basically saying: “Something is wrong with your data,” instead of: “This request is too big and I refuse to process it.”  &lt;/p&gt;

&lt;p&gt;But here’s the uncomfortable part.  &lt;/p&gt;

&lt;p&gt;By the time you return 400, the server may have already:&lt;br&gt;
• Allocated memory&lt;br&gt;
• Parsed JSON&lt;br&gt;
• Spent CPU cycles&lt;br&gt;
• Tied up worker threads&lt;/p&gt;

&lt;p&gt;Multiply that by concurrent requests and suddenly you’re not debugging a validation issue. You’re watching your service politely walk into a denial-of-service scenario.  &lt;/p&gt;

&lt;p&gt;This is why I added a Large Payload Test into Rentgen.  &lt;/p&gt;

&lt;p&gt;It takes a valid request and inflates only one thing: the body size. No broken JSON. No invalid headers. Just more data than your API should reasonably accept. The expected result is simple: 413. Immediately. At the boundary.  &lt;/p&gt;

&lt;p&gt;Anything else means your server is doing work it should never have started.  &lt;/p&gt;

&lt;p&gt;And this isn’t theoretical. The exact issue was detected in the ChatGPT API. Oversized payloads were being processed incorrectly. It was reported. It was fixed within a day. That response speed tells you everything about how serious this class of bug actually is.  &lt;/p&gt;

&lt;p&gt;The reason it survives in most systems is beautifully human:&lt;br&gt;
• “Clients won’t send that much data.”&lt;br&gt;
• “We validate input anyway.”&lt;br&gt;
• “This endpoint isn’t public.”&lt;/p&gt;

&lt;p&gt;Attackers love assumptions like that.&lt;/p&gt;

&lt;p&gt;The fix is boring — which is precisely why it works:&lt;br&gt;
Define strict payload limits. Enforce them at the edge. Return 413 consistently. Document it.  &lt;/p&gt;

&lt;p&gt;No drama. No heroics. Just discipline.  &lt;/p&gt;

&lt;p&gt;APIs don’t fall over only because of exotic exploits. Sometimes they fall over because they were too polite to say: “This payload is too large.”  &lt;/p&gt;

&lt;p&gt;If your API returns 413 consistently, you’re not being strict. You’re being responsible.  &lt;/p&gt;

&lt;p&gt;Full story and technical breakdown here: &lt;a href="https://rentgen.io/api-stories/large-payload-handling.html" rel="noopener noreferrer"&gt;https://rentgen.io/api-stories/large-payload-handling.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>backend</category>
      <category>performance</category>
      <category>security</category>
    </item>
    <item>
      <title>Your API Doesn’t Have a Bug. It Just Hates Capital Letters.</title>
      <dc:creator>Liudas</dc:creator>
      <pubDate>Wed, 18 Feb 2026 02:38:31 +0000</pubDate>
      <link>https://forem.com/liudasjan/your-api-doesnt-have-a-bug-it-just-hates-capital-letters-1p7b</link>
      <guid>https://forem.com/liudasjan/your-api-doesnt-have-a-bug-it-just-hates-capital-letters-1p7b</guid>
      <description>&lt;p&gt;You know what’s beautiful?&lt;/p&gt;

&lt;p&gt;Spending three hours debugging auth headers, payload validation, and middleware…&lt;br&gt;
Only to discover someone typed /V1/users instead of /v1/users.  &lt;/p&gt;

&lt;p&gt;One capital letter. Half a day gone. Brilliant.&lt;/p&gt;

&lt;p&gt;Here’s the problem.&lt;/p&gt;

&lt;p&gt;Unlike domains, URL paths are usually case-sensitive.&lt;br&gt;
So /v1 and /V1 are technically different resources. That’s fine.  &lt;/p&gt;

&lt;p&gt;What’s not fine is when your API responds with:&lt;br&gt;
• 400 Bad Request&lt;br&gt;
• 403 Forbidden&lt;br&gt;
• 500 Internal Server Error  &lt;/p&gt;

&lt;p&gt;None of those say the real thing: “This resource does not exist.”  &lt;/p&gt;

&lt;p&gt;Instead, they send developers down the rabbit hole of:&lt;br&gt;
• comparing headers&lt;br&gt;
• rechecking tokens&lt;br&gt;
• blaming payload&lt;br&gt;
• questioning infrastructure&lt;br&gt;
• arguing in Slack  &lt;/p&gt;

&lt;p&gt;All because of one uppercase letter.&lt;/p&gt;

&lt;p&gt;What Rentgen does&lt;/p&gt;

&lt;p&gt;Rentgen takes a valid request and mutates only one thing:&lt;br&gt;
It converts the entire path to uppercase. That’s it.  &lt;/p&gt;

&lt;p&gt;And then it checks:&lt;br&gt;
• If paths are strict → return 404 Not Found&lt;br&gt;
• If paths are normalized → return 2xx&lt;br&gt;
• Anything else → misleading behavior&lt;/p&gt;

&lt;p&gt;Simple. Deterministic. Brutal.&lt;/p&gt;

&lt;p&gt;This isn’t some exotic security flaw. It’s worse. It’s a time vampire.&lt;/p&gt;

&lt;p&gt;It won’t crash production.&lt;br&gt;
It won’t trigger alerts.&lt;br&gt;
It will just quietly burn engineering hours while everyone swears “it works on my machine”.  &lt;/p&gt;

&lt;p&gt;APIs don’t fail only on complex edge cases. Sometimes they fail because Caps Lock was on.  &lt;/p&gt;

&lt;p&gt;If your API handles uppercase paths predictably, you eliminate an entire class of pointless debugging.  &lt;/p&gt;

&lt;p&gt;And that’s worth more than it sounds.&lt;/p&gt;

&lt;p&gt;Full article here: &lt;a href="https://rentgen.io/api-stories/uppercase-path-handling.html" rel="noopener noreferrer"&gt;https://rentgen.io/api-stories/uppercase-path-handling.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>backend</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Your API Breaks Because Someone Used Caps Lock</title>
      <dc:creator>Liudas</dc:creator>
      <pubDate>Tue, 17 Feb 2026 02:55:12 +0000</pubDate>
      <link>https://forem.com/liudasjan/your-api-breaks-because-someone-used-caps-lock-1g25</link>
      <guid>https://forem.com/liudasjan/your-api-breaks-because-someone-used-caps-lock-1g25</guid>
      <description>&lt;p&gt;Yes. This actually happens.  &lt;/p&gt;

&lt;p&gt;Someone calls your API as API.EXAMPLE.COM instead of api.example.com…&lt;br&gt;
And your backend responds with 404. Or 500. Or something equally embarrassing.  &lt;/p&gt;

&lt;p&gt;Congratulations — your API is sensitive to keyboard mood.  &lt;/p&gt;

&lt;p&gt;Rentgen runs a simple mutation: it takes the exact same request and uppercases only the domain. Nothing else changes. The expected behavior? Exactly the same 2xx response.  &lt;/p&gt;

&lt;p&gt;If it fails, that’s not “edge case”. That’s infrastructure smell.  &lt;/p&gt;

&lt;p&gt;DNS doesn’t care about casing. Browsers don’t care. Most tooling doesn’t care. If your API does — somewhere in your stack you’re matching the Host header as raw text instead of treating it like the identifier it is.  &lt;/p&gt;

&lt;p&gt;The worst part?&lt;br&gt;
When this bug hits, nobody suspects it. Teams debug payloads, auth, headers, routing… while the root cause is literally Caps Lock.  &lt;/p&gt;

&lt;p&gt;In this run: 🟢 Pass (200 OK).&lt;br&gt;
Good. That’s how it should behave.  &lt;/p&gt;

&lt;p&gt;But when it fails in real systems, it’s usually because of sloppy reverse proxy rules, case-sensitive host matching, or dev configs that were “temporary” three years ago.  &lt;/p&gt;

&lt;p&gt;Your API should not break because someone typed in uppercase.  &lt;/p&gt;

&lt;p&gt;Full breakdown and real-world cases here: &lt;a href="https://rentgen.io/api-stories/uppercase-domain-handling.html" rel="noopener noreferrer"&gt;https://rentgen.io/api-stories/uppercase-domain-handling.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>api</category>
      <category>backend</category>
      <category>networking</category>
      <category>testing</category>
    </item>
  </channel>
</rss>
