Geo-Targeting
Route browser sessions through residential proxies in specific countries with aligned timezone, locale, and language
Country-routed sessions
Pass ?country=XX (ISO 3166-1 alpha-2) when connecting to route your session through a residential proxy in that country:
wss://api.anakin.io/v1/browser-connect?country=GBAligned fingerprint signals
When you pass ?country=, the browser's timezone, locale, language, and Accept-Language all match the proxy's country. Anti-bot systems compare these against the IP — a UK IP that reports UTC and en-US is an obvious bot signal. With ?country=GB every signal lines up.
What websites see for ?country=GB:
| Signal | What websites see |
|---|---|
| Exit IP | UK residential (e.g. BT, Virgin Media, Sky) |
navigator.language | en-GB |
navigator.languages | ["en-GB"] |
Accept-Language request header | en-GB |
Intl.DateTimeFormat().resolvedOptions().timeZone | Europe/London |
new Date().getTimezoneOffset() | -60 (BST) or 0 (GMT) depending on the date |
Intl.NumberFormat default locale | en-GB (formats currency as £) |
Intl.NumberFormat(undefined, {style:'currency',currency:'GBP'}) | £1,234.56 |
| WebRTC ICE candidates | mDNS-obfuscated (no real IP leak) |
navigator.geolocation | denied by default (requires explicit user grant) |
Supported countries
Per-country timezone and locale defaults:
| Code | Timezone | Locale |
|---|---|---|
US | America/New_York | en-US |
GB | Europe/London | en-GB |
DE | Europe/Berlin | de-DE |
FR | Europe/Paris | fr-FR |
ES | Europe/Madrid | es-ES |
IT | Europe/Rome | it-IT |
NL | Europe/Amsterdam | nl-NL |
SE | Europe/Stockholm | sv-SE |
JP | Asia/Tokyo | ja-JP |
KR | Asia/Seoul | ko-KR |
CN | Asia/Shanghai | zh-CN |
IN | Asia/Kolkata | en-IN |
SG | Asia/Singapore | en-SG |
HK | Asia/Hong_Kong | zh-HK |
AU | Australia/Sydney | en-AU |
NZ | Pacific/Auckland | en-NZ |
CA | America/Toronto | en-CA |
MX | America/Mexico_City | es-MX |
BR | America/Sao_Paulo | pt-BR |
AR | America/Argentina/Buenos_Aires | es-AR |
AE | Asia/Dubai | ar-AE |
SA | Asia/Riyadh | ar-SA |
ZA | Africa/Johannesburg | en-ZA |
Country codes not in this list still route through a residential proxy in that country (proxy availability permitting), but timezone and locale fall back to the browser's defaults (UTC and en-US). Open a support ticket if you need a country added to the alignment table.
If ?country= is omitted, sessions default to US.
Example: GB session
import asyncio
from playwright.async_api import async_playwright
async def main():
async with async_playwright() as p:
browser = await p.chromium.connect_over_cdp(
"wss://api.anakin.io/v1/browser-connect?country=GB",
headers={"X-API-Key": "your_api_key"},
)
page = browser.contexts[0].pages[0]
# IP, timezone, language all align to GB
info = await page.evaluate("""
({
tz: Intl.DateTimeFormat().resolvedOptions().timeZone,
lang: navigator.language,
offset: new Date().getTimezoneOffset(),
})
""")
print(info) # {tz: 'Europe/London', lang: 'en-GB', offset: 0}
await browser.close()
asyncio.run(main())const { chromium } = require('playwright');
(async () => {
const browser = await chromium.connectOverCDP(
'wss://api.anakin.io/v1/browser-connect?country=GB',
{ headers: { 'X-API-Key': 'your_api_key' } }
);
const page = browser.contexts()[0].pages()[0];
const info = await page.evaluate(() => ({
tz: Intl.DateTimeFormat().resolvedOptions().timeZone,
lang: navigator.language,
offset: new Date().getTimezoneOffset(),
}));
console.log(info); // {tz: 'Europe/London', lang: 'en-GB', offset: 0}
await browser.close();
})();Sticky exit IP within a session
A single session keeps the same exit IP for its duration. Reconnecting issues a fresh proxy by default — pair with Saved Sessions if you need IP stickiness across reconnects (the saved session's proxy is preserved).