When people start scraping at scale, the first fix they reach for is IP rotation: cycle through a pool of addresses so no single IP sends too many requests. That instinct is correct, but the naive version โ grab a fresh IP for every single request โ often makes things worse, not better. Effective rotation is about matching human-like patterns, not maximizing IP churn.
This article covers when to rotate, how fast, and the mistakes that get otherwise-good scrapers blocked.
Why rotate at all
Websites detect scraping largely by counting: how many requests came from one IP, how fast, and in what pattern. A single IP making hundreds of requests a minute is unmistakably automated. Spreading that load across many IPs keeps each individual address under the radar and below rate limits.
But the goal is not "look like many IPs" โ it is "look like many normal users." A real user browses from one IP for a while, then goes away. Understanding that distinction is what separates rotation that works from rotation that trips alarms.
Rotation strategies
- Per-request rotation: a new IP for every request. Maximum spread, but it is unnatural for sequential page loads and breaks anything that relies on a session (login, cart, pagination cookies).
- Per-session rotation: hold one IP for a logical session โ a login, a sequence of related pages โ then rotate. This mirrors real browsing and is the right default for most crawls.
- Time-based (sticky) rotation: keep an IP for a fixed window (say 5โ10 minutes), then move on. Useful when a task naturally spans a stretch of time.
- Rotate-on-failure: keep an IP while it works, and only switch when you hit a block, CAPTCHA, or error. Efficient, but pair it with a cap so one bad IP cannot stall a worker.
Getting the pace right
The most common mistake is rotating every request against a target that expects sessions. If you load page 2 of a search from a different IP than page 1, you have told the site that "one user" teleported across the country between clicks โ a strong bot signal. For anything stateful, keep the same IP for the whole session.
Equally, do not hammer a single IP just because rotation feels wasteful. Add realistic delays between requests, randomize them slightly, and cap the requests-per-IP so no address stands out. The rhythm you want is many IPs each doing a modest, human amount of work.
Match rotation to proxy type
Rotating residential and mobile pools are built for per-session or time-based rotation โ the pool hands you a fresh consumer IP whenever you ask. Static ISP proxies are the opposite: you hold one IP deliberately, which is what you want for logged-in, long-lived tasks where changing IPs would itself look suspicious.
So the rotation question and the proxy-type question are linked. Decide whether your task is stateless (rotate freely) or stateful (hold the IP), then pick the proxy type that supports that pattern.
Beyond the IP
Rotation alone will not save a scraper that is careless elsewhere. Anti-bot systems also look at request headers, TLS fingerprints, cookie behavior, and timing. If every request uses an identical, obviously-automated user agent, changing the IP will not help much.
Pair IP rotation with a consistent-but-plausible set of headers, respect for robots and rate limits, backoff when you see 429s, and sensible concurrency. IP rotation is one layer of a good scraper, not the whole thing.
A sensible default
If you are unsure where to start: use a rotating residential pool with per-session rotation, add randomized delays of a second or more between requests, cap each IP to a few dozen requests, and rotate on any block. Monitor your success rate and only tighten or loosen from there based on what the target actually does.
The ClickIP dashboard lets you configure sticky sessions and rotation behavior per order, so you can tune the rhythm without changing your code.
Ready to try ClickIP?
Mobile, residential, ISP, IPv4/6 proxies in 100+ countries.