100ContinueRFC 9110 §15.2.1
Sent before a large POST body so the server can OK or reject it via Expect: 100-continue. The client withholds the body until that 100 arrives — saves bandwidth on rejected uploads.
101Switching ProtocolsRFC 9110 §15.2.2
WebSocket / HTTP/2 upgrade response. After the Upgrade header negotiation, the same connection switches to a different protocol.
103Early HintsRFC 8297
Hints (Link: rel=preload) sent before the main response. Browsers begin fetching CSS / JS while the server is still working — a TTFB win.
200OKRFC 9110 §15.3.1
Standard success with a body. Used by GET, POST, PUT — the server commits to providing a body.
201CreatedRFC 9110 §15.3.2
Resource was created. Usually accompanied by a Location header pointing to the new resource. The canonical response to POST /users.
202AcceptedRFC 9110 §15.3.3
Received but processed asynchronously. Background jobs, queued mail, video encoding. Pair with a polling URL the client can check.
204No ContentRFC 9110 §15.3.5
Success without a body. PUT, DELETE, post-form-submit redirects. Send Content-Length: 0.
206Partial ContentRFC 9110 §15.3.7
Partial range response. Video streaming, chunked downloads. Send a Content-Range header so the client knows the slice.
301Moved PermanentlyRFC 9110 §15.4.2
Permanent move. Search engines and browsers cache the new URL. Standard for domain migration and forced HTTPS. Method may change — use 308 to preserve.
302FoundRFC 9110 §15.4.3
Temporary move. Not cached. A/B tests, login branching, transient redirects. POST → GET (legacy compatibility).
304Not ModifiedRFC 9110 §15.4.5
Conditional GET hit. Pair with If-None-Match / If-Modified-Since. No body — bandwidth savings is the point.
307Temporary RedirectRFC 9110 §15.4.8
Like 302 but the method is preserved. A POST stays a POST at the new URL.
308Permanent RedirectRFC 9110 §15.4.9
Like 301 but the method is preserved. The proper permanent redirect for REST APIs.
400Bad RequestRFC 9110 §15.5.1
The request itself is wrong. JSON parse failure, bad method, format error. The 4xx default when nothing more specific fits.
401UnauthorizedRFC 9110 §15.5.2
Authentication is required. WWW-Authenticate tells the client which scheme (Basic, Bearer, Digest). The auth is missing or failed (expired token).
402Payment RequiredRFC 9110 §15.5.3
Almost never used. Stripe and other payment SaaS use it for card decline. The spec marks it 'reserved'.
403ForbiddenRFC 9110 §15.5.4
Authenticated but not authorized. Token is valid, just no permission for this resource. Don't confuse with 401 — 401 = 'who?', 403 = 'no.'
404Not FoundRFC 9110 §15.5.5
Resource not found. The route doesn't exist or the ID didn't match. Often used in place of 403 to avoid leaking which IDs exist (GitHub pattern).
405Method Not AllowedRFC 9110 §15.5.6
Wrong method on a real route. The route exists; the method (GET / POST / etc.) isn't defined for it. List allowed methods in an Allow header.
406Not AcceptableRFC 9110 §15.5.7
Client's Accept header asked for a format the server can't provide (e.g. application/xml). Content negotiation failed. Rare in practice.
408Request TimeoutRFC 9110 §15.5.9
Client too slow — connection timed out. Usually keep-alive idle expiry. Client opens a fresh connection and retries.
409ConflictRFC 9110 §15.5.10
Conflict with current state. Duplicate signup, simultaneous edits, optimistic-lock failure. Explain the conflict in the body.
410GoneRFC 9110 §15.5.11
Permanently removed. Different from 404 — this is an explicit 'we deleted this'. Speeds up SEO deindex.
413Content Too LargeRFC 9110 §15.5.14
Request body too large. Upload limit exceeded. Tell the client the limit (Retry-After or in the body).
415Unsupported Media TypeRFC 9110 §15.5.16
Unsupported Content-Type. E.g. an endpoint that only accepts application/x-www-form-urlencoded received application/json.
418I'm a teapotRFC 2324
I am a teapot. RFC 2324's April Fool's joke. Some sites use it as a bot-block signal (Google has).
422Unprocessable ContentRFC 9110 §15.5.21
JSON parses fine, but the values fail validation. More specific than 400 — common in Laravel, FastAPI, Rails.
429Too Many RequestsRFC 6585 §4
Rate limit hit. Retry-After tells the client when to try again (seconds or HTTP-date).
451Unavailable For Legal ReasonsRFC 7725
Blocked for legal reasons (censorship). RFC 7725 — named for Fahrenheit 451. EU GDPR, Korean MOIS, US DMCA.
500Internal Server ErrorRFC 9110 §15.6.1
Server-side code error. Exception, null pointer, DB outage. Show users a generic message; log the full stack.
501Not ImplementedRFC 9110 §15.6.2
Server doesn't recognize the method (PROPFIND, etc.). Different from 405 — 405 has the route but not the method.
502Bad GatewayRFC 9110 §15.6.3
Proxy got a bad response from upstream. The origin behind nginx / a CDN died or returned garbage.
503Service UnavailableRFC 9110 §15.6.4
Service temporarily unavailable. Restart, overload, maintenance. Add Retry-After — search engines will revisit on 503 + Retry-After.
504Gateway TimeoutRFC 9110 §15.6.5
Proxy didn't get a response in time. Different from 502 — 502 is bad reply, 504 is no reply.
511Network Authentication RequiredRFC 6585 §6
Captive-portal trigger — hotel / airport Wi-Fi 'agree to terms' redirects. RFC 6585.