Skip to content
My Tiny Utils

Search tools

Type to find a tool, then press Enter to open it.

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 registration

    A 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 default

    The 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 default

    Success, but a transforming proxy modified the origin server's 200 response — for example by recompressing images.

  • 204

    No Content

    Cacheable by default

    The 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 default

    The 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 default

    The resource has several representations (languages, formats) and the client or user should pick one.

  • 301

    Moved Permanently

    Cacheable by default

    The 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

    Deprecated

    Formerly 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, unused

    Reserved. 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 default

    Like 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 unchanged

    The 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 unchanged

    The 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 unchanged

    Reserved 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 unchanged

    The 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 unchanged

    The 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 unchanged

    The 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 unchanged

    The server can't produce a response matching the request's Accept, Accept-Language, or Accept-Encoding headers.

  • 407

    Proxy Authentication Required

    Don't retry unchanged

    Like 401, but the client must first authenticate with a proxy between it and the server.

  • 408

    Request Timeout

    Safe to retry

    The 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 unchanged

    The 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 unchanged

    The resource was deliberately removed and won't be back. Search engines drop 410 URLs faster than 404s.

  • 411

    Length Required

    Don't retry unchanged

    The server refuses a request body without a Content-Length header.

  • 412

    Precondition Failed

    Don't retry unchanged

    A 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 unchanged

    The 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 unchanged

    The URL is longer than the server will process.

  • 415

    Unsupported Media Type

    Don't retry unchanged

    The 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 unchanged

    The byte range in the Range header lies outside the resource — usually past its end.

  • 417

    Expectation Failed

    Don't retry unchanged

    The 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 unchanged

    The 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 unchanged

    Laravel's response when a form's CSRF token is missing or has expired.

  • 420

    Enhance Your Calm

    Unofficial · Twitter API v1 (retired)Safe to retry

    The old Twitter API's rate-limit response, replaced by the standard 429. Some other services still use it.

  • 421

    Misdirected Request

    Safe to retry

    The 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 unchanged

    The 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 retry

    A WebDAV resource is locked and the request didn't include the lock token.

  • 424

    Failed Dependency

    Don't retry unchanged

    A WebDAV request failed because another action it depended on failed — often inside a 207 batch.

  • 425

    Too Early

    Safe to retry

    The 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 unchanged

    The server refuses the current protocol and names the one to switch to in the Upgrade header.

  • 428

    Precondition Required

    Don't retry unchanged

    The server requires conditional requests (If-Match) to prevent lost updates, and this request had none.

  • 429

    Too Many Requests

    Safe to retry

    Rate limited: the client sent too many requests in a given time.

  • 431

    Request Header Fields Too Large

    Don't retry unchanged

    One header, or all headers together, are too large for the server.

  • 444

    No Response

    also “Connection Closed Without Response”
    Unofficial · nginxDon't retry unchanged

    nginx 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 unchanged

    Access 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 Balancing

    An 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 unchanged

    An 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 unchanged

    nginx'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 unchanged

    nginx'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 unchanged

    nginx'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 unchanged

    nginx's code for a plain-HTTP request that arrived on a port expecting TLS.

  • 499

    Client Closed Request

    Unofficial · nginx

    Logged 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 only

    The server hit an unexpected condition it has no more specific code for — usually an unhandled exception.

  • 501

    Not Implemented

    Cacheable by defaultDon't retry unchanged

    The server doesn't support the functionality required — usually a request method it doesn't recognize at all.

  • 502

    Bad Gateway

    Retry idempotent requests only

    A gateway or proxy got an invalid response — or none at all — from the upstream server it forwarded to.

  • 503

    Service Unavailable

    Safe to retry

    The server is temporarily unable to handle the request — overloaded, or down for maintenance.

  • 504

    Gateway Timeout

    Retry idempotent requests only

    A gateway or proxy didn't get a response from the upstream server in time.

  • 505

    HTTP Version Not Supported

    Don't retry unchanged

    The server doesn't support the major HTTP version used in the request.

  • 506

    Variant Also Negotiates

    Don't retry unchanged

    A 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 unchanged

    The 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 unchanged

    A WebDAV server found an infinite loop while processing a request with Depth: infinity.

  • 509

    Bandwidth Limit Exceeded

    Unofficial · Apache / cPanel hostingSafe to retry

    Shared hosting's response when an account has used up its bandwidth allowance.

  • 510

    Not Extended

    ObsoleteDon't retry unchanged

    From 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 unchanged

    A 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 only

    Cloudflare reached the origin server, but it answered with something empty, unexpected, or unparseable.

  • 521

    Web Server Is Down

    Unofficial · CloudflareRetry idempotent requests only

    The origin refused Cloudflare's connection.

  • 522

    Connection Timed Out

    Unofficial · CloudflareRetry idempotent requests only

    Cloudflare couldn't complete a TCP connection to the origin in time.

  • 523

    Origin Is Unreachable

    Unofficial · CloudflareRetry idempotent requests only

    Cloudflare can't route to the origin at all — usually a DNS or network problem.

  • 524

    A Timeout Occurred

    Unofficial · CloudflareRetry idempotent requests only

    Cloudflare 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 unchanged

    Cloudflare couldn't negotiate TLS with the origin.

  • 526

    Invalid SSL Certificate

    Unofficial · CloudflareDon't retry unchanged

    With SSL mode Full (strict), Cloudflare couldn't validate the origin's certificate.

  • 530

    Origin DNS Error

    Unofficial · CloudflareDon't retry unchanged

    Returned 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.