HTTP Status Codes / 4xx Client Error Status Codes

4xx Client Error Status Codes

4xx status codes are client error responses. They describe requests that are malformed, unauthorized, forbidden, too large, rate limited, or otherwise impossible for the server to process as sent.

This is an educational guide. The pages linked here are documentation pages served as 200 OK, even when the HTTP status code being explained is an error response.

What 4xx means

Client error responses mean the server understood enough of the request to decide that the client must change something before the request can succeed.

Where 4xx responses appear

Implementation notes

Common 4xx groups

Compare similar 4xx codes

401 vs 403: Unauthorized or Forbidden?

Use 401 when the client should authenticate. Use 403 when the client is authenticated or known, but still not allowed.

Question401 Unauthorized403 Forbidden
Main problemAuthentication missing, invalid, or expired.Authorization denied for this resource or action.
Client actionLog in, refresh token, or send credentials.Do not retry unless permissions change.
HeaderUsually includes WWW-Authenticate.Usually does not challenge authentication.

400 vs 411 vs 413 vs 422 Request Errors

Use these 4xx codes to separate invalid syntax, missing request length, oversized bodies, and well-formed requests that fail business validation.

CodeMain problemFirst fix
400The request is malformed or cannot be parsed.Fix syntax, headers, routing, or body shape.
411The server requires Content-Length before reading the body.Send Content-Length or use a supported upload method.
413The request body is larger than the server accepts.Reduce the payload or raise documented limits safely.
422The request parses correctly but fails semantic validation.Change the submitted values according to field-level errors.

Rules for every 4xx response

What RFC 9110 says about every 4xx response, quoted from the RFC.

The same rule is in the response obligations table and its JSON.

For an API, an RFC 9457 Problem Details body is one standard way to send that explanation.

All 4xx status codes

CodeNameMeaning
400Bad RequestThe server cannot or will not process the request because of something it sees as a client error, such as malformed syntax, invalid framing, or deceptive routing.
401UnauthorizedThe request lacks valid authentication credentials for the target resource. The response must include a WWW-Authenticate challenge.
402Payment RequiredReserved for future use. The original intention was that this code might be used as part of some form of digital cash or micropayment scheme, as proposed, for example, by GNU Taler, but that has not yet happened, and this code is not widely used. Google Developers API uses this status if a particular developer has exceeded the daily limit on requests. Sipgate uses this code if an account does not have sufficient funds to start a call. Shopify uses this code when the store has not paid their fees and is temporarily disabled. Stripe uses this code for failed payments where parameters were correct, for example blocked fraudulent payments.
403ForbiddenThe server understood the request but refuses to fulfill it. Sending the same credentials again will not help.
404Not FoundThe origin server did not find a current representation for the target resource, or is not willing to say that one exists.
405Method Not AllowedThe server knows the request method, but the target resource does not support it. The response must include an Allow header.
406Not AcceptableThe requested resource is capable of generating only content not acceptable according to the Accept headers sent in the request. See Content negotiation.
407Proxy Authentication RequiredThe client must first authenticate itself with the proxy.
408Request TimeoutThe server timed out waiting for the request. According to HTTP specifications: "The client did not produce a request within the time that the server was prepared to wait. The client MAY repeat the request without modifications at any later time."
409ConflictThe request conflicts with the current state of the target resource. The client may be able to resolve the conflict and resubmit.
410GoneThe target resource is no longer available at the origin server, and the condition is likely to be permanent.
411Length RequiredThe request did not specify the length of its content, which is required by the requested resource.
412Precondition FailedOne or more conditions in the request header fields evaluated to false on the server.
413Content Too LargeThe request content is larger than the server is willing or able to process. RFC 7231 called this 413 Payload Too Large, and RFC 2616 called it 413 Request Entity Too Large.
414URI Too LongThe URI provided was too long for the server to process. Often the result of too much data being encoded as a query-string of a GET request, in which case it should be converted to a POST request. Called "Request-URI Too Long" previously.
415Unsupported Media TypeThe server refuses the request because the content is in a format this method on the target resource does not support.
416Range Not SatisfiableThe client has asked for a portion of the file (byte serving), but the server cannot supply that portion. For example, if the client asked for a part of the file that lies beyond the end of the file. Called "Requested Range Not Satisfiable" previously.
417Expectation FailedThe server cannot meet the requirements of the Expect request-header field.
418I'm a teapotThis code was defined in 1998 as one of the traditional IETF April Fools' jokes, in RFC 2324, Hyper Text Coffee Pot Control Protocol, and is not expected to be implemented by actual HTTP servers. The RFC specifies this code should be returned by teapots requested to brew coffee. This HTTP status is used as an Easter egg in some websites, such as Google.com's I'm a teapot easter egg.[53]
421Misdirected RequestThe request was directed at a server that is not able to produce a response (for example because of connection reuse).
422Unprocessable ContentThe server understands the content type and the syntax is correct, but it cannot process the instructions in the request. RFC 4918 called this 422 Unprocessable Entity.
423LockedThe resource that is being accessed is locked.
424Failed DependencyThe request failed because it depended on another request and that request failed (e.g., a PROPPATCH).
425Too EarlyIndicates that the server is unwilling to risk processing a request that might be replayed.
426Upgrade RequiredThe client should switch to a different protocol such as TLS/1.3, given in the Upgrade header field.
428Precondition RequiredThe origin server requires the request to be conditional. Intended to prevent the 'lost update' problem, where a client GETs a resource's state, modifies it, and PUTs it back to the server, when meanwhile a third party has modified the state on the server, leading to a conflict.
429Too Many RequestsThe user has sent too many requests in a given amount of time (rate limiting).
431Request Header Fields Too LargeThe server is unwilling to process the request because either an individual header field, or all the header fields collectively, are too large.
451Unavailable For Legal ReasonsA server operator has received a legal demand to deny access to a resource or to a set of resources that includes the requested resource. The code 451 was chosen as a reference to the novel Fahrenheit 451 (see the Acknowledgements in the RFC).
499Client Closed RequestUsed by nginx to log a request whose client closed the connection before nginx sent the response header.

HTTP status code lookup
REST API status code chooser
cURL command generator
By Ping Now, a website/API/service uptime monitor
Data from Wikipedia