Error reference cURL

How to Fix cURL Error 28: Operation Timed Out

cURL error 28 — CURLE_OPERATION_TIMEDOUT — means the request ran out of time before it finished: either the connection never came up within the connect timeout, or the whole transfer blew past the overall limit. It is a deadline failure, not a refusal. This guide shows how to find the stalled phase, set realistic limits, and tune timeouts for proxied traffic.

cURL Error 28: Operation Timed Out

What cURL Error 28 Actually Means

Error 28 is CURLE_OPERATION_TIMEDOUT: curl gave up because a time limit expired. Two separate limits can trigger it. The connect timeout (--connect-timeout) covers DNS resolution, the TCP handshake, and any proxy or TLS negotiation; the overall limit (--max-time) covers the entire transfer, body included. The error text tells you which one fired: "Connection timed out" points at the connect phase, while "Operation timed out after N milliseconds with X bytes received" means the transfer started and then outran its deadline.

Crucially, error 28 is not a refusal. The server did not reject you — something in the path was too slow or silently discarded packets. Common producers: an overloaded target, slow DNS, a firewall that blackholes traffic instead of rejecting it, a congested route, or a slow proxy exit. Compare error 7 (connection refused), where something actively said no; 28 is what silence looks like.

The bytes-received figure is a free diagnostic. Zero bytes received means you have a connectivity or reachability problem; a partial count means data was flowing but throughput could not finish the job in time — a tuning problem, not an outage.

cURL Error 28: Operation Timed Out

How to Fix cURL Error 28, Step by Step

Work from the most common cause down. Most timeout reports resolve at one of the first three steps, and every step narrows where the time is actually going.

  1. Read the error text first: Connection timed out means the connect phase failed, while Operation timed out ... with N bytes received means the transfer started but outran --max-time.
  2. Set both limits explicitly — --connect-timeout 15 and --max-time 90 — rather than inheriting a wrapper's hidden, often aggressive defaults.
  3. Re-run with -v and watch where output stops: during DNS, during TCP connect, during the TLS handshake, or mid-body. Each stall point implicates a different layer.
  4. Test the same URL without the proxy. Success direct but timeout proxied puts the delay on the proxy path; a timeout both ways points at the target or your own network.
  5. Rule out slow DNS: if -v hangs before any Trying [ip] line, resolution is the bottleneck — pin it with --resolve example.com:443:IP or switch resolvers.
  6. Check for firewalls or security appliances silently dropping the port. A blackholed packet produces exactly this signature: no reset, no refusal, just a timeout.
  7. For large responses, the deadline may simply be too small for the payload. Raise --max-time, or replace it with --speed-limit 1000 --speed-time 30 to abort only on genuine stalls.
  8. Add --retry 3 --retry-delay 2 for transient congestion — but treat retries as a cushion, not a fix, if the same request times out every run.
cURL Error 28: Operation Timed Out

Why Proxies Change the Timeout Math

A proxied request has two legs — your machine to the proxy, then the proxy to the target — plus proxy authentication and CONNECT tunneling before TLS even begins. Timeouts tuned against direct connections are frequently too tight once a proxy joins the path. Residential and mobile exits amplify this: they ride real consumer and carrier connections, so latency is naturally higher and more variable than a datacenter route.

The goal is not just bigger numbers; it is making sure a slow exit does not stay in your path. With rotating residential proxies, each new connection can take a fresh exit IP, so a congested route clears on its own. With sticky sessions, you control the trade: keep an exit for consistency, or cut a new session the moment one turns sluggish.

Budget the full chain, not one hop

Give the connect phase 10-15 seconds and the whole transfer 60-120 depending on payload. That covers proxy auth, tunneling, the exit's last mile, and the target's response time in one honest deadline — instead of a 5-second limit that fails healthy residential requests.

Rotate away from slow exits

On ProxyOmega Budget Unlimited (/plan-unlimited/), ports rotate exits on a per-port interval, so persistent slowness on one IP clears without intervention. Need control mid-job? Start a session with -session-job42 in the username; if that exit slows down, switching to a new session ID gets a different IP immediately.

Match the plan to the workload

Throughput-heavy jobs — large pages, media, bulk fetches — fit Premium Unlimited (/plan-premium/), with dedicated speeds from 200 Mbps to 1 Gbps. Latency-sensitive checks do well on Platinum's Tier-1 ISP-quality exits (/plan-platinum/). Mobile 4G/5G IPs are the most authentic and also the slowest medium; budget deadlines accordingly.

cURL Error 28: Operation Timed Out

A Timeout-Safe Request Through a Proxy

This request separates connect and total limits, aborts only on real stalls, and retries transient failures — through a rotating residential port, where each retry can land on a fresh exit.

# Phase-aware timeouts + stall detection + retries
curl -x "http://USERNAME-country-us:[email protected]:10000" \
  --connect-timeout 15 \
  --max-time 90 \
  --speed-limit 1000 --speed-time 30 \
  --retry 3 --retry-delay 2 \
  -sS "https://httpbin.org/get"
FAQ

Frequently asked questions

What is the difference between curl error 28 and error 7?
Error 7 means the connection was actively refused — something answered and rejected it, usually a wrong port or a service that is down. Error 28 means nothing answered in time: packets were dropped or the path was too slow. Refusal points to configuration; a timeout points to firewalls, latency, or limits that are simply too tight.
What timeout values should I use with residential proxies?
Start with a connect timeout of 10-15 seconds and an overall limit of 60-120 seconds, sized to your typical payload. Residential and mobile exits ride real consumer connections, so latency varies more than on datacenter routes. Pair the deadline with --speed-limit and --speed-time so curl aborts on genuine stalls instead of punishing slow-but-progressing transfers.
Does curl error 28 mean my proxy is down?
Not by itself. A dead proxy usually produces error 7 (connection refused) or error 5 (could not resolve proxy) rather than a timeout. Isolate it: request a small neutral URL such as https://api.ipify.org through the proxy. If that returns quickly, the proxy leg is healthy and the slowness lives at the target or on the exit route.
Why does error 28 hit only some of my requests?
Intermittent timeouts usually mean variable exit quality or a handful of slow targets, not a broken setup. With rotating proxies each connection can take a different exit, so a slow route clears on the next attempt. Add --retry with a short delay, and if you use sticky sessions, switch to a new session ID when one turns sluggish.

Stop losing requests to timeouts. Start routing today.

Route through ProxyOmega residential proxies with sticky sessions, country targeting, and a 99.7% success rate.

ProxyOmega ProxyOmega

90M+ ethically-sourced IPs across 200+ countries and 30,000+ cities. Residential, mobile, ISP and IPv6 proxies for scraping and AI agents.

GDPRCCPA
Product
Premium Unlimited Budget Unlimited Residential / ISP Mobile IPv6 Chrome Extension
Solutions
Web scraping AI agents Price monitoring SERP & SEO Integrations All use cases
Resources
Glossary Error codes Free tools Proxies by platform Locations
Company
About Blog Docs Reseller program Affiliate Contact Sign in
© 2026 ProxyOmega Ltd. All rights reserved.