HTTP status codes list

Every HTTP code, in plain English.

62 rows
CodeNameWhat it means
ContinueThe server got the request headers and the client can send the body.
Switching ProtocolsThe server agrees to switch protocols, for example to WebSocket.
ProcessingThe server is still working on a long request (WebDAV). Rarely used now.
Early HintsSent before the final response so the browser can start preloading files.
OKThe request worked. The body holds the result.
CreatedA new resource was created, usually after a POST. The Location header points to it.
AcceptedThe request was accepted for processing but isn’t finished yet.
Non-Authoritative InformationThe response was changed by a proxy from what the origin server sent.
No ContentThe request worked and there is nothing to send back.
Reset ContentThe request worked; the client should reset the form or view that sent it.
Partial ContentOnly part of the file is sent, as asked for with a Range header (used for video and resumable downloads).
Multi-StatusSeveral status codes for several operations in one response (WebDAV).
Already ReportedMembers already listed earlier in the same response aren’t repeated (WebDAV).
IM UsedThe response is the result of changes applied to the current version (delta encoding).
Multiple ChoicesThere are several possible responses; the client should pick one.
Moved PermanentlyThe page has a new address for good. Browsers and search engines update to the new URL.
FoundThe page is temporarily at another address. Keep using the original URL.
See OtherGet the result from another URL with a GET request, often after a form is submitted.
Not ModifiedThe cached copy is still current, so nothing is sent again.
Use ProxyDeprecated. Browsers ignore it for security reasons.
Temporary RedirectTemporarily at another URL; repeat the request there with the same method and body.
Permanent RedirectMoved for good; repeat the request at the new URL with the same method and body.
Bad RequestThe server can’t understand the request, for example because of broken syntax.
UnauthorizedYou need to log in or send valid credentials.
Payment RequiredReserved for future use; some services use it when payment is needed.
ForbiddenThe server understood the request but won’t allow it. Logging in again with the same account won’t help.
Not FoundNothing exists at this URL, or the server won’t say whether it does.
Method Not AllowedThe URL exists but doesn’t accept this method, such as POST.
Not AcceptableThe server can’t give a response in any format the client said it accepts.
Proxy Authentication RequiredLike 401, but you need to log in to a proxy first.
Request TimeoutThe client took too long to send the request.
ConflictThe request clashes with the current state, such as an edit conflict.
GoneThe resource was removed on purpose and won’t come back.
Length RequiredThe request needs a Content-Length header.
Precondition FailedA condition in the request headers, such as If-Match, wasn’t met.
Content Too LargeThe request body is bigger than the server allows (formerly Payload Too Large).
URI Too LongThe URL is longer than the server will handle.
Unsupported Media TypeThe server doesn’t accept the format of the request body.
Range Not SatisfiableThe requested part of the file is outside its size.
Expectation FailedThe server can’t meet the Expect header in the request.
I’m a teapotAn April Fools’ joke from 1998 (RFC 2324). Some servers use it for fun.
Misdirected RequestThe request went to a server that can’t answer for this address.
Unprocessable ContentThe request is well formed but the data in it doesn’t make sense, such as a failed validation.
LockedThe resource is locked (WebDAV).
Failed DependencyThe request failed because an earlier request it depended on failed (WebDAV).
Too EarlyThe server won’t risk processing a request that might be replayed.
Upgrade RequiredThe client must switch to another protocol, given in the Upgrade header.
Precondition RequiredThe server needs a conditional request (such as If-Match) to avoid lost updates.
Too Many RequestsRate limited: the client sent too many requests. Retry-After may say when to try again.
Request Header Fields Too LargeThe headers, or one of them, are too big.
Unavailable For Legal ReasonsBlocked for legal reasons, such as a court order.
Internal Server ErrorSomething went wrong on the server and it has no more specific code.
Not ImplementedThe server doesn’t support the feature needed for this request.
Bad GatewayA gateway or proxy got an invalid response from the server behind it.
Service UnavailableThe server is overloaded or down for maintenance. Usually temporary.
Gateway TimeoutA gateway or proxy didn’t get a response in time from the server behind it.
HTTP Version Not SupportedThe server doesn’t support the HTTP version used.
Variant Also NegotiatesThe server is misconfigured: content negotiation loops back on itself.
Insufficient StorageThe server can’t store what’s needed to finish the request (WebDAV).
Loop DetectedThe server found an infinite loop while processing the request (WebDAV).
Not ExtendedFurther extensions to the request are needed.
Network Authentication RequiredYou need to log in to the network, as with hotel or airport Wi-Fi.

Click a highlighted value to copy it.

Type in the box to filter, or press / to jump to it.

Runs in your browser. Nothing uploaded.

How to use the HTTP status code list

  1. Type a code (404), part of a name (gateway) or a word from the meaning (cache) into the filter box.
  2. Use Client error, Server error or one of the other class buttons to show a single group of codes.
  3. Click a code to copy it.

The five classes

The first digit tells you what kind of answer the server gave. A client that meets a code it doesn’t know treats it like the x00 code of its class, so an unknown 4xx is handled like 400.

Class Meaning
1xx Informational An interim reply. The request is still going.
2xx Success The request worked.
3xx Redirection The client has to go somewhere else, or use its cached copy.
4xx Client error Something is wrong with the request: the URL, the login or the data sent.
5xx Server error The request looked fine, but the server failed to answer it.

The codes you’ll meet most

  • 200 OK: the normal answer. A “page not found” message served with a 200 is called a soft 404, and search engines may index it as a real page. Missing pages should return a real 404.
  • 301, 302, 307 and 308: 301 and 308 mean moved for good, 302 and 307 mean moved for now. The difference between the pairs is that 307 and 308 make the browser repeat the request exactly, while with 301 and 302 a POST may turn into a GET. For an ordinary page, 301 or 308 for a permanent move is all you need.
  • 304 Not Modified: the browser asked whether its cached copy was still current and the server said yes. Nothing is wrong. This saves bandwidth.
  • 400 Bad Request: the request itself is broken, often a malformed URL, an oversized cookie or invalid JSON in an API call. If a URL has unusual characters, check how they’re encoded with the URL encoder.
  • 401 vs 403: log in to fix a 401. A 403 means the account, IP address or file permissions don’t allow access.
  • 404 vs 410: both mean the page isn’t there. 410 says it was removed on purpose and won’t come back, which is a clearer signal when you delete content for good.
  • 429 Too Many Requests: you hit a rate limit. Wait and retry, and respect the Retry-After header if there is one.
  • 500 Internal Server Error: a crash or misconfiguration on the server. Check the error log.
  • 502, 503 and 504: these usually come from a proxy, load balancer or CDN in front of your app. 502 means the app behind it sent back nonsense or crashed, 504 means it took too long, and 503 means the service is down or overloaded. For planned maintenance, send a 503 with Retry-After so crawlers come back later instead of treating pages as gone.

Renamed codes

RFC 9110, the current HTTP standard from 2022, renamed two codes. 413 was Payload Too Large and is now Content Too Large. 422 was Unprocessable Entity and is now Unprocessable Content. The table uses the new names, but older docs and libraries still show the old ones. The numbers and their meaning didn’t change.