dev101.io

HTTP Status Codes

HTTP Status Code Reference — search every IANA code with retry guidance.

Loading tool…

How to use HTTP Status Codes

  1. Type a numeric status code (e.g. 418) or a keyword (teapot, forbidden, rate limit) into the search box.
  2. A single match expands into a detail card showing the RFC reference, common causes, and retry guidance.
  3. Use the category tabs (1xx / 2xx / 3xx / 4xx / 5xx) to filter the grid to a single family.
  4. Click the copy icon on any card to copy the "<code> <name>" string to your clipboard for pasting into a ticket or code comment.
  5. Click Share to get a URL that restores the exact search and filter combination — useful for linking colleagues to a specific code.
  6. Clear the search box to see every code grouped by category with color bands.

HTTP Status Codes — Full Reference

A searchable, color-coded reference for every HTTP status code in the IANA registry — informational, success, redirection, client error, and server error — plus the commonly encountered non-standard codes from nginx, Cloudflare, Laravel, IIS, Twitter, and Esri ArcGIS. Every code ships with its RFC reference, a plain-English description, common real-world causes, and retry guidance so you can decide whether to back off, surface the error to the user, or fix the request.

Why a dedicated HTTP status reference

Most online HTTP status lists are autogenerated tables of "404 Not Found — the resource could not be found". That is not a reference; it is a tautology. When you are on-call debugging a production incident at two in the morning, the questions you actually need answered are different: Is this error retryable? Why did the upstream proxy emit it instead of the origin? Does this code mean my idempotency key is being ignored, or that my credentials are wrong? The IANA registry page itself is a flat table with two columns and zero guidance. The RFCs have the guidance but are 200-page documents you cannot grep quickly.

This tool is the in-between layer. Every code carries a one- or two-sentence description, three to four of the most common real-world causes (based on the actual text of the defining RFC plus the vendor docs for nginx, Cloudflare, and the major cloud load balancers), and an explicit retryable / idempotent-safe flag so you can wire an HTTP client's retry policy straight from the card. The color-band grouping mirrors the mental model most engineers use — green for success, yellow for redirection, red for client error, dark red for server error — and the search box accepts either a numeric code or a keyword so you can jump straight from "rate limit" to 429 without scrolling.

