Configure any available plan and add-ons. Pay only for 48 hours.
Try proxiesA proxy for Puppeteer in Node.js that works headless: whitelist auth with no credential code, dedicated IPs for scraping and browser automation, from $19/mo.
Puppeteer’s proxy story has one catch, and everything else follows from it: --proxy-server accepts only a host and port. Put user:pass@ in the string and Chrome rejects the whole proxy with ERR_NO_SUPPORTED_PROXIES; the documented route is calling page.authenticate() before navigation — on every page you open, for HTTP proxies only, and with nothing to fall back on in headless mode, where the browser can’t even show a login popup. For SOCKS5 there’s no credential support at all: the feature request has been open since 2019.
IP whitelisting makes all of that irrelevant. Add the IP of the machine running your scripts in the Dashboard — every plan includes up to five whitelisted source IPs — and the launch options carry the entire setup:
import puppeteer from "puppeteer";
const browser = await puppeteer.launch({
args: ["--proxy-server=IP:port"], // whitelisted, so no credentials
});
const page = await browser.newPage();
await page.goto("https://example.com");
No auth calls, no plugins like puppeteer-page-proxy, no local proxy-chain hop — and the same line works headless, in Docker, and with SOCKS5. When one exit IP per browser isn’t enough, pass proxyServer to browser.createBrowserContext() and run several isolated contexts in a single browser process, each behind its own address.
Addresses come from your package: export the list in TXT, CSV, or a custom template and distribute it across workers and contexts. Packages start at 100 IPs, from $19/mo. Product specs are in the adjacent panel; the comparison table below shows where datacenter packages sit among other proxy types. For a step-by-step walkthrough — page.authenticate(), per-context proxies, and rotation from a list — see the Puppeteer proxy setup guide.
Four infrastructure types — and the use cases each one fits best.
| Our pick for Puppeteer Packagesdatacenter IPv4 |
Rotating | ISP | IPv6 | |
|---|---|---|---|---|
| IP source | Datacenter, IPv4 | Datacenterthe same 100,000+ IP pool | Consumer ISP networks | Datacenter |
| IP allocation | Static list | Full pool accessthe exit IP rotates on every request | Static list | Static list |
| List refreshes | Up to 3 per month, free | Not applicable | Up to 3 per month, free | Provider-dependent |
| Pricing model | Per-IP packageunlimited bandwidth | Credit-basedyou pay per request, not per IP | Per-IP packageunlimited bandwidth | Per-IP package |
| Website compatibility | ✓ ~100% | ✓ ~100% | ✓ ~100% | ✕ Limitedmany websites don't support IPv6 |
| Speed | Up to 500 Mbps | Up to 300 Mbps | Up to 500 Mbps | Datacenter-grade |
| Anti-fraud trust | Medium | MediumIP rotation helps | High | Low to medium |
| Price | $from $0.07 per IP/month | $$$from $49.00/month | $$from $0.22 per IP/month | $typically the lowest-cost option |
| Best for | Web scraping and automation at a predictable volume: your own IPs, unlimited bandwidth | API scraping that needs as many different IPs as possible without buying a fixed list | Social media, accounts, long sessions — wherever IP trust matters | Use cases where the target site is guaranteed to support IPv6 |
| Buy now | Rotating proxies | ISP proxies | We don't sell these: too many limitations for general-purpose work |
Whitelisting is the base access method on every plan, so Puppeteer proxy authentication without page.authenticate is the default here — username/password stays available on top when a workflow calls for it. Copy the example for your stack, or paste it into your AI coding assistant to adapt.
# HTTP or HTTPS proxy curl -x http://login:password@IP:port https://example.com # SOCKS5 curl --socks5-hostname IP:port \ --proxy-user login:password \ https://example.com
import requests proxy = "http://login:password@IP:port" # your proxy from the Dashboard r = requests.get( "https://example.com", proxies={"http": proxy, "https": proxy}, ) print(r.status_code)
import { ProxyAgent } from "undici"; const dispatcher = new ProxyAgent("http://login:password@IP:port"); const res = await fetch("https://example.com", { dispatcher }); console.log(res.status);
$ch = curl_init("https://example.com"); curl_setopt($ch, CURLOPT_PROXY, "IP:port"); curl_setopt($ch, CURLOPT_PROXYUSERPWD, "login:password"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch);
Choose a standard format or create a custom one with any field order and delimiter your software requires.
See the FAQ for the ports used by each protocol.
You can automate purchases, renewals, whitelist changes, and proxy list exports. Create an API key in your Dashboard in a couple of clicks.
Claude, Cursor, and other agents buy proxies, renew plans, and export updated proxy lists through an access token you create in your Dashboard. See how it works.
Per-IP prices shown are for the largest package size. Get an exact quote in the calculator above.
| IP | Country | Port | Protocol | |
|---|---|---|---|---|
| 212.183.88.215 | AT | 80 | HTTP | |
| 47.243.92.199 | HK | 3128 | HTTP | |
| 212.183.88.153 | AT | 80 | HTTP | |
| 212.183.88.13 | AT | 80 | HTTP | |
| 203.95.199.159 | KH | 8080 | HTTP | |
| 154.92.9.3 | JP | 80 | HTTP | |
| 113.204.79.230 | CN | 9091 | HTTP | |
| 181.214.1.97 | AE | 80 | HTTP | |
| 219.93.101.63 | MY | 80 | HTTP | |
| 185.18.250.64 | CH | 80 | HTTP |
A few service metrics—and feedback from our customers.
I use proxies for online games. I have been using the service for many months and I am satisfied with the quality and efficiency. Proxies work as they should and there are practically no disconnects. I recommend it, you will not regret it!
Like the service! Responsive and fast support, affordable prices, convenient renewal panel and network selection. Just what I need!
I used the service for social networking. At first I bought it for a month, but now I will definitely renew it because the quality is really good! I am very glad that I finally found a really cool service!
Proxies do not fail, and at this price it is a great gift. I buy them when I need them, usually once every few months. There have been a few minor glitches but the support here is above all praise. Responsive, kind, understanding and fast. All issues were resolved promptly. It is very nice to work with true professionals.
Can't find your answer? Message us in live chat — real humans reply.
It almost always means credentials ended up inside the --proxy-server value. Chrome doesn't parse user:pass@IP:port there — it treats the whole string as an unsupported proxy scheme and refuses to route anything. Strip the string down to IP:port and the error disappears. Then authenticate one of two ways: call page.authenticate({username, password}) before the first goto() on every page you create, or whitelist your server's IP in the Dashboard and skip credentials entirely — the second option is one less call per page and the only one that also covers SOCKS5.
No. page.authenticate() answers HTTP auth challenges, and Chrome has no mechanism for SOCKS5 credentials at all — the Puppeteer feature request (issue #4170) has been open since 2019 with no plans to implement it. The community workarounds are proxy-chain (a local hop that strips authentication) or forks of puppeteer-page-proxy, both of which add moving parts to every request. With IP whitelisting the limitation simply doesn't apply: --proxy-server=socks5://IP:port connects with no credentials to negotiate, and every address in our packages answers on HTTP, HTTPS, SOCKS4, and SOCKS5 alike.
Per page — not natively; that's exactly the gap the puppeteer-page-proxy plugin tried to fill by re-routing requests in JavaScript. The supported unit is the browser context: browser.createBrowserContext({ proxyServer: 'IP:port' }) gives you an isolated session — separate cookies, storage, and exit IP — inside a single Chrome process. One context per account or task is the pattern: dozens of contexts cost far less RAM than dozens of browsers. Assign each context its own address from your package list, and with whitelisted IPs the contexts need no authentication calls at all.
Rotating proxies for Puppeteer work at two levels, and neither requires restarting Chrome per address. The self-managed way: export your package list and cycle through it — a new address per puppeteer.launch(), or per browser context if you're running many tasks in one process. That's a few lines of code and keeps per-IP costs at package prices. The managed way: point --proxy-server at a rotating plan's gateway once, and the exit IP changes on our side per request — no list handling, but billing shifts from per-IP to per-request, which only pays off when you genuinely need thousands of distinct exits. What doesn't work is trying to swap the proxy of an already-running context: the flag is fixed at creation, so rotation always means a new context, not a mutation.
The proxy flag itself behaves identically — --proxy-server works the same headless and headful. Two practical notes. First, in headless mode a proxy auth failure is invisible: there's no popup, requests just die with ERR_TUNNEL_CONNECTION_FAILED, which is why credential-free whitelisting saves the most debugging time exactly where most Puppeteer fleets run. Second, in Docker remember that the IP to whitelist is the egress IP of the host (or NAT gateway), not the container's internal address — check what the outside world sees with curl ifconfig.me from inside the container before adding it in the Dashboard.
A different proxy type may be a better fit for your use case. All products use the same Dashboard and support team.
An IP reserved exclusively for you, available from a single IP. Speeds of up to 500 Mbps per proxy.
Learn moreStatic ISP-registered residential IPs for use cases where network origin matters.
Learn morePay per request and access the full 100,000+ IP pool through a single gateway. Built for web scraping and API workloads.
Learn moreSOCKS5 with UDP support — for gaming, streaming, and VoIP.
Learn moreWe can sign a contract and provide all the documents your accounting team needs. Most business orders are activated within 24 hours of your request.