Geo-targeting that actually works
Picking a country is the easy part. Making the rest of the request agree with it is what determines whether you get the local page.
Priya Kapoor
Solutions engineering
21 Jul 2026 · 7 min read
You set the exit to Germany, fetch the page, and get English prices in dollars. The proxy worked; your request did not. Geolocation is inferred from a bundle of signals and the IP address is only the loudest of them.
The signals that matter
| Signal | Where it lives | How often sites use it |
|---|---|---|
| IP geolocation | Network layer | Almost always |
| Accept-Language | Request header | Very often |
| Locale cookie | Set on first visit | Often, and it overrides everything |
| Timezone | JavaScript, Intl API | On JS-rendered sites |
| URL path or subdomain | /de/, de.example.com | Common in retail |
| CDN edge headers | Cloudflare, Akamai | Increasingly |
Make them agree
LOCALES = {
"de": ("de-DE,de;q=0.9,en;q=0.6", "Europe/Berlin", "EUR"),
"jp": ("ja-JP,ja;q=0.9,en;q=0.5", "Asia/Tokyo", "JPY"),
"br": ("pt-BR,pt;q=0.9,en;q=0.5", "America/Sao_Paulo", "BRL"),
}
def request_for(country, url):
lang, tz, currency = LOCALES[country]
proxy = f"http://wp-acc4821-country-{country}:pass@res.wproxy.io:8000"
return requests.get(
url,
proxies={"https": proxy},
headers={"Accept-Language": lang},
timeout=30,
)In a headless browser you can go further and set the timezone and locale on the context itself, which covers the JavaScript-visible signals that a header cannot reach.
const context = await browser.newContext({
proxy: {
server: "http://res.wproxy.io:8000",
username: "wp-acc4821-country-de-city-munich",
password: "pass",
},
locale: "de-DE",
timezoneId: "Europe/Berlin",
geolocation: { latitude: 48.14, longitude: 11.58 },
permissions: ["geolocation"],
});Watch for the sticky cookie
The most common cause of wrong-locale results
A locale cookie set during an earlier request with a different exit. It survives the proxy change and overrides everything you just configured. Use a fresh browser context or clear cookies whenever you change country.
Go below country when the target does
In the United States, sales tax, shipping estimates, delivery windows and quite often the prices themselves vary by state and metro. A country-level exit in the US gives you a random one of those realities. If you are monitoring retail pricing, target the state or the city and be explicit about which one you sampled — otherwise your time series is measuring rotation, not the market.