# Read timed out through a proxy: causes and sensible timeouts

> Read timed out through a residential proxy: why it happens, sensible connect and read timeouts for scrapers, and how to retry without piling up.

- URL: https://crawlrelay.com/docs/errors/read-timeout/
- Last updated: 2026-10-13
- Publisher: CrawlRelay (https://crawlrelay.com)

Client timeout error: the exact message in each tool, the likely causes in order, and the fix that works.

**Quick answer — What does Read timed out (ReadTimeout) mean with a proxy?**

**Read timed out** means your client waited longer than its read timeout for the next bytes of the response. Through CrawlRelay residential proxies, the delay usually comes from a slow target or a slow home exit. Set separate connect and read timeouts, about 10 and 30 to 60 seconds for HTML pages, and retry a timed-out request once on a new exit.

## Read timed out (ReadTimeout) at a glance

| Attribute | Value |
| --- | --- |
| Error | Read timed out (ReadTimeout) |
| Type | Client timeout error |
| Sent by | Your HTTP client, when no data arrived within the read timeout |
| Defined in | Client setting, no protocol status |
| Retry it? | Yes, once or twice on a new exit |
| First check | Compare your read timeout with the target's normal response time |

## What does Read timed out (ReadTimeout) mean?

Clients usually have two timers. The connect timeout limits how long the client waits to open the connection to the proxy. The read timeout limits how long it waits between bytes once the request is sent. A read timeout therefore means the connection worked but the answer was too slow.

Without explicit timeouts, some clients wait forever. In Python requests, no timeout is the default, so a single stuck request can freeze a worker.

## What does a read timeout look like in Python, curl, Node.js and browsers?

The same failure prints differently in every tool. These are the messages to search your logs for:

- **Python requests:** `ReadTimeout: HTTPSConnectionPool(...): Read timed out. (read timeout=10)`
- **httpx:** `httpx.ReadTimeout`
- **Node.js:** `ETIMEDOUT`, `ESOCKETTIMEDOUT`, or an `AbortError` from your own timer
- **Playwright:** `TimeoutError: page.goto: Timeout 30000ms exceeded`

## What causes a read timeout?

Most likely first:

- **A slow target page**, such as search results or heavy dynamic pages.
- **A slow exit**: home upload speed, Wi-Fi or a busy mobile cell.
- **Large downloads** read in one block instead of streamed.
- **Timeouts set too tight** for the page type.
- **Browser pages** that wait for network idle on sites that never stop loading trackers.

## How do I diagnose a read timeout step by step?

1. Time the request without the proxy to get a baseline.
2. Log time to first byte and total time separately.
3. Check response sizes for the slow URLs.
4. In browsers, check which `waitUntil` condition you use.

*Test the failing URL with curl (HTTP port, verbose)*

```bash
# Use the URL that fails; with https://api.ipify.org instead, you test the gateway alone.
# "HTTP/1.1 200 Connection established" first, then the site's own status: the site answered.
curl -v -x http://USERNAME:PASSWORD@gw.crawlrelay.com:7777 https://TARGET_URL

# Same test through the SOCKS5 port, with DNS resolved at the exit
curl -v --socks5-hostname gw.crawlrelay.com:7778 --proxy-user USERNAME:PASSWORD https://TARGET_URL
```

## How do I fix a read timeout?

- **Set both timeouts**: connect about 10 seconds, read 30 to 60 seconds for HTML, more for large files.
- **Stream big responses** and write them to disk in chunks.
- **Use `domcontentloaded`** instead of network idle in Playwright when you only need the HTML.
- **Block heavy resources** you do not need in browsers, such as video.
- **Retry once on a new exit**, then move the URL to a slow queue.

*Python httpx: explicit connect, read, write and pool timeouts*

```python
import httpx

proxy = "http://USERNAME:PASSWORD@gw.crawlrelay.com:7777"
timeout = httpx.Timeout(connect=10.0, read=30.0, write=10.0, pool=10.0)

with httpx.Client(proxy=proxy, timeout=timeout) as client:
    try:
        r = client.get("https://api.ipify.org")
        print(r.status_code, r.text)
    except httpx.TimeoutException as exc:
        print("timed out:", type(exc).__name__)  # ConnectTimeout, ReadTimeout...
```

## Should I retry after a read timeout?

Retry a read timeout once or twice on a new exit. If the same URL keeps timing out, give it a longer timeout in a separate slow queue rather than raising the timeout for everything. Watch out for duplicate side effects: only retry requests that are safe to repeat, such as GET.

## How does Read timed out (ReadTimeout) apply to CrawlRelay?

Each new CrawlRelay connection without a session ID uses a different residential exit, so a retry also tests a different home connection. Keep sticky sessions short for slow targets: if the exit is slow, every request in the session is slow.

Gateway: `gw.crawlrelay.com`, port 7777 (HTTP, HTTPS through CONNECT) and port 7778 (SOCKS5). Username format: `USERNAME-country-{cc}-state-{state}-city-{city}-zip-{zip}-asn-{asn}-session-{id}-ttl-{minutes}`. Related: [504 Gateway Timeout](https://crawlrelay.com/docs/errors/504-gateway-timeout/) · [Connection reset](https://crawlrelay.com/docs/errors/connection-reset/) · [Concurrency guide](https://crawlrelay.com/docs/concurrency/).

## Read timed out (ReadTimeout): questions developers ask

### What timeout should I use for scraping with proxies?

Start with about 10 seconds to connect and 30 seconds to read for HTML pages, then adjust from your own measurements. JSON APIs are often faster; large files and slow search pages need more. Set them explicitly: Python requests has no timeout by default.

### Does a timeout cost me traffic?

Only for the bytes that were transferred before the timeout. A request that times out while waiting for the first byte moved almost nothing. A large download that times out halfway did transfer data. Stream large files and resume them where possible.

### Why do timeouts happen in bursts?

Often because the target slows down under load, sometimes your own load. Bursts across many exits at once point to the target; isolated timeouts point to single slow exits. Lower concurrency on the host when a burst starts.

## Other proxy errors in this reference

- [401 Unauthorized vs 407](https://crawlrelay.com/docs/errors/401-unauthorized/)
- [403 Forbidden](https://crawlrelay.com/docs/errors/403-forbidden/)
- [407 Proxy Authentication Required](https://crawlrelay.com/docs/errors/407-proxy-authentication-required/)
- [429 Too Many Requests](https://crawlrelay.com/docs/errors/429-too-many-requests/)
- [502 Bad Gateway](https://crawlrelay.com/docs/errors/502-bad-gateway/)
- [503 Service Unavailable](https://crawlrelay.com/docs/errors/503-service-unavailable/)
- [504 Gateway Timeout](https://crawlrelay.com/docs/errors/504-gateway-timeout/)
- [Cannot connect to proxy (ProxyError)](https://crawlrelay.com/docs/errors/cannot-connect-to-proxy/)
- [Connection reset by peer (ECONNRESET)](https://crawlrelay.com/docs/errors/connection-reset/)
- [ERR_PROXY_CONNECTION_FAILED](https://crawlrelay.com/docs/errors/err-proxy-connection-failed/)
- [ERR_TUNNEL_CONNECTION_FAILED](https://crawlrelay.com/docs/errors/err-tunnel-connection-failed/)
- [Read timed out (ReadTimeout)](https://crawlrelay.com/docs/errors/read-timeout/)
- [SOCKS5 proxy errors](https://crawlrelay.com/docs/errors/socks5-proxy-errors/)
- [SSL: CERTIFICATE_VERIFY_FAILED](https://crawlrelay.com/docs/errors/ssl-certificate-verify-failed/)
- [SSL: WRONG_VERSION_NUMBER](https://crawlrelay.com/docs/errors/ssl-wrong-version-number/)

**Residential proxies with docs that cover the failure cases** CrawlRelay residential proxies from $0.50/GB, traffic that never expires. [See pricing](https://crawlrelay.com/pricing/) · [Quick start](https://crawlrelay.com/docs/)

---

CrawlRelay: CrawlRelay is a developer-first rotating residential and 4G/5G mobile proxy service for scrapers and AI data pipelines: non-expiring pay-as-you-go traffic from $0.50/GB, paid in crypto, with no ID upload. No KYC — no ID, no selfie, no documents. Pay in crypto.
