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. Think of it as hanging up the phone before the other person finishes their sentence. The server never gets to send the response — there's no one left to receive it — so 499 only shows up in server or CDN logs, never as a page in your browser. For scrapers, a 499 usually means your own code gave up first: a timeout set too short, a cancelled request, or a worker that was killed while the origin was still busy producing 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

Most 4xx codes describe a problem the server found with your request. A 499 is different: it's recorded after the client has already disconnected, so it describes the client's behaviour, not the server's. Nginx created the code specifically to separate "the caller hung up" from a genuine server error.

Here's the typical chain of events. Your HTTP library has a timeout — a maximum time it will wait for a reply. If the page takes longer than that, the library gives up and closes the socket (the open network connection). From the origin server's point of view, that looks like a client that vanished mid-request, so it logs a 499. Cloudflare and other reverse proxies (servers that sit in front of the origin and relay traffic) follow the same convention. Because the response never reaches your code, your scraper sees this as a timeout or connection-aborted error — not as a 499. The 499 itself only ever 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 pages — ones rendered with JavaScript, or sitting behind an anti-bot challenge — can take many seconds to respond. If your client times out at 5–10 seconds, you give up too early and generate 499s. Other common triggers:

  • A proxy that is slow or flaky and stalls the connection.
  • A worker process that gets killed mid-request — by running out of memory (OOM), by autoscaling, or by a deploy — while requests are still in flight.
  • Cancelling requests in your own code: an aborted async task, or a closed browser tab in a headless (no visible window) run.

Concurrency makes it worse. Hitting a slow origin with many requests at once makes each response slower still, which makes more of your timeouts fire, which produces 499s in bulk.

How to fix and avoid 499

Start by raising your client's read and connect timeouts so they comfortably exceed the target's worst-case response time. Then retry any timed-out request with exponential backoff and jitter — wait a bit longer before each retry, with a little randomness so your retries don't all fire at the same moment. Lower your concurrency so the origin (and your proxy) can finish answering before your timeouts trip.

Next, audit your proxies: swap out slow or unstable endpoints, and prefer reliable residential proxies for protected sites. Make sure your workers aren't being killed mid-request by memory limits or aggressive autoscaling. Finally, if the origin is slow because it's actively challenging you, the real fix isn't per-request tweaks — it's to 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 it's widely used in server and CDN logs. Browsers never display it because the client has already disconnected by the time it's logged.

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 or 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. A 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 your read and 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-31