Proxy error · TIMEOUT

Connection timeout

A timeout is your own client giving up. Nobody sent an error, there was only silence, so the first job is finding which leg went quiet: you to the proxy, the proxy to the site, or the site working on its answer.
Whose fault is it?

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
With a proxy in the path

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.

The key question

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 -w timings 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.
Cheapest first

Fixes, in the order to try them

  1. 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
  2. Retry through a fresh exit

    On rotating residential, one retry leaves from a different home connection. Keep it to one or two.

    Costs nothing
  3. Load less

    In a browser, wait for domcontentloaded and 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
  4. 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 nothing
  5. 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.

    Costs money
Per tool

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
terminal
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 got
Python Requests
legs.py
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 + spider
# 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
light.py
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
legs.mjs
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 headers

The 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.

Before you buy anything

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.

The meter

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.

From the metering section of our terms of service.

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.

TIMEOUT, asked often

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.

The community layer

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 Discord

4,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.

Join the Discord4,200+ monkeys, free to lurk