Proxies for Puppeteer, Playwright and Selenium

One endpoint for headless Chrome or Firefox, with a session id that holds a whole page load on one exit.

From $4.99 a month for 3 GB

That is $1.66/GB at this size, and the rate falls as the volume rises.

For targets that refuse or challenge datacenter ranges

  • Rotating Datacenter from $5.90 a month for 10 GB. Lower per-GB rate, where the target accepts hosting ranges
  • Rotating Unmetered from $29.00 a month for 250 connections, with no data cap or per-GB charge, priced per concurrent connection. When page weight rather than request count would decide the bill
  • No data cap or per-GB charge on Rotating Unmetered: priced per concurrent connection.
  • Residential exits from an upstream partner network in 170+ countries.
  • HTTP(S) / SOCKS5 on one credential; Puppeteer, Playwright and Selenium all take it.
Visa Mastercard American ExpressAMEX PayPal Bitcoin Card, PayPal, Bitcoin or USDT
  • 7-day refund on your first order
  • Billed monthly. Cancel anytime, keep access to period end.

Point the browser you already have at the real target through a free allocation of shared datacenter proxies first, no card required.

Start free

Plans and pricing

Billed monthly. Card and PayPal renew automatically until you cancel. Bitcoin and USDT cannot be collected from your wallet, so a Bitcoin or USDT plan does not renew on its own unless your account credit covers the renewal in full; otherwise you pay the renewal invoice from your dashboard. Cancel anytime from your own settings. You keep access until the end of the period you have paid for.

Residential

Residential exits from a partner network, with country, state, city and ASN targeting

BandwidthPrice per GBTotalDiscountSelect this plan
3 GB$1.66/GB$4.99 /mo-
5 GB$1.39/GB$6.99 /moSave 16%
10 GB$0.99/GB$9.99 /moSave 40%
25 GB$0.79/GB$19.99 /moSave 52%
50 GB$0.69/GB$34.99 /moSave 58%
100 GB Featured$0.49/GB$49.00 /moSave 70%
250 GB$0.47/GB$119.00 /moSave 72%
500 GB$0.45/GB$229.00 /moSave 73%
1 TB$0.44/GB$449.00 /moSave 73%
5 TB$0.39/GB$1,995.00 /moSave 77%
Bandwidth
Per GB pricing
Threads
Unlimited
Protocols
HTTP(S) / SOCKS5
Sessions
Per tunnel or request, or sticky (best effort, up to 30 min)

Rotating Datacenter

Auto-rotating datacenter proxies across the US, Italy and Spain, billed by bandwidth usage. The gateway picks an exit per HTTPS tunnel, SOCKS5 connection or plain-HTTP request, or holds one with a session id

BandwidthPrice per GBTotalDiscountSelect this plan
10 GB$0.59/GB$5.90 /mo-
25 GB Featured$0.52/GB$13.00 /moSave 12%
50 GB$0.47/GB$23.50 /moSave 20%
Bandwidth
Per GB pricing
Threads
Unlimited
Protocols
HTTP(S) / SOCKS5
Sessions
Per tunnel or request, or sticky up to 30 min

Rotating Unmetered

Rotating datacenter proxies with no data cap, priced by how many connections you run at once rather than how many bytes you move. The gateway picks an exit per HTTPS tunnel, SOCKS5 connection or plain-HTTP request, or holds one with a session id

# of ConnectionsPrice per ConnectionTotalDiscountSelect this plan
250 connections$0.116$29.00 /mo-
600 connections$0.098$59.00 /moSave 15%
1,200 connections Featured$0.082$99.00 /moSave 29%
2,000 connections$0.074$149.00 /moSave 35%
4,000 connections$0.062$249.00 /moSave 46%
Bandwidth
Unlimited
Threads
250 to 4,000
Protocols
HTTP(S) / SOCKS5
Sessions
Per tunnel or request, or sticky up to 30 min

Is this the right product for you?

The tool does not decide which product you need; the target does. Point the script you already have at your real target through the free datacenter allocation. If the page renders, rotating datacenter is the cheaper buy. If it comes back challenged or empty, residential is where to start; it can be refused too, so buy the smallest plan and check before scaling. One consideration is specific to browsers: a headless page load moves several times the bytes an HTTP client does, so Rotating Unmetered, priced by concurrent connections rather than by the bytes they move, can be the cheaper plan.

