Connection timeout
Usually the path, sometimes the site. Your credentials are not involved: a bad password gets a fast 407.
- Usually from
- Any leg; residential exits are the usual slow one
- Try first
- Set separate connect and read timeouts and see which fires
What a timeout means through a proxy
A proxied request waits three times. Your client connects to the proxy. The proxy connects out to the site and the tunnel opens. Then the site sends its response. A timeout on the first wait is your network or the proxy address; on the second, the proxy path; on the third, usually the site.
Residential requests leave through home connections. Some are slow and some drop mid-request, which shows up as read timeouts. A retry on the rotating gateway goes out through a different home.
Some sites deal with traffic they do not want by holding the connection open and sending nothing. That looks like a timeout, and it is a block.
Your credentials, the proxy, or the target?
Usually the path, sometimes the site. Your credentials are not involved: a bad password gets a fast 407.
Your credentials
Not the cause. A wrong password is answered straight away with a 407.
The proxy
Connect timeouts to the gateway, or a slow residential exit on the way out. A retry through a new exit helps.
The target site
Read timeouts on a site that is slow, or that is stalling you on purpose. Check whether it does the same without a proxy.
How to tell
- A connect timeout to the proxy address itself means the proxy never saw you. Check your firewall and the host and port first.
- Connect succeeds and the read times out: the tunnel or the site is slow. Retry through a new exit and see if it clears.
- curl's
-wtimings split the legs:%{time_connect}is reaching the proxy,%{time_appconnect}is the TLS handshake with the site,%{time_starttransfer}is the first byte back. - Timeouts on one site and not on others point at that site.
Fixes, in the order to try them
- Costs nothing
Set connect and read timeouts separately
Around 10 seconds to connect and 30 to read is a reasonable start. Whichever one fires tells you which leg is slow.
- Costs nothing
Retry through a fresh exit
On rotating residential, one retry leaves from a different home connection. Keep it to one or two.
- Costs nothing
Load less
In a browser, wait for
domcontentloadedand block the images, fonts and video you do not need. Fewer bytes means fewer chances to stall, and less traffic on the meter. - Costs nothing
Test from the same machine with curl
A company firewall or a VPN may block outbound connections to proxy ports. If curl times out from the same machine too, the problem is on your network.
- Costs money
Use a static IP for latency-sensitive work
ISP and datacenter IPs run at datacenter latency. If residential latency is what times you out and the target accepts those addresses, a static IP fixes it.
See the real status and headers
Each sample sets the limits explicitly and reports which leg ran out, so you raise the right one or none at all.
curl
curl -s -o /dev/null -x http://USER:[email protected]:8000 \
--connect-timeout 10 --max-time 30 \
-w 'proxy %{time_connect}s tls %{time_appconnect}s first byte %{time_starttransfer}s total %{time_total}s\n' \
https://example.com/
# exit code 28 means a limit fired; the timings show how far it gotPython Requests
import requests
URL = "https://example.com/"
PROXY = "http://USER:[email protected]:8000"
try:
r = requests.get(URL, proxies={"http": PROXY, "https": PROXY}, timeout=(10, 30))
print(r.status_code, r.elapsed)
except requests.exceptions.ConnectTimeout:
print("connect leg: the proxy or the tunnel did not answer in 10 s")
except requests.exceptions.ReadTimeout:
print("read leg: connected, then nothing for 30 s")
except requests.exceptions.ProxyError as err:
print("proxy leg:", err)Recent urllib3 reports a failure to reach the proxy itself as a ProxyError, which is why it is caught too.
Scrapy
# settings.py
DOWNLOAD_TIMEOUT = 30
RETRY_TIMES = 2
# in the spider
from twisted.internet.error import TCPTimedOutError, TimeoutError
def start_requests(self):
for url in self.start_urls:
yield scrapy.Request(url, errback=self.on_error)
def on_error(self, failure):
if failure.check(TimeoutError, TCPTimedOutError):
self.logger.warning("timed out: %s", failure.request.url)Playwright
from playwright.sync_api import TimeoutError as PageTimeout
from playwright.sync_api import sync_playwright
PROXY = {"server": "http://resi.proxymonkey.io:8000", "username": "USER", "password": "PASS"}
HEAVY = {"image", "font", "media"}
with sync_playwright() as p:
browser = p.chromium.launch(proxy=PROXY)
page = browser.new_page()
page.route(
"**/*",
lambda route: route.abort() if route.request.resource_type in HEAVY else route.continue_(),
)
try:
page.goto("https://example.com/", wait_until="domcontentloaded", timeout=45_000)
except PageTimeout:
print("no DOM within 45 s")
browser.close()Node.js
import { fetch, ProxyAgent } from "undici";
const dispatcher = new ProxyAgent("http://USER:[email protected]:8000");
try {
const res = await fetch("https://example.com/", {
dispatcher,
signal: AbortSignal.timeout(30_000),
});
console.log(res.status);
} catch (err) {
if (err.name === "TimeoutError") console.error("no complete answer in 30 s");
else console.error(err.cause?.code ?? err);
}
// UND_ERR_CONNECT_TIMEOUT could not reach the proxy
// UND_ERR_HEADERS_TIMEOUT connected, then no response headersThe samples use the residential gateway, resi.proxymonkey.io:8000. For an ISP or datacenter IP, use USER:PASS@IP:PORT for the address you rented. Your dashboard lists the host and port for every order, and where it differs from this page, the dashboard is right.
Will a different proxy line fix it?
When switching helps
Residential exits are home connections and can be slow. ISP and datacenter addresses run at datacenter latency, and the product pages list a faster uplink as a paid add-on on dedicated IPs.
When it will not
A site that stalls unwanted traffic, or one that is slow for everyone, times out on any line. So does a firewall on your side.
Is a failed request billed?
We bill for request bytes and response bytes, including headers and protocol overhead on the tunnelled connection. Connections that fail before transferring data are not billed. Retries that you initiate are billed and appear as separate entries in your usage log.
The terms say connections that fail before transferring data are not billed, so a timeout reaching the proxy costs nothing. A timeout after part of the response arrived did move bytes, and the terms bill request and response bytes without describing a partial response separately. Check the row in your usage log, and ask in Discord if it looks wrong. Retries you initiate are billed as separate entries.
Residential is billed per GB of that traffic. ISP and datacenter addresses are charged per IP for their term, and where a plan includes a traffic allowance, traffic past it is billed per GB under the same rule. The usage log in your dashboard has one row per request with bytes in, bytes out and cost, so you can look up the failed request yourself.
Questions people ask about a timeout
Why are residential proxies slower?
Your request leaves through someone’s home connection, with whatever upload speed and Wi-Fi they have. Some exits are quick and some are not. ISP and datacenter addresses sit in datacenters and have steadier latency.
Should I just raise the timeout?
Only once you know which leg is slow. A long timeout on a dead exit holds a worker for minutes. A short connect timeout with one retry gets through sooner and wastes less.
Do timed-out requests cost me money?
The terms say connections that fail before transferring data are not billed. Once bytes have moved they are billed like any request, and every retry you send is its own entry in the usage log.
Could the site be stalling me on purpose?
Some do. If one site times out through every exit while other sites load fine, treat it as a block: slow down, and check that you are welcome on that path.
Errors that travel with this one
- ECONNREFUSED
Connection refused
Something said no before any HTTP happened. Usually the host or port you gave for the proxy.
Work it out → - 502
502 Bad Gateway
A go-between got a bad answer from the next hop. Could be the proxy, could be the site’s own load balancer.
Work it out → - 429
429 Too Many Requests
The site says you are going too fast, and it often says for how long.
Work it out →
Still stuck on a timeout?
Paste your error in the Discord: the full message plus the command or the few lines that set up the proxy, with the password taken out. Someone there has seen it before.
Join the Discord4,200+monkeys in the Discord
Help from humans
Post your error, get an answer. Usually in minutes, usually from someone who has hit the same wall.
A status bot that tells on us
Pool health, incidents and maintenance posted automatically. Including the bad days.
Deals and free traffic
Bonus GB drops, early access to new pools, and the occasional giveaway for a good bug report.