HTTP Errors

What Is the 499 Status Code? (Client Closed Request)

On this page

HTTP 499 Client Closed Request is a non-standard status code, logged by Nginx (and CDNs like Cloudflare) when the client closes the connection before the server finishes sending a response. It isn't returned to the browser — there's no one left to receive it — so you see 499 in server or CDN logs, not as a page. For scrapers, a 499 usually means your own client gave up (a timeout that's too aggressive, a cancelled request, or a killed worker) while the origin was still working on a slow response.

Quick facts

Status code499 (non-standard, Nginx)
MeaningClient Closed Request
Where you see itNginx / CDN access logs, not in the browser
Common causes (scraping)Client timeout too low, cancelled request, slow origin or proxy
Right responseRaise client/read timeouts, lower concurrency, retry with backoff

What a 499 actually means

Unlike a normal 4xx, a 499 is recorded after the client has already hung up, so it describes the client's behaviour, not the server's. Nginx introduced the code to distinguish "the caller disconnected" from real server errors. When a request takes longer than your HTTP library's timeout, the library aborts the socket; from the origin's side that looks like a client that closed the request mid-flight, and it logs 499. Cloudflare and other reverse proxies adopted the same convention. Because the response never reaches your code, your scraper typically surfaces this as a timeout/connection-aborted exception rather than a 499 — the 499 lives in the target's logs.

Why scrapers run into 499

The most common cause is a read timeout set too low for the page you're fetching. Heavy, JavaScript-rendered, or anti-bot-challenged pages can take many seconds to respond; if your client times out at 5–10 seconds you abort early and generate 499s. Other triggers: a proxy that is slow or flaky and stalls the connection, a worker process that is killed (OOM, autoscaling, deploy) while requests are in flight, or cancelling requests in code (an aborted async task, a closed browser tab in a headless run). Overloading a slow origin with high concurrency makes each response slower, which makes your timeouts fire, which produces 499s in bulk.

How to fix and avoid 499

Start by raising your client read/connect timeouts to comfortably exceed the target's worst-case response time, then retry timed-out requests with exponential backoff and jitter. Lower concurrency so the origin (and your proxy) can answer before your timeouts trip. Audit your proxies — swap out slow or unstable endpoints and prefer reliable residential proxies for protected sites. Make sure workers aren't being killed mid-request by memory limits or aggressive autoscaling. If the origin is genuinely slow because it's challenging you, the real fix is to stop fighting the challenge per-request and use a scraping API that handles the wait and the unblock for you.

Related terms

Concept map

How 499 Status Code (499 Error) connects

The terms most directly tied to this one. Hover a node to see its neighbours, click to preview, drag to rearrange.

0 terms · 0 connections
You are here · HTTP Errors
Building map…

Frequently asked questions

Is 499 a real HTTP status code?

Not in the official spec. It's a non-standard code introduced by Nginx to mean "Client Closed Request" and is widely used in server and CDN logs. Browsers never display it because the client has already disconnected.

Why do I see 499 when scraping but my request just timed out?

They're two views of the same event. Your HTTP client reports a timeout/aborted connection; the origin's Nginx logs that same abort as a 499. Increase your timeout and the 499s usually disappear.

Does a 499 mean I'm blocked?

Not directly. 499 is about a closed connection, not a refusal. But it often appears alongside blocking — a site that's slow-walking or challenging your request can push your client past its timeout, producing 499s as a side effect.

How do I stop getting 499 errors?

Raise read/connect timeouts, retry with backoff, reduce concurrency, and use reliable proxies so responses arrive before your client gives up. If a site is slow because it's anti-bot-challenging you, offload the wait to a scraping API.

Last updated: 2026-05-28