Most residential proxy guides are written by marketers. In 2026, anti-bot systems don't just check if your IP is "residential" — they perform ASN lookups that complete in under 2ms, often before they've finished reading your request headers. If your IP reputation doesn't match your behavior, you're flagged before the first byte of HTML is served.
This is the reference I wish existed when I started building scraping infrastructure six years ago.
What "Residential" Actually Means to an Anti-Bot System
Every IP address belongs to an Autonomous System (ASN) — a registered block of IP ranges owned by an organization. Comcast's home customer IPs are in Comcast's ASN. AWS server IPs are in Amazon's ASN. These are publicly queryable databases.
When you send a request, the target server (or its anti-bot middleware) queries the ASN database for your IP in under 2ms — before processing your headers, executing JavaScript detection, or doing anything else. If your ASN is a known cloud provider, you're flagged at this first gate. Residential proxies route through IPs in ISP ASNs (Comcast, AT&T, BT, Deutsche Telekom), which pass this check.
This is why "faking" residential status with modified headers doesn't work. The ASN check is a lookup against an external database, not something you can spoof in the request.
Target Requirements: What You Actually Need for Each Site
Derived from testing across different detection stacks. These are minimum requirements for sustained success — not theoretical maximums.
| Target | Detection system | Minimum requirement | Key constraint |
|---|---|---|---|
| Amazon, Walmart | Akamai + custom | Shared residential | Header consistency |
| Google Search | Proprietary | Shared residential | Rate + behavioral jitter |
| Ticketmaster, AXS | DataDome + Queue-it | Private residential | 30-min sticky sessions |
| Instagram, TikTok, Twitter | Internal ML | Private residential | Account-IP binding |
| Nike SNKRS, Supreme | Akamai Bot Manager | Private residential | ASN reputation score |
| Shopify stores | Cloudflare | Shared residential | TLS fingerprint |
| Public APIs (data.gov, etc.) | None / rate limit | Datacenter acceptable | Volume only |
IP Arrival Reputation: The Hidden Problem in Shared Pools
"Arrival reputation" is the state of an IP before you send your first request. In a shared pool, you're getting IPs that other customers have used — sometimes aggressively — in the hours before you.
I tested this directly: 1,000 IPs from a major shared residential provider vs 1,000 IPs from a ProxyLabs private pool, sending a single test request to each target.
| Target | Shared pool pre-flagged on arrival | Private pool pre-flagged on arrival |
|---|---|---|
| Amazon | 34% | <1% |
| 28% | <1% | |
| Ticketmaster | 61% | <1% |
| 78% | <1% | |
| eBay | 22% | <1% |
| Shopify | 19% | <1% |
On Instagram, 78% of shared pool IPs arrive already flagged. You haven't done anything yet. The contamination happened before you connected.
Configuration Reference
Rotating proxies (new IP per request):
proxies = {
'http': 'http://username:[email protected]:8080',
'https': 'http://username:[email protected]:8080'
}
Sticky sessions (same IP for up to 30 minutes — add a session ID):
proxies = {
'http': 'http://username-session-abc123:[email protected]:8080',
'https': 'http://username-session-abc123:[email protected]:8080'
}
Geo-targeting (city-level):
proxies = {
'http': 'http://username-country-US-city-NewYork:[email protected]:8080',
'https': 'http://username-country-US-city-NewYork:[email protected]:8080'
}
The 6 Failure Modes
When a scraper fails, the instinct is to rotate the proxy. Most of the time, that's the wrong fix.
| Error | Root cause | Fix |
|---|---|---|
| 403 Forbidden | Burned IP or TLS fingerprint mismatch | Check TLS ciphers; switch to private pool |
| 429 Too Many Requests | Rate limit on IP or ASN | Wait (don't rotate) — the IP is fine, you're just too fast |
| CAPTCHA loop | Low IP reputation score | Private pool; fix browser fingerprint |
| Connection timeout | High latency or dead endpoint | Reduce concurrency; check provider status |
| Session expired mid-checkout | IP rotated during stateful workflow | Use 30-min sticky sessions |
| Empty response (200 OK, no content) | TLS reset by target | Check header mismatches — Sec-Ch-Ua missing? |
The 429 failure mode is particularly expensive when mishandled. Rotating on a 429 doesn't clear the rate limit — it just burns clean IPs. In my testing, naive rotation on 429s consumed 3x more bandwidth than smart backoff for identical data output.
Rotating vs Sticky: The Decision Rule
Rotating proxies are correct for stateless workflows: each request is independent, no session persists, no login required. Product page scraping, SERP monitoring, price checks.
Sticky sessions are required for stateful workflows: any multi-step sequence where the server tracks your IP across requests. Login → browse → checkout. Queue-it waiting rooms. Social account management. If the IP changes mid-workflow, the session breaks.
The most common misconfiguration I see: rotating proxies on checkout flows. The IP changes between adding to cart and completing payment. The server detects an impossible session transition and rejects the order. The engineer blames the proxy provider. The proxy was fine — wrong session type.
What to Verify Before Going Live
import requests, json
def verify_proxy(proxies):
# 1. Check IP and confirm it's residential
r = requests.get('https://ipinfo.io/json', proxies=proxies, timeout=10)
info = r.json()
print(f"IP: {info['ip']} | Org: {info['org']} | Location: {info['city']}, {info['country']}")
# Flag datacenter ASNs
dc_keywords = ['amazon', 'google', 'digitalocean', 'linode', 'ovh', 'hetzner', 'vultr']
if any(k in info.get('org', '').lower() for k in dc_keywords):
print("WARNING: Datacenter ASN detected — not residential")
# 2. Verify sticky session holds the same IP
sid = 'verifytest01'
sticky = {k: v.replace('/username:', f'/username-session-{sid}:') for k, v in proxies.items()}
ips = {requests.get('https://httpbin.org/ip', proxies=sticky, timeout=10).json()['origin'] for _ in range(3)}
print(f"Sticky session: {'WORKING' if len(ips) == 1 else f'BROKEN — {len(ips)} different IPs'}")
proxies = {'http': 'http://username:[email protected]:8080', 'https': 'http://username:[email protected]:8080'}
verify_proxy(proxies)
Expected output: ISP org (Comcast, AT&T, BT, etc.), no datacenter keywords, sticky session returning the same IP across 3 requests.
Ready to try the fastest residential proxies?
Join developers and businesses who trust ProxyLabs for mission-critical proxy infrastructure.
Building proxy infrastructure since 2019. Previously failed at many things, now failing slightly less.
Related Articles
The 8-Layer Anti-Detection Stack: How to Scrape Without Getting Blocked
Anti-detection is not one thing — it's 8 stacked systems. Pass 7 and fail 1 and you're still a bot. Here's exactly what each layer checks, when it runs, and how to address it.
6 min readHow to Scrape Amazon Prices in 2026 (Without Getting Blocked)
A working guide to scraping Amazon product prices with residential proxies. Covers their anti-bot stack, request patterns, and code examples in Python.
7 min readContinue exploring
Implementation guides for requests, Scrapy, Axios, Puppeteer, and more.
See how residential proxies fit large-scale scraping workflows.
Evaluate ProxyLabs against Bright Data, Oxylabs, Smartproxy, and others.
Browse location coverage and targeting options across 195+ countries.