HTTP Status Codes

A free, interactive HTTP status code list and REST API cheat sheet. Every registered code from 100 to 511, plus selected unofficial nginx, Cloudflare, and AWS codes, in plain English. Click any code to copy it, or share a direct link.

1xx Informational

Interim responses. The server received the request and the client should continue.

100

Continue

The initial part of the request has been received and the client should continue sending the rest, such as the request body.

RFC 9110
101

Switching Protocols

The server is switching protocols as requested by the client via the Upgrade header. Most commonly seen when opening a WebSocket connection.

RFC 9110
102

Processing

Deprecated

The server has accepted the full request but has not yet completed it (WebDAV). Deprecated and rarely seen today.

RFC 2518
103

Early Hints

Used to return preload or preconnect hints before the final response, so browsers can start fetching critical resources early.

RFC 8297
104

Upload Resumption Supported

Temporary

An interim response telling the client that the server supports resumable uploads. Its Location header points to the upload resource, so an interrupted upload can be picked up again. A temporary registration from an IETF draft, not yet a final standard.

IETF draft · temporary

2xx Success

The request was received, understood, and accepted.

200

OK

The request succeeded. The meaning of success depends on the HTTP method: GET returns the resource, POST reports the result of the action.

RFC 9110
201

Created

The request succeeded and a new resource was created as a result. The Location header usually points to the new resource.

RFC 9110
202

Accepted

The request has been accepted for processing, but the processing has not been completed. Common for asynchronous jobs and queued processing.

RFC 9110
203

Non-Authoritative Information

The request succeeded, but a transforming proxy has modified the content from the origin server’s 200 response.

RFC 9110
204

No Content

The server processed the request but is not returning any content. Common for DELETE requests and save actions that need no response body.

RFC 9110
205

Reset Content

Instructs the client to reset the document view that sent the request, such as clearing a submitted form.

RFC 9110
206

Partial Content

The server is delivering only part of the resource due to a Range header. Used for download resumption and video streaming.

RFC 9110
207

Multi-Status

Conveys information about multiple independent operations, each with its own status code (WebDAV).

RFC 4918
208

Already Reported

The members of a DAV binding have already been enumerated in an earlier part of the response (WebDAV).

RFC 5842
226

IM Used

The server fulfilled a GET request and the response represents the result of one or more instance manipulations, such as a delta update.

RFC 3229

3xx Redirection

Further action is needed, usually following a redirect to another URL.

300

Multiple Choices

The request has more than one possible response. The client or user should choose one of them.

RFC 9110
301

Moved Permanently

The URL of the requested resource has been changed permanently. Browsers cache this redirect and search engines transfer ranking signals to the new URL.

Often confused with 308 Permanent Redirect: both are permanent. After a 301 a client may change POST to GET, after a 308 the method and body stay the same.

RFC 9110
302

Found

The resource is temporarily at a different URL and clients should keep using the original one. Google treats it as only a weak signal to switch to the new URL, so use 301 or 308 for permanent moves.

Often confused with 307 Temporary Redirect: both are temporary. After a 302 a client may change POST to GET, after a 307 the method and body stay the same.

RFC 9110
303

See Other

The response can be found at another URL using a GET request. Often used after a POST so a page refresh does not resubmit the form.

RFC 9110
304

Not Modified

The client’s cached copy is still valid and can be reused. Sent in response to conditional requests with If-None-Match or If-Modified-Since headers.

RFC 9110
305

Use Proxy

Deprecated

Deprecated. The requested resource must be accessed through the specified proxy. No longer used due to security concerns.

RFC 9110
306

(Unused)

Reserved

Reserved. It was defined as Switch Proxy in an early draft and is no longer used, but the number remains reserved.

RFC 9110
307

Temporary Redirect

The resource is temporarily at another URL. Unlike 302, the request method and body must not change when following the redirect.

Often confused with 302 Found: both are temporary. After a 302 a client may change POST to GET, after a 307 the method and body stay the same.

