An active CleanProxies plan
Static ISP proxies for fixed US IPs, or rotating residential / mobile proxies for pools. The $4.99 trial works too.
Create new ProxyConfiguration({ proxyUrls: ["http://USERNAME:PASSWORD@HOST:PORT"] }) and pass it as proxyConfiguration to CheerioCrawler, PlaywrightCrawler or any other Crawlee crawler. With the session pool on (the default), Crawlee pairs each session with one URL from the list.
Crawlee handles request queues, retries, sessions and block detection for both plain HTTP and headless-browser crawls, and every crawler takes the same proxy object. You can start on one rotating residential line, then move to sticky lists or a tiered setup without touching your request handlers.
Static ISP proxies for fixed US IPs, or rotating residential / mobile proxies for pools. The $4.99 trial works too.
From the dashboard's proxy manager: host (or IP), port, username and password. Convert lists with the proxy list formatter.
npm install crawlee (or npx crawlee create my-crawler).npm install playwright and npx playwright install chromium.Both products use the same setup in Crawlee. What changes is how long an IP stays with you.
With a single rotating line in proxyUrls, every session shares the gateway and each new connection gets a fresh IP from the 50M+ pool, even inside one session. Pass a sticky list (5 to 60 minutes or 24 hours) instead when a session's cookies must stay on one IP.
Residential IPs in 190+ countries with country, state and city targeting. Rotate on every request or hold a sticky session for up to 90 minutes; GB never expire.
Each ISP URL in proxyUrls is one dedicated US IP, and Crawlee keeps a session on the same URL for its whole life, so a session's cookies always travel with the same IP. With unlimited bandwidth, ISP lines suit daily crawls of the same sites.
Dedicated static IPs registered to US and Canadian ISPs. The address stays the same for as long as you hold it, with unlimited bandwidth and HTTP(S) or SOCKS5 access.
Every product connects over HTTP(S); static ISP and ISP subnet proxies also run SOCKS5 and IP whitelisting. This is what the dashboard gives you to paste into Crawlee.
IP:PORT:USER:PASSOne line per dedicated IP. With IP whitelisting on, the line is just IP:PORT and no password is sent.
HOST:PORT:USER:PASSGenerated in the proxy manager. The username carries the location and session you pick, so generate a new list to change them.
http://USERNAME:PASSWORD@HOST:PORTsocks5://USERNAME:PASSWORD@HOST:PORTUse http:// even for HTTPS websites; the TLS session still runs end to end. The socks5:// form is for static ISP and ISP subnet proxies.
Four steps, then check the exit IP with the free proxy checker.
Run npm install crawlee, plus Playwright if you crawl with a real browser.
Put one or more http://USERNAME:PASSWORD@HOST:PORT URLs in proxyUrls.
Add proxyConfiguration to the crawler options and leave useSessionPool and persistCookiesPerSession on.
Crawl https://api.ipify.org?format=json once and log json.ip in the request handler.
Replace the highlighted placeholders with the values from your dashboard. Pick an example to see its code.
import { CheerioCrawler, ProxyConfiguration } from "crawlee";
const proxyConfiguration = new ProxyConfiguration({
proxyUrls: ["http://USERNAME:PASSWORD@HOST:PORT"],
});
const crawler = new CheerioCrawler({
proxyConfiguration,
maxConcurrency: 20,
async requestHandler({ request, json, $, log }) {
if (json) log.info("Exit IP: " + json.ip);
else log.info(request.url + ": " + $("title").text());
},
});
await crawler.run(["https://api.ipify.org?format=json"]);proxyInfo in the request handler tells you which proxy a request used. Log proxyInfo.hostname rather than proxyInfo.url, which contains the password.Crawlee binds every session to one URL from proxyUrls, round-robin. Generate a sticky residential list in the dashboard and pass all of its lines: each session then keeps its own IP and its own cookies, and a session retired after a block moves on to the next line.
import { PlaywrightCrawler, ProxyConfiguration } from "crawlee";
import { readFileSync } from "node:fs";
// one sticky line per row: http://USERNAME:PASSWORD@HOST:PORT
const proxyUrls = readFileSync("sticky.txt", "utf8").split("\n").filter(Boolean);
const crawler = new PlaywrightCrawler({
proxyConfiguration: new ProxyConfiguration({ proxyUrls }),
useSessionPool: true,
persistCookiesPerSession: true,
sessionPoolOptions: { maxPoolSize: proxyUrls.length },
async requestHandler({ page, session, log }) {
log.info("session " + session?.id + ": " + (await page.title()));
},
});
await crawler.run(["https://example.com"]);sessionPoolOptions.blockedStatusCodes.tieredProxyUrls takes groups of URLs. Crawlee starts each domain on the first tier, moves up a tier when it detects blocking there and probes the lower tier again later. Convert your ISP export to URL format with the proxy list formatter.
import { CheerioCrawler, ProxyConfiguration } from "crawlee";
import { readFileSync } from "node:fs";
const ispUrls = readFileSync("isp.txt", "utf8").split("\n").filter(Boolean);
const proxyConfiguration = new ProxyConfiguration({
tieredProxyUrls: [
ispUrls, // tier 0: static ISP lines
["http://USERNAME:PASSWORD@HOST:PORT"], // tier 1: rotating residential
],
});
const crawler = new CheerioCrawler({
proxyConfiguration,
async requestHandler({ request, $ }) {
console.log(request.url, $("title").text());
},
});proxyConfiguration.newUrl() yourself.Run node crawler.mjs. The log line Exit IP: … should show a residential IP in the country you generated, not your server's address.
Open What is my IP? through the proxy to see the address and headers a website receives, or paste up to ten lines into the free proxy checker to test connectivity, latency and exit IP.
Still stuck? Our 24/7 support team answers fast: contact us with the error and the line you used (leave the password out).
@ or : in the password breaking the URL.Copy the line again and percent-encode special characters in the password.maxConcurrency, use PlaywrightCrawler for protected sites, and add residential IPs as a second tier.proxyConfiguration wasn't passed to the crawler, or a null entry is in the URL list.Pass the object as proxyConfiguration and remove empty or null entries (Crawlee treats null as "no proxy").Setup guides and best practices from the CleanProxies blog.
Setup guides for tools people run next to Crawlee.
meta['proxy'] with credentials, a rotation middleware for ISP lists and crawl settings that avoid bans.
Setup guideLaunch and per-context proxies in Node.js and Python, credential fields and SOCKS5 limits.
Setup guide--proxy-server with page.authenticate, per-context proxies, SOCKS5 limits and leak fixes.
Setup guideCustom proxy URLs in Actor input, createProxyConfiguration with proxyUrls, and an exit IP check.
Setup guideStraight answers about running CleanProxies in Crawlee.
Crawlee hands out the URLs in proxyUrls round-robin and remembers which URL each session got. A session keeps its proxy until it is retired, then the replacement session takes the next URL.