Network Tools

HTTP Status Codes

Look up HTTP status codes and their detailed meanings.

🔍
⭐ Common status codes
Status code list62 results
ℹ️100
Continue
Continue
→
ℹ️101
Switching Protocols
Switching Protocols
→
ℹ️102
Processing
Processing
→
ℹ️103
Early Hints
Early Hints
→
✅200
OK
OK
→
✅201
Created
Created
→
✅202
Accepted
Accepted
→
✅203
Non-Authoritative Information
Non-Authoritative Info
→
✅204
No Content
No Content
→
✅205
Reset Content
Reset Content
→
✅206
Partial Content
Partial Content
→
✅207
Multi-Status
Multi-Status
→
✅208
Already Reported
Already Reported
→
✅226
IM Used
IM Used
→
↪️300
Multiple Choices
Multiple Choices
→
↪️301
Moved Permanently
Moved Permanently
→
↪️302
Found
Found (Temporary)
→
↪️303
See Other
See Other
→
↪️304
Not Modified
Not Modified
→
↪️305
Use Proxy
Use Proxy
→
↪️307
Temporary Redirect
Temporary Redirect
→
↪️308
Permanent Redirect
Permanent Redirect
→
⚠️400
Bad Request
Bad Request
→
⚠️401
Unauthorized
Unauthorized
→
⚠️402
Payment Required
Payment Required
→
⚠️403
Forbidden
Forbidden
→
⚠️404
Not Found
Not Found
→
⚠️405
Method Not Allowed
Method Not Allowed
→
⚠️406
Not Acceptable
Not Acceptable
→
⚠️407
Proxy Authentication Required
Proxy Auth Required
→
⚠️408
Request Timeout
Request Timeout
→
⚠️409
Conflict
Conflict
→
⚠️410
Gone
Gone
→
⚠️411
Length Required
Length Required
→
⚠️412
Precondition Failed
Precondition Failed
→
⚠️413
Payload Too Large
Payload Too Large
→
⚠️414
URI Too Long
URI Too Long
→
⚠️415
Unsupported Media Type
Unsupported Media Type
→
⚠️416
Range Not Satisfiable
Range Not Satisfiable
→
⚠️417
Expectation Failed
Expectation Failed
→
⚠️418
I'm a Teapot
I'm a Teapot
→
⚠️421
Misdirected Request
Misdirected Request
→
⚠️422
Unprocessable Entity
Unprocessable Entity
→
⚠️423
Locked
Locked
→
⚠️424
Failed Dependency
Failed Dependency
→
⚠️425
Too Early
Too Early
→
⚠️426
Upgrade Required
Upgrade Required
→
⚠️428
Precondition Required
Precondition Required
→
⚠️429
Too Many Requests
Too Many Requests
→
⚠️431
Request Header Fields Too Large
Header Fields Too Large
→
⚠️451
Unavailable For Legal Reasons
Unavailable (Legal)
→
❌500
Internal Server Error
Internal Server Error
→
❌501
Not Implemented
Not Implemented
→
❌502
Bad Gateway
Bad Gateway
→
❌503
Service Unavailable
Service Unavailable
→
❌504
Gateway Timeout
Gateway Timeout
→
❌505
HTTP Version Not Supported
HTTP Version Not Supported
→
❌506
Variant Also Negotiates
Variant Also Negotiates
→
❌507
Insufficient Storage
Insufficient Storage
→
❌508
Loop Detected
Loop Detected
→
❌510
Not Extended
Not Extended
→
❌511
Network Authentication Required
Network Auth Required
→

What is HTTP Status Code Reference?

HTTP status codes indicate the result of an HTTP request. This tool provides a reference for all standard status codes.

Status Code Categories

  • 1xx: Informational
  • 2xx: Success (200 OK, 201 Created)
  • 3xx: Redirection (301 Moved, 302 Found)
  • 4xx: Client Error (400 Bad Request, 404 Not Found)
  • 5xx: Server Error (500 Internal, 503 Unavailable)

Common Codes

  • 200 OK - Request successful
  • 404 Not Found - Resource not found
  • 500 Internal Server Error - Server error

