HTTP Status Codes

A full reference of HTTP statuses with human explanations: what each code means and when you hit it in practice. Search by number or name, click a code for a direct link.

Nothing found. Try another number or word.

1xx — Informational

The request was received and processing continues. Interim responses.

100
Continue#

The server got the start of the request and tells the client to keep sending the body. You see it with the Expect: 100-continue header, when the client asks permission before uploading a large body.

101
Switching Protocols#

The server agrees to switch protocols as requested in the client's Upgrade header. The classic example is upgrading an HTTP connection to WebSocket.

102
Processing#

A deprecated WebDAV code meaning the server accepted the request and is still working on it, so the client doesn't time out. Rarely used in practice — 103 took its place.

103
Early Hints#

The server sends headers early (usually Link with preload/preconnect) while it prepares the main response. Lets the browser start fetching critical resources sooner.

2xx — Success

The request was successfully received, understood, and processed.

200
OK#

The request succeeded and the response body carries the useful data. The most common code for GET and any operation that returns a result.

201
Created#

The request succeeded and created a new resource — the typical answer to a POST. Good practice is to return a Location header pointing at the new resource.

202
Accepted#

The request was accepted but is processed asynchronously and isn't finished yet. Used for background jobs and queues where the result comes later.

203
Non-Authoritative Information#

A successful response whose metadata was modified by an intermediary (like a proxy) rather than coming straight from the origin server. Very rarely seen.

204
No Content#

The request succeeded but there is no body to return — nothing to send back. Unlike 200, it's handy for DELETE or for PUT/PATCH when the client needs no data in return.

205
Reset Content#

The request succeeded and the client is asked to reset the form or view it submitted from. Almost never seen in the wild.

206
Partial Content#

The server returns only part of the resource in response to a Range header. This is what powers resumable downloads and video/audio seeking.

207
Multi-Status#

A WebDAV code where the body holds several independent statuses for different operations at once (usually as XML). Useful when one request touches many resources.

208
Already Reported#

A WebDAV code: this element was already listed in a previous part of a Multi-Status response, so it isn't repeated. Niche — you won't meet it outside WebDAV.

226
IM Used#

The server fulfilled the request and returned a delta-encoding result (RFC 3229) instead of the full resource. Exotic; you basically never hit it in everyday web work.

3xx — Redirection

Further action is needed to complete the request — usually following another URL.

300
Multiple Choices#

The requested resource has several representations and the client is invited to pick one. Rarely used in practice — the server usually decides for the client.

301
Moved Permanently#

The resource has moved for good to the new URL in the Location header. Unlike 302, search engines pass link equity to the new address, so 301 is the choice for a permanent move.

302
Found#

A temporary redirect: the resource currently lives at a different URL but will return to the old one. Unlike 301, no SEO equity is passed; historically browsers switched the method to GET, so use 307 if you must preserve it.

303
See Other#

Tells the client to fetch the result from another URL using GET, regardless of the original method. The backbone of the POST/Redirect/GET pattern, so a page refresh won't resubmit the form.

304
Not Modified#

The resource hasn't changed since the client's cached version (via ETag or If-Modified-Since), so no body is sent — use your cache. Saves bandwidth on conditional requests.

305
Use Proxy#

Indicates the resource must be accessed through the proxy in the Location header. Deprecated as insecure; modern browsers ignore it.

307
Temporary Redirect#

A temporary redirect like 302, but with a strict guarantee: the method and body are preserved (a POST stays a POST). Use it when the request must not turn into a GET.

308
Permanent Redirect#

A permanent redirect like 301, but it preserves the method and body. Think of it as "301 for POST": the address moved for good and the method must not become GET.

4xx — Client errors

The problem is on the client side: the request is malformed or not allowed.

400
Bad Request#

The server couldn't understand the request because of a client-side error: broken syntax, invalid JSON, missing required fields. The generic "you sent something wrong" answer.

401
Unauthorized#

The client isn't authenticated: the token is missing, expired, or invalid — the system doesn't know who you are. Unlike 403, the issue is that you haven't identified yourself; log in and retry.

402
Payment Required#

Reserved for future payment use and long mostly unused. These days some APIs return it when payment is needed or a plan's quota is exceeded.

403
Forbidden#

The server knows who you are but refuses access — you lack the rights. Unlike 401, logging in again won't help: you're authenticated, but this operation isn't permitted for you.

404
Not Found#

No resource exists at this address, and the server doesn't say whether it ever did. Unlike 410, it makes no claim about the resource's fate — maybe it never existed.

405
Method Not Allowed#

The resource exists but the HTTP method doesn't apply to it (e.g. a POST where only GET is allowed). The server must list the allowed methods in the Allow header.

406
Not Acceptable#

The server can't produce a response in any format the client asked for via the Accept header. For example, the client wants XML but only JSON is available.

407
Proxy Authentication Required#

Like 401, but you must authenticate with the proxy server rather than the target resource. The proxy expects a Proxy-Authorization header.

408
Request Timeout#

The client took too long to send its request, so the server gave up waiting and closed the connection. You can simply retry the request.

409
Conflict#

The request clashes with the current state of the resource: editing a stale version, or creating something that already exists. Often used for optimistic locking and duplicate detection.

410
Gone#

The resource existed but has been permanently removed and won't come back. Unlike 404, this is an explicit "it's gone for good" — a signal for search engines to drop the page.

411
Length Required#

The server refuses the request because it lacks a Content-Length header. Shows up when the server needs to know the body size up front.

412
Precondition Failed#

One of the conditions in the request headers (If-Match, If-Unmodified-Since, etc.) failed, so the request was rejected. Guards against overwriting data someone else changed.

413
Content Too Large#

