Look up any HTTP status code and what causes it, from 1xx to 5xx. Searchable and filterable, with one-click copy and a bulk URL status checker. Free.
A status code is the first line of every HTTP response, and it is the server telling you what happened before it tells you anything else. This page is a reference for 62 of them — every code in current use across all five classes — and each entry carries a plain description, the causes that actually produce it, concrete steps to fix it, its RFC reference, and related codes you probably also want to read.
The reference tab has a search box that matches on the number, the reason phrase and the description text, so typing 429, rate or too many all land in the same place. There is a jump-to-code box for going straight to a number, filters for the five classes, and a security filter that narrows the list to codes with authentication, authorisation or exposure implications. Results show as a grid or a flat list, paginated twelve at a time, and clicking any code opens a detail panel. Several of the heavily used codes — 301, 302, 401, 403, 404, 429, 500 — also carry copy-ready configuration snippets for Nginx, Apache, Express and Next.js. Ctrl/Cmd+K focuses search; Esc closes the detail panel.
| Class | Name | What it means | Who needs to act |
|---|---|---|---|
| 1xx | Informational | The request was received; the server is still working. An interim response, not a final one. | Usually nobody — handled by the client library |
| 2xx | Successful | The request was received, understood and accepted. | Nobody |
| 3xx | Redirection | Further action is needed to complete the request, normally following a Location header. | The client, automatically |
| 4xx | Client Error | The request was malformed, unauthorised, or asked for something that is not there. | The caller — retrying the same request unchanged will not help |
| 5xx | Server Error | The request may have been valid; the server failed to fulfil it. | The server operator |
The dividing line between 4xx and 5xx is responsibility, and it is worth being strict about it. A 4xx says “you asked wrongly”; a 5xx says “I broke”. An API that returns 500 for a validation failure is lying to its callers and will drown its own error dashboards. An API that returns 400 for a database outage hides a real incident.
Two questions separate these four: is the move permanent, and is the HTTP method preserved?
| Code | Reason phrase | Permanent? | Method preserved? |
|---|---|---|---|
| 301 | Moved Permanently | Yes | Not guaranteed — clients historically rewrite POST to GET |
| 302 | Found | No | Not guaranteed — same historical rewrite |
| 303 | See Other | No | No, deliberately — the client is told to use GET |
| 307 | Temporary Redirect | No | Yes — method and body are preserved |
| 308 | Permanent Redirect | Yes | Yes — method and body are preserved |
The method-rewriting on 301 and 302 is not a browser bug; it is behaviour that predates the specification and was then documented as permitted. 307 and 308 exist precisely to remove the ambiguity. Practical consequences:
Also in the class: 300 Multiple Choices, rarely used; 304 Not Modified, the caching response to a conditional request carrying If-None-Match or If-Modified-Since, which returns headers and no body and is the single cheapest response a server can send; and 305 Use Proxy, deprecated and ignored by modern clients. Note that 306 is reserved and no longer used, which is why the list jumps from 305 to 307. When you need to trace where a chain of these actually terminates, the site’s redirect-chain-checker follows the hops one at a time.
401 Unauthorized means unauthenticated — the name is a long-standing misnomer. The server does not know who you are, or the credentials you sent were rejected. A conforming 401 must include a WWW-Authenticate header describing how to authenticate. The fix is on the credential path: send a token, refresh an expired one, correct the scheme.
403 Forbidden means the server understood the request and is refusing it, and re-authenticating will not change the outcome. The identity may be perfectly valid and simply lack the right. The fix is on the permission path: role assignments, ACLs, file ownership, bucket policy.
The test that settles it: would sending better credentials fix this? If yes, 401. If no, 403. Two wrinkles worth knowing. Some servers deliberately return 404 instead of 403 for resources you may not even know exist, because a 403 confirms existence and leaks structure — a legitimate trade of correctness for privacy. And a great many reported “403 errors” in browser consoles are actually CORS failures: the request was blocked or rejected at the origin policy layer, not because of any permission on the resource. Check the response headers before you go looking at file permissions. Related codes: 407 Proxy Authentication Required, which is 401 for a proxy rather than the origin, and 511 Network Authentication Required, the captive-portal code.
404 Not Found means the server has no representation for this URI and is not saying why. It might never have existed, it might be a typo, it might come back tomorrow. It is inherently non-committal.
410 Gone means it existed, it was deliberately removed, and it is not coming back. That extra certainty is the entire value. Crawlers treat a 410 as a stronger removal signal than a 404 and generally stop retrying sooner, and clients with a cached copy know to discard it rather than hope. When you genuinely delete content — a retired product, an expired listing, a page taken down on purpose — 410 is the honest answer and the one that gets the URL out of the index fastest.
Where 404 is still right: unknown URLs, mistyped paths, anything you have not decided about. Where neither is right: content that moved. That is a 301, and redirecting a removed page to an unrelated one is worse than either code, because it teaches crawlers that your redirects do not mean anything. The one thing you must not do is serve a “page not found” message with a 200 status — a soft 404 is invisible to every automated check you own.
These four look identical to a user and mean completely different things to whoever is on call. The distinction is which machine failed.
| Code | Reason phrase | What failed | First place to look |
|---|---|---|---|
| 500 | Internal Server Error | The application itself hit an unhandled condition | Application logs and the stack trace |
| 502 | Bad Gateway | A proxy or load balancer got an invalid or empty response from upstream | Whether the upstream process is running and listening on the expected port |
| 503 | Service Unavailable | The server is temporarily unable to handle the request — overload or planned maintenance | Capacity, worker pools, connection limits, deploy state |
| 504 | Gateway Timeout | A proxy waited for upstream and gave up | Slow queries and the proxy’s own timeout setting |
502 and 504 both point at the boundary between two systems, and the difference is whether the upstream answered badly or did not answer in time. A 502 that appears the instant you request is usually a dead backend; a 504 that appears after a fixed interval is a timeout, and that interval is a configuration value you can read. Raising the proxy timeout makes 504s disappear without making anything faster — sometimes that is the right call, more often it just moves the pain.
503 is the one class of server error that is meant to be temporary, and it is the correct code for planned maintenance. It should carry a Retry-After header so clients and crawlers know to come back rather than treating the outage as removal. The rest of the class: 501 Not Implemented (the method is unrecognised, not merely disallowed — that is 405), 505 HTTP Version Not Supported, 507 Insufficient Storage, 508 Loop Detected, and 510 Not Extended.
429 Too Many Requests says you have exceeded a rate limit. It is not a failure of your request; it is a statement about your request rate. The critical part is the Retry-After header, which the server may send as either a number of seconds or an HTTP-date, and which tells you exactly how long to wait. A client that ignores it and retries immediately is making the problem worse and will usually be limited harder.
The correct client behaviour is: read Retry-After and honour it if present; otherwise back off exponentially with some jitter, so that a fleet of clients hit by the same limit does not synchronise and retry in lockstep. Cap the number of attempts. Many APIs also expose remaining-quota headers so you can throttle before you get limited at all, and the detail panel for 429 in this tool includes worked retry-with-backoff implementations for JavaScript and TypeScript alongside rate-limiter configurations for Express and Next.js middleware.
Related codes in the same neighbourhood: 408 Request Timeout, where the client was too slow to send its request rather than too fast; 425 Too Early, which refuses a request that risks 0-RTT replay; and 431 Request Header Fields Too Large, which in practice almost always means an oversized cookie.
Allow header listing the ones that work. That header is the answer to your question.Location header pointing at what you just made. 202 Accepted means queued, not done. 204 No Content means success with deliberately empty body — correct for a DELETE.Range request. It is how video seeking and resumable downloads work, and its failure sibling is 416 Range Not Satisfiable.Expect: 100-continue) and 101 Switching Protocols (the WebSocket upgrade).The second tab takes a list of URLs — one per line or comma-separated, up to 100 at a time — and reports what each one actually returns. Bare hostnames are normalised to https:// automatically. For each URL you get the final status code, its reason phrase, the response time in milliseconds, and the full redirect chain expanded hop by hop, so a URL that goes through three 301s before landing on a 404 shows you all four steps rather than just the last one. It follows up to ten redirects, applies a five-second timeout per request, and runs up to ten checks concurrently. Results export to CSV or JSON.
This tab is the one part of the tool that is not purely local: the checks are performed server-side, because a browser cannot read cross-origin response headers or observe a redirect chain without following it opaquely. Requests are sent with HEAD where the server supports it, and identify themselves honestly in the User-Agent. The reference tab, by contrast, is entirely static data in the page — searching and filtering send nothing anywhere.
One note on RFC references. Each entry cites the specification that defined it, and for most core codes that is the RFC 7230–7235 series. Those were consolidated into RFC 9110 in 2022, which is now the authoritative document for HTTP semantics; the codes and their meanings did not change, and a handful of reason phrases were retitled — 413 to Content Too Large, 422 to Unprocessable Content. Codes defined outside the core series keep their own references: RFC 6585 for 428, 429, 431 and 511; RFC 7538 for 308; RFC 7725 for 451; RFC 8297 for 103; RFC 4918 for the WebDAV codes.
HTTP status codes are three-digit numbers returned by web servers in response to client requests. They indicate whether a request was successful, redirected, resulted in a client error, or caused a server error. Understanding status codes is essential for web development, API design, debugging, and monitoring.
Status codes are defined by RFC 9110 (HTTP Semantics) and organized into five classes based on their first digit. This tool provides a comprehensive reference for all standard and common non-standard status codes with explanations, use cases, and debugging guidance.
| Class | Range | Meaning | Examples |
|---|---|---|---|
| 1xx | 100-199 | Informational — request received, processing continues | 100 Continue, 101 Switching Protocols |
| 2xx | 200-299 | Success — request received, understood, and accepted | 200 OK, 201 Created, 204 No Content |
| 3xx | 300-399 | Redirection — further action needed to complete request | 301 Moved Permanently, 302 Found, 304 Not Modified |
| 4xx | 400-499 | Client Error — request contains errors or cannot be fulfilled | 400 Bad Request, 401 Unauthorized, 404 Not Found |
| 5xx | 500-599 | Server Error — server failed to fulfill a valid request | 500 Internal Server Error, 502 Bad Gateway, 503 Service Unavailable |
| Code | Name | When Returned |
|---|---|---|
| 200 | OK | Request succeeded — response contains the requested resource |
| 201 | Created | Resource was successfully created (POST/PUT) |
| 204 | No Content | Success, but no response body (DELETE, updates) |
| 301 | Moved Permanently | Resource has a new permanent URL — update bookmarks |
| 304 | Not Modified | Cached version is still valid — no data transfer needed |
| 400 | Bad Request | Request syntax or parameters are invalid |
| 401 | Unauthorized | Authentication required or failed |
| 403 | Forbidden | Authenticated but not authorized for this resource |
| 404 | Not Found | Resource does not exist at this URL |
| 429 | Too Many Requests | Rate limit exceeded — slow down |
| 500 | Internal Server Error | Generic server failure — check server logs |
| 502 | Bad Gateway | Upstream server returned an invalid response |
| 503 | Service Unavailable | Server is overloaded or in maintenance |
HTTP status codes are 3-digit responses from servers indicating request results. Categories: 1xx (informational), 2xx (success), 3xx (redirection), 4xx (client error), 5xx (server error). Purpose: communicate success/failure, enable proper error handling, assist debugging, affect SEO rankings. Common codes: 200 OK (success), 404 Not Found (missing resource), 500 Internal Server Error (server problem). Clients use codes to: retry on 503, cache 200 responses, follow 301 redirects, display error messages. Essential for web APIs, browser behavior, and application logic.
Redirect codes indicate resource moved: 301 Moved Permanently: permanent redirect, search engines transfer SEO value, browsers cache it. 302 Found (temporary): temporary redirect, search engines keep original URL, may not cache. 307 Temporary Redirect: like 302 but preserves request method (POST stays POST), more explicit about temporary nature. 308 Permanent Redirect: like 301 but preserves request method, newer standard (RFC 7538). Use 301 for: domain changes, HTTPS migration, permanent URL changes. Use 302/307 for: A/B testing, maintenance mode, temporary moves. Modern practice: prefer 307/308 over 302/301 when method preservation matters.
4xx errors indicate client-side problems: 400 Bad Request: malformed syntax, invalid data. Fix: validate request format. 401 Unauthorized: missing/invalid authentication. Fix: provide credentials. 403 Forbidden: authenticated but not authorized. Fix: check permissions. 404 Not Found: resource doesn't exist. Fix: verify URL, check routes. 405 Method Not Allowed: wrong HTTP method (GET vs POST). Fix: use correct method. 408 Request Timeout: client took too long. Fix: optimize request speed. 429 Too Many Requests: rate limit exceeded. Fix: implement backoff, reduce frequency. Client fixes: validate input, provide auth, check URLs, respect rate limits.
5xx errors indicate server-side failures: 500 Internal Server Error: generic error, something broke. Check: server logs, exceptions, database connections. 502 Bad Gateway: upstream server returned invalid response. Check: proxy configuration, upstream server health. 503 Service Unavailable: temporary overload or maintenance. Check: server capacity, recent deploys. 504 Gateway Timeout: upstream server didn't respond in time. Check: upstream performance, timeout settings, database queries. Troubleshooting: check error logs, monitor server resources (CPU, memory), verify dependencies (database, APIs), review recent code changes, check network connectivity. Users should: retry request, wait during maintenance, contact support if persists.
Search engines use status codes for crawling decisions: 200 OK: page indexed normally, good. 301 Permanent Redirect: link equity transfers to new URL, search engines update index. 302/307 Temporary: link equity stays with original, doesn't update index. 404 Not Found: page removed from index, some 404s are normal (old content). 410 Gone: stronger signal than 404, permanent removal. 503 Service Unavailable: temporary, search engines retry later, prolonged 503 can cause deindexing. Best practices: use 301 for permanent changes, fix 404s on important pages or redirect them, serve 410 for intentionally removed content, avoid soft 404s (200 status but "not found" content). Monitor crawl errors in Google Search Console.
Useful specialized codes: 206 Partial Content: for range requests, video streaming, resumable downloads. 304 Not Modified: cached version still valid, saves bandwidth. 409 Conflict: request conflicts with resource state, duplicate entry, versioning conflict. 410 Gone: resource permanently deleted (stronger than 404). 418 I'm a teapot: April Fools joke (RFC 2324), actually implemented by some servers. 422 Unprocessable Entity: syntactically correct but semantically invalid data. 451 Unavailable For Legal Reasons: censorship, DMCA takedowns. 429 Too Many Requests: rate limiting, include Retry-After header. Use when: 206 for large files, 409 for optimistic locking, 422 for validation errors, 451 for compliance.
RESTful API status code conventions: GET success: 200 OK with body, 404 if not found. POST create: 201 Created with Location header, 400 for invalid data, 409 for duplicate. PUT update: 200 OK with body, 204 No Content without body, 404 if doesn't exist. PATCH partial update: 200 OK, 204 No Content. DELETE: 204 No Content, 200 if returning deleted resource, 404 if already gone. Errors: 400 for validation errors, 401 for missing auth, 403 for insufficient permissions, 422 for semantic errors, 500 for server errors. Include error details in response body. Consistent patterns improve API usability.
Rate limiting status codes: 429 Too Many Requests: standard for rate limit exceeded. Include headers: Retry-After: 60 (seconds to wait), X-RateLimit-Limit: 1000 (total allowed), X-RateLimit-Remaining: 0 (requests left), X-RateLimit-Reset: 1234567890 (Unix timestamp). Alternative: 503 Service Unavailable with Retry-After (for overload, not just rate limit). Client behavior: respect Retry-After header, implement exponential backoff, reduce request rate. Best practices: return 429 before processing request (fail fast), provide clear error messages, document rate limits, offer different tiers if applicable. Modern APIs use 429 exclusively for rate limiting, making it distinct from server errors.