A reference table of the 62 IANA-registered HTTP status codes, split into 1xx through 5xx classes, each with its standard reason phrase, a one-line meaning and a paragraph on what the server is actually saying. Reach for it while reading logs, HAR files or API responses, to decide whether a 503 deserves a retry and a 403 does not.

What the table covers, and what it deliberately omits

The rows are exactly the registered codes: 4 in 1xx, 10 in 2xx, 8 in 3xx, 29 in 4xx and 11 in 5xx. Because the list follows the IANA registry, 418 (I'm a Teapot, RFC 2324) survives as a joke entry and 305 Use Proxy stays even though RFC 9110 marks it deprecated, while 306 is absent — RFC 9110 records it as no longer used. Numbers that exist only inside one vendor stack are missing entirely: Cloudflare's 520–527, nginx's 444 and 499, Twitter's 420. So a search for 499 returning nothing means "not registered with IANA", not "impossible on the wire". When a proxy invents a number, the response headers such as Server or cf-ray identify its origin far better than any table.

Which fields the search box actually matches

The filter touches three fields only: the three-digit code as a substring, the English reason phrase lowercased, and the one-line label in the current locale. The long explanation paragraph is never indexed, and neither are the class tabs. Typing timeout returns 408 and 504; typing 30 lists the whole 3xx block; typing timely, a word that only appears inside the 504 explanation, returns nothing. The category tab and the query combine with AND, not OR. A quirk follows from the same logic in the Chinese UI: searching 重定向 finds 307 and 308 because their labels read 临时重定向 and 永久重定向, while 301 and 302 are labelled 永久移动 and 临时移动 and contain none of those characters.

What the copy button writes to the clipboard

Copying an entry emits a four-line block: the code and its English reason phrase, the localized one-line label, a blank line, then the explanation paragraph. The first line is always the IANA reason phrase, even in Chinese mode, so a pasted 408 still begins 408 Request Timeout with 请求超时 underneath. In English mode the second line duplicates the first for most entries, because the label and the phrase store the same string — that repetition is data, not a rendering bug. The format is plain text rather than JSON so the searchable three-digit code sits at the start of the line where grep and ticket search expect it. The list pane itself scrolls inside a fixed height, so the table stays compact while browsing.

Worked example

Searching a symptom instead of a number

Input
timeout
Output
2 results: 408 Request Timeout, 504 Gateway Timeout

Both rows match through the English reason phrase, not through the explanation. Searching timely instead yields zero rows even though the word is visible inside the 504 detail paragraph, because that paragraph is never part of the filter. Copying 504 then gives you the reason phrase twice: once as the name, once as the one-line label.

Limits and pitfalls

  • Only the 62 registered codes are in the table; vendor numbers such as 499, 520 or 444 return no results because they are nginx, Cloudflare or Twitter extensions rather than IANA entries.
  • The explanation paragraph is not searchable. Quoting a phrase out of it returns zero rows even though the text is on screen.
  • In Chinese mode the reason phrase stays English, so a status code quoted from a server log as 429 Too Many Requests has to be matched against the English name, not the Chinese label.
  • The table states the meaning of a number, not the content of one response: a WAF challenge and a failed permission check both return 403, and only the body and headers tell them apart.
  • Reason phrases are advisory. Servers may send any text, and clients must branch on the three digits — a 200 followed by a phrase like Error is still a success at the protocol level.

Related tools

This lookup page, or the thing next to it

SituationThis status code tablePick this instead
You have one three-digit number out of a log line and want the standard wordingGives the IANA reason phrase plus one paragraph, computed in the browser, so it still answers while the network you are debugging is the broken part.RFC 9110 Section 15 or the IANA registry. Go there for the normative sentence, the "must not be generated" constraints, or the exact deprecation wording — none of which a one-paragraph summary can carry.
You have a real response and must decide whether the caller, the origin or the gateway is at faultSplits by hundreds only: 4xx points at the request, 502 and 504 point somewhere between you and the origin. The headers that actually name the culprit are never visible here.Run curl -sS -o /dev/null -w "%{http_code}" against the endpoint, then read Server, cf-ray, x-cache and Retry-After. The number fixes the class; the headers name the machine.
Application code has to branch or decide whether to retryA lookup screen: no export, no endpoint, no constants to import, and nothing that maps a code to a retry decision.The built-in enumerations — http.HTTPStatus in Python, the net/http constants in Go, require("node:http").STATUS_CODES in Node. The Node map carries English phrases only, so the Chinese labels on this page cannot be lifted from it.
You want to know how often each code came back over a day of access logsOne query at a time, and the counter above the list reports how many rows matched, not how many times the endpoint answered that way.Field nine of the nginx combined format: awk '{print $9}' access.log | sort | uniq -c | sort -rn. With more than a handful of hosts, move to whatever log store already has the data.
The team is defining its own error codes for an APIOnly registered three-digit numbers exist here; a payload code such as 40001 or 40902 is not a status code and will never be a row.A written catalogue of your own, with a small set of HTTP codes at the edge: 4xx for the caller, 5xx for you. The number classifies, the body identifies.
You are setting the alert threshold: does 4xx traffic count as failureEvery 4xx lands in one bucket, so a 401 from an expired token is counted exactly like a 500 — the table has no notion of which meaning is a fault.Per-code rules in the dashboard: drop 401, 403 and 404 out of the SLO, and track 429 separately as a capacity signal. The table explains the meanings; the alert rule has to choose which meanings hurt.

The twelve codes a cache may store without being asked to

CodeReason phrase as it appears hereWhy a shared cache may reuse it unprompted
200OKThe plain success case. With no Cache-Control and no Expires, a cache is still allowed to invent a freshness lifetime out of Last-Modified, which is how a stale page survives a deploy.
203Non-Authoritative InformationSent when a transforming proxy rewrote the payload. It sits on the cacheable list, so the rewritten copy can keep being served after the origin stops transforming.
204No ContentOn the list even though nothing is in the body: the stored result is still a complete, reusable response, and the headers are all the client ever receives.
206Partial ContentA Range reply is cacheable, but the stored slice is only useful if the next request asks for an overlapping range — Content-Range has to be kept alongside it.
300Multiple ChoicesAlmost never produced on the wire, yet registered as cacheable, so an aggregator response can be stored and replayed by an intermediary.
301Moved PermanentlyThe main reason the list exists: an unchanged Location should not cost a trip to the origin on every single request.
308Permanent RedirectAdded in RFC 9110 to the older eleven. Same permanent meaning as 301, but the method and body must be replayed unchanged, so the cached hop cannot quietly turn a POST into a GET.
404Not FoundThe row that surprises people. A cache may store a 404 and keep answering with it after the resource appears, which is why a freshly deployed page can stay missing for the cached lifetime.
405Method Not AllowedCacheable by default, so the stored Allow list is what a later caller is judged against, not the origin as it is now.
410GoneCacheable on purpose: the resource is meant to stay absent, so re-asking the origin adds nothing.
414URI Too LongAlso on the list, so an edge can keep refusing the same oversized URI even after the limit was raised upstream.
501Not ImplementedLast of the twelve. A stored 501 can outlive the moment when the origin starts supporting the method after all.

These are the codes RFC 9110 §15.1 calls heuristically cacheable, and all twelve exist as rows in this table. The list only governs storing and guessing freshness when the response carries no explicit expiration; one Cache-Control: no-store voids every row above. 304 is absent because it carries no representation of its own — it only refreshes a copy that was already stored.

Frequently Asked Questions

301 vs 302 vs 307 vs 308 — which redirect do I pick?
The difference is method preservation and caching: 301/302 historically allow POST to be rewritten as GET (browsers do this); 307/308 strictly preserve the method — 308 is the permanent 301, 307 the temporary 302. API migrations that must preserve the method use 308/307; page moves use 301/302.
Where is the line between 4xx and 5xx?
4xx means the client is at fault (bad request, unauthorized, missing resource) — retrying unchanged will keep failing; 5xx means the server is at fault. In monitoring, a 5xx spike usually signals an outage; a 4xx spike suggests an attack or a buggy client release.
204 versus 200 — when do I use 204?
204 means success with an empty body — common for DELETE confirmations and saves, saving the overhead of an empty payload. It cannot carry a body: calling res.json() on a 204 throws, so branch on the status code.

Content reviewed: