> ## Documentation Index
> Fetch the complete documentation index at: https://docs.statproxies.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Blocked Requests

> Why proxy requests fail and how to fix them.

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 Method      | What It Checks                                  |
| --------------------- | ----------------------------------------------- |
| Rate limiting         | Too many requests from one IP in a short period |
| Header fingerprinting | Missing or suspicious HTTP headers              |
| TLS fingerprinting    | Browser-like vs bot-like TLS handshake          |
| Behavioral analysis   | Non-human navigation patterns                   |
| Captcha challenges    | Interactive verification to prove you're human  |

## How to avoid blocks

### 1. Add realistic headers

Always include common browser headers:

```python theme={null}
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:

```python theme={null}
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:

```python theme={null}
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:

```javascript theme={null}
const browser = await puppeteer.launch({
  args: ['--proxy-server=http://192.168.1.1:3128']
});
```

See our [Puppeteer guide](/articles/puppeteer) for full setup.

### 5. Handle retries gracefully

```python theme={null}
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

| Code | Meaning             | Action                                |
| ---- | ------------------- | ------------------------------------- |
| 403  | Forbidden           | Rotate IP, add headers, add delays    |
| 429  | Too Many Requests   | Back off, reduce request rate         |
| 503  | Service Unavailable | Target may be under load, retry later |
| 407  | Proxy Auth Required | Check your credentials                |

<Info>
  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.
</Info>

## Related

<CardGroup cols={2}>
  <Card title="Connection Errors" icon="circle-exclamation" href="/articles/connection-errors">
    Fix proxy connectivity issues
  </Card>

  <Card title="Slow Performance" icon="gauge" href="/articles/slow-performance">
    Optimize request speed
  </Card>
</CardGroup>
