The best Puppeteer proxy is the one whose IP type matches what the target checks, and that choice matters more than the provider name. Teams usually reach for Puppeteer because a site renders with JavaScript or runs a browser challenge, and those same sites score every connection by where its IP comes from: a data center, a home broadband line or a mobile carrier. Short answer: datacenter IPs for unprotected pages, residential pools for broad scraping of lightly protected sites, and mobile IPs for protected targets and logged-in sessions.
Key takeaways
- Pick the IP type by target: datacenter for unprotected pages, residential for broad low-stakes scraping, mobile for protected sites and logged-in sessions.
- Mobile carrier IPs are shared with real phone users behind CGNAT, so blocking one risks blocking real customers.
- Rotation level matters as much as IP type: per request for stateless pages, sticky sessions for multi-step flows, one dedicated mobile device per logged-in account.
- Chrome rejects credentials written into the proxy URL and has no SOCKS5 authentication, so Puppeteer needs page.authenticate() or a local bridge.
- A full browser downloads images, fonts and video. On per-GB plans, blocking those resource types cuts usage before it reaches the bill.
Best Proxies for Puppeteer Compared
There is no single top-performing proxy service for Puppeteer automation. Every IP type below works with Puppeteer at the protocol level. What differs is how a target reads the IP, how it rotates, and what a real browser session costs on it.
| Factor | Datacenter | Residential | ISP (static residential) | Shared mobile | Dedicated mobile |
|---|---|---|---|---|---|
| How sites read it | Hosting network, labeled in IP databases | Home broadband IP | ISP-registered IP hosted in a data center | Carrier IP shared with real phone users | Carrier IP on one mobile device assigned to you |
| Rotation | Static or pool | Rotating pool, sticky sessions | Static | Per request, timed or sticky | On demand, by link or API call |
| Billing | Per IP or per GB | Per GB | Per IP, monthly | Per GB | Per day, week or month |
| Best Puppeteer job | Unprotected pages, testing, internal tools | Broad scraping of lightly protected sites | Long sessions that need one fixed IP | Protected targets at volume | Logged-in sessions and account automation |
| Weak spot | Filtered first on protected targets | Pool quality varies by provider | A flagged static IP stays flagged | Usually costs more per GB than residential | One exit IP at a time per device |
Datacenter IPs are fast and inexpensive, and they are also the first range a protected site filters, because hosting networks are labeled as such in commercial IP databases. Residential and mobile IPs come from consumer networks, and the mobile vs residential proxy comparison covers where those two part ways.
Mobile carriers go one step further. Their addresses sit behind carrier-grade NAT, where one public IP serves many real phone users at once, so a site that blocks it also blocks paying customers.
How to Select the Best Proxy Network for Puppeteer
Choosing a proxy for Puppeteer starts with the job the script does, not with pool size. Four workloads cover most Puppeteer jobs, from web data extraction to logged-in automation:
- Unprotected pages, testing and internal tools. Datacenter proxies are enough. If a plain HTTP client already gets the page, a headless browser may not be needed at all.
- High-volume Puppeteer scraping. For broad crawls of lightly protected sites, residential pools usually cost less per GB, and any residential proxy with an authenticated HTTP endpoint is compatible with Puppeteer. Targets behind Cloudflare, DataDome or Akamai are where shared rotating mobile proxies earn their cost: carrier IPs, billed per GB, with per-request, timed or sticky rotation.
- Logged-in sessions and account automation. A dedicated mobile proxy gives one account one real mobile device and one carrier exit IP, held until you rotate it. Dedicated devices are high-speed 4G/5G connections, with Premium the faster tier, which helps when every page load pulls a full JavaScript bundle.
- US and other geo targets. Use exits in the target country and make the browser agree with them. Set the timezone with
page.emulateTimezone()and the language with anAccept-Languageheader, so a session on a US carrier IP does not report a European clock.
Rotation: Per Request, Sticky Session or Per Device
One Puppeteer page load fires requests to several hosts: the document, scripts, APIs, fonts and analytics. With per-request rotation, those requests can leave through different IPs. That suits stateless product and search pages, and it breaks anything with a login, a cart or a multi-step form, where the site expects one visitor on one address.
Sticky sessions hold an IP for a set time and cover most multi-step flows. To run several sticky sessions in one browser, give each session its own browser context: Puppeteer's createBrowserContext options accept a separate proxyServer per context, and pages in that context authenticate on their own.
Dedicated devices rotate on demand instead. On a VoidMob device, the IP stays fixed until the script calls the device's private rotation link between jobs, at most once a minute, then confirms the new IP before the next run.
VoidMob shared lists set the rotation mode with a single value, rotation_period_seconds, and dedicated devices cap rotation by time:
Puppeteer Proxy Setup in One Snippet
Every IP type above plugs into Puppeteer the same way. Chromium reads the proxy from the --proxy-server launch flag and, per the Chromium proxy documentation, will not use a username and password embedded in it, so credentials go through page.authenticate() before the first navigation. The VoidMob Puppeteer proxy integration is three values: host proxy.voidmob.com, port 10000, and the username and password of a proxy list from your dashboard. The snippet targets Puppeteer 25, which ships as ESM only and needs Node 22.12 or newer.
1import puppeteer from 'puppeteer';2 3const browser = await puppeteer.launch({4args: ['--proxy-server=http://proxy.voidmob.com:10000'],5});6 7const page = await browser.newPage();8await page.authenticate({9username: '<list-username>',10password: '<list-password>',11});12 13await page.goto('https://ipinfo.io/json', { waitUntil: 'domcontentloaded' });14console.log(await page.evaluate(() => document.body.innerText));15 16await browser.close();The output shows the exit IP, country and network name. On a mobile proxy, the network should read as a carrier, not a hosting company.
Credentials in the proxy URL break the launch
Writing http://user:pass@host:port into --proxy-server looks correct and fails. On Puppeteer 25, Chrome rejects the proxy string and every navigation fails with net::ERR_NO_SUPPORTED_PROXIES. Keep the flag to scheme, host and port, and pass credentials with page.authenticate().
SOCKS5 needs one more step. Chrome supports no authentication methods for SOCKS5, so either run a local proxy-chain server with the SOCKS5 proxy as its upstream and point --proxy-server at the local address, or use the HTTP endpoint instead. The HTTP route is simpler, and Chrome hands DNS resolution to an HTTP proxy, so lookups do not leave from the machine running the script. Per-context sessions, rotation code and common errors are covered step by step in our Puppeteer proxy setup reference.
What a Full Browser Costs on Per-GB Proxies
Puppeteer downloads everything a normal visit loads: images, web fonts, video and tracking scripts. On per-GB residential or mobile plans, that traffic is billed even though the scraper never reads it. Blocking those resource types takes a few lines, and it works alongside page.authenticate():
1await page.setRequestInterception(true);2 3page.on('request', (request) => {4const blocked = ['image', 'media', 'font'];5if (blocked.includes(request.resourceType())) {6 request.abort();7} else {8 request.continue();9}10});With request interception on, every request has to be continued or aborted, or the page stalls. Run the trimmed setup against the real target before scaling it.
Dedicated devices are billed by time rather than by traffic, so trimming matters most on shared per-GB plans. Estimate what a job will use before picking a plan:
Proxy data usage calculator
Rough estimate, not a billing forecast. Real usage varies by target, media mix and caching.
About 2 MB per page with media, over 30 days.
Prices updated
What a Proxy Does Not Fix in Puppeteer
A proxy changes the network identity of a session. It does not change what the browser reports about itself. A default Puppeteer launch still sets navigator.webdriver to true (Puppeteer 25 included), and anti-bot vendors check signals like that alongside the IP. A clean mobile IP removes the network reasons to block a session; the browser's own signals take an engine-level patched build, not a stealth plugin. Our guide to bypassing Cloudflare Turnstile walks through the browser side.
Puppeteer does have one advantage over plain HTTP clients: requests come from real Chrome, so the TLS handshake matches a browser. Packages that set a proxy per page by re-sending each request from Node.js, such as puppeteer-page-proxy, give that advantage away. Per-context proxies keep every request inside Chrome.
Run Puppeteer on real carrier IPs
Shared rotating and dedicated 4G/5G mobile proxies with HTTP(S) and SOCKS5 authentication, sticky sessions and one-click rotation.
FAQ
Do I need a proxy for Puppeteer?
Not always. Puppeteer runs without one on pages that do not rate-limit or score traffic, and for local testing. A proxy becomes necessary when the target blocks or throttles the IP the script runs from, when content differs by country, or when several sessions must not share one address. From there the IP type follows the target: the more a site inspects where a connection comes from, the more a residential or mobile IP is worth over a datacenter one.
What are the best proxy services to use with Puppeteer?
The best proxy services for Puppeteer are the ones whose IP type fits the target. Datacenter proxies suit unprotected pages, residential pools suit broad scraping of lightly protected sites, and mobile proxies suit protected targets and logged-in sessions. Any proxy Puppeteer can authenticate against over HTTP will work. VoidMob offers shared rotating mobile proxies billed per GB and dedicated mobile proxies on a single mobile device.
Which proxy providers offer reliable IP rotation for Puppeteer scripts?
Look for a provider that offers three rotation modes: a new IP per request, sticky sessions that hold one IP for a set time, and on-demand rotation for dedicated IPs. VoidMob shared lists rotate per request, every N seconds or stay sticky, and dedicated mobile proxies rotate through a private link at most once a minute. Use per-request rotation for stateless pages and sticky sessions for anything with a login.
Are residential proxies good for Puppeteer?
Yes, for broad scraping of lightly protected sites, where they usually cost less per GB than mobile IPs. Any authenticated HTTP residential proxy works with Puppeteer. On targets with strict bot protection, or for logged-in account work, mobile carrier IPs hold up better, because they are shared with real phone users and platforms avoid blocking them outright.
What are the best proxies for web scraping with Puppeteer in the US?
US mobile or residential exits, chosen by how protected the target is. Route through IPs in the United States and make the browser agree with them: set a US timezone with page.emulateTimezone() and send an English Accept-Language header. A US IP paired with a browser that reports a European timezone is an easy mismatch for anti-bot scripts to catch.
Can proxies help Puppeteer get past anti-bot systems?
Partly. A clean mobile or residential IP removes the network reasons to block a session, such as a hosting ASN or a flagged address. Anti-bot systems also check the browser for automation signals like navigator.webdriver, and a proxy changes none of those. Passing both checks takes a clean IP, an engine-level patched browser, and human-paced requests.
Does Puppeteer support SOCKS5 proxies with authentication?
Not directly. Chrome supports no authentication methods for SOCKS5, so a socks5 proxy that needs a username and password will not connect from Puppeteer on its own. Run a local proxy-chain server with the SOCKS5 proxy as its upstream and point --proxy-server at the local address, or use the provider's HTTP endpoint with page.authenticate().
What are fast and secure proxies for Puppeteer automation?
For speed, a dedicated mobile proxy gives one script the full connection of a mobile device, and VoidMob's dedicated devices are high-speed 4G/5G connections, with Premium the faster tier. For security, use authenticated proxies only, never open public proxy lists, and load HTTPS targets: the proxy tunnels the encrypted connection, so page content stays encrypted between Chrome and the site.
Match the IP Type to the Target, Then Scale
Puppeteer proxies are chosen by target, not by price per GB. Datacenter covers what is unprotected, residential covers broad low-stakes crawling, and mobile covers protected sites and anything that logs in. Set rotation to match the flow, authenticate through page.authenticate(), trim the assets the script never reads, and treat the browser fingerprint as a separate job from the IP. Test on a small plan against the real target before scaling the run.
