IP reputation is the score a bot-detection system gives an address before it reads the request: the network type, the address's history, and how many sessions it has served. Rate limits on protected sites are rarely a fixed number per minute. They are velocity models that count requests per session, per fingerprint and per token.
TL;DR
- Vendors score the network before they score the request: the autonomous system, the IP's history, and how many distinct sessions it has produced recently.
- Datacenter ranges start with a penalty. Residential ISPs start neutral. Mobile carrier ranges start with a bonus because thousands of real people share one address behind carrier NAT.
- Rate limits are rarely a fixed number per minute. They are velocity models: requests per session, sessions per IP, pages per token, and the shape of the request sequence.
- Rotating IPs per request is itself a signal when the fingerprint and cookies stay constant. Consistency across layers applies to the network layer too.
- The ethical sourcing of residential proxies varies widely. Know what you are paying for. Enforcement since 2024 has targeted botnet-sourced pools (the 911 S5 takedown covered about 19 million addresses), and in October 2025 Reddit sued Perplexity together with three scraping and proxy providers, so provenance is now a buyer's legal question too.
- A residential exit fixes geography and ASN only. A May 2026 benchmark from a residential IP found that a Linux host still shows Linux-shaped TLS, HTTP/2 and JavaScript signals through the proxy.
How an address is scored
flowchart TB
accTitle: How an IP address is scored
accDescr: The network class sets a starting penalty, neutral score or bonus, then history, threat feeds, velocity keys and request sequence adjust it into a final score.
IP[Source IP] --> C{ASN class}
C -->|datacenter| P1[prior: penalty]
C -->|residential ISP| P2[prior: neutral]
C -->|mobile carrier, CGNAT| P3[prior: bonus]
P1 & P2 & P3 --> H[History: fingerprints seen,<br/>tokens issued, challenges failed]
H --> TI[Threat feeds: proxy exits, Tor, VPN ranges]
TI --> V[Velocity keys: per IP, per session,<br/>per fingerprint, per token]
V --> Q[Sequence shape and concurrency]
Q --> S{{score}}
class C violet
class P1 bad
class P2 soft
class P3 ok
class S key
Slowing down touches one box near the bottom. The class, history and feed boxes above it were decided before your first request arrived.
Three classes of address
Datacenter. Allocated to hosting providers and clouds. The ASN is public. Any request from these ranges is more likely to be automated than human, and the prior reflects it. Some vendors block them outright for consumer sites; most add a score penalty and serve challenges more readily.
Residential. Allocated to consumer ISPs. The prior is neutral. These addresses are obtained by proxy providers through SDKs embedded in free apps, through paid opt-in programs, or through arrangements with ISPs. The quality differs: an address that has served a thousand scraping sessions in a week has a history, and vendors keep that history.
Mobile. Allocated to carriers. Carrier-grade NAT puts hundreds or thousands of subscribers behind one public IPv4 address. Blocking it blocks all of them, so vendors apply a much higher threshold. This is why mobile proxies cost the most.
History and sharing
Beyond the class, vendors keep per-IP state: how many fingerprints have been seen from it, how many tokens were issued, how many were later flagged, how many challenges failed. An address that produced fifty distinct Chrome fingerprints in an hour is a proxy exit, whatever its ASN says. Providers that resell the same residential pool to many customers produce exactly this pattern, and the pool degrades for everyone.
Threat intelligence feeds add another layer: known proxy exit lists, Tor nodes, VPN ranges and addresses observed in credential stuffing. These are shared across vendors and update hourly.
Velocity, not rate
The naive model of a rate limit is "N requests per minute per IP". Real systems measure velocity across several keys:
- Requests per session token, and the ratio of page views to resource loads. Browsers load images, CSS and scripts; a client that fetches only HTML has a ratio of 1:0.
- Sessions per IP per hour, and distinct fingerprints per IP.
- Pages per minute within a session compared with the human distribution for that site. A product page every two seconds for an hour is not a shopper.
- Sequence shape. Humans arrive at a listing, open a few items, go back, filter, and leave. Scrapers walk every page of every category in order. The transition graph is a feature.
- Concurrency. Several open connections from one session fetching different categories at once has no human equivalent.
Slowing a scraper to one page every five seconds fixes only the third bullet.
Rotation as a signal
Rotating the exit address on every request seems to defeat per-IP velocity, and it does, at the cost of creating a new contradiction: the same fingerprint and the same cookies now arrive from a hundred addresses in a hundred cities within minutes. Vendors key velocity on the fingerprint hash as well as the IP, and they flag a session whose address changes country between requests.
The configuration that looks like a person is sticky: one address per session for the session's lifetime, a session that lasts about as long as a human visit, and a fingerprint that stays constant within the session and changes with the address between sessions.
Demonstration: measure a site's velocity model
Without triggering a block, you can estimate how a site counts. Against a site you have permission to test (your own staging environment, or a public practice site such as books.toscrape.com which has no protection, as a control), run a controlled ramp and log status codes:
import time, requests, statistics
URL = "https://example.test/listing?page={}" # a site you are allowed to test
s = requests.Session()
s.headers["User-Agent"] = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36"
for delay in (5, 2, 1, 0.5, 0.25):
codes, latencies = [], []
for page in range(1, 21):
t0 = time.time()
r = s.get(URL.format(page))
latencies.append(time.time() - t0)
codes.append(r.status_code)
time.sleep(delay)
print(f"delay={delay}s codes={sorted(set(codes))} "
f"p50={statistics.median(latencies):.2f}s max={max(latencies):.2f}s "
f"retry_after={r.headers.get('Retry-After')}")
Read the output for three things. The delay at which the first 429 or 403 appears is the per-session velocity threshold. A rising median latency before any error is a soft limit, where the site deprioritizes you first.
A Retry-After header tells you the window length. Run it again from a second IP with the same session cookies: if the limit arrives sooner, the site keys on the session, not the address. Run it with a fresh session per request from one IP: if the limit arrives sooner, it keys on the address.
On the unprotected control site every row shows [200] with flat latency, which confirms the harness itself is not the bottleneck.
Read more: choosing a proxy class for a job
| Job | Address class | Session policy |
|---|---|---|
| Public data, no bot management, high volume | datacenter | rotate freely, respect robots and rate |
| Consumer site with bot management, moderate volume | residential, sticky | one IP per session, sessions of 10 to 30 minutes, matching timezone and locale |
| Logged-in or high-value endpoints | mobile or the user's own connection | one identity per account, never share across accounts |
| One-off research at human pace | your own IP in your own browser | no proxy at all; the honest option is also the best scoring one |
The last row is the operating model of in-browser tools, and it is worth noting that an individual on a home connection has a better reputation score than any proxy they can buy.
A fifth row appeared in 2025: declare yourself. Web Bot Auth lets an automated client sign requests with a published key, and Cloudflare, DataDome and others admit signed agents by policy instead of by reputation score. For crawlers that have a legitimate reason to be identified (research, search, a user-directed agent), it replaces the proxy question entirely. The anti-bot client script post covers the mechanism.
Read more: provenance of residential pools
Residential proxy providers obtain addresses in four ways: SDKs in free mobile apps and browser extensions where the user consented in a terms screen, explicit paid opt-in programs where the device owner is compensated, partnerships with ISPs, and in the worst cases malware. The first category is the largest and the consent is often nominal. Before buying, ask the provider for their sourcing policy and whether they publish an abuse contact and an opt-out. Vendors on the detection side maintain lists of pools with poor provenance, so the cheap pool is also the one most likely to be pre-flagged.
The legal picture as of October 2026: the 2024 takedown of the 911 S5 botnet, which sold access through roughly 19 million compromised addresses, set the pattern that enforcement targets how the pool was built, not proxying as such. The hiQ and Meta v. Bright Data decisions left scraping of public, logged-out data defensible in the United States but did nothing about contract and terms claims.
Reddit's October 2025 suit names Perplexity along with SerpApi, Oxylabs and AWMProxy, and its amended complaint in February 2026 added allegations about scraping Google search results; it is pending, not decided. Compliance guides now treat continuing to route through residential IPs after an explicit block as evidence of unauthorized access. None of this is legal advice; it is the state of the docket.
Frequently asked questions
Why are datacenter IPs blocked more often?
Datacenter address ranges belong to hosting providers, and traffic from them is far more likely to be automated, so many systems start those requests with a penalty or block them outright on consumer sites. Residential addresses start neutral, and mobile carrier addresses start with a bonus.
Are mobile proxies better than residential proxies?
For bot scores, usually yes. Mobile carriers put many subscribers behind one public address, so blocking it would block real people, and vendors set higher thresholds. Mobile proxies also cost the most, and sourcing practices vary between providers.
Should I rotate proxies on every request?
Usually not. When the same fingerprint and cookies arrive from many addresses within minutes, vendors flag the session. One sticky address per session, with the session lasting about as long as a real visit, looks more like a person.
Does slowing down a scraper avoid rate limits?
Only partly. Slower requests fix pages per minute, but velocity models also count sessions per IP, fingerprints per IP, the ratio of pages to resources, crawl order and concurrency, and none of those change when you add a delay.