What you get

Residential in 170+ countries
Country, state, city and ASN targeting, all set in the proxy username rather than by switching endpoints. These exits come from an upstream partner network and are resold, which is why residential is billed by the gigabyte.
Both protocols, no upcharge
HTTP(S) / SOCKS5 on every tier of this product, on one credential, at no extra charge.
Thousands
Owned datacenter IPs
170
Residential countries

Connection details

One endpoint per product, and the browser only ever holds one of them. Rotating Datacenter is gw-rotating_datacenter.node4.io:8083, and Rotating Unmetered is gw-rotating_unmetered.node4.io:8084. Country and session are segments of the username, so a browser changes market without changing endpoint.

Host
gw-residential.node4.io
HTTP(S) port
8082
SOCKS5 port
1082

Code examples

Puppeteernpm install puppeteer
import puppeteer from "puppeteer";

// The address is a Chromium launch flag, and Chromium DROPS any
// credentials written into it. They go to page.authenticate instead.
const browser = await puppeteer.launch({
  args: ["--proxy-server=http://gw-rotating_datacenter.node4.io:8083"],
});

const page = await browser.newPage();
// The session segment holds one exit for this page load and the flow
// after it. Without it, the document and its scripts can arrive from
// different exits.
await page.authenticate({
  username: "USER-session-482913",
  password: "PASS",
});

await page.goto("https://api.ipify.org");
console.log(await page.$eval("body", (el) => el.innerText));
await browser.close();
Playwrightnpm install playwright
import { chromium } from "playwright";

// Playwright carries the address and the credentials in one option,
// and takes it on a context as well as on launch, so one browser
// process can hold several contexts on several exits.
const browser = await chromium.launch();

const context = await browser.newContext({
  proxy: {
    server: "http://gw-residential.node4.io:8082",
    username: "USER-country-de-session-a41f9c",
    password: "PASS",
  },
});

const page = await context.newPage();
await page.goto("https://api.ipify.org");
console.log(await page.textContent("body"));
await browser.close();
Selenium (Python)pip install selenium
from selenium import webdriver

# WebDriver has no username or password field for an HTTP proxy, and
# Chromium ignores credentials written into the flag. Register this
# machine's public address on the Auth & IP Access page and send none.
options = webdriver.ChromeOptions()
options.add_argument("--headless=new")
options.add_argument("--proxy-server=http://gw-rotating_datacenter.node4.io:8083")

driver = webdriver.Chrome(options=options)
driver.get("https://api.ipify.org")
print(driver.find_element("tag name", "body").text)
driver.quit()

A page load is not one request. Opening a URL in headless Chrome fires dozens: the document, then the scripts, fonts, images and third-party endpoints it references, all through the proxy you configured, over connections the browser keeps alive for the next navigation. Two things follow. Rotation per connection can spread one page across several exits, which no ordinary visitor produces, so a browser usually wants a session. And the bytes per page are a multiple of what an HTTP client moves, which puts the billing unit into the buying decision.

Puppeteer and Playwright: where the proxy goes

Both set the proxy at the browser level and neither needs a plugin. In Puppeteer the address is a Chromium launch argument in args, and the credentials are a separate step, because Chromium discards a username and password embedded in that flag: page.authenticate carries them, once per page. Playwright has a proxy option taking server, username and password, accepted at launch and on browser.newContext, which lets one browser process hold several contexts on different exits. Country and session ids ride in the username on our gateways, so choosing a country or pinning a session is a string you build rather than an endpoint you switch.

The 407s, the per-context caveat and the DNS and WebRTC side channels are in proxy authentication in Puppeteer and Playwright.

  • Puppeteer: args: ["--proxy-server=http://HOST:PORT"], then page.authenticate({ username, password })
  • Playwright: proxy: { server, username, password }, on launch or on browser.newContext()
  • Country and session ride in the username: USER-country-de-session-482913

Selenium: authenticate by IP whitelist

