Skip to main content
Even with residential ISP proxies, some requests may be blocked by target websites. This guide covers why blocks happen and how to handle them.

Why requests get blocked

Target websites use various detection methods:
Detection MethodWhat It Checks
Rate limitingToo many requests from one IP in a short period
Header fingerprintingMissing or suspicious HTTP headers
TLS fingerprintingBrowser-like vs bot-like TLS handshake
Behavioral analysisNon-human navigation patterns
Captcha challengesInteractive verification to prove you’re human

How to avoid blocks

1. Add realistic headers

Always include common browser headers:
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
    "Accept-Language": "en-US,en;q=0.9",
    "Accept-Encoding": "gzip, deflate, br",
}

response = requests.get(url, proxies=proxies, headers=headers)

2. Rotate your proxy IPs

Distribute requests across your proxy pool:
import random

proxy_list = [
    "http://user:pass@ip1:3128",
    "http://user:pass@ip2:3128",
    "http://user:pass@ip3:3128",
]

proxy = random.choice(proxy_list)

3. Add delays between requests

Avoid machine-speed request patterns:
import time
import random

time.sleep(random.uniform(1, 3))  # 1-3 second random delay

4. Use a headless browser

For JavaScript-heavy sites with advanced detection, use Puppeteer or Playwright instead of raw HTTP requests:
const browser = await puppeteer.launch({
  args: ['--proxy-server=http://192.168.1.1:3128']
});
See our Puppeteer guide for full setup.

5. Handle retries gracefully

import time

def fetch_with_retry(url, proxies, max_retries=3):
    for attempt in range(max_retries):
        try:
            response = requests.get(url, proxies=proxies, timeout=15)
            if response.status_code == 200:
                return response
            if response.status_code == 429:  # Rate limited
                time.sleep(5 * (attempt + 1))
                continue
        except requests.exceptions.RequestException:
            time.sleep(2)
    return None

Status codes to watch for

CodeMeaningAction
403ForbiddenRotate IP, add headers, add delays
429Too Many RequestsBack off, reduce request rate
503Service UnavailableTarget may be under load, retry later
407Proxy Auth RequiredCheck your credentials
Stat Proxies uses residential ISP IPs, which have a significantly lower block rate than datacenter IPs. If you’re still getting blocked frequently, the issue is usually request patterns, not the proxy itself.

Connection Errors

Fix proxy connectivity issues

Slow Performance

Optimize request speed