The request body is larger than the server is willing to accept (formerly Payload Too Large). Typical when uploading files that are too heavy.

414
URI Too Long#

The request URL is longer than the server will process. Usually a GET with a huge number of query-string parameters — switch to POST.

415
Unsupported Media Type#

The server can't handle the body format declared in the Content-Type header. For example, XML was sent where only JSON is accepted.

416
Range Not Satisfiable#

The range requested via the Range header falls outside the resource's size. Happens during resumed downloads when the offset exceeds the file length.

417
Expectation Failed#

The server can't meet the requirement in the Expect header (usually Expect: 100-continue). Not seen very often in practice.

418
I'm a teapot#

I'm a teapot, so I can't brew coffee. A joke code from the April Fools' RFC 2324 (HTCPCP); sometimes used as an easter egg or a placeholder response.

421
Misdirected Request#

The request reached a server not configured to respond to it (the wrong host behind this connection). Relevant in HTTP/2 when connections are reused across domains.

422
Unprocessable Content#

The request syntax is fine, but the data doesn't make sense — business-rule validation failed. Unlike 400 (a malformed request), here the request is understood but semantically wrong; popular in APIs and Laravel.

423
Locked#

The resource is locked (a WebDAV code) and can't be changed until the lock is released. Rarely seen outside WebDAV.

424
Failed Dependency#

The request failed because another request it depended on failed (WebDAV). A niche code.

425
Too Early#

The server isn't willing to process a request sent too early (TLS 1.3 early data), to avoid replay attacks. It asks the client to retry after the full handshake.

426
Upgrade Required#

The server refuses to proceed over the current protocol and requires switching via the Upgrade header (e.g. to TLS). It comes with an Upgrade header.

428
Precondition Required#

The server requires the request to be conditional (e.g. with If-Match) to avoid a race when changes happen concurrently. Protection against the "lost update" problem.

429
Too Many Requests#

The client is sending too many requests in a given window — rate limiting kicked in. The server usually adds a Retry-After header telling you when to try again.

431
Request Header Fields Too Large#

The request headers are too large, either in total or individually, and the server refuses them. A common cause is bloated cookies.

451
Unavailable For Legal Reasons#

Access is blocked for legal reasons — censorship, a government takedown order, or DMCA. The number is a nod to the novel "Fahrenheit 451".

5xx — Server errors

The request is valid, but the server failed to fulfil it.

500
Internal Server Error#

Something broke on the server and it can't explain it more specifically — the catch-all for any unexpected error. Most often it's an unhandled exception in the code.

501
Not Implemented#

The server doesn't support the functionality needed to handle this kind of request at all. Unlike 405, the method isn't just disabled for a resource — the server doesn't support it at all.

502
Bad Gateway#

A server acting as a gateway or proxy got an invalid response from the upstream server. Classic when nginx sits in front of your app and the app returns garbage or crashes.

503
Service Unavailable#

The server temporarily can't handle the request — overload or maintenance. Usually comes with Retry-After; the condition is temporary and should pass soon.

504
Gateway Timeout#

A gateway or proxy didn't get a response from the upstream server in time. Unlike 502, no response came at all rather than a broken one.

505
HTTP Version Not Supported#

The server doesn't support the HTTP protocol version used in the request. Extremely rare in practice.

506
Variant Also Negotiates#

A server misconfiguration in content negotiation: the chosen variant itself tries to negotiate, creating a loop. Exotic.

507
Insufficient Storage#

The server ran out of storage space to complete the request (a WebDAV code). Shows up on write operations when the disk or quota is full.

508
Loop Detected#

The server detected an infinite loop while processing the request (WebDAV) and aborted. A niche code.

510
Not Extended#

The server needs further extensions to fulfill the request that the request itself doesn't provide. Practically never used.

511
Network Authentication Required#

The client needs to authenticate to gain network access. The classic example is a captive portal — the login screen on public Wi-Fi.

What HTTP status codes are. An HTTP status code is a three-digit number the server returns for every request to report its outcome. The first digit sets the class: 1xx informational, 2xx success, 3xx redirection, 4xx client error, 5xx server error. Knowing the codes matters when debugging APIs, configuring redirects, and reading logs: the number instantly tells you whose side the problem is on and what to do next.

FAQ

What is the difference between 301 and 302?

301 is a permanent redirect: the address moved for good and search engines pass link equity to the new URL. 302 is temporary: the resource currently lives elsewhere but will return, and no SEO equity is passed. For a permanent move, always use 301.

How is 401 different from 403?

401 Unauthorized means "I don't know who you are" — you aren't authenticated and need to log in. 403 Forbidden means "I know who you are, but you can't do this" — you lack the rights, and logging in again won't help.

What does a 429 error mean?

429 Too Many Requests means you sent too many requests in a short window and rate limiting kicked in. The server usually adds a Retry-After header telling you when you can try again.

Is the 418 code serious?

No, 418 "I'm a teapot" is a joke code from an April Fools' RFC about controlling coffee pots. It is not used in real APIs, but sometimes appears as an easter egg or placeholder.

A complete HTTP status code reference with clear explanations. Every status — from 100 Continue to 511 Network Authentication Required — comes with a description of what it means and when you encounter it in practice. There is search by number and name and a direct link to each code.

The reference clarifies the commonly confused pairs: 301 vs 302 (permanent vs temporary redirect and their SEO impact), 401 vs 403 (not authenticated vs forbidden), 302 vs 307 vs 308 (request-method preservation), 404 vs 410 (not found vs gone for good). This helps you pick the right code when designing an API.

HTTP status codes come up when debugging REST APIs, configuring redirects and nginx, reading server logs, and working with webhooks. The reference is useful for backend and frontend developers, QA, and DevOps — to quickly understand what a given status means and where to look for the problem.

Related tools