cdpfleet Sign up free

cdpfleet / Geo testing

For localization, growth and ad teams

One script, every country your users are in.

Pick the exit country with one proxy token, let the browser take its timezone and language from that IP, and check what each country really gets: the language, the prices, the cookie banner, the ads. Measured, with the mismatches a site can spot.

  • 1 tokenper country, no proxy account
  • Tier 1–2device-OS targeting
  • 15 / 15Camoufox geoip checks agreed with the IP (case 74)

Choose the country

  • A token instead of a proxy account: cdpfleet-resi-country-de exits from a residential IP in Germany; add -session-<name> to keep the same IP and -lifetime-<minutes> to say how long. The same token works in every language and in proxy_rules (case 25, residential proxy).
  • Rotating or sticky: three lookups through a rotating token gave three different IPs; two sessions with the same session name got the same IP, even in different browsers. Use a sticky session when a check spans several pages or a city-level result matters (case 25).
  • Device OS of the IP: Tier 1 and 2 tokens can also ask for the operating system of the device behind the IP, e.g. -os-windows, to match a Windows persona (resi-os-persona recipe).
  • Only the requests that need it: send the site through the residential exit and everything else through your own proxy with proxy_rules (resi-for-one-host recipe); residential traffic is billed per GB.
  • Your own exits work too: a proxy per country of your own, or on dedicated plans your own VPN server with vpn (proxies).
Camoufox through a sticky German residential IP, timezone and language from that IP
// npm install [email protected]
// Browsers run on cdpfleet, so no `npx playwright install` is needed.
import { firefox } from 'playwright';

const KEY = process.env.CDPFLEET_API_KEY;

// 1. Launch the browser
const res = await fetch('https://starter.cdpfleet.com/camoufox/session', {
  method: 'POST',
  headers: { 'x-api-key': KEY, 'content-type': 'application/json' },
  body: JSON.stringify({
    proxy: 'cdpfleet-resi-country-de-session-shop1-lifetime-30',
    geoip: true,
  }),
});
if (!res.ok) throw new Error(`launch failed: ${res.status} ${await res.text()}`);
const { wsUrl } = await res.json();

// 2. Connect and drive it
const browser = await firefox.connect(wsUrl, { headers: { 'x-api-key': KEY } });
const page = await browser.newPage();
await page.goto('https://example.com');
console.log(await page.title());
await browser.close(); // ends the session and stops billing

Make the browser agree with its IP

  • Camoufox does it for you: with geoip (on by default) its timezone, language, Accept-Language, Intl formats and WebRTC agreed with the exit IP in all 15 cells — New York, Berlin and Tokyo, five runs each (case 74). It draws the language per launch the way residents are spread, so a German exit gave German in 2 of 5 launches and en-DE, es-DE, el-DE in the others; set locale when the test needs the country's main language.
  • Chrome needs the context set: headful Chrome reported UTC and en-US through every exit until the context got locale and timezoneId from a first lookup of the exit (case 74). For maps and store finders add geolocation and the permission too — granting the permission alone left getCurrentPosition timing out (case 35).
  • Formats follow the locale: de-DE formats 1.234.567,891 and 1.10.2026, 17:30:00, ja-JP 2026/10/2 0:30:00, and the same instant shows as local time in each country (case 15).
  • Geo-IP gets the country right, not always the city: databases disagree about residential ranges, so check location with the service the site itself uses (case 15).

What changes by country, measured

  • The site you get: from Germany all five news sites in our test showed a consent banner in four of five runs; from the US two of them never showed one, and the US visitor carried up to 291 third-party cookies without a click. One site answered 403 to the US exit in three of five runs and always loaded from Germany (case 37).
  • Prices are formatted, not converted: a euro price showed as €49.90 to the US and Japanese personas and 49,90 € to the German one — the currency is the site's choice (case 15).
  • Languages and redirects: the same URL can answer in another language or redirect to a country site; record the final URL and document.documentElement.lang next to the screenshot.
  • Or just look, no code: a live tab opens a real browser tab in the country you pick, used from your own browser — see what a site shows there without a VPN; free for 3 minutes, longer from the dashboard or one API call. Geo compare does several countries side by side in one call (case 87).
  • Ad checks: load the page from the market you buy for, keep the session sticky while ads load, and keep a recording of the run as evidence of what was shown.

Phones and mobile layouts

  • Mobile layouts on desktop browsers: Playwright device emulation changes the user agent, viewport and touch, through the same country exit (case 02).
  • Real phone browsers: Chrome, Samsung Internet and other browsers on hardware Android phones and iOS WebView are in early access (mobile).