This is one of those bugs that feels embarrassing to admit — not because it’s rare, but because everyone has seen it, and almost nobody tests for it.
Someone writes /V1/users instead of /v1/users.
The API responds with 400 Bad Request, 404,
or something equally unhelpful.
And suddenly, half a day disappears into debugging.
What was tested
Rentgen takes a known, valid API request and mutates only the path — everything after the domain is converted to uppercase.
- TEST: Uppercase Path Test
- Mutation: URL path converted to uppercase
- Expected:
404 Not Found— resource does not exist- or
2xx— API explicitly treats paths as case-insensitive
- Anything else: misleading behavior
Why this matters
Unlike domain names, URL paths are usually treated as case-sensitive.
That means /v1 and /V1 are different resources.
And that’s fine — as long as the API communicates that clearly.
The problem starts when the API responds with something vague or misleading.
A 400 Bad Request suggests the payload is wrong.
A 403 Forbidden suggests permissions.
A 500 suggests the server broke.
None of those point to the real issue: the resource simply does not exist.
The debugging trap
This is how it usually plays out:
- One developer types
/V1instead of/v1 - The API returns
400 - They inspect the payload
- They compare headers
- They re-run the request multiple times
- They compare it with a colleague’s request that “works”
Everything looks identical. Same endpoint. Same body. Same auth.
The difference hides in plain sight: one character. One uppercase letter.
When it’s finally spotted, the reaction is always the same: “Wait… seriously?”
What Rentgen found
In a correct implementation, one of two behaviors is acceptable:
-
Strict routing:
return
404 Not Foundbecause/V1is not a valid resource -
Normalized routing:
treat
/v1and/V1as equivalent and return2xx
Both are defensible. What’s not defensible is returning something that sends developers looking in the wrong direction.
Why this bug survives
Because it sits in an awkward gap:
- too small to be a feature bug
- too inconsistent to reproduce easily
- too embarrassing to write a test for manually
Testers rarely try random casing in paths. Developers assume URLs are copied, not typed. And tooling often hides the actual string being sent.
Real-world impact
This issue doesn’t bring systems down. It does something worse: it quietly burns time.
- hours lost debugging payloads
- support tickets that can’t be reproduced
- “works on my machine” arguments
- unnecessary blame on auth, data, or infrastructure
All because the API didn’t clearly say: “this resource does not exist”.
How to fix it
Pick a behavior and make it explicit:
- If paths are case-sensitive, return a clean
404 - If you normalize paths, do it consistently and document it
- Never turn path casing into a
400or500
The goal is not flexibility. The goal is predictability.
Why this check exists in Rentgen
Because this bug is too small for people to think about — and too expensive to ignore when it hits.
Rentgen checks it automatically so you don’t have to discover it during a debugging session that ends with: “Oh… you used a capital letter.”
Final thoughts
APIs don’t fail only on complex edge cases. Sometimes they fail on typography.
If your API handles uppercase paths predictably, you remove an entire class of pointless debugging. And that’s a bigger win than it sounds.