Every proxy request answers one question: should this come from the same IP as the last one, or a different one? Get it wrong and you either get flagged for an account that hops between countries mid-login, or you crawl ten thousand pages from one IP until it's blocked. On crawlproxies the answer is a few characters in your username.
Rotating: a new IP on every connection
If your username has no session in it, you're rotating:
USERNAME-country-usEvery new connection through the gateway gets a different IP from the pool. Rotating is the right default for work where each request stands on its own:
- crawling product pages, search results or listings
- price and availability checks
- SEO rank tracking and ad verification
- anything you'd happily run from a thousand different machines
Rotation is per connection, not per request. Most HTTP clients keep a connection open and send several requests over it, and those requests share the connection's IP. If you need a fresh IP every single time, open a new connection per request. Our Python and Node.js guides show how.
Sticky: one IP for as long as you need
Add a session id to the username and the gateway keeps routing you through the same IP:
USERNAME-country-us-session-cart42-time-1800-session-cart42names the session. Any letters and numbers you like; reuse the same id to keep the same IP.-time-1800is how long to hold the IP, in seconds (here, 30 minutes). In the generator you pick the length in minutes, up to 2 hours on Residential.
Use sticky sessions whenever a website expects one visitor to stay put:
- logging in and staying logged in
- carts, checkouts and multi-step forms
- managing social or marketplace accounts
- anything with a session cookie tied to your IP
Changing IP between "enter password" and "enter code" looks exactly like an account takeover, and sites treat it that way.
Side by side
| Rotating | Sticky | |
|---|---|---|
| Username | USERNAME-country-us | USERNAME-country-us-session-ID-time-1800 |
| IP changes | Every new connection | When you change the session id, or the time runs out |
| Best for | Crawling, monitoring, high volume | Logins, accounts, checkouts |
| Blocking risk | Spread across many IPs | Concentrated on one IP: pace yourself |
| Typical pattern | Many workers, one username | One session id per account or task |
Patterns that work
One session per account. Derive the session id from the account so the same account always comes back to the same session while it's alive:
def proxy_for_account(account_id: str) -> str:
user = f"USERNAME-country-us-session-acct{account_id}-time-3600"
return f"http://{user}:PASSWORD@geo.crawlproxies.com:8080"One session per job. For a multi-step job (search, open result, add to cart, check out), create a new session id when the job starts and drop it when it ends:
import uuid
job_session = uuid.uuid4().hex[:10]
proxy = f"http://USERNAME-country-us-session-{job_session}-time-900:PASSWORD@geo.crawlproxies.com:8080"Rotate the session when you're blocked. If a sticky IP starts returning 403s or CAPTCHAs, switch to a new session id rather than retrying the same one: you get a clean IP and keep everything else.
Things to plan for
- Residential IPs are real devices. Phones go to sleep and routers restart. A sticky IP can disappear before your timer runs out. If the IP changes mid-session, re-check your login state instead of assuming it held.
- Keep sessions as short as the task. A 2-hour session for a 2-minute job just ties one IP to more of your traffic than necessary.
- Don't share a session between unrelated accounts. Two accounts on one IP is a classic linking signal.
- Pace sticky traffic. All of a session's requests come from one IP, so the site sees one very busy visitor. Add delays like a person would.
Which products support sessions?
Sticky sessions work on every product except Dedicated ISP. The generator shows the session option for your plan and the longest duration it allows. Dedicated ISP works differently: each proxy line is its own static IP, so there's nothing to make sticky. Every request on that line already uses the same IP.
Ready to try both? Open the generator, switch the session type, and compare the IPs with curl -x ... https://ipinfo.io/ip.