What it does

  • Inlined IANA registry. All 63+ codes from the IANA HTTP Status Code Registry (RFC 9110, RFC 7540, RFC 6585, RFC 8297, WebDAV) are included, plus the commonly encountered non-standard codes (418, 419, 420, 440, 444, 451, 494–499, 520–526).
  • Search by code or keyword. Type a number (418), a reason phrase (Not Found), a fragment (teapot, forbidden, rate limit), or a category shortcut (4xx). The search runs against names, descriptions, and common causes.
  • Detail card for exact matches. Single-match queries expand into a large card that shows the code, name, RFC reference, full description, common-cause bullets, retry guidance, and idempotency flag.
  • Filterable grid. Category tabs (All / 1xx / 2xx / 3xx / 4xx / 5xx) narrow the grid to a single family. Color bands on every card match the category for at-a-glance scanning.
  • Per-card copy button. One click copies the "<code> <name>" string so you can paste it into an incident ticket, a PR description, or a log-filter query.
  • Shareable URLs. The query and category filter round-trip through the URL fragment (#s=…) so you can bookmark a filtered view or send it to a colleague. Nothing is sent to the server — fragments are client-only by design.

Retry semantics — the short version

HTTP codes fall into three retry buckets:

  • Retry with backoff: 408, 425, 429, 500, 502, 503, 504 — and the Cloudflare 5xx family (520, 521, 522, 523, 524). These signal a transient failure where the next attempt may succeed. Use exponential backoff with full jitter. Honour Retry-After if it is set.
  • Do not retry, fix the request: 400, 401, 403, 404, 405, 409, 413, 414, 415, 422, 431. The request itself is wrong — retrying the identical bytes will fail the identical way.
  • Retry only for idempotent methods: 501 Not Implemented and 507 Insufficient Storage. A subsequent request may succeed after the server is updated or quota is freed, but replaying a non-idempotent POST is unsafe.

Each card in the tool flags the retry bucket explicitly, plus a second flag for idempotent-safe retry so you can build a client-side policy that never retries a non-idempotent POST on a 5xx by accident.

What's not supported (yet)

  • HTTP/2 and HTTP/3 stream errors. Codes like REFUSED_STREAM or ENHANCE_YOUR_CALM are frame-level, not status-level — they deserve a separate tool when HTTP/3 becomes widespread enough to matter in day-to-day debugging.
  • Vendor-specific extended codes beyond the common set. Apache mod_security returns 406/418 with custom reason phrases; Azure Front Door invents 5xx sub-codes. The tool only ships the codes that appear in real production traffic across multiple vendors.
  • History / changelog. RFC 9110 deprecated a handful of phrases (413 is now "Content Too Large", not "Payload Too Large"). The tool ships current names only; if you need the historical phrase, check the RFC.

If you want to go deeper on a related area, the URL Encoder / Decoder handles query-string-level debugging, the JWT Decoder handles the Bearer-token side of 401 investigations, and the JSON Formatter handles the error bodies most 4xx responses carry.

Privacy and trust

Everything in this tool is client-side. The status registry is a TypeScript constant compiled into the page bundle; search runs against that constant in memory; no API call fires when you type. The share button encodes state into the URL fragment (#…), which browsers never transmit to servers. The repository is open source, the implementation is a single file of ~700 lines, and the component uses the same shared primitives (CopyButton, ShareButton, Badge) as every other tool on the site — no new third-party packages were added to ship this feature.

Frequently asked questions

What is the difference between HTTP 401 and 403?

401 Unauthorized means the request lacks valid authentication — the server does not yet know who you are, so sending (or refreshing) credentials may fix it. 403 Forbidden means the server has identified the caller but refuses to grant access — the identity is known but the permission is not. A good rule of thumb is "401 = log in, 403 = you are logged in but not allowed". The 401 response must also include a `WWW-Authenticate` header naming the scheme (Bearer, Basic, Digest), while a 403 response does not.

When should I retry a failed HTTP request?

Retry on transient codes — 408 Request Timeout, 425 Too Early, 429 Too Many Requests, 500 Internal Server Error, 502 Bad Gateway, 503 Service Unavailable, and 504 Gateway Timeout — using exponential backoff with jitter. Honour the `Retry-After` header if the server sends one. Do not retry on 4xx codes that signal a client mistake (400, 401, 403, 404, 409, 422) because the same request will fail the same way. For non-idempotent methods like POST, retry only if you can guarantee exactly-once semantics (idempotency keys) or if your 5xx retry policy is explicitly scoped to safe methods.

Is HTTP 418 I'm a Teapot a real code?

Yes and no. It was formally defined by RFC 2324 as part of the Hyper Text Coffee Pot Control Protocol (HTCPCP), an April Fools' specification published in 1998. Although the RFC is a joke, the code is preserved in the IANA HTTP Status Code Registry as a reserved "unused" code and has been implemented as an Easter egg in servers like Google's, Node.js, and Spring. Some WAF vendors (notably Cloudflare) repurpose 418 to indicate traffic they have classified as malicious or bot-driven, which is why you may occasionally see a genuine 418 from a hardened edge in front of a production origin.

What is the difference between 301 and 308 (or 302 and 307)?

All four are redirect codes. 301 (Moved Permanently) and 302 (Found, temporary) predate a strict spec on method preservation, so many clients silently turn a POST redirect into a GET. 307 (Temporary Redirect) and 308 (Permanent Redirect) were introduced later to forbid that downgrade — a POST stays a POST when the client follows the `Location` header. For API endpoints you almost always want 307 or 308 because they preserve both the method and the request body. Use 301/308 when the URL has moved for good, 302/307 when the move is temporary (maintenance, A/B routing, regional failover).

How do I implement rate limiting with HTTP 429?

Respond with 429 Too Many Requests once the client exceeds the configured rate, and include a `Retry-After` header telling the client how many seconds (or a future HTTP-date) to wait before trying again. Include explicit rate headers like `X-RateLimit-Limit`, `X-RateLimit-Remaining`, and `X-RateLimit-Reset` so well-behaved clients can pace themselves. On the server, implement a token-bucket or leaky-bucket counter keyed by API key, IP, or user ID; sliding windows are more accurate than fixed windows but cost more memory. Clients should back off exponentially with jitter on 429, never retrying faster than the `Retry-After` value.

Does this tool send my search queries anywhere?

No. The entire HTTP status code reference is inlined in the page bundle as a TypeScript constant, and every search runs against that in-memory dataset. There is no API call when you type, no analytics on your queries, and no outbound request when you click a result. The share button encodes your query and category filter into the URL fragment (#…), which browsers never transmit to servers by design, so even a shared link keeps everything client-side.

Related tools