Why headless browsers are a special case
Headless browsers (Chrome or Firefox running without a visible window, controlled by code) are the go-to tool for scraping JavaScript-heavy sites and automating complex workflows. They also change the proxy equation:
- They use much more bandwidth. A browser loads every image, script, font and tracking pixel.
- They hold state. Cookies, local storage and challenge tokens tie a session to an IP.
- They have rich fingerprints. The browser exposes hundreds of signals that should match the IP's location.
- Proxy settings are usually per browser or per context, not per request.
Which proxies suit headless browsers?
| Proxy type | Fit | Why |
|---|---|---|
| Rotating residential with sticky sessions | Excellent | Trusted IPs; one session per context |
| ISP (static residential) | Excellent | Fast, stable, priced per IP, so bandwidth doesn't cost extra |
| Datacenter | Good on lenient sites | Fast and cheap |
| Mobile | Excellent, costly | Strictest sites only |
Because browsers are bandwidth-heavy, ISP proxies with unlimited data can be much cheaper than per-GB residential proxies for long-running browser workloads.
Tool guides
- Puppeteer proxies, including authentication, rotation, per-page proxies and SOCKS5
- Playwright proxies
- Selenium proxies
Controlling bandwidth
Block resources you don't need. In Puppeteer:
await page.setRequestInterception(true);
page.on('request', (req) =>
['image', 'media', 'font'].includes(req.resourceType()) ? req.abort() : req.continue());In Playwright:
await context.route('**/*', (route) =>
['image', 'media', 'font'].includes(route.request().resourceType()) ? route.abort() : route.continue());Also consider blocking known analytics and ad domains. Test that blocking doesn't hurt success; some bot checks look for normal resource loading.
Matching the browser to the proxy
Set timezone, locale, Accept-Language and (if needed) geolocation to match the proxy's location. Use realistic viewports. Avoid leaking your real IP through WebRTC. See browser fingerprinting and proxies and WebRTC leaks.
Session design
- One context (or browser) per proxy session.
- Keep the same IP for the whole flow: login, navigation, checkout.
- Rotate between sessions, not within them.
- Reuse a session that passed a bot challenge for as long as it works.
See sticky vs rotating sessions.
Proxy tip: Want to skip proxy management on some targets? Geonode offers both raw proxies and a Scraper API that returns HTML or Markdown with optional JavaScript rendering. We compare the two approaches in using Geonode with headless browsers.
Browser or HTTP client?
Use a browser only when you need it:
- The data is rendered by JavaScript and not available from an API.
- The site requires passing a JavaScript challenge.
- You need to interact (click, scroll, fill forms).
Otherwise, an HTTP client is faster, cheaper and easier to scale. Often a hybrid works best: use a browser to pass the challenge and collect cookies, then reuse them in an HTTP client through the same proxy session. See web scraping proxies.
Scaling
Browsers are resource-hungry. Use pools (for example puppeteer-cluster), limit concurrency per server, recycle browsers periodically to avoid memory leaks, and monitor success rates per proxy. See Puppeteer cluster proxies.
Headless browser proxy checklist
- [ ] One proxy session per browser context
- [ ] Timezone, locale and language match the exit
- [ ] WebRTC restricted to proxied routes
- [ ] Heavy resources blocked (tested for side effects)
- [ ] Block detection on content, not just status
- [ ] Retries with fresh sessions and backoff
- [ ] Concurrency limited per target domain
- [ ] Browsers recycled periodically
- [ ] Success, latency and bytes logged per proxy
Hybrid browser + HTTP pattern
Some sites only need a browser to pass an initial challenge. After that, an HTTP client can reuse the cookies:
- Open a browser context through a sticky proxy session.
- Load the homepage and pass any challenge.
- Export cookies and the user agent.
- Use an HTTP client with the same proxy session, cookies and user agent for subsequent pages.
- Refresh via the browser when cookies expire.
This combines browser compatibility with HTTP efficiency. The same IP and user agent must be used, or the clearance will be invalid.
Comparing headless tools for proxy work
| Puppeteer | Playwright | Selenium | |
|---|---|---|---|
| Credentials in config | No (page.authenticate) | Yes | No (forwarder/whitelist) |
| Per-context proxy | Yes (recent) | Yes | No (per driver) |
| Locale/timezone per context | Page emulation | Context options | Flags/CDP |
| Browsers | Chromium (and Firefox support) | Chromium, Firefox, WebKit | All major |
See Puppeteer proxies, Playwright proxies and Selenium proxies.
Chrome's new headless mode and what it means for proxies
Chrome's headless mode was rebuilt. The old implementation, a separate lightweight browser with noticeable differences from normal Chrome, now ships separately as chrome-headless-shell. Plain --headless runs the same browser as headful Chrome, just without a window. Google's headless mode documentation explains the change.
What that means for proxy work:
- Fewer giveaways. Many fingerprint differences that used to mark headless sessions have gone, so IP quality and behaviour count for relatively more.
- Same proxy flags.
--proxy-server, bypass lists and per-context proxies work the same way in both modes. - Extensions work. New headless supports extensions, which reopens extension-based proxy setups for headless runs, though a forwarder is usually simpler.
- More resources. A full browser uses more memory and CPU than the old shell, which affects how many sessions each server can run. Re-measure capacity after switching.
- Old shell for lightweight jobs.
chrome-headless-shellstill suits simple rendering at high volume where fingerprint fidelity doesn't matter.
Test both against your actual targets; the right choice depends on what the site checks. For framework specifics, see Puppeteer proxies, Playwright proxies and Selenium proxies. For capacity planning with many browsers, see puppeteer-cluster proxies.
Key takeaways
- Headless browsers use far more bandwidth than HTTP clients, which makes per-GB proxies expensive without resource blocking.
- Sticky residential and ISP proxies fit browser sessions best.
- Use one proxy session per context and rotate between sessions, not within them.
- Align timezone, locale and WebRTC behaviour with the proxy.
- Use browsers only where needed; hybrid browser-plus-HTTP setups combine compatibility with efficiency. See puppeteer proxies.
FAQ
Do headless browsers need residential proxies?
On protected sites, usually. On lenient sites, datacenter works.
Why is my proxy bill so high with Puppeteer?
Browsers download everything. Block images, fonts and trackers, or switch to ISP proxies with unlimited bandwidth.
Is headless mode detectable?
It can be. Newer headless Chrome is close to headful, but detection still happens. See Puppeteer stealth and proxies.
Editorial note: Proxy providers change their pools, features and prices often, so treat any figures here as typical ranges at the time of writing and confirm current terms with the provider before you buy.