RFC 9110
308

Permanent Redirect

The resource has permanently moved. Like 301, but the request method and body must not change when following the redirect.

Often confused with 301 Moved Permanently: both are permanent. After a 301 a client may change POST to GET, after a 308 the method and body stay the same.

RFC 9110

4xx Client Errors

The request contains an error or cannot be fulfilled as sent.

400

Bad Request

The server cannot process the request due to a client error. Check the request syntax, query parameters, and JSON body for mistakes.

Often confused with 422 Unprocessable Content: 400 is for a request the server cannot make sense of, such as broken JSON. 422 is for a request that parses fine but fails validation, such as a missing field. Many APIs use 400 for both.

RFC 9110
401

Unauthorized

Authentication is required and has failed or has not been provided. Retry with a valid Authorization header, such as a fresh token or login.

Often confused with 403 Forbidden: 401 means valid credentials are missing, so logging in can help. 403 means the server refuses anyway, so sending the same credentials again will not.

RFC 9110
402

Payment Required

Reserved

Reserved for future use. In practice some APIs use it to signal that payment is needed or a quota has been exceeded.

RFC 9110
403

Forbidden

The server understood the request but refuses to fulfill it. Sending the same credentials again will not help, and the reason may have nothing to do with credentials at all, such as a blocked IP address.

Often confused with 401 Unauthorized: 401 means valid credentials are missing, so logging in can help. 403 means the server refuses anyway, so sending the same credentials again will not.

RFC 9110
404

Not Found

The server cannot find the requested resource. Check the URL for typos. APIs may also use it to hide resources from unauthorized clients.

Often confused with 410 Gone: a 404 says nothing about whether the resource will come back, a 410 says it is gone for good.

RFC 9110
405

Method Not Allowed

The request method is known but not supported by this resource, such as sending POST to a GET-only endpoint. The Allow header lists supported methods.

RFC 9110
406

Not Acceptable

No available representation matches the client’s Accept headers, such as requesting XML from a JSON-only API.

RFC 9110
407

Proxy Authentication Required

Authentication with the proxy is required before the request can proceed. The proxy equivalent of 401.

RFC 9110
408

Request Timeout

The server timed out waiting for the request. Often caused by slow networks or a client holding a connection open without sending data.

RFC 9110
409

Conflict

The request conflicts with the current state of the resource. Typical for version conflicts, duplicate submissions, or concurrent edits.

RFC 9110
410

Gone

The resource is gone and that is likely to be permanent, with no forwarding address. Google removes 404 and 410 pages from its index in the same way.

Often confused with 404 Not Found: a 404 says nothing about whether the resource will come back, a 410 says it is gone for good.

RFC 9110
411

Length Required

The server requires a Content-Length header, which the request did not supply.

RFC 9110
412

Precondition Failed

One or more conditions in the request headers, such as If-Match, evaluated to false. Used to prevent lost updates in concurrent editing.

RFC 9110
413

Content Too Large

The request body is larger than the server accepts. Often an upload exceeding a size limit, such as client_max_body_size in nginx. Formerly called Payload Too Large.

RFC 9110
414

URI Too Long

The URI is longer than the server can interpret, usually a query string that has grown out of control.

RFC 9110
415

Unsupported Media Type

The media format of the request body is not supported by the resource. Check the Content-Type header on the request.

RFC 9110
416

Range Not Satisfiable

The requested byte range cannot be fulfilled, for example a range beyond the end of the file.

RFC 9110
417

Expectation Failed

The expectation given in the Expect request header cannot be met by the server.

RFC 9110
418

I'm a teapot

Reserved

The server refuses to brew coffee because it is, permanently, a teapot. An April Fools’ joke from 1998 that was deployed so often that the official registry now lists the number as reserved and (Unused).

RFC 2324
421

Misdirected Request

The request was directed at a server that cannot produce a response, often a TLS or HTTP/2 connection reuse issue.

RFC 9110
422

Unprocessable Content

The request was well-formed but contains semantic errors. Common in REST APIs when a field fails validation. Formerly called Unprocessable Entity.

Often confused with 400 Bad Request: 400 is for a request the server cannot make sense of, such as broken JSON. 422 is for a request that parses fine but fails validation, such as a missing field. Many APIs use 400 for both.

RFC 9110
423

Locked

The resource being accessed is locked (WebDAV).

RFC 4918
424

Failed Dependency

The request failed because a previous request it depended on also failed (WebDAV).

RFC 4918
425

Too Early

The server is unwilling to risk processing a request that might be replayed, related to TLS 1.3 early data.

RFC 8470
426

Upgrade Required

The client must switch to a different protocol, given in the Upgrade header, to continue.

RFC 9110
428

Precondition Required

The origin server requires the request to be conditional, to prevent lost updates when multiple clients edit the same resource.

RFC 6585
429

Too Many Requests

The client has sent too many requests in a given amount of time. Slow down, and if the response has a Retry-After header, wait that long before retrying.

RFC 6585
431

Request Header Fields Too Large

The request headers are too large for the server to process. Oversized cookies are the most common cause.

RFC 6585
451

Unavailable For Legal Reasons

The resource cannot legally be provided, often due to censorship, court order, or a takedown request. The number references Fahrenheit 451.

RFC 7725

5xx Server Errors

The server failed to fulfill a valid request.

500

Internal Server Error

A generic server error when no more specific 5xx code fits. Check the server logs for the underlying exception.

RFC 9110
501

Not Implemented

The server does not support the functionality needed to fulfill the request, such as an HTTP method it does not recognize at all.

RFC 9110
502

Bad Gateway

The server, acting as a gateway, received an invalid response from the upstream server. Common with reverse proxies when the backend crashes.

Often confused with 504 Gateway Timeout: with a 502 the upstream server sent an invalid answer or refused the connection, with a 504 it did not answer in time.

RFC 9110
503

Service Unavailable

The server is not ready to handle the request. Usually temporary: planned maintenance, an overloaded server, or a backend marked unhealthy.

RFC 9110
504

Gateway Timeout

The gateway did not receive a timely response from the upstream server. Check upstream timeout settings and long-running requests.

Often confused with 502 Bad Gateway: with a 502 the upstream server sent an invalid answer or refused the connection, with a 504 it did not answer in time.

RFC 9110
505

HTTP Version Not Supported

The HTTP version used in the request is not supported by the server.

RFC 9110
506

Variant Also Negotiates

Transparent content negotiation resulted in a circular reference. A server configuration error.

RFC 2295
507

Insufficient Storage

The server cannot store the representation needed to complete the request (WebDAV).

RFC 4918
508

Loop Detected

The server detected an infinite loop while processing the request (WebDAV).

RFC 5842
510

Not Extended

Obsolete

Further extensions to the request are required for the server to fulfill it. The specification was moved to Historic and the registry marks the code as obsolete.

RFC 2774
511

Network Authentication Required

The client needs to authenticate to gain network access. Shown by captive portals on hotel, airport, and cafe Wi-Fi.

RFC 6585

Unofficial & Server-Specific

Non-standard codes used by nginx, Cloudflare, AWS, and other platforms. Some are only logged or handled inside the server and never reach the client. Not part of the official IANA registry.

419

Page Expired

Returned by Laravel when a CSRF token is missing or expired. Refresh the page and submit the form again.

Unofficial · Laravel
420

Enhance Your Calm

Retired

Returned by the original Twitter API when a client was rate limited. Retired in favor of the standard 429.

Unofficial · Twitter
444

No Response

An nginx-specific code that closes the connection without sending any response. Used to drop malicious or unwanted requests.

Unofficial · nginx
460

Client Closed Connection

An AWS load balancer code. The client closed the connection before the load balancer’s idle timeout ran out, usually because the client’s own timeout is shorter than the time the target needs to respond.

Often confused with 499 Client Closed Request: the same event seen by different software. nginx logs 499 and an AWS load balancer records 460 when the client hangs up before the response.

Unofficial · AWS
463

Too Many Forwarded IPs

An AWS load balancer code. The X-Forwarded-For header contained more than 30 IP addresses.

Unofficial · AWS
464

Incompatible Protocol Versions

An AWS load balancer code. The protocol of the incoming request does not fit the protocol version of the target group, such as an HTTP/1.1 request sent to a gRPC or HTTP/2 target group.

Unofficial · AWS
494

Request Header Too Large

An nginx-internal code: a request header exceeded the configured buffer size. Unless an error_page rule handles it, the client receives a plain 400. A request line that is too long gets 414 instead.

Unofficial · nginx
495

SSL Certificate Error

An nginx-internal code: verifying the client’s certificate failed. It can be handled with an error_page rule, otherwise the client receives a plain 400.

Unofficial · nginx
496

SSL Certificate Required

An nginx-internal code: the client did not present the required certificate. It can be handled with an error_page rule, otherwise the client receives a plain 400.

Unofficial · nginx
497

HTTP Request Sent to HTTPS Port

An nginx-internal code: a plain HTTP request was sent to a port listening for HTTPS. Often handled with an error_page rule that redirects to HTTPS, otherwise the client receives a plain 400.

Unofficial · nginx
499

Client Closed Request

An nginx log code that is never sent to anyone: the client closed the connection before nginx could send a response. Usually an impatient client, a low proxy timeout, or users navigating away.

Often confused with 460 Client Closed Connection: the same event seen by different software. nginx logs 499 and an AWS load balancer records 460 when the client hangs up before the response.

Unofficial · nginx
509

Bandwidth Limit Exceeded

The site exceeded its hosting bandwidth quota. Common on shared cPanel and Apache hosting.

Unofficial · Apache
520

Web Server Returned an Unknown Error

A Cloudflare code: the origin returned an empty, malformed, or unexpected response. Check the origin server logs.

Unofficial · Cloudflare
521

Web Server Is Down

A Cloudflare code: Cloudflare could not connect to the origin server. The origin is offline or blocking Cloudflare IP addresses.

Unofficial · Cloudflare
522

Connection Timed Out

A Cloudflare code: Cloudflare timed out contacting the origin, either while opening the TCP connection or while waiting for the origin to acknowledge the request. Often firewall rules or an overloaded origin server.

Unofficial · Cloudflare
523

Origin Is Unreachable

A Cloudflare code: Cloudflare could not route to the origin, most often a DNS or network configuration problem.

Unofficial · Cloudflare
524

A Timeout Occurred

A Cloudflare code: the connection to the origin succeeded but no HTTP response arrived in time, or sending the request data to the origin timed out. Long-running requests are the usual cause.

Unofficial · Cloudflare
525

SSL Handshake Failed

A Cloudflare code: the TLS handshake between Cloudflare and the origin failed. Check the origin certificate and SSL settings.

Unofficial · Cloudflare
526

Invalid SSL Certificate

A Cloudflare code: the origin certificate was rejected, usually expired or self-signed while SSL mode is set to Full (strict).

Unofficial · Cloudflare
527

Railgun Error

Retired

A legacy Cloudflare code from the retired Railgun service, signaling a failed connection between Railgun components.

Unofficial · Cloudflare
530

Origin DNS Error

A Cloudflare code shown with an accompanying 1xxx error. Most often the origin hostname could not be resolved in DNS.

Unofficial · Cloudflare
561

Unauthorized

An AWS load balancer code. A listener rule is set to authenticate users, but the identity provider returned an error code while authenticating the user. The access logs hold the error reason code.

Unofficial · AWS
562

JWKS Request Failed

An AWS load balancer code. The load balancer did not get a successful and valid response from the JWKS endpoint it uses to verify JSON Web Tokens.

Unofficial · AWS