HTTP Status Codes
Look up any HTTP status code — every IANA-registered code plus nginx and Cloudflare's unofficial ones — with what it means, what causes it, how to fix it, and whether to retry.
Processed locally in your browser — nothing is uploaded.
HTTP Status Codes
Showing 83 status codes
1xx Informational
The request was received and is continuing; a final response follows.
- 100
Continue
The server has received the request headers and the client should go ahead and send the body. It answers a request sent with Expect: 100-continue.
- 101
Switching Protocols
The server agrees to switch the connection to the protocol named in the Upgrade header — almost always a WebSocket handshake.
- 102
Processing
A WebDAV interim response saying the server has accepted a long-running request and is still working on it, so the client shouldn't time out.
- 103
Early Hints
Sent before the final response so the browser can start preloading or preconnecting to resources listed in Link headers while the server is still building the page.
- 104
Upload Resumption Supported
Temporary registrationA provisional registration for the IETF resumable uploads draft: the server tells the client where an interrupted upload can be resumed.
2xx Successful
The request was received, understood, and accepted.
- 200
OK
Cacheable by defaultThe request succeeded. For GET the body is the resource; for POST it's the result of the action.
- 201
Created
The request succeeded and created a new resource, usually identified by the Location header.
- 202
Accepted
The request was accepted for processing, but the work isn't finished — it may still fail. Common for queued or asynchronous jobs.
- 203
Non-Authoritative Information
Cacheable by defaultSuccess, but a transforming proxy modified the origin server's 200 response — for example by recompressing images.
- 204
No Content
Cacheable by defaultThe request succeeded and there's deliberately no response body.
- 205
Reset Content
Success; the client should reset the document view, such as clearing a form for another entry.
- 206
Partial Content
Cacheable by defaultThe server is sending only the byte range(s) the client asked for with a Range header — how video seeking and resumable downloads work.
- 207
Multi-Status
A WebDAV response whose XML body holds a separate status for each of several resources — some may have failed.
- 208
Already Reported
Used inside a WebDAV 207 body: this resource was already listed earlier in the response, so it isn't repeated (avoids loops with bindings).
- 226
IM Used
The server applied instance manipulations, such as a delta encoding, and the body is the result rather than the full resource.
3xx Redirection
Further action, usually following a Location header, completes the request.
- 300
Multiple Choices
Cacheable by defaultThe resource has several representations (languages, formats) and the client or user should pick one.
- 301
Moved Permanently
Cacheable by defaultThe resource has a new permanent URL in Location. Browsers and search engines update to it, and browsers cache the redirect aggressively.
- 302
Found
also “Moved Temporarily”The resource is temporarily at the URL in Location; keep using the original URL for future requests.
- 303
See Other
Go fetch a different URL with GET — typically the result page after a form submission (the Post/Redirect/Get pattern).
- 304
Not Modified
A conditional request (If-None-Match or If-Modified-Since) matched: the client's cached copy is still current, so no body is sent.
- 305
Use Proxy
DeprecatedFormerly told the client to repeat the request through the proxy in Location. Deprecated for security reasons; browsers ignore it.
- 306
(Unused)
also “Switch Proxy”Reserved, unusedReserved. It was used in an early HTTP/1.1 draft (as Switch Proxy) and is no longer assigned.
- 307
Temporary Redirect
Like 302, but the client must repeat the request with the same method and body at the URL in Location.
- 308
Permanent Redirect
Cacheable by defaultLike 301, but the method and body must not change: a POST is re-sent as a POST to the new URL.
4xx Client Error
The request is wrong or can't be fulfilled as sent.
- 400
Bad Request
Don't retry unchangedThe server can't or won't process the request because of something it considers a client error — malformed syntax, invalid framing, or invalid parameters.
- 401
Unauthorized
Don't retry unchangedThe request lacks valid authentication credentials. Despite the name it means unauthenticated; the server must say how to authenticate in WWW-Authenticate.
- 402
Payment Required
Don't retry unchangedReserved for future use by the spec, but used in practice by APIs and SaaS products to signal a billing problem or exhausted plan.
- 403
Forbidden
Don't retry unchangedThe server understood the request and knows who you are (or doesn't care), but refuses it. Re-authenticating won't help.
- 404
Not Found
Cacheable by defaultDon't retry unchangedThe server has nothing at this URL — or won't admit that it does. It says nothing about whether the absence is temporary.
- 405
Method Not Allowed
Cacheable by defaultDon't retry unchangedThe URL exists but doesn't support this method — for example a POST to a GET-only route. The Allow header must list the methods it does support.
- 406
Not Acceptable
Don't retry unchangedThe server can't produce a response matching the request's Accept, Accept-Language, or Accept-Encoding headers.
- 407
Proxy Authentication Required
Don't retry unchangedLike 401, but the client must first authenticate with a proxy between it and the server.
- 408
Request Timeout
Safe to retryThe server gave up waiting for the client to finish sending the request, and is closing the connection. Browsers also see it when an idle keep-alive connection is closed.
- 409
Conflict
Don't retry unchangedThe request conflicts with the resource's current state — an edit conflict, a duplicate, or a state transition that isn't allowed.
- 410
Gone
Cacheable by defaultDon't retry unchangedThe resource was deliberately removed and won't be back. Search engines drop 410 URLs faster than 404s.
- 411
Length Required
Don't retry unchangedThe server refuses a request body without a Content-Length header.
- 412
Precondition Failed
Don't retry unchangedA condition in the request headers, such as If-Match or If-Unmodified-Since, wasn't met — usually someone else changed the resource first.
- 413
Content Too Large
also “Payload Too Large”, “Request Entity Too Large”Don't retry unchangedThe request body is larger than the server is willing to accept.
- 414
URI Too Long
also “Request-URI Too Long”Cacheable by defaultDon't retry unchangedThe URL is longer than the server will process.
- 415
Unsupported Media Type
Don't retry unchangedThe server won't accept the body's format, as given by Content-Type or Content-Encoding.
- 416
Range Not Satisfiable
also “Requested Range Not Satisfiable”Don't retry unchangedThe byte range in the Range header lies outside the resource — usually past its end.
- 417
Expectation Failed
Don't retry unchangedThe server can't meet the Expect request header — in practice, it doesn't support Expect: 100-continue.
- 418
(Unused)
also “I'm a teapot”Reserved, unusedDon't retry unchangedThe famous "I'm a teapot" from the 1998 April Fools' RFC 2324 (HTCPCP). Because so much software implements the joke, HTTP reserved 418 so it's never assigned to anything real.
- 419
Page Expired
Unofficial · LaravelDon't retry unchangedLaravel's response when a form's CSRF token is missing or has expired.
- 420
Enhance Your Calm
Unofficial · Twitter API v1 (retired)Safe to retryThe old Twitter API's rate-limit response, replaced by the standard 429. Some other services still use it.
- 421
Misdirected Request
Safe to retryThe request reached a server that can't answer for this host — typically an HTTP/2 connection reused for a different domain that shares a certificate.
- 422
Unprocessable Content
also “Unprocessable Entity”Don't retry unchangedThe body is well-formed and of a supported type, but its content fails validation — a missing required field or an invalid value.
- 423
Locked
Safe to retryA WebDAV resource is locked and the request didn't include the lock token.
- 424
Failed Dependency
Don't retry unchangedA WebDAV request failed because another action it depended on failed — often inside a 207 batch.
- 425
Too Early
Safe to retryThe server won't process a request sent as TLS 1.3 early data (0-RTT) because it could be replayed.
- 426
Upgrade Required
Don't retry unchangedThe server refuses the current protocol and names the one to switch to in the Upgrade header.
- 428
Precondition Required
Don't retry unchangedThe server requires conditional requests (If-Match) to prevent lost updates, and this request had none.
- 429
Too Many Requests
Safe to retryRate limited: the client sent too many requests in a given time.
- 431
Request Header Fields Too Large
Don't retry unchangedOne header, or all headers together, are too large for the server.
- 444
No Response
also “Connection Closed Without Response”Unofficial · nginxDon't retry unchangednginx closes the connection without sending anything. The client sees an empty reply or a reset connection; 444 only appears in nginx's logs.
- 451
Unavailable For Legal Reasons
Don't retry unchangedAccess is denied for legal reasons — a court order, government censorship, or a takedown. The number nods to Fahrenheit 451.
- 460
Client Closed Connection
Unofficial · AWS Elastic Load BalancingAn AWS Application Load Balancer log entry: the client closed the connection before the load balancer's idle timeout elapsed, so no response was delivered.
- 463
Too Many Forwarded IPs
Unofficial · AWS Elastic Load BalancingDon't retry unchangedAn AWS Application Load Balancer received an X-Forwarded-For header with more than 30 IP addresses.
- 494
Request Header Too Large
Unofficial · nginxDon't retry unchangednginx's internal code for a request header or cookie exceeding large_client_header_buffers. Clients normally receive a 400 "Request Header Or Cookie Too Large" page; 494 shows up when used with error_page.
- 495
SSL Certificate Error
Unofficial · nginxDon't retry unchangednginx's code for a client certificate that failed verification in mutual TLS. The client receives a 400 page unless error_page maps it.
- 496
SSL Certificate Required
Unofficial · nginxDon't retry unchangednginx's code for a request that didn't present the client certificate that mutual TLS requires.
- 497
HTTP Request Sent to HTTPS Port
Unofficial · nginxDon't retry unchangednginx's code for a plain-HTTP request that arrived on a port expecting TLS.
- 499
Client Closed Request
Unofficial · nginxLogged by nginx when the client closed the connection while nginx was still processing the request. Nothing is sent — the client already left.
5xx Server Error
The server failed to fulfill an apparently valid request.
- 500
Internal Server Error
Retry idempotent requests onlyThe server hit an unexpected condition it has no more specific code for — usually an unhandled exception.
- 501
Not Implemented
Cacheable by defaultDon't retry unchangedThe server doesn't support the functionality required — usually a request method it doesn't recognize at all.
- 502
Bad Gateway
Retry idempotent requests onlyA gateway or proxy got an invalid response — or none at all — from the upstream server it forwarded to.
- 503
Service Unavailable
Safe to retryThe server is temporarily unable to handle the request — overloaded, or down for maintenance.
- 504
Gateway Timeout
Retry idempotent requests onlyA gateway or proxy didn't get a response from the upstream server in time.
- 505
HTTP Version Not Supported
Don't retry unchangedThe server doesn't support the major HTTP version used in the request.
- 506
Variant Also Negotiates
Don't retry unchangedA server configuration error in transparent content negotiation: the chosen variant is itself set up to negotiate, creating a loop.
- 507
Insufficient Storage
Don't retry unchangedThe server can't store what's needed to complete the request — typically a full disk or quota on a WebDAV server.
- 508
Loop Detected
Don't retry unchangedA WebDAV server found an infinite loop while processing a request with Depth: infinity.
- 509
Bandwidth Limit Exceeded
Unofficial · Apache / cPanel hostingSafe to retryShared hosting's response when an account has used up its bandwidth allowance.
- 510
Not Extended
ObsoleteDon't retry unchangedFrom the experimental HTTP Extension Framework: the request needs further extensions. The framework was moved to Historic status and the code is obsolete.
- 511
Network Authentication Required
Don't retry unchangedA captive portal (hotel, airport, café Wi-Fi) is intercepting traffic until you log in to the network.
- 520
Web Server Returned an Unknown Error
Unofficial · CloudflareRetry idempotent requests onlyCloudflare reached the origin server, but it answered with something empty, unexpected, or unparseable.
- 521
Web Server Is Down
Unofficial · CloudflareRetry idempotent requests onlyThe origin refused Cloudflare's connection.
- 522
Connection Timed Out
Unofficial · CloudflareRetry idempotent requests onlyCloudflare couldn't complete a TCP connection to the origin in time.
- 523
Origin Is Unreachable
Unofficial · CloudflareRetry idempotent requests onlyCloudflare can't route to the origin at all — usually a DNS or network problem.
- 524
A Timeout Occurred
Unofficial · CloudflareRetry idempotent requests onlyCloudflare connected to the origin, but the origin didn't send an HTTP response within the timeout (100 seconds by default).
- 525
SSL Handshake Failed
Unofficial · CloudflareDon't retry unchangedCloudflare couldn't negotiate TLS with the origin.
- 526
Invalid SSL Certificate
Unofficial · CloudflareDon't retry unchangedWith SSL mode Full (strict), Cloudflare couldn't validate the origin's certificate.
- 530
Origin DNS Error
Unofficial · CloudflareDon't retry unchangedReturned together with a Cloudflare 1xxx error (often 1016, origin DNS error) that explains the real problem.
About HTTP Status Codes
A searchable reference for every HTTP status code you're likely to meet. It covers the complete IANA registry from 100 to 511 — including the WebDAV codes, 103 Early Hints, 425 Too Early, and the reserved 306 and 418 — plus the unofficial codes that show up in real logs: nginx's 444 and 499, Cloudflare's 520–526 and 530, AWS load balancer codes, Laravel's 419, and a few others. Unofficial codes are labelled with the software that sends them, so you never mistake a vendor's convention for the standard.
Every entry says what the code means, what typically causes it, and what to do about it — split into advice for the client making the request and for whoever runs the server, because a 502 means something very different depending on which side you're on. Each also notes whether the response is cacheable by default, whether it's safe to retry, the headers that matter (Retry-After, Location, WWW-Authenticate…), and the RFC section that defines it.
Type a code, a word like "timeout" or "cache", a header name, or a vendor like "nginx" to search; the filters narrow to one class or hide unofficial codes. Every code has its own link — /tools/http-status-codes#503 opens straight to 503 — so you can drop an explanation into a ticket or a code review.
The five classes
- 1xx Informational — the request is in progress; a final response follows
- 2xx Successful — the request worked
- 3xx Redirection — go somewhere else, or use your cached copy (304)
- 4xx Client Error — the request is wrong; repeating it unchanged won't help (with a few exceptions such as 408, 425, and 429)
- 5xx Server Error — the server failed; often temporary, but retry with care
The first digit is all a client strictly has to understand. RFC 9110 says a client that receives a code it doesn't recognize must treat it as the x00 code of its class — so an unknown 299 is handled like 200 OK and an unknown 599 like 500. Search for any three-digit code and the tool tells you how it would be treated.
Retrying safely
"Safe to retry" means repeating the identical request is reasonable after a delay — 429 and 503 usually come with a Retry-After header saying how long. "Retry idempotent requests only" marks failures where the server may already have done the work before the error, like a 504 or Cloudflare's 524: repeating a GET or PUT is harmless, but repeating a POST could charge a card twice. Use exponential backoff with jitter either way, and cap the number of attempts.
Cacheable by default
Twelve codes — 200, 203, 204, 206, 300, 301, 308, 404, 405, 410, 414, and 501 — are heuristically cacheable: a browser or CDN may store them even without Cache-Control or Expires headers. That's why a mistaken 301 sticks in browsers and a brief 404 can be served from a CDN after the page is fixed. Any status can be cached when the response says so explicitly.
Example
Input
504
Output
504 Gateway Timeout — a gateway or proxy didn't get a response from the upstream server in time. Causes: slow queries, a proxy timeout shorter than the work, a hung upstream. Retry: idempotent requests only — the upstream may still have finished the work.
Limitations
- The unofficial codes are a curated selection of the ones people actually search for, not every code any product has ever invented.
- Advice is general. A specific API may document its own meaning for a code — for example, many APIs use 404 rather than 403 to hide resources — so check its documentation too.
Frequently asked questions
What is the difference between 401 and 403?
401 Unauthorized means the request isn't authenticated — credentials are missing, wrong, or expired — and logging in may fix it; the server must send a WWW-Authenticate header. 403 Forbidden means the server knows who you are (or doesn't need to) and still refuses, so re-authenticating won't help.
What causes a 502 Bad Gateway error?
A proxy or load balancer — nginx, Cloudflare, an AWS ALB — forwarded the request but got an invalid response or no response from the application behind it. Usually the app crashed, is restarting during a deploy, or isn't listening on the address the proxy expects. Check the proxy's error log and whether the upstream process is running.
What's the difference between 502 and 504?
Both come from a gateway or proxy. 502 Bad Gateway means the upstream server answered with something invalid or closed the connection; 504 Gateway Timeout means it didn't answer in time. A 504 often means the work is slow rather than broken, so the upstream may still finish the request.
Which HTTP status codes should a client retry?
408, 429, and 503 are meant to be retried after a delay — honor Retry-After when the server sends it. 500, 502, and 504 can be retried for idempotent requests like GET, but not blindly for POST, since the server may have already acted. Most other 4xx errors fail the same way until the request is fixed.
What does status code 499 mean?
499 Client Closed Request is an nginx-specific code: the client disconnected before nginx sent a response. It appears only in nginx's logs — the client never receives it. It usually means a client or load-balancer timeout is shorter than the time the request takes.
What are Cloudflare errors 520, 521, 522, and 524?
They're Cloudflare's own codes for problems between Cloudflare and the origin server. 520 means the origin returned an empty or invalid response, 521 that it refused the connection, 522 that the connection timed out, and 524 that the origin connected but took longer than 100 seconds to respond.
Should I use 301 or 308 for a permanent redirect?
Use 301 for ordinary page moves — every client understands it. Use 308 when the request method and body must be kept, such as for an API endpoint that receives POSTs, because browsers may turn a POST into a GET when following a 301. The same applies to 302 versus 307 for temporary redirects.
Is 418 I'm a teapot a real status code?
It started as an April Fools' joke in RFC 2324 (1998), but so much software implemented it that RFC 9110 reserved 418 as "(Unused)" so it can never be assigned a real meaning. It's fine as an Easter egg, but shouldn't be used for real errors.