BuildNot yet confirmed elsewhere1 publisher3 min readPublished
Geo-targeting sets one signal in six, and the other five still say US laptop
A dev.to post argues that blocks from mismatched proxies are a coherence problem rather than IP reputation. The mechanism holds up. The 8% figure attached to it is an assertion.
The Engineer · Build desk
What happened
- A reader's scraper pulled Amazon listings through a rotating residential proxy and got three currencies back in one run; the thread called it a cleaning job.
- A blocklisted IP returns 403, while incoherent geo yields extra challenges, cache misses, short sticky sessions and, per the author, an 8% lower success rate.
- The proposed remedy is a single per-country table holding language, timezone and locale, with no other code allowed to write those fields.
Why it matters
- constraint Buying more exits cannot repair a mismatch whose only accurate member was the IP, so proxy spend is the wrong budget line for this class of failure.
- exposure A German exit under default Playwright resolves to a narrower identity than no proxy at all: a US-configured client that someone has deliberately routed through Frankfurt.
- cost The tax lands on whoever sized the request budget, at roughly one lost success in twelve, and it never surfaces as an error to argue about.
- decision Teams that normalise mixed currencies in their cleaning stage are choosing to destroy the one artefact that shows which signal each endpoint trusted.
The useful part of the roamproxy write-up is the currency mess, because it is the only part of this failure that leaves something you can grep [1]. According to the post, a large storefront picks which shop to serve from some mix of IP geolocation, Accept-Language and any locale cookie you are carrying, and different endpoints resolve it differently: search on the IP, product page on the cookie, cart on the account [6]. Three currencies in one output file is therefore a transcript of which signal each handler believed [6]. Normalise it in post-processing and you have deleted your only free detector.
Then the count. The post enumerates six things a target can read off a single request arriving on a German residential exit: Accept-Language, timezone, locale-derived formatting, the storefront you get served, where your DNS query came from, and a resumed TLS session ticket [3][4][5][6][7][8]. The `country-de` flag in the proxy username sets exactly one of them [2]. Five to one is the whole argument [11].
The sharpest of the five is not exotic. Playwright's default Accept-Language is `en-US,en;q=0.9` [3], which is character for character the value the author's own profile table assigns to the `us` exit [10][12]. `requests` and `httpx` send the header not at all [3]. A real German Chrome sends four tags with descending q-values [3]. The German exit does not make the client German; the client keeps announcing its own country underneath a network layer that claims another.
Two of the six come with the author's own caveats, and they are worth keeping. The DNS split, where `socks5://` resolves locally so a CDN sees a query from California and a connection from Frankfurt, is described as something most sites do not act on; the harm is landing on the wrong edge, with a different A/B bucket and a different cache [7]. A TLS ticket issued to an IP in Ohio and resumed from Frankfurt is called a small oddity, visible at the handshake before any HTTP [8]. Neither of those blocks you. They corrupt data you have already collected and will misattribute to the target.
The number to handle carefully is the 8%. The soft-failure model around it is coherent: more challenges, fewer cached responses, sticky sessions that expire early, A/B assignment to the control group, and no error anywhere to tell you [13]. But the claim that your success rate sits 8% below where it should be, permanently, arrives without a measurement behind it [13], and it is the line most likely to get quoted back. Taken at face value it is roughly one request in twelve or thirteen that should have worked and did not [14], with nothing in the log to mark it.
The remedy the post offers is a table keyed by exit country holding language, timezone and locale, with nothing else in the codebase permitted to set those three [10]. It is cheap. The reason it goes undone is that IP reputation has a vendor attached and header coherence does not: rotation is a purchase, and a profile table is a refactor of code you already shipped [9].
What to watch
- Measured block or challenge rates for matched versus mismatched Accept-Language on the same exits, since the 8% shortfall is currently an assertion with no data behind it.
- Whether headless browser tooling starts deriving timezone and locale from the proxy exit rather than the host machine by default.
- Whether large storefronts consolidate locale resolution onto one signal, which would remove the mixed-currency output that makes this diagnosable at all.
Clarity's read
What the record supports and how the coverage leans. The claims behind it follow.
Reality
- Evidence42
- Adoption
- Insufficient
- Hype gap+25
- Incentives65
- Confidence55
Claim ledger
Ranked by verification strength, evidence, and original report placement.
- [1]
A reader described a scraper pulling Amazon listings through a rotating residential proxy that returned prices in three different currencies inside one run; the discussion thread treated it as a data-cleaning problem.
- [2]
Geo-targeting a proxy is a single line of configuration, for example country-de in the proxy username.
- [3]
Python's requests sends no Accept-Language header and httpx sends none; Playwright sends en-US,en;q=0.9 by default; a real German Chrome sends de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7.
- [4]
Timezone is readable via one call to Intl.DateTimeFormat().resolvedOptions().timeZone, and a headless browser inherits the host machine's zone: a CI runner in UTC or a laptop in America/Los_Angeles will disagree with a Frankfurt exit.
- [5]
navigator.language, navigator.languages and the date and number formats produced by page scripts all derive from the browser's locale, not from the IP.
- [6]
Large e-commerce sites resolve the storefront from a combination of IP geolocation, Accept-Language and any prior locale cookie, and when those disagree different code paths win on different page types: search keys on IP, product page on the cookie, cart on the account, producing EUR, USD and GBP in one output file.
- [7]
With a SOCKS5 proxy configured as socks5:// rather than socks5h://, the local machine resolves the hostname, so a CDN sees a DNS query from California and a TCP connection from Frankfurt; the author says most sites do not act on this, but it routes the client to the wrong edge, giving different A/B buckets, different cache and sometimes different content.
- [8]
A TLS session ticket issued to an IP in Ohio and resumed from Frankfurt is described as a small oddity the server sees at the handshake, before the first byte of HTTP.
- [9]
Rotating the exit IP cannot fix the mismatch because the IP was the one signal that was correct; the author classes this as the fingerprint-scoped case, failing identically from every exit.
- [10]
The author's fix is one source of truth per exit country: a PROFILES table in geo_profile.py mapping de to de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7 with Europe/Berlin and de-DE, gb to en-GB,en;q=0.9 with Europe/London, and us to en-US,en;q=0.9 with America/New_York, with nothing else allowed to set those values.
- [11]
Of the six signals the post says a target can read from one request, the proxy country flag sets only the IP, leaving five unchanged.
- [12]
Playwright's default Accept-Language is identical to the value the post's own profile table assigns to a US exit, so a German exit running default Playwright self-reports as a US client behind a German proxy.
- [13]
A blocklisted IP fails loudly with a 403, while inconsistent geo fails softly: more challenges, fewer cached responses, sticky sessions that expire faster, A/B assignment to the control group, and a success rate the author says is 8% lower than it should be, permanently, with nothing reporting it.
- [14]
An 8% shortfall in success rate is about one request in 12.5 that should have succeeded and did not.
Sources
1 independent publisher whose own reporting we read for this story.
- dev.toYour Proxy Is in Germany. The Rest of Your Client Isn't.
1 article · August 25, 2026
Topics and entities
Follow any of these and your For You feed starts watching them — no settings page required.
Topics
- Web ScrapingFollow
- Client Locale FingerprintingFollow
- Anti-Bot DetectionFollow
- Residential Proxies & Geo-TargetingFollow