403 vs 407 vs 429: reading proxy and block errors
Three status codes that look similar and mean completely different things. Which system sent each, and what to change.
How automated traffic is identified, layer by layer, and which layers a different address actually affects.
The single most useful thing to understand about blocking is that it happens in stages, and each stage is cheaper for the defender than the next. Work out which one refused you and the next step is obvious. Guess, and you will spend money on proxies to fix a problem proxies cannot reach.
| Layer | Decides on | Does a new address help? |
|---|---|---|
| Network reputation | The ASN and address history | Yes, if the new address is classified differently |
| Transport | The TLS handshake | No. The handshake is unchanged |
| Protocol | Header set, order and HTTP version | No |
| Behaviour | Timing, paths, volume per identity | Resets the counter, not the pattern |
| Client challenge | JavaScript execution, CAPTCHA | No |
Only the first and fourth rows respond to a new address at all. This is why "we switched to residential proxies and still get blocked" is such a common report: the decision was never about where the request appeared to come from.
The first message of a TLS connection is sent in plain text before any encryption, and it lists the cipher suites and extensions your TLS library supports, in your library's order. That is emitted before you have sent a single header, so the classification is finished before the user agent ever arrives.
We measured how far apart the clients actually are. A byte-level capture of nine HTTP clients and a browser found the browser sending eleven headers against a median of four, no two clients producing the same header order, and two clients sending no user agent at all. None of it changes with a proxy.
The response itself narrows the cause considerably:
The status-code guide covers the three refusals you will meet most often and what each one obliges you to do differently.
Fingerprinting rewards ordinariness and punishes contradiction. No single property is rare; the combination is. Changing one value to something unusual does not blend you in, it moves you to a smaller group.
This is why partial disguise reliably backfires. A browser user agent over a library handshake, or an exit in one country with a browser reporting another country's timezone, is more distinctive than sending nothing at all.
Three status codes that look similar and mean completely different things. Which system sent each, and what to change.
Software that decides whether a request came from a human, using signals well beyond the IP address.
Building an identifier from browser and device characteristics exposed to JavaScript.
Twelve connections from one Chromium browser produced twelve different JA3 hashes. curl and Go produced one each, every time.
A challenge intended to separate humans from automation, and usually a symptom rather than the problem itself.
Identifying a client from the structure of its TLS handshake, before any HTTP request is sent.
Nine HTTP clients and a browser, captured at the byte level. The browser sent 11 headers; the median library sent 4, in a different…