The WebDriver proxy capability has fields for the proxy host and scheme, and a username and password for SOCKS only; there is no field for an HTTP proxy credential, and Chromium ignores credentials embedded in the proxy-server flag, so the browser connects unauthenticated and raises a dialog no element lookup can reach. Two arrangements avoid it. Register the public address of the machine running Selenium and connect with no credentials: IP whitelisting is available on every product, and on the rotating gateways a whitelisted machine can still send the username with an empty password to keep country and session targeting, while a whitelisted residential connection sends no username and gets an untargeted exit. Or use Selenium 4's authentication handler, which answers the challenge over DevTools with no extension and no local forwarder.

Four authentication routes with working code for each, and the three ways to rotate, are in rotating a Selenium proxy, and the auth traps on the way.

Hold a page load on one exit

The gateway chooses an exit each time the browser opens a connection to it. A page load opens several connections in parallel, so without a session the document and its scripts can leave from different exits, and the next navigation may reuse any connection still open. Most targets never notice; targets that tie a session to an address do, and the symptom is a login that succeeds followed by a page that treats you as a stranger. Add a session segment to the username to hold one exit for the whole flow. On the rotating plans the pin holds for up to 30 minutes, measured from when it is first assigned, not from your most recent request, so a longer job should mint a fresh session id and carry on. Residential sessions are best effort, with a 30-minute ceiling: the exit can drop sooner if its device goes offline, so switch to a new session ID after repeated failures.

What breaks when the exit changes mid-flow is covered in sticky versus rotating sessions.

Bytes or connections: what decides the bill

A crawler fetches the document and parses it. A headless browser fetches the document and everything it asks for: the framework bundle, the fonts, the images, the analytics beacons. On a per-gigabyte plan that multiple lands on the bill, so the lowest rate per gigabyte is not automatically the cheapest way to run a browser. Rotating Unmetered has no data cap and is priced by concurrent connections, meaning the number of connections open at the same time. That is not the same as your worker count: one page load opens several connections in parallel, so each worker can hold many, and the right size is the peak number of simultaneous proxy connections you observe on a real run. Blocking images, fonts and media in the browser cuts a metered bill and lowers the peak on a connection-priced one, so do it before you size anything.

Where each billing unit wins, with the arithmetic, is in unmetered billing versus per GB.

What a proxy fixes, and what it leaves standing

Rotation and residential exits address one problem: limits and bans counted per IP address. They do nothing about what the browser announces about itself. An automated Chromium is identifiable from its runtime properties, its TLS handshake, its font and codec list and its timing, and a target correlating on those will connect your sessions whatever the exit is. A cookie set behind one exit and replayed behind another is a stronger signal than either exit alone. Buy proxies for the address problem, treat the browser's own footprint as separate work, and change one variable at a time when something starts failing.

What you are buying, by product

Residential exits are consumer connections in a partner network, billed by the gigabyte, and are the product to try when a target refuses datacenter ranges. Rotating datacenter selects an exit for each connection (each request, on plain HTTP) from blocks Node4 owns in the United States, Italy and Spain, also billed by the gigabyte, and is the cheaper answer where a target tolerates hosting traffic but limits each address. Rotating Unmetered serves the same addresses through its own hostname and port, priced by concurrent connections instead of bytes. Dedicated datacenter is priced per address with unlimited bandwidth, which suits a long-running browser job against a tolerant target.

The same products compared against competitors rather than against each other, for this workload: how the proxy types rank for a browser job.

How it compares

FeatureThis pageRotating datacenterDedicated datacenter
IP changesPicked per connection, or stickyPicked per connection, or stickyFixed
IP originPartner networkIP blocks we ownIP blocks we own
BillingPer GBPer GB, or per connection unmeteredPer proxy / month
Geo targetingCountry, state, cityCountryLocation of the block
Credentials in the browserUsername and password, or whitelistUsername and password, or whitelistUsername and password, or whitelist
Entry price$1.66/GB at 3 GB, $0.39 at 5 TB$0.59/GB at 10 GB, $0.47 at 50 GB$1.49/proxy at 5, $0.75 at 1,000
Browser workload it suitsTargets refusing hosting rangesTargets that accept themOne lasting identity per worker

What people use these for

Sites that render in the browser

A parser handed a single-page application gets an empty shell. A headless browser gets the DOM the user sees, and the proxy decides which network it is built from.

Checking a market you do not sit in

Run the suite through an exit in the country you sell to and read the prices, banners and consent flows a visitor there meets.

Logged-in and multi-step journeys

Pin a session id per worker so the login, the cart and the confirmation all leave from one exit instead of three.

Worker pools you can size

Rotation and concurrency are separate dials. One endpoint serves every worker, and on the connection-priced plan what you buy is the number of connections open at the same time; one worker holds several during a page load, so size by the peak you measure.

Frequently asked questions

Which proxies should I use with Puppeteer, Playwright or Selenium?

Test first, because the answer depends on the target rather than the tool. Run your existing script against the real target through the free datacenter allocation. If the page renders, rotating datacenter is the cheaper product and the place to start. If it comes back challenged or empty, try residential on the smallest plan. The browser-specific adjustment is the billing unit: a headless page load moves several times what an HTTP client does, so measure a short run before sizing a per-gigabyte plan, or price it by concurrent connections instead.

How do I pass proxy credentials to a headless browser?

It depends on the tool. Puppeteer takes the address as a launch argument and the credentials separately through page.authenticate, because Chromium discards a username and password written into the launch flag. Playwright takes both together in its proxy option, on launch or on a browser context. Selenium has nowhere to put an HTTP proxy credential, since the WebDriver proxy capability defines a username and password only for SOCKS, so it uses either IP whitelisting or Selenium 4's DevTools authentication handler.

Can each browser context have its own exit IP?

Yes, in both Puppeteer and Playwright, and it is the cheapest rotation a browser can do. A context is an isolated profile inside a running browser, so replacing one costs milliseconds where relaunching the browser costs a process tree and a couple of seconds. Give each context its own session id in the username and each one holds its own exit; close and reopen a context to move it to a fresh address. Chromium on some platforms has ignored a context-level proxy unless the browser itself was launched with one, so launch with a placeholder address and assert the exit before trusting it.

Does SOCKS5 work with a headless browser?

Chromium accepts a SOCKS5 proxy in the same launch flag and Playwright accepts a socks5 scheme in its proxy option, so the address half works. The credential half does not: the mechanism that answers an HTTP proxy challenge has no SOCKS equivalent, so a SOCKS5 browser job authenticates by IP whitelist, which is available on every product. SOCKS5 is included on every paid plan at no extra charge; the free allocation is HTTP and HTTPS only.

How long does a sticky session hold one exit?

On the rotating plans, for up to 30 minutes, measured from when the pin is first assigned rather than from your most recent request, so a busy session does not extend its own window. Work that outlives it should mint a fresh session id and carry on. Residential sessions are best effort, with a 30-minute ceiling: the exit can drop sooner if its device goes offline, so switch to a new session ID after repeated failures.

Will proxies stop my headless browser getting blocked?

They address one cause. Changing the exit address moves you out from under anything counted per address: rate limits, per-IP caps, a single banned address. It does not change what the browser says about itself, so an automated Chromium's runtime properties, TLS handshake and timing still travel with the session, and a target correlating on those will connect your requests from any exit. Treat the two as separate work and change one at a time.

How much bandwidth does a headless browser use?

Several times what a crawler uses, so measure rather than estimate. Multiply pages by the full weight of the page, not the weight of its markup, because the browser fetches the scripts, fonts and images a parser skips. Run a bounded, representative slice of the job and read the gigabytes off the Bandwidth tab on Analytics; that gives you cost per unit of work and it scales from there. Blocking images, media and fonts at the request level cuts it sharply, and a connection-priced plan removes the meter from the question.

Do I need one proxy per browser?

Not with a gateway. Every browser and every context points at one hostname and port with one credential, and the exit is chosen behind it, so a pool of forty workers needs no list of forty addresses and nothing to health check. Give each worker its own session id if you want each one to keep a stable identity. Per-address products are the other shape: they suit a specific, lasting identity per account rather than a fresh exit per worker.

From $4.99 a month for 3 GB

Billed monthly. Cancel anytime in your settings, and you keep access to the end of the period you have paid for.

Guides for Proxies for Puppeteer, Playwright and Selenium

Setup, targeting and troubleshooting, written for people already running this in production.