Every country shows the same result
Check Does ipinfo.io report the expected country in each context?
Fix Give every context its own proxy option and check that each IP was bought in that country. Rerun with a single exit to isolate it.
One fixed exit per test country, so a geo rule, a translation or an RPC error shows up in your test run before your users see it.
dApps answer differently by country. Polymarket, for example, documents a geoblock endpoint that returns the detected IP, country and region, lists jurisdictions where its front end and API block orders or allow closing positions only, and tells builders to check the location before placing an order. If your dApp applies rules like these, you only see each region's result from an IP in that region.
Browser automation takes a proxy per browser or per context. Playwright sets a proxy for the whole browser or for each browser context, so one test run can walk through several countries, and it sends a username and password only to HTTP(S) proxies — so generate your IPs with HTTP. Wallet extensions such as MetaMask load only in Chromium started with a persistent context.
Static exits keep results comparable. A static datacenter IP keeps its address for the whole term, so a country that fails today fails on the same IP tomorrow instead of on a random one — the Web3 note in the console calls this setup “Development and tools”.
Scroll horizontally with the arrow keys to read all content.
| Criterion | Choose | Why |
|---|---|---|
| Product | Static datacenter proxy | Fixed, fast IPs priced per IP |
| Billing | Per IP and term | The address stays the same until the term ends |
| How many IPs | One per country you test | Each region keeps its own fixed exit |
| Country | Every market you serve or restrict | Nothing is preselected for Web3 — buy one IP per country |
| Protocol | HTTP (preselected) | Playwright sends a username and password only to HTTP(S) proxies |
| IP changes | Never during the term | Renew in My assets so runs stay comparable |
The “Configure dApp testing proxies” button opens static datacenter proxies for the Web3 use case, billed per IP and term with HTTP selected. Choose the region, the term and Quantity (up to 100 IPs at a time) before you pay.
Scroll horizontally with the arrow keys to read all content.
| Criterion | Static ISP | Rotating residential | Datacenter |
|---|---|---|---|
| What you get | A home-broadband IP fixed to you for the whole term | Household IPs: a sticky session in the country you pick, or rotation on the Budget line | Fixed IPs in data centres — the console's fastest and cheapest option |
| Price | Per IP and term, shown in PTC before you pay (1 PTC = US$1) | Per GB: Budget US$1.50, Premium US$5.00, from 1 GB | Per IP and term, shown in PTC before you pay |
| Best for dApp testing | Checks that must come from a home-broadband address | Spot checks across many countries or cities, paid per GB | Automated suites in CI — one fixed IP per country |
Prices in US dollars; you pay with PTC credit (1 PTC = US$1). Top up your wallet, then buy the line you need. Auto-renew isn't available yet, so renew static IPs in My assets before their term ends.
The “Configure dApp testing proxies” button opens Static Datacenter Proxies with the Web3 use case selected. Under Connection settings pick the Region, choose the Term and keep Protocol at HTTP, then click Review cost and generate. Each purchase covers one Region, so repeat it for every country in your test matrix; Quantity adds more IPs in the same country (up to 100 at a time).
Expected result Your configuration lists Per IP and term, Web3, the region and the protocol.
After payment the console opens My assets. Choose View credentials on the new proxy and copy the endpoint (host:port), username and password.
Store each country's host, port, username and password as CI secrets, not in the repository. In Playwright pass them as the proxy option of the browser or of each context, as in the example below.
Run the same flow through every exit. Read the exit country first, then the page status, and keep a screenshot per country so differences are easy to review.
Expected result Each run reports its exit country, the page status and a screenshot.
Scroll horizontally with the arrow keys to read all content.
// Save as geo-test.mjs and run: node geo-test.mjs
// npm i -D playwright && npx playwright install chromium
import { chromium } from 'playwright'
const DAPP_URL = 'https://app.example.org/' // your dApp
const exits = {
US: { server: 'http://US_HOST:PORT', username: 'USERNAME', password: 'PASSWORD' },
DE: { server: 'http://DE_HOST:PORT', username: 'USERNAME', password: 'PASSWORD' },
}
const browser = await chromium.launch()
for (const [expected, proxy] of Object.entries(exits)) {
const context = await browser.newContext({ proxy })
const page = await context.newPage()
await page.goto('https://ipinfo.io/country')
const seen = (await page.locator('body').innerText()).trim()
const response = await page.goto(DAPP_URL, { waitUntil: 'domcontentloaded' })
console.log(`${expected}: exit ${seen}, status ${response?.status()}`)
await page.screenshot({ path: `dapp-${expected}.png`, fullPage: true })
await context.close()
}
await browser.close()
Playwright takes a proxy per browser context, so one run walks through several countries. Keep hosts and passwords in your CI secrets and replace DAPP_URL with your dApp.
Check Does ipinfo.io report the expected country in each context?
Fix Give every context its own proxy option and check that each IP was bought in that country. Rerun with a single exit to isolate it.
Check Are username and password set as separate proxy fields, copied exactly from View credentials, on an IP generated with HTTP?
Fix Pass them as username and password next to server, as in the example, and copy them again from My assets.
Check Is Chromium started with a persistent context, and not Google Chrome or Edge?
Fix Use the Chromium bundled with Playwright and launchPersistentContext, and pass the proxy in the same launch options.
Datacenter for automated suites: one fixed, low-cost IP per country. Use rotating residential for spot checks across many countries or cities, and static ISP when a check must come from a home-broadband address.
Yes, in Chromium: Playwright loads extensions only with a persistent context, and the browser's proxy then covers MetaMask's traffic too. Use a test wallet with test funds only.
Run the restricted flow through an IP in each restricted country and in one allowed country, and compare the results. Polymarket's documentation shows the pattern: a geoblock endpoint reports the detected country and region before an order is placed.
No. It changes where requests come from, not what a node returns. If results differ by country, check whether your dApp calls different RPC endpoints or APIs per region.
One per country in your test matrix. Parallel runs in the same country can share that IP as long as you stay within your dApp's and RPC provider's limits.
Official documentation · Checked:
Documents GET https://polymarket.com/api/geoblock, which returns whether the user is blocked plus the detected IP, country and region; lists jurisdictions blocked completely, close-only on front end and API, and close-only on the front end only; tells builders to verify the location before placing orders.
Official documentation · Checked:
Shows a proxy set for the whole browser or per browser context, with server, username and password; HTTP(S) and SOCKSv5 proxies are supported, and the optional username and password are documented for HTTP(S) proxies.
Official documentation · Checked:
Extensions only work in Chromium launched with a persistent context; Google Chrome and Microsoft Edge removed the command-line flags needed to side-load them.
Product observation · Checked:
Read in the console source on 2026-10-18: for the Web3 use case the static datacenter page bills Per IP and term, offers HTTP or SOCKS5 with HTTP preselected, leaves Region unselected, shows Auto-renew IP as Not yet available and states that static IPs never rotate. Its Web3 note reads “Development and tools: Per IP · HTTP CONNECT by default · 1 fixed exit · adjustable protocol and term”. Since 19 October 2026 the Quantity field takes 1 to 100, and the console buys and charges the IPs one by one.
Product observation · Checked:
Budget rotating residential US$1.50 per GB and Premium US$5.00 per GB, both from 1 GB; account credit in PTC at 1 PTC = US$1.00; static ISP and datacenter leases depend on region, quantity and term and are shown before you pay — as published on the pricing page (checked against the production catalogue on 2026-10-09).
Create an account, top up once and pick rotating residential, static ISP or datacenter. Rotating residential exits cover 195+ countries and regions.