The server has the request headers and the client should go on and send the body.
When you see it: Sent in reply to Expect: 100-continue, so a client can learn that a large upload will be accepted before sending it. curl adds that header to big POST bodies.
Lets the server send Link headers before the final response is ready.
When you see it: Send Link: </app.css>; rel=preload; as=style or rel=preconnect while the backend is still rendering the page, so the browser can start fetching early. Browsers act on it over HTTP/2 and HTTP/3.
SEO and caching: Can shorten Largest Contentful Paint on slow server-rendered pages. Crawlers ignore it.
2xx Success
The request was received, understood and accepted.
The request succeeded. What the body holds depends on the method: the resource for GET, nothing for HEAD, the outcome for POST.
When you see it: The normal success response.
SEO and caching: A "page not found" or empty search page that answers 200 is a soft 404: search engines may index it or report it in Search Console. Return 404 or 410 instead.
The request succeeded and there is no body to send.
When you see it: DELETE, PUT or PATCH requests that return nothing, autosave endpoints and analytics beacons. A 204 must not carry a body, and browsers stay on the current page.
The body contains only the byte ranges asked for in the Range header.
When you see it: Resumable downloads and seeking in audio or video. The response carries Content-Range, or a multipart/byteranges body for several ranges.
The resource has a new permanent URL, given in the Location header.
When you see it: Domain moves, HTTP to HTTPS, renamed URLs. For historical reasons clients may turn a POST into a GET when following it, so use 308 for API endpoints that must keep the method.
SEO and caching: A strong signal: search engines index the new URL and pass ranking signals to it. Keep the redirect in place for at least a year. Browsers cache 301s hard, so test before you ship one.
The resource is temporarily at another URL; clients should keep using the original one.
When you see it: Temporary moves, login redirects, A/B tests. Like 301, browsers turn a POST into a GET when following it; 307 keeps the method.
SEO and caching: Treated as temporary, so the original URL stays indexed, though a 302 left in place for a long time may end up treated as permanent. Use 301 or 308 for permanent moves. Not cached unless Cache-Control or Expires allow it.
The cached copy the client already has is still valid, so no body is sent.
When you see it: The answer to a conditional GET or HEAD with If-None-Match (ETag) or If-Modified-Since. It must repeat the caching headers a 200 would have had (Cache-Control, ETag, Expires, Vary). Only send it to conditional requests.
SEO and caching: Saves bandwidth and crawl budget: Googlebot sends conditional requests and a 304 tells it the page hasn't changed.
Like 302, but the client must repeat the request to the new URL with the same method and body.
When you see it: Temporary redirects for APIs and form handlers. Browsers also show an internal 307 when HSTS upgrades a link from http:// to https:// without touching the network.
SEO and caching: Temporary, like 302: the original URL stays indexed.
The server won't process the request because of a client error: malformed syntax, invalid framing or unparseable content.
When you see it: Generic input errors when nothing more specific fits (422 is more precise for well-formed but invalid data). Common causes: broken JSON, an invalid query string, corrupted or oversized cookies.
The request has no valid authentication credentials for the resource.
When you see it: A missing, expired or wrong token or password. The response must include a WWW-Authenticate challenge. If the user is logged in but not allowed, send 403.
SEO and caching: Pages behind a 401 are not indexed.
The server understood the request but refuses to fulfil it, and authenticating again won't help.
When you see it: Logged-in users without permission, IP or country blocks, firewall (WAF) rules, a directory with listing disabled, wrong file permissions. A server may answer 404 instead to hide that the resource exists.
SEO and caching: Not indexed. Don't use 401 or 403 to slow down crawlers; use 429 or 503 for that.
The server has nothing at this URL, or won't say whether it does.
When you see it: Pages that were deleted or never existed, typos and broken links.
SEO and caching: Google drops 404 URLs from its index over time and doesn't penalize a site for having them. Redirect only when there is a real replacement page; redirecting everything to the home page is treated as a soft 404.
The server can't produce a representation that matches the request's Accept headers, and won't send a default.
When you see it: Rare: most servers send a default representation instead. On shared hosting it often comes from ModSecurity blocking a request it considers an attack.
The request conflicts with the current state of the resource.
When you see it: Edit conflicts, duplicate unique values (an email already registered), version mismatches. Explain the conflict in the body so the client can resolve it.
A condition in the request headers, such as If-Match or If-Unmodified-Since, turned out false.
When you see it: Optimistic concurrency: refuse a PUT when the resource's ETag changed since the client read it, so nobody overwrites someone else's edit.
The request body is larger than the server is willing to process. Formerly "Payload Too Large".
When you see it: Upload limits, such as nginx's client_max_body_size (1 MB by default) or PHP's upload_max_filesize. Send Retry-After if the limit is temporary.
The server doesn't support the body's Content-Type or Content-Encoding.
When you see it: JSON sent without Content-Type: application/json, or an upload in a format the endpoint doesn't take. The response can list what it accepts in Accept or Accept-Encoding.
The request reached a server that isn't able to answer for this origin (scheme, host and port). First defined in RFC 7540.
When you see it: HTTP/2 or HTTP/3 connection reuse across host names that share an IP address and certificate but are served by different servers, or an SNI and Host mismatch. Clients can retry on a new connection.
The server hit an unexpected condition that stopped it from fulfilling the request.
When you see it: Uncaught exceptions, crashed scripts, a syntax error in .htaccess, bad file permissions on scripts. The server's error log says what happened.
SEO and caching: Occasional 5xx errors do no harm, but persistent ones make search engines crawl less and eventually drop the affected URLs.
A gateway or proxy got an invalid response from the upstream server.
When you see it: The application behind nginx or a load balancer crashed, isn't listening, is on the wrong port, or closed the connection (for example PHP-FPM down).
The server can't handle the request right now because of overload or maintenance; it should work later.
When you see it: Planned maintenance, overload protection, a backend pool with no healthy servers. Send Retry-After with the expected wait.
SEO and caching: The right code for maintenance: search engines retry later and keep pages indexed during a short outage. Serving 503 for more than a few days can get URLs dropped.
The server can't store what the request needs it to store.
When you see it: A full disk or exhausted quota on a WebDAV or file storage server.
Unofficial and vendor-specific codes
These codes are not in the IANA registry. Each is specific to the software or service named next to it, and other servers may use the same number differently.
The WebDAV server found an infinite loop while processing a request with Depth: infinity.
When you see it: WebDAV bindings that point back at themselves. Some shared hosts also send 508 "Resource Limit Is Reached" when an account exceeds its CPU or process limits, which is a non-standard use.
Cloudflare returns 530 together with a 1xxx error such as 1016 (origin DNS error).
When you see it: Look up the 1xxx number shown on the error page.
No status code matches. Try a number like 503 or a word like "redirect".
Sources: the IANA HTTP Status Code Registry and RFC 9110 (HTTP Semantics), plus the RFCs named on each code. The unofficial group is documented by the vendors themselves.
About the HTTP Status Codes reference
This page lists every code in the IANA HTTP Status Code Registry, named as in RFC 9110 and the other RFCs that registered them. Each entry explains what the code means, when servers send it, and, where it matters, what it means for search engines and caches. Codes that caches may store without explicit headers are marked "Cacheable by default". A separate group covers unofficial codes from nginx, Cloudflare, Laravel and shared hosts, which are not standards.
How to use it
Search by number or by word, such as "redirect" or "Retry-After".
Narrow the list with the class buttons, or jump to a class.
Link to a single code with #404 at the end of the page URL.
Examples
410 Gone: how it differs from 404 for search engines.
For web pages either works: search engines treat 301 and 308 as permanent and 302 and 307 as temporary. The difference is the method: clients may turn a POST into a GET when following a 301 or 302, but must keep it for 307 and 308, so APIs should use those.
Is 404 or 410 better for removed pages?
Both remove the URL from search results in time; 410 says the removal is deliberate and may be processed a little sooner. Redirect only to a genuine replacement.
What should a maintenance page return?
503 with a Retry-After header. Search engines retry later and keep your pages indexed during a short outage.
What is 418?
A joke from a 1998 April Fools' RFC. RFC 9110 marks it unused and reserved.
Related tools
Redirect Checker: follow a URL's redirect chain and see each status.