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
| 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 anAbortErrorfrom 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?
- Time the request without the proxy to get a baseline.
- Log time to first byte and total time separately.
- Check response sizes for the slow URLs.
- In browsers, check which
waitUntilcondition you use.
# 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:[email protected]: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_URLHow 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
domcontentloadedinstead 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.
import httpx
proxy = "http://USERNAME:[email protected]: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 · Connection reset · Concurrency guide.
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
HTTP status codes
- 401 Unauthorized vs 407
- 403 Forbidden
- 407 Proxy Authentication Required
- 429 Too Many Requests
- 502 Bad Gateway
- 503 Service Unavailable
- 504 Gateway Timeout
Browser and client errors
Connection and TLS errors
Residential proxies with docs that cover the failure cases
CrawlRelay residential proxies from $0.50/GB, traffic that never expires.