devxcode

HTTP Status Codes Reference

Every HTTP status code with its meaning, RFC citation, cacheability and handler snippets — searchable instantly, entirely on this device.

0 bytes uploaded

1xx — Informational

1xx status codes — code, name, and one-line summary
CodeNameSummaryCopy
100ContinueInterim reply to Expect: 100-continue — the headers look acceptable, keep sending the body.
101Switching ProtocolsThe server accepts the client's Upgrade offer and is switching the connection to that protocol.
102ProcessingWebDAV interim reply: the server took the request and is still working on it.
103Early HintsInterim reply carrying Link headers so the browser can start preloading before the final response.

The same 1xx codes in full — each row above links to its entry.

100 Continue

What it means

The server has read the request headers and is willing to accept the body that follows. It answers a request that carried Expect: 100-continue, letting a client confirm the server will take a large upload before actually transmitting it.

It is an interim response: a final status code always follows on the same exchange. Browsers and most HTTP libraries handle the handshake internally, so application code almost never observes it.

When to use it

  • Acknowledge Expect: 100-continue before reading a large request body you intend to accept.
  • Spare clients from streaming a big upload to an endpoint that would reject the request on its headers alone.

When not to use it

  • Never as a final response — a definitive status must still follow.
  • Not for requests that did not send Expect: 100-continue; unsolicited interim replies are noise.

Cacheability

Not applicable: interim 1xx responses are never stored by caches — RFC 9111 governs final responses only.

Idempotency context

Interim responses carry no idempotency weight of their own; what matters is the method of the request still in flight.

Defined in

RFC 9110 §15.2.1

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(100).end(); // 100 Continue
});
FastAPI
from fastapi import FastAPI, Response

app = FastAPI()

@app.get("/api/resource")
def handler():  # 100 Continue
    return Response(status_code=100)
nginx
location /api/resource {
    return 100; # Continue
}
fetch
// Interim responses never reach fetch(): the browser consumes
// 100 Continue and resolves with the final response that follows.
const res = await fetch("/api/resource");
console.log(res.status); // the final status, never 100
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 100 Continue

101 Switching Protocols

What it means

Sent when the server agrees to a client's Upgrade header and changes what the current connection speaks — the classic case is the WebSocket handshake. The response's own Upgrade header names the protocol now in effect.

After the 101 header block, the connection is no longer HTTP/1.1: whatever follows belongs to the new protocol.

When to use it

  • Complete a WebSocket handshake against an HTTP/1.1 endpoint.
  • Switch to any protocol both peers negotiated through the Upgrade mechanism.

When not to use it

  • HTTP/2 and HTTP/3 never use it — protocol selection happens via ALPN in the TLS handshake instead.
  • Not unless the request actually offered Upgrade and you really switch; a 101 with no follow-through strands the connection.

Cacheability

Not applicable: interim 1xx responses are never stored by caches — RFC 9111 governs final responses only.

Idempotency context

Interim responses carry no idempotency weight of their own; what matters is the method of the request still in flight.

Defined in

RFC 9110 §15.2.2

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.set("Upgrade", 'websocket');
  res.set("Connection", 'Upgrade');
  res.status(101).end(); // 101 Switching Protocols
});
FastAPI
from fastapi import FastAPI, Response

app = FastAPI()

@app.get("/api/resource")
def handler():  # 101 Switching Protocols
    return Response(status_code=101, headers={"Upgrade": "websocket", "Connection": "Upgrade"})
nginx
location /api/resource {
    add_header Upgrade 'websocket' always;
    add_header Connection 'Upgrade' always;
    return 101; # Switching Protocols
}
fetch
// Interim responses never reach fetch(): the browser consumes
// 101 Switching Protocols and resolves with the final response that follows.
// Its headers (Upgrade, Connection) are handled at the protocol layer.
const res = await fetch("/api/resource");
console.log(res.status); // the final status, never 101
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 101 Switching Protocols
# Upgrade: websocket
# Connection: Upgrade

102 Processing

Semi-standard

What it means

A WebDAV server sends 102 while a long-running request (a deep COPY or MOVE, say) is underway, so the client's timeout does not fire before the final answer arrives.

It never carries a result — a final status always follows once the work completes.

When to use it

  • Keep a WebDAV client from timing out during an operation that legitimately takes a while.

When not to use it

  • New designs — answer slow work with 202 plus a status resource, or send 103 for the preload case.
  • Anywhere outside WebDAV; general HTTP clients may not understand it.

Cacheability

Not applicable: interim 1xx responses are never stored by caches — RFC 9111 governs final responses only.

Idempotency context

Interim responses carry no idempotency weight of their own; what matters is the method of the request still in flight.

Defined in

RFC 2518 §10.1

Scope: WebDAV only. Defined in RFC 2518 and dropped from the RFC 4918 revision for lack of implementations — still IANA-registered, so it earns semi-standard standing here.

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(102).end(); // 102 Processing
});
FastAPI
from fastapi import FastAPI, Response

app = FastAPI()

@app.get("/api/resource")
def handler():  # 102 Processing
    return Response(status_code=102)
nginx
location /api/resource {
    return 102; # Processing
}
fetch
// Interim responses never reach fetch(): the browser consumes
// 102 Processing and resolves with the final response that follows.
const res = await fetch("/api/resource");
console.log(res.status); // the final status, never 102
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 102 Processing

103 Early Hints

What it means

While the origin is still composing the real response, 103 ships probable headers early — above all Link: rel=preload — so the browser can begin fetching stylesheets, scripts and fonts it will almost certainly need.

The final response follows and its headers are authoritative; hints that turn out wrong are simply discarded.

When to use it

  • Buy back latency when the origin needs real time to render but already knows the page's critical assets.
  • In front of slow application servers, emitted by the CDN or reverse proxy on their behalf.

When not to use it

  • When the final response is fast anyway — the hint saves nothing.
  • For headers that must be authoritative (cookies, redirects); hints are advisory only.

Cacheability

Not applicable: interim 1xx responses are never stored by caches — RFC 9111 governs final responses only.

Idempotency context

Interim responses carry no idempotency weight of their own; what matters is the method of the request still in flight.

Defined in

RFC 8297 §2

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.set("Link", '</styles.css>; rel=preload; as=style');
  res.status(103).end(); // 103 Early Hints
});
FastAPI
from fastapi import FastAPI, Response

app = FastAPI()

@app.get("/api/resource")
def handler():  # 103 Early Hints
    return Response(status_code=103, headers={"Link": "</styles.css>; rel=preload; as=style"})
nginx
location /api/resource {
    add_header Link '</styles.css>; rel=preload; as=style' always;
    return 103; # Early Hints
}
fetch
// Interim responses never reach fetch(): the browser consumes
// 103 Early Hints and resolves with the final response that follows.
// Its headers (Link) are handled at the protocol layer.
const res = await fetch("/api/resource");
console.log(res.status); // the final status, never 103
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 103 Early Hints
# Link: </styles.css>; rel=preload; as=style

2xx — Successful

2xx status codes — code, name, and one-line summary
CodeNameSummaryCopy
200OKThe request succeeded; what the body holds depends on the method.
201CreatedThe request created a new resource; Location says where it lives.
202AcceptedThe request was accepted for processing, but the processing has not completed — and might still fail.
203Non-Authoritative InformationThe request succeeded, but a transforming proxy altered what the origin sent.
204No ContentThe request succeeded and there is deliberately nothing in the body.
205Reset ContentSuccess — and the client should reset the view (typically a form) that produced the request.
206Partial ContentThe server is delivering only the byte range(s) the Range header asked for.
207Multi-StatusWebDAV batch answer: the XML body carries a separate status for each affected resource.
208Already ReportedWebDAV: this resource appeared earlier in the same multistatus body and is not repeated.
226IM UsedThe body is a delta — the result of instance manipulations applied to a prior version the client holds.

The same 2xx codes in full — each row above links to its entry.

200 OK

What it means

The workhorse of HTTP: the request was understood and fulfilled. For GET the body is the requested resource, for POST it is the result of the action, for HEAD there is no body at all.

Precisely because it is the default success, a 200 wrapped around an error message in the body ('200 with {"error": …}') is an anti-pattern — it defeats caches, monitoring and every client that trusts the status line.

When to use it

  • Any request that completed and has a result to return in the body.
  • GET responses serving the current representation of a resource.

When not to use it

  • When a more precise 2xx exists: 201 for creation, 202 for accepted-but-pending, 204 for no body.
  • Never for failures dressed up in a successful envelope — pick the honest 4xx or 5xx.

Cacheability

Cacheable by default: this is one of the status codes caches may store and reuse even without explicit freshness information (RFC 9111 heuristic caching).

Idempotency context

Idempotency belongs to the request method, not the status code: retrying a GET, PUT or DELETE is safe by definition, while resending a POST may repeat its side effects.

Defined in

RFC 9110 §15.3.1

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(200).send("OK");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=200,
        content={"detail": "OK"},
    )
nginx
location /api/resource {
    return 200; # OK
}
fetch
const res = await fetch("/api/resource");
if (res.status === 200) {
  // 200 OK
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 200 OK

201 Created

What it means

One or more resources now exist that did not before — the typical answer to a POST that added something, or a PUT that wrote to a fresh URI. The Location header (or, absent one, the request URI) identifies the primary new resource.

The body conventionally describes the created resource, often including its representation and an ETag for later conditional requests.

When to use it

  • POST endpoints that make a new row, document or job — return 201 with Location pointing at it.
  • PUT requests that created (rather than replaced) the target resource.

When not to use it

  • Actions that merely update existing state — that is 200 or 204.
  • Asynchronous creation that has not happened yet; that is 202.

Cacheability

Not cacheable by default: caches may store this response only when explicit freshness information — Cache-Control or Expires — permits it (RFC 9111).

Idempotency context

Creation via POST is not idempotent — resending can create a duplicate; creation via PUT to a client-chosen URI is, which is why idempotency keys exist for POST.

Defined in

RFC 9110 §15.3.2

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.set("Location", '/new/location');
  res.status(201).send("Created");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=201,
        content={"detail": "Created"},
        headers={"Location": "/new/location"},
    )
nginx
location /api/resource {
    add_header Location '/new/location' always;
    return 201; # Created
}
fetch
const res = await fetch("/api/resource");
if (res.status === 201) {
  // 201 Created
  const location = res.headers.get("Location");
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 201 Created
# Location: /new/location

202 Accepted

What it means

HTTP's fire-and-acknowledge answer: the server took the request into its queue and makes no promise about the outcome. It exists so a server can accept work without holding the connection open until the work is done.

A good 202 body tells the client how to follow up — a status URL to poll, a webhook that will fire, or an estimate of when to check back.

When to use it

  • Batch jobs, exports, video transcodes — anything queued for later execution.
  • Webhook receivers that validate quickly and process afterwards.

When not to use it

  • Work you complete synchronously — answer 200, 201 or 204 with the actual outcome.
  • As a way to dodge error reporting; if validation already failed, say so with a 4xx now.

Cacheability

Not cacheable by default: caches may store this response only when explicit freshness information — Cache-Control or Expires — permits it (RFC 9111).

Idempotency context

A 202 acknowledges receipt, not completion — a retry may enqueue the same work twice unless the endpoint deduplicates by idempotency key.

Defined in

RFC 9110 §15.3.3

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(202).send("Accepted");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=202,
        content={"detail": "Accepted"},
    )
nginx
location /api/resource {
    return 202; # Accepted
}
fetch
const res = await fetch("/api/resource");
if (res.status === 202) {
  // 202 Accepted
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 202 Accepted

203 Non-Authoritative Information

What it means

The response is a 200 in substance, except an intermediary — a transforming proxy, an image-compressing gateway — changed the representation on the way through, so the client should not treat it as the origin's exact bytes.

In practice it is rare; the modern Cache-Control: no-transform directive exists so origins can forbid the behavior entirely.

When to use it

  • Proxies that deliberately transform payloads and want to disclose it honestly.

When not to use it

  • Origin servers — by definition the origin's own answer is authoritative.
  • When the transformation changes meaning rather than encoding; then the proxy should not transform at all.

Cacheability

Cacheable by default: this is one of the status codes caches may store and reuse even without explicit freshness information (RFC 9111 heuristic caching).

Idempotency context

Idempotency belongs to the request method, not the status code: retrying a GET, PUT or DELETE is safe by definition, while resending a POST may repeat its side effects.

Defined in

RFC 9110 §15.3.4

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(203).send("Non-Authoritative Information");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=203,
        content={"detail": "Non-Authoritative Information"},
    )
nginx
location /api/resource {
    return 203; # Non-Authoritative Information
}
fetch
const res = await fetch("/api/resource");
if (res.status === 203) {
  // 203 Non-Authoritative Information
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 203 Non-Authoritative Information

204 No Content

What it means

Success with an intentionally empty body: the action worked and the server has nothing to add. The client should keep its current view — a browser stays on the page rather than navigating.

It is the natural answer to a DELETE, a PUT that updated in place, or a settings toggle where echoing the resource back would be wasted bytes.

When to use it

  • DELETE requests that removed the resource and have nothing further to report.
  • PUT/PATCH updates where the client already holds the current representation.

When not to use it

  • When the client needs the resulting state (new ETag aside) — return 200 with a body.
  • Never with a body attached; intermediaries are entitled to drop or reject it.

Cacheability

Cacheable by default: this is one of the status codes caches may store and reuse even without explicit freshness information (RFC 9111 heuristic caching).

Idempotency context

Commonly follows idempotent methods (PUT, DELETE), so a retry usually lands harmlessly — a second DELETE of the same resource typically earns a 404.

Defined in

RFC 9110 §15.3.5

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(204).end(); // 204 No Content
});
FastAPI
from fastapi import FastAPI, Response

app = FastAPI()

@app.get("/api/resource")
def handler():  # 204 No Content
    return Response(status_code=204)
nginx
location /api/resource {
    return 204; # No Content
}
fetch
const res = await fetch("/api/resource");
if (res.status === 204) {
  // 204 No Content
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 204 No Content

205 Reset Content

What it means

Like 204 the body is empty, but 205 adds an instruction: clear the document view that sent the request. The intended use is form submissions where the user will enter another record immediately.

Browser support was never strong, so it survives mostly in APIs whose own clients honor the convention.

When to use it

  • Data-entry endpoints where the natural next step is a blank form for another submission.

When not to use it

  • General web forms relying on browsers to do the resetting — handle it in your own client code instead.

Cacheability

Not cacheable by default: caches may store this response only when explicit freshness information — Cache-Control or Expires — permits it (RFC 9111).

Idempotency context

Idempotency belongs to the request method, not the status code: retrying a GET, PUT or DELETE is safe by definition, while resending a POST may repeat its side effects.

Defined in

RFC 9110 §15.3.6

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(205).end(); // 205 Reset Content
});
FastAPI
from fastapi import FastAPI, Response

app = FastAPI()

@app.get("/api/resource")
def handler():  # 205 Reset Content
    return Response(status_code=205)
nginx
location /api/resource {
    return 205; # Reset Content
}
fetch
const res = await fetch("/api/resource");
if (res.status === 205) {
  // 205 Reset Content
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 205 Reset Content

206 Partial Content

What it means

The answer to a successful range request: Content-Range declares which slice of the full representation this body carries. It is what makes resumable downloads and video seeking work.

Multiple ranges arrive as a multipart/byteranges body; a range the server cannot satisfy earns 416 instead.

When to use it

  • Serving Range requests for large files — installers, media, archives.
  • Video/audio streaming endpoints where players seek by byte offset.

When not to use it

  • When you ignore the Range header — then send the full 200 and clients will cope.
  • For application-level pagination; Range is about bytes of one representation, not collections.

Cacheability

Cacheable by default: this is one of the status codes caches may store and reuse even without explicit freshness information (RFC 9111 heuristic caching).

Idempotency context

Range requests are GETs, so retrying is safe; a well-behaved client revalidates with If-Range so a changed file restarts cleanly instead of splicing mismatched halves.

Defined in

RFC 9110 §15.3.7

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.set("Content-Range", 'bytes 0-1023/4096');
  res.status(206).send("Partial Content");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=206,
        content={"detail": "Partial Content"},
        headers={"Content-Range": "bytes 0-1023/4096"},
    )
nginx
location /api/resource {
    add_header Content-Range 'bytes 0-1023/4096' always;
    return 206; # Partial Content
}
fetch
const res = await fetch("/api/resource");
if (res.status === 206) {
  // 206 Partial Content
  const contentRange = res.headers.get("Content-Range");
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 206 Partial Content
# Content-Range: bytes 0-1023/4096

207 Multi-Status

What it means

One request touched several resources and they did not all fare the same, so the response wraps a per-resource status inside a multistatus XML body. A PROPFIND across a folder tree is the canonical producer.

The 207 itself says nothing about success or failure — the truth is inside the body, which clients must parse.

When to use it

  • WebDAV operations (PROPFIND, COPY, MOVE, DELETE on collections) with mixed per-resource outcomes.

When not to use it

  • JSON APIs doing batch operations — model per-item results in your own response shape under a 200 instead.

Cacheability

Not cacheable by default: caches may store this response only when explicit freshness information — Cache-Control or Expires — permits it (RFC 9111).

Idempotency context

The batch inherits the method's semantics per resource; retrying a partially failed batch re-runs the parts that already succeeded, so check the body before resending.

Defined in

RFC 4918 §11.1

Scope: WebDAV. Outside DAV-speaking clients, expect nothing to understand the multistatus body.

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(207).send("Multi-Status");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=207,
        content={"detail": "Multi-Status"},
    )
nginx
location /api/resource {
    return 207; # Multi-Status
}
fetch
const res = await fetch("/api/resource");
if (res.status === 207) {
  // 207 Multi-Status
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 207 Multi-Status

208 Already Reported

What it means

Inside a 207 body, when bindings make the same resource reachable twice, 208 marks the later occurrences instead of duplicating their contents — preventing exponentially bloated answers over looped bindings.

When to use it

  • WebDAV servers implementing RFC 5842 bindings, inside multistatus bodies only.

When not to use it

  • As a top-level status for ordinary requests — it only means something inside a 207.

Cacheability

Not cacheable by default: caches may store this response only when explicit freshness information — Cache-Control or Expires — permits it (RFC 9111).

Idempotency context

Idempotency belongs to the request method, not the status code: retrying a GET, PUT or DELETE is safe by definition, while resending a POST may repeat its side effects.

Defined in

RFC 5842 §7.1

Scope: WebDAV bindings extension (RFC 5842) — rare even within WebDAV.

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(208).send("Already Reported");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=208,
        content={"detail": "Already Reported"},
    )
nginx
location /api/resource {
    return 208; # Already Reported
}
fetch
const res = await fetch("/api/resource");
if (res.status === 208) {
  // 208 Already Reported
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 208 Already Reported

226 IM Used

What it means

Part of RFC 3229 delta encoding: the client said it already has an older instance (A-IM/If-None-Match), and the server answered with just the difference. 226 signals that the body is not the full representation but the output of the negotiated instance manipulation.

Deployment never took off; you will meet it in niche sync protocols more often than on the open web.

When to use it

  • Sync endpoints where shipping diffs against a client-held baseline saves real bandwidth and both sides implement RFC 3229.

When not to use it

  • Anywhere clients have not negotiated delta encoding — they would treat the diff as the whole document.

Cacheability

Cacheable only with explicit freshness information, and caches must understand instance manipulations to reuse it correctly (RFC 3229 §10.4.1).

Idempotency context

Idempotency belongs to the request method, not the status code: retrying a GET, PUT or DELETE is safe by definition, while resending a POST may repeat its side effects.

Defined in

RFC 3229 §10.4.1

Scope: Delta-encoding extension (RFC 3229); registered but rarely deployed.

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(226).send("IM Used");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=226,
        content={"detail": "IM Used"},
    )
nginx
location /api/resource {
    return 226; # IM Used
}
fetch
const res = await fetch("/api/resource");
if (res.status === 226) {
  // 226 IM Used
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 226 IM Used

3xx — Redirection

3xx status codes — code, name, and one-line summary
CodeNameSummaryCopy
300Multiple ChoicesMore than one representation fits; the body lists the alternatives for the client to pick.
301Moved PermanentlyThe resource lives at the Location URI now and forever; clients and search engines should update their references.
302FoundThe resource is temporarily somewhere else; keep using the original URI next time.
303See OtherDeliberately fetch a different URI with GET — the Post/Redirect/Get pattern's status code.
304Not ModifiedThe cached copy is still good — the conditional request matched, so no body is sent.
305Use ProxyDeprecated: the request was supposed to be repeated through the proxy in Location.
306Switch ProxyReserved and unused — a draft-era proxy code that never made it into the standard.
307Temporary RedirectTemporary redirect that forbids method rewriting — a POST stays a POST at the new URI.
308Permanent RedirectPermanent redirect that forbids method rewriting — 301's semantics with the method guaranteed.

The same 3xx codes in full — each row above links to its entry.

300 Multiple Choices

What it means

The target resource has several representations — different formats, languages or versions — and the server declines to choose. The body enumerates them; a Location header may nominate a preferred one.

Real deployments almost always negotiate proactively (Accept, Accept-Language) and pick server-side, which is why 300 is rarely seen in the wild.

When to use it

  • Genuine agent-driven negotiation, where the human or client must make the choice.

When not to use it

  • When the server can decide from request headers — answer 200 with Vary instead.

Cacheability

Cacheable by default: this is one of the status codes caches may store and reuse even without explicit freshness information (RFC 9111 heuristic caching).

Idempotency context

Idempotency belongs to the request method, not the status code: retrying a GET, PUT or DELETE is safe by definition, while resending a POST may repeat its side effects.

Defined in

RFC 9110 §15.4.1

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(300).send("Multiple Choices");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=300,
        content={"detail": "Multiple Choices"},
    )
nginx
location /api/resource {
    return 300; # Multiple Choices
}
fetch
const res = await fetch("/api/resource");
if (res.status === 300) {
  // 300 Multiple Choices
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 300 Multiple Choices

301 Moved Permanently

What it means

The permanent redirect: links, bookmarks and search indexes should replace the old URI with the one in Location. It is the workhorse of domain migrations and URL restructuring, and it transfers SEO signals to the new address.

One historical wart: clients are allowed to change the method — a POST redirected with 301 usually gets replayed as a GET. When the method must survive the hop, use 308.

When to use it

  • Permanent URL moves — renamed pages, http→https at the domain level, retired URL schemes.
  • Canonicalization redirects (trailing slash, www vs apex) meant to be remembered.

When not to use it

  • Anything temporary — caches will keep sending users to Location long after you change your mind; that is 302/307 territory.
  • Redirecting POST/PUT/DELETE where the method must be preserved — use 308.

Cacheability

Cacheable by default — permanently, in effect: browsers remember 301s aggressively even without explicit freshness, which is exactly why a mistaken one is painful to undo (RFC 9111).

Idempotency context

The redirect itself is harmless to retry; the caveat is method rewriting — clients may replay the redirected request as GET, so a non-idempotent original can silently change shape.

Defined in

RFC 9110 §15.4.2

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.set("Location", '/new/location');
  res.status(301).send("Moved Permanently");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=301,
        content={"detail": "Moved Permanently"},
        headers={"Location": "/new/location"},
    )
nginx
location /api/resource {
    add_header Location '/new/location' always;
    return 301; # Moved Permanently
}
fetch
const res = await fetch("/api/resource");
if (res.status === 301) {
  // 301 Moved Permanently
  const location = res.headers.get("Location");
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 301 Moved Permanently
# Location: /new/location

302 Found

What it means

The temporary redirect everyone actually ships: go to Location for now, but do not update bookmarks or indexes. Originally named 'Moved Temporarily' in HTTP/1.0; HTTP/1.1 renamed it 'Found'.

Like 301 it carries the historical method-rewrite tolerance — most clients turn a redirected POST into a GET. 307 exists precisely to forbid that.

When to use it

  • Short-lived detours: A/B routing, geo-based hops, 'log in first' bounces where the original URL stays canonical.

When not to use it

  • Permanent moves — search engines keep the old URL indexed; use 301/308.
  • When the method must be preserved across the hop; that is 307.

Cacheability

Not cacheable by default: caches may store this response only when explicit freshness information — Cache-Control or Expires — permits it (RFC 9111).

Idempotency context

Clients may replay the redirected request as GET (the historical tolerance), so a POST that hits a 302 can lose its method — use 307/308 when that matters.

Defined in

RFC 9110 §15.4.3

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.set("Location", '/new/location');
  res.status(302).send("Found");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=302,
        content={"detail": "Found"},
        headers={"Location": "/new/location"},
    )
nginx
location /api/resource {
    add_header Location '/new/location' always;
    return 302; # Found
}
fetch
const res = await fetch("/api/resource");
if (res.status === 302) {
  // 302 Found
  const location = res.headers.get("Location");
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 302 Found
# Location: /new/location

303 See Other

What it means

Unlike 301/302's accidental method rewriting, 303 orders it: whatever method the request used, retrieve the resource named in Location with GET. It decouples an action from the page that shows its result.

It is the correct engine of Post/Redirect/Get: the form POST returns 303, the browser GETs the result page, and a refresh re-runs only the harmless GET.

When to use it

  • After a successful form POST, redirecting to a result or confirmation page.
  • Pointing a client at a status resource after starting an async job (often paired with 202 patterns).

When not to use it

  • When the client should repeat the SAME request elsewhere — that is 307/308.

Cacheability

Not cacheable by default: caches may store this response only when explicit freshness information — Cache-Control or Expires — permits it (RFC 9111).

Idempotency context

Designed to make retries safe at the UX level: after the 303 hop, refreshing repeats the GET of the result page, not the original POST.

Defined in

RFC 9110 §15.4.4

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.set("Location", '/new/location');
  res.status(303).send("See Other");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=303,
        content={"detail": "See Other"},
        headers={"Location": "/new/location"},
    )
nginx
location /api/resource {
    add_header Location '/new/location' always;
    return 303; # See Other
}
fetch
const res = await fetch("/api/resource");
if (res.status === 303) {
  // 303 See Other
  const location = res.headers.get("Location");
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 303 See Other
# Location: /new/location

304 Not Modified

What it means

The answer to a conditional GET (If-None-Match against an ETag, or If-Modified-Since against a date) when the stored response is still current: no body, just headers, and the client keeps using its cached copy.

It is the cheapest useful response in HTTP — validation for the price of a round trip — and the backbone of browser revalidation.

When to use it

  • Any endpoint that emits ETag or Last-Modified and receives the matching conditional headers back.
  • High-traffic assets where saving body bytes on revalidation matters.

When not to use it

  • Requests that were not conditional — an unconditional GET must get the full 200.
  • Never with a body; by definition there is nothing to send.

Cacheability

A 304 is not stored itself: it instructs the cache to refresh the stored 200 response it validated and keep serving that (RFC 9111 §4.3.4).

Idempotency context

Conditional GETs are safe by construction — retrying costs another round trip and nothing else.

Defined in

RFC 9110 §15.4.5

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.set("ETag", '"33a64df5"');
  res.status(304).end(); // 304 Not Modified
});
FastAPI
from fastapi import FastAPI, Response

app = FastAPI()

@app.get("/api/resource")
def handler():  # 304 Not Modified
    return Response(status_code=304, headers={"ETag": '"33a64df5"'})
nginx
location /api/resource {
    add_header ETag '"33a64df5"' always;
    return 304; # Not Modified
}
fetch
const res = await fetch("/api/resource");
if (res.status === 304) {
  // 304 Not Modified
  const etag = res.headers.get("ETag");
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 304 Not Modified
# ETag: "33a64df5"

305 Use Proxy

Deprecated

What it means

HTTP/1.1 originally let an origin redirect a client through a specific proxy. Letting a remote server reconfigure the client's proxy turned out to be a security hole, and the code was deprecated.

Modern clients ignore it; proxy configuration belongs to the client side (PAC files, system settings), never to a response.

When to use it

  • Never in new systems — it exists in this reference so you can recognize it in old traffic.

When not to use it

  • Anywhere. If you control routing, do it in infrastructure configuration, not status codes.

Cacheability

Not cacheable by default: caches may store this response only when explicit freshness information — Cache-Control or Expires — permits it (RFC 9111).

Idempotency context

Idempotency belongs to the request method, not the status code: retrying a GET, PUT or DELETE is safe by definition, while resending a POST may repeat its side effects.

Defined in

RFC 9110 §15.4.6

Scope: Deprecated by RFC 9110 §15.4.6 'due to security concerns regarding in-band configuration of a proxy'. Recognize, never emit.

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(305).send("Use Proxy");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=305,
        content={"detail": "Use Proxy"},
    )
nginx
location /api/resource {
    return 305; # Use Proxy
}
fetch
const res = await fetch("/api/resource");
if (res.status === 305) {
  // 305 Use Proxy
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 305 Use Proxy

306 Switch Proxy

Deprecated

What it means

A previous draft of HTTP/1.1 defined 306 ('Switch Proxy'); the idea was abandoned alongside 305's deprecation, and the code point is now reserved. RFC 9110 lists it only as '(Unused)'.

No conforming implementation sends it; seeing one in the wild means something exotic or broken upstream.

When to use it

  • Never — the code point is reserved precisely so nothing emits it.

When not to use it

  • Any response. If you need proxy redirection semantics, solve it in client configuration.

Cacheability

Not cacheable by default: caches may store this response only when explicit freshness information — Cache-Control or Expires — permits it (RFC 9111).

Idempotency context

Idempotency belongs to the request method, not the status code: retrying a GET, PUT or DELETE is safe by definition, while resending a POST may repeat its side effects.

Defined in

RFC 9110 §15.4.7

Scope: Reserved. Named 'Switch Proxy' only in an expired draft; RFC 9110 §15.4.7 lists the code point as '(Unused)'.

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(306).send("Switch Proxy");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=306,
        content={"detail": "Switch Proxy"},
    )
nginx
location /api/resource {
    return 306; # Switch Proxy
}
fetch
const res = await fetch("/api/resource");
if (res.status === 306) {
  // 306 Switch Proxy
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 306 Switch Proxy

307 Temporary Redirect

What it means

Semantically 302 with the loophole closed: the client must repeat the request at the Location URI with the same method and body. It exists because deployed clients had turned 302-redirected POSTs into GETs for decades.

It is what an API should send when a write endpoint is temporarily somewhere else and the write must still happen.

When to use it

  • Temporarily rerouting requests whose method and body must survive the hop — API writes, upload endpoints.
  • HSTS-style internal upgrade redirects where the request should be replayed exactly.

When not to use it

  • Permanent moves — that is 308.
  • After a form POST when you WANT the client to GET a result page — that is 303.

Cacheability

Not cacheable by default: caches may store this response only when explicit freshness information — Cache-Control or Expires — permits it (RFC 9111).

Idempotency context

The method is preserved, so the retry semantics of the original request carry over unchanged — a redirected POST is still a POST with all its side effects.

Defined in

RFC 9110 §15.4.8

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.set("Location", '/new/location');
  res.status(307).send("Temporary Redirect");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=307,
        content={"detail": "Temporary Redirect"},
        headers={"Location": "/new/location"},
    )
nginx
location /api/resource {
    add_header Location '/new/location' always;
    return 307; # Temporary Redirect
}
fetch
const res = await fetch("/api/resource");
if (res.status === 307) {
  // 307 Temporary Redirect
  const location = res.headers.get("Location");
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 307 Temporary Redirect
# Location: /new/location

308 Permanent Redirect

What it means

The permanent counterpart of 307: update all references to the Location URI, and repeat the request there with the same method and body. Defined in RFC 7538 and folded into RFC 9110 as the fourth core redirect.

Choose along two axes — permanent vs temporary, method-preserving vs not: 301/302 are the lenient legacy pair, 308/307 the strict modern one.

When to use it

  • Permanent moves of API endpoints that accept writes — the POST/PUT must not degrade to GET.
  • Domain or path migrations where you also serve non-GET traffic.

When not to use it

  • Temporary detours — like 301, a cached 308 is hard to take back.
  • Very old client populations that predate RFC 7538, if any still matter to you.

Cacheability

Cacheable by default: this is one of the status codes caches may store and reuse even without explicit freshness information (RFC 9111 heuristic caching).

Idempotency context

Method-preserving like 307: the replayed request keeps its original idempotency, so redirected non-idempotent writes still deserve idempotency keys.

Defined in

RFC 9110 §15.4.9

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.set("Location", '/new/location');
  res.status(308).send("Permanent Redirect");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=308,
        content={"detail": "Permanent Redirect"},
        headers={"Location": "/new/location"},
    )
nginx
location /api/resource {
    add_header Location '/new/location' always;
    return 308; # Permanent Redirect
}
fetch
const res = await fetch("/api/resource");
if (res.status === 308) {
  // 308 Permanent Redirect
  const location = res.headers.get("Location");
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 308 Permanent Redirect
# Location: /new/location

4xx — Client errors

4xx status codes — code, name, and one-line summary
CodeNameSummaryCopy
400Bad RequestThe server cannot or will not process this — the request itself is malformed or invalid.
401UnauthorizedAuthentication is required and missing or invalid — despite the name, it means unauthenticated.
402Payment RequiredReserved for future use — in practice: pay, top up or upgrade before this request can succeed.
403ForbiddenThe server understood the request and refuses to authorize it — identity is known, permission is denied.
404Not FoundThe server found no current representation for the target URI — or is not saying whether one exists.
405Method Not AllowedThe URI exists, but not for this method — Allow lists the ones that work.
406Not AcceptableNothing the server can produce satisfies the request's Accept headers.
407Proxy Authentication Required401's twin for proxies: the intermediary wants credentials before it will forward the request.
408Request TimeoutThe server gave up waiting for the rest of the request and is closing the connection.
409ConflictThe request collides with the resource's current state — resolve the conflict, then resend.
410GoneThe resource existed, was deliberately removed, and is not coming back — stop asking.
411Length RequiredThe server refuses the request without a Content-Length header.
412Precondition FailedAn If-Match / If-Unmodified-Since precondition evaluated false — the resource changed under you.
413Content Too LargeThe request body exceeds what the server will process — renamed from 'Payload Too Large' in RFC 9110.
414URI Too LongThe request target is longer than the server is willing to interpret.
415Unsupported Media TypeThe request body's format is not one this endpoint accepts — Content-Type (or the content itself) is wrong.
416Range Not SatisfiableNone of the requested byte ranges overlap the resource — e.g. resuming past the end of the file.
417Expectation FailedThe Expect header asks for something this server cannot honor.
418I'm a TeapotAn April Fools' classic from HTCPCP: a teapot, asked to brew coffee, politely refuses.
420Enhance Your CalmTwitter API v1's folk code for clients it wanted to slow down; retired, still met in the wild.
421Misdirected RequestThis request reached a server that is not configured to answer for its target authority.
422Unprocessable ContentThe body parses fine but its meaning fails validation — well-formed, semantically wrong.
423LockedWebDAV: the resource is under a lock the request does not hold.
424Failed DependencyWebDAV: this action failed because an earlier action it depended on failed.
425Too EarlyThe server won't process a request that arrived in TLS early data — replay risk; send it again after the handshake.
426Upgrade RequiredThe server refuses to talk over this protocol version — switch to the one named in Upgrade first.
428Precondition RequiredThe server insists this request be conditional — send it again with If-Match.
429Too Many RequestsThe client exceeded a rate limit; Retry-After says how long to back off.
431Request Header Fields Too LargeThe header section — one field or all of them together — exceeds what the server will accept.
451Unavailable For Legal ReasonsAccess is denied because of a legal demand — censorship, court order or policy, disclosed honestly.
499Client Closed Requestnginx's log-only code: the client hung up before the server finished responding.

The same 4xx codes in full — each row above links to its entry.

400 Bad Request

What it means

The generic client error: bad syntax, an unparsable body, invalid parameters, framing the server refuses to honor. The fault is in the request, and resending it unchanged will fail identically.

Because it is the catch-all, a useful 400 carries a body explaining WHAT was wrong; a bare 400 turns every client-side bug into archaeology.

When to use it

  • Unparsable JSON, invalid query parameters, violated request schemas — with a body naming the offending field.
  • As the honest fallback when no more specific 4xx fits.

When not to use it

  • When a sharper code exists: 401/403 for auth, 404 for absence, 422 for well-formed-but-semantically-wrong, 415 for the wrong media type.
  • Server-side faults — a handler crash on valid input is a 500, not a 400.

Cacheability

Not cacheable by default: caches may store this response only when explicit freshness information — Cache-Control or Expires — permits it (RFC 9111).

Idempotency context

Retrying an unchanged request is pointless by definition — the request must be fixed before it can succeed.

Defined in

RFC 9110 §15.5.1

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(400).send("Bad Request");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=400,
        content={"detail": "Bad Request"},
    )
nginx
location /api/resource {
    return 400; # Bad Request
}
fetch
const res = await fetch("/api/resource");
if (res.status === 400) {
  // 400 Bad Request
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 400 Bad Request

401 Unauthorized

What it means

The request lacks valid credentials for the target resource. The name is HTTP's most famous misnomer: 401 is about WHO YOU ARE (authentication), while 403 is about WHAT YOU MAY DO (authorization).

A conforming 401 carries a WWW-Authenticate header naming at least one acceptable scheme — Bearer for token APIs, Basic for the classic browser prompt.

When to use it

  • Missing, expired or malformed credentials — tell the client to (re)authenticate and retry.
  • Token-based APIs when the access token fails validation; the client's cue to refresh it.

When not to use it

  • Valid credentials without sufficient rights — that is 403.
  • Hiding a resource's existence from unauthenticated eyes; many APIs deliberately answer 404 for that.

Cacheability

Not cacheable by default: caches may store this response only when explicit freshness information — Cache-Control or Expires — permits it (RFC 9111).

Idempotency context

Safe to retry once credentials are fixed — the original request was never executed.

Defined in

RFC 9110 §15.5.2

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.set("WWW-Authenticate", 'Bearer realm="api"');
  res.status(401).send("Unauthorized");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=401,
        content={"detail": "Unauthorized"},
        headers={"WWW-Authenticate": 'Bearer realm="api"'},
    )
nginx
location /api/resource {
    add_header WWW-Authenticate 'Bearer realm="api"' always;
    return 401; # Unauthorized
}
fetch
const res = await fetch("/api/resource");
if (res.status === 401) {
  // 401 Unauthorized
  const wwwAuthenticate = res.headers.get("WWW-Authenticate");
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 401 Unauthorized
# WWW-Authenticate: Bearer realm="api"

402 Payment Required

What it means

RFC 9110 still labels 402 'reserved for future use' — the imagined micropayment web never arrived. The code point is standard; a standardized meaning is not.

APIs have colonized it anyway: exhausted quotas, expired subscriptions and billing failures commonly answer 402, and clients treat it as 'money, then retry'.

When to use it

  • API billing boundaries: plan limits reached, trial expired, payment method declined — with a body linking to the fix.

When not to use it

  • Interoperable surfaces where clients need standardized semantics — 403 with an explanatory body travels better.

Cacheability

Not cacheable by default: caches may store this response only when explicit freshness information — Cache-Control or Expires — permits it (RFC 9111).

Idempotency context

Nothing was executed; retry after the billing state changes — retrying before that yields the same answer.

Defined in

RFC 9110 §15.5.3

Scope: Officially 'reserved for future use' (RFC 9110 §15.5.3); its billing usage is convention, not standard.

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(402).send("Payment Required");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=402,
        content={"detail": "Payment Required"},
    )
nginx
location /api/resource {
    return 402; # Payment Required
}
fetch
const res = await fetch("/api/resource");
if (res.status === 402) {
  // 402 Payment Required
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 402 Payment Required

403 Forbidden

What it means

Authentication succeeded or is irrelevant; authorization failed. Re-authenticating as the same principal will not help, which is exactly the line between 403 and 401.

Servers that prefer not to reveal WHY (or that the resource exists at all) are explicitly allowed to answer 404 instead — private repositories on code-hosting platforms famously do.

When to use it

  • A known user lacking rights: role checks, ownership checks, IP allowlists, WAF policy denials.
  • Writes rejected by policy even with valid credentials — read-only mode, immutable resources.

When not to use it

  • Missing or bad credentials — that is 401, with WWW-Authenticate.
  • When even confirming existence leaks information; answer 404 deliberately.

Cacheability

Not cacheable by default: caches may store this response only when explicit freshness information — Cache-Control or Expires — permits it (RFC 9111).

Idempotency context

Retrying unchanged is futile — the denial is a policy decision, not a transient state; only a permission change unblocks it.

Defined in

RFC 9110 §15.5.4

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(403).send("Forbidden");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=403,
        content={"detail": "Forbidden"},
    )
nginx
location /api/resource {
    return 403; # Forbidden
}
fetch
const res = await fetch("/api/resource");
if (res.status === 403) {
  // 403 Forbidden
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 403 Forbidden

404 Not Found

What it means

The most famous status code in HTTP: nothing lives at this URI right now. It makes no claim about the past or future — the resource may never have existed, may have been deleted, or may be deliberately hidden.

That ambiguity is a feature: 404 is the standard way to deny existence without confirming anything, which is why access-controlled systems return it where a 403 would leak.

When to use it

  • Requests for resources that genuinely are not there — broken links, deleted records, typo'd IDs.
  • Deliberately masking a resource's existence from callers without rights to know it.

When not to use it

  • Known-permanent removals where you can say so — 410 communicates 'gone for good' more usefully.
  • As a lazy stand-in for 400 when the path was valid but parameters were not.

Cacheability

Cacheable by default: this is one of the status codes caches may store and reuse even without explicit freshness information (RFC 9111 heuristic caching).

Idempotency context

Safe to retry, pointless to expect a different answer until the resource comes into existence.

Defined in

RFC 9110 §15.5.5

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(404).send("Not Found");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=404,
        content={"detail": "Not Found"},
    )
nginx
location /api/resource {
    return 404; # Not Found
}
fetch
const res = await fetch("/api/resource");
if (res.status === 404) {
  // 404 Not Found
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 404 Not Found

405 Method Not Allowed

What it means

The target resource is real, but the request method is not in its repertoire — a POST to a read-only document, a DELETE where deletion is not offered. The response MUST carry an Allow header listing the supported methods.

It is a more precise answer than 404 (the resource exists) and than 501 (the server understands the method fine — this resource just does not offer it).

When to use it

  • Any routed endpoint hit with an unsupported method — frameworks usually emit it (with Allow) automatically.

When not to use it

  • Methods the server does not implement at all — that is 501.
  • Authorization-based method denial (the method exists, this caller may not use it) — that is 403.

Cacheability

Cacheable by default: this is one of the status codes caches may store and reuse even without explicit freshness information (RFC 9111 heuristic caching).

Idempotency context

Nothing was executed; the fix is switching to a method the Allow header names, not retrying the same one.

Defined in

RFC 9110 §15.5.6

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.set("Allow", 'GET, HEAD');
  res.status(405).send("Method Not Allowed");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=405,
        content={"detail": "Method Not Allowed"},
        headers={"Allow": "GET, HEAD"},
    )
nginx
location /api/resource {
    add_header Allow 'GET, HEAD' always;
    return 405; # Method Not Allowed
}
fetch
const res = await fetch("/api/resource");
if (res.status === 405) {
  // 405 Method Not Allowed
  const allow = res.headers.get("Allow");
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 405 Method Not Allowed
# Allow: GET, HEAD

406 Not Acceptable

What it means

Proactive content negotiation failed: the client's Accept, Accept-Language or Accept-Encoding constraints exclude every representation the server has. A helpful body lists what IS available.

In practice most servers ignore mismatched Accept headers and send their default representation anyway — RFC 9110 explicitly permits that — so a real 406 usually comes from strict APIs.

When to use it

  • Strict APIs that refuse to serve a format the client did not ask for (e.g. client demands XML, server only has JSON).

When not to use it

  • When serving your default representation anyway is kinder — the spec allows it and most of the web does it.
  • Unsupported REQUEST body formats — that is 415.

Cacheability

Not cacheable by default: caches may store this response only when explicit freshness information — Cache-Control or Expires — permits it (RFC 9111).

Idempotency context

Idempotency belongs to the request method, not the status code: retrying a GET, PUT or DELETE is safe by definition, while resending a POST may repeat its side effects.

Defined in

RFC 9110 §15.5.7

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(406).send("Not Acceptable");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=406,
        content={"detail": "Not Acceptable"},
    )
nginx
location /api/resource {
    return 406; # Not Acceptable
}
fetch
const res = await fetch("/api/resource");
if (res.status === 406) {
  // 406 Not Acceptable
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 406 Not Acceptable

407 Proxy Authentication Required

What it means

A proxy on the path — corporate egress, a paid gateway — demands authentication. The Proxy-Authenticate header names the scheme, and the client answers with Proxy-Authorization, exactly mirroring the 401/WWW-Authenticate pair one hop earlier.

When to use it

  • Authenticating proxies challenging clients that have not presented Proxy-Authorization.

When not to use it

  • Origin servers — an origin demanding credentials sends 401.

Cacheability

Not cacheable by default: caches may store this response only when explicit freshness information — Cache-Control or Expires — permits it (RFC 9111).

Idempotency context

The request never crossed the proxy; retrying with Proxy-Authorization is safe and expected.

Defined in

RFC 9110 §15.5.8

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.set("Proxy-Authenticate", 'Basic realm="proxy"');
  res.status(407).send("Proxy Authentication Required");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=407,
        content={"detail": "Proxy Authentication Required"},
        headers={"Proxy-Authenticate": 'Basic realm="proxy"'},
    )
nginx
location /api/resource {
    add_header Proxy-Authenticate 'Basic realm="proxy"' always;
    return 407; # Proxy Authentication Required
}
fetch
const res = await fetch("/api/resource");
if (res.status === 407) {
  // 407 Proxy Authentication Required
  const proxyAuthenticate = res.headers.get("Proxy-Authenticate");
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 407 Proxy Authentication Required
# Proxy-Authenticate: Basic realm="proxy"

408 Request Timeout

What it means

The client opened a request but did not finish sending it within the server's patience — a stalled upload, a connection held half-open. The server typically closes the connection along with the response.

Its mirror image is nginx's non-standard 499, where the CLIENT is the one who walked away first.

When to use it

  • Reaping connections whose request never completed within your read timeout.

When not to use it

  • Upstream timeouts while the server itself waits on a backend — that is 504.
  • Slow processing of a fully received request; pick 202 (accept and continue) or let it finish.

Cacheability

Not cacheable by default: caches may store this response only when explicit freshness information — Cache-Control or Expires — permits it (RFC 9111).

Idempotency context

Explicitly retry-friendly: the request was never fully received, so clients — browsers included — may repeat it automatically, even for non-idempotent methods.

Defined in

RFC 9110 §15.5.9

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(408).send("Request Timeout");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=408,
        content={"detail": "Request Timeout"},
    )
nginx
location /api/resource {
    return 408; # Request Timeout
}
fetch
const res = await fetch("/api/resource");
if (res.status === 408) {
  // 408 Request Timeout
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 408 Request Timeout

409 Conflict

What it means

The request was well-formed but cannot be applied to the resource as it stands: a version edit based on stale state, a duplicate of a uniqueness-constrained value, a delete of something already changed underneath.

Unlike most 4xx codes, 409 is an invitation: the body should describe the conflict well enough for the client to reconcile and try again.

When to use it

  • Optimistic-concurrency version collisions (often alongside ETag/If-Match machinery).
  • Uniqueness violations — 'that name is taken' — where the client can choose differently and resubmit.

When not to use it

  • Failed If-Match/If-Unmodified-Since preconditions specifically — HTTP reserves 412 for those.
  • Validation failures unrelated to current state — that is 400 or 422.

Cacheability

Not cacheable by default: caches may store this response only when explicit freshness information — Cache-Control or Expires — permits it (RFC 9111).

Idempotency context

Do not retry blind — the point of a 409 is that state moved; re-read the resource, reconcile, then resend the corrected request.

Defined in

RFC 9110 §15.5.10

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(409).send("Conflict");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=409,
        content={"detail": "Conflict"},
    )
nginx
location /api/resource {
    return 409; # Conflict
}
fetch
const res = await fetch("/api/resource");
if (res.status === 409) {
  // 409 Conflict
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 409 Conflict

410 Gone

What it means

404 with a memory: the server confirms the resource USED to live here and the absence is intentional and likely permanent. It invites clients to delete their references.

Search engines treat it as a stronger removal signal than 404, which is exactly why retired content and sunset API versions deserve it.

When to use it

  • Retired content and API versions you want crawlers and clients to forget.
  • Expired one-time resources — used invitation links, closed listings, lapsed promotions.

When not to use it

  • Absence that might be temporary or unexplained — plain 404 promises less and is safer.
  • Hiding access-controlled resources; 410 CONFIRMS something existed, which may itself leak.

Cacheability

Cacheable by default: this is one of the status codes caches may store and reuse even without explicit freshness information (RFC 9111 heuristic caching).

Idempotency context

Safe to retry and permanently futile — the answer is designed never to change.

Defined in

RFC 9110 §15.5.11

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(410).send("Gone");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=410,
        content={"detail": "Gone"},
    )
nginx
location /api/resource {
    return 410; # Gone
}
fetch
const res = await fetch("/api/resource");
if (res.status === 410) {
  // 410 Gone
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 410 Gone

411 Length Required

What it means

The server will not accept this request's body without knowing its size up front — usually a rejection of chunked transfer where the deployment cannot or will not buffer unbounded input.

Clients fix it by resending with a valid Content-Length; HTTP/2 and HTTP/3 frame data differently, so it is mostly an HTTP/1.1 phenomenon.

When to use it

  • Endpoints or intermediaries that must know body size before accepting it (quota precheck, storage allocation).

When not to use it

  • When you can stream and enforce limits as you read — cutting off at the cap with 413 is friendlier.

Cacheability

Not cacheable by default: caches may store this response only when explicit freshness information — Cache-Control or Expires — permits it (RFC 9111).

Idempotency context

Nothing was processed; resending with Content-Length is safe for any method.

Defined in

RFC 9110 §15.5.12

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(411).send("Length Required");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=411,
        content={"detail": "Length Required"},
    )
nginx
location /api/resource {
    return 411; # Length Required
}
fetch
const res = await fetch("/api/resource");
if (res.status === 411) {
  // 411 Length Required
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 411 Length Required

412 Precondition Failed

What it means

The conditional machinery working as designed: the client said 'only apply this if my version is still current' (If-Match with an ETag, If-Unmodified-Since with a date) and it was not, so the server refused to execute.

This is the response that makes optimistic concurrency real over HTTP — the lost-update problem answered at the protocol level.

When to use it

  • Conditional writes whose precondition failed — the client must re-fetch, re-apply changes and resend with the new validator.

When not to use it

  • State conflicts detected WITHOUT protocol preconditions — that is 409.
  • Failed If-None-Match on a GET — that path answers 304, not 412.

Cacheability

Not cacheable by default: caches may store this response only when explicit freshness information — Cache-Control or Expires — permits it (RFC 9111).

Idempotency context

The refused request had no effect; the correct retry re-reads the resource and carries the fresh ETag — never just resend the stale one.

Defined in

RFC 9110 §15.5.13

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(412).send("Precondition Failed");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=412,
        content={"detail": "Precondition Failed"},
    )
nginx
location /api/resource {
    return 412; # Precondition Failed
}
fetch
const res = await fetch("/api/resource");
if (res.status === 412) {
  // 412 Precondition Failed
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 412 Precondition Failed

413 Content Too Large

What it means

The body outweighs the server's limits and the request is refused; the server may close the connection to stop the upload. RFC 9110 renamed it from 'Payload Too Large' (and HTTP/1.1's original 'Request Entity Too Large') — all three phrasings survive in error pages and older stacks.

If the condition is temporary — a full queue, a momentary quota — the server can include Retry-After.

When to use it

  • Upload endpoints enforcing size caps — with the limit stated in the body so clients can act on it.
  • Reverse proxies rejecting oversized bodies before they reach application servers.

When not to use it

  • Too-long URLs — that is 414.
  • Oversized header sections — that is 431.

Cacheability

Not cacheable by default: caches may store this response only when explicit freshness information — Cache-Control or Expires — permits it (RFC 9111).

Idempotency context

Retrying the identical body will fail identically; shrink the content or negotiate a chunked/resumable path first.

Defined in

RFC 9110 §15.5.14

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(413).send("Content Too Large");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=413,
        content={"detail": "Content Too Large"},
    )
nginx
location /api/resource {
    return 413; # Content Too Large
}
fetch
const res = await fetch("/api/resource");
if (res.status === 413) {
  // 413 Content Too Large
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 413 Content Too Large

414 URI Too Long

What it means

Usually the symptom of state crammed into a query string — filters, tokens, whole documents — until a proxy or server's URL buffer gives out. Common limits sit around 4–8 KB per hop, and the lowest one on the path wins.

The durable fix is moving bulk data into a request body (POST) or a stored server-side reference, not raising limits hop by hop.

When to use it

  • Refusing URLs beyond your parser's or infrastructure's documented limit.

When not to use it

  • Oversized bodies (413) or header sections (431) — each direction of excess has its own code.

Cacheability

Cacheable by default: this is one of the status codes caches may store and reuse even without explicit freshness information (RFC 9111 heuristic caching).

Idempotency context

Nothing was executed; the request must be restructured — typically into a POST body — before retrying.

Defined in

RFC 9110 §15.5.15

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(414).send("URI Too Long");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=414,
        content={"detail": "URI Too Long"},
    )
nginx
location /api/resource {
    return 414; # URI Too Long
}
fetch
const res = await fetch("/api/resource");
if (res.status === 414) {
  // 414 URI Too Long
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 414 URI Too Long

415 Unsupported Media Type

What it means

The server understood the request but refuses the body's media type: XML sent to a JSON-only API, an image format the upload endpoint does not take, or a Content-Encoding it cannot undo.

The response can name the supported types via Accept (for the method) so the client knows what to send instead.

When to use it

  • API endpoints enforcing a request Content-Type contract (application/json and nothing else, say).
  • Upload endpoints restricted to specific file formats.

When not to use it

  • A parsable, supported format whose CONTENT is invalid — that is 400 (syntax) or 422 (semantics).
  • Response-side negotiation failures — that is 406.

Cacheability

Not cacheable by default: caches may store this response only when explicit freshness information — Cache-Control or Expires — permits it (RFC 9111).

Idempotency context

Nothing was processed; convert the body to a supported type and resend safely.

Defined in

RFC 9110 §15.5.16

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(415).send("Unsupported Media Type");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=415,
        content={"detail": "Unsupported Media Type"},
    )
nginx
location /api/resource {
    return 415; # Unsupported Media Type
}
fetch
const res = await fetch("/api/resource");
if (res.status === 415) {
  // 415 Unsupported Media Type
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 415 Unsupported Media Type

416 Range Not Satisfiable

What it means

The Range header asked for slices the current representation cannot supply — a resume offset beyond the file's length is the classic case, often after the file changed between download sessions.

For byte ranges the response should carry Content-Range: bytes */LENGTH so the client learns the actual size and can restart sensibly.

When to use it

  • Range-serving endpoints rejecting out-of-bounds or degenerate range sets.

When not to use it

  • Ranges you could partially satisfy — serve the satisfiable part as 206.
  • When ignoring Range and sending the whole 200 is acceptable; the spec allows that too.

Cacheability

Not cacheable by default: caches may store this response only when explicit freshness information — Cache-Control or Expires — permits it (RFC 9111).

Idempotency context

Safe to retry after correcting the range against the length Content-Range reported.

Defined in

RFC 9110 §15.5.17

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.set("Content-Range", 'bytes */4096');
  res.status(416).send("Range Not Satisfiable");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=416,
        content={"detail": "Range Not Satisfiable"},
        headers={"Content-Range": "bytes */4096"},
    )
nginx
location /api/resource {
    add_header Content-Range 'bytes */4096' always;
    return 416; # Range Not Satisfiable
}
fetch
const res = await fetch("/api/resource");
if (res.status === 416) {
  // 416 Range Not Satisfiable
  const contentRange = res.headers.get("Content-Range");
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 416 Range Not Satisfiable
# Content-Range: bytes */4096

417 Expectation Failed

What it means

The request's Expect header carries an expectation the server (or a proxy on the path) will not meet. Since 100-continue is the only standard expectation, a 417 almost always means some hop does not support that handshake.

Clients recover by resending without the Expect header — most HTTP libraries do it automatically.

When to use it

  • Servers or intermediaries that genuinely cannot support 100-continue on a path where a client demands it.

When not to use it

  • Rejecting the request's CONTENT — expectation failure is strictly about the Expect header.

Cacheability

Not cacheable by default: caches may store this response only when explicit freshness information — Cache-Control or Expires — permits it (RFC 9111).

Idempotency context

The body was never accepted; resending without Expect is the standard, safe recovery.

Defined in

RFC 9110 §15.5.18

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(417).send("Expectation Failed");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=417,
        content={"detail": "Expectation Failed"},
    )
nginx
location /api/resource {
    return 417; # Expectation Failed
}
fetch
const res = await fetch("/api/resource");
if (res.status === 417) {
  // 417 Expectation Failed
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 417 Expectation Failed

418 I'm a Teapot

Semi-standard

What it means

Born in RFC 2324 (the Hyper Text Coffee Pot Control Protocol, dated 1998-04-01): 'any attempt to brew coffee with a teapot should result in the error code 418 I'm a teapot.' It is a joke — and one of the best-loved artifacts of internet culture.

RFC 9110 pointedly does NOT define 418: the code point is marked unused/reserved in the IANA registry after a 2017 community campaign ('Save 418') kept frameworks from repurposing it. Many real servers still serve it as an easter egg.

When to use it

  • Easter eggs and demo endpoints, where whimsy is the point and no client needs to machine-interpret the answer.

When not to use it

  • Production APIs — clients and monitoring treat it as an unknown 4xx, which per HTTP's fallback rule means they handle it as a generic 400.
  • As a bot-blocking response; 403 or 429 say what you actually mean.

Cacheability

Not cacheable by default: caches may store this response only when explicit freshness information — Cache-Control or Expires — permits it (RFC 9111).

Idempotency context

The teapot remains a teapot on retry — short and stout, and entirely idempotent about it.

Defined in

RFC 2324 §2.3.2

Scope: Semi-standard: defined by the April Fools' RFC 2324, marked '(Unused)' by RFC 9110 §15.5.19, yet deliberately reserved in the IANA registry and widely implemented as an easter egg.

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(418).send("I'm a Teapot");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=418,
        content={"detail": "I'm a Teapot"},
    )
nginx
location /api/resource {
    return 418; # I'm a Teapot
}
fetch
const res = await fetch("/api/resource");
if (res.status === 418) {
  // 418 I'm a Teapot
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 418 I'm a Teapot

420 Enhance Your Calm

Non-standard

What it means

Never part of HTTP: Twitter's first API answered over-eager clients with 420 Enhance Your Calm before RFC 6585 gave the world a standard code. Twitter itself moved to 429 in API v1.1.

You will still meet it in old client libraries, mocks and tutorials — treat any surviving sender the way you would treat a 429: back off.

When to use it

  • Recognizing it in legacy traffic and third-party logs — never for emitting.

When not to use it

  • Your own services — send the standard 429 with Retry-After; every client understands it.

Cacheability

Not cacheable by default: caches may store this response only when explicit freshness information — Cache-Control or Expires — permits it (RFC 9111).

Idempotency context

Treat like 429: back off before retrying, whatever the method.

Defined in

No formal spec — Twitter API v1 (historical)

Scope: Non-standard folk code. Twitter API v1 only, superseded there by 429; documented here because it still surfaces in logs and older tooling.

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(420).send("Enhance Your Calm");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=420,
        content={"detail": "Enhance Your Calm"},
    )
nginx
location /api/resource {
    return 420; # Enhance Your Calm
}
fetch
const res = await fetch("/api/resource");
if (res.status === 420) {
  // 420 Enhance Your Calm
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 420 Enhance Your Calm

421 Misdirected Request

What it means

The request arrived at a server unable to produce an authoritative response for the URI's origin — the signature failure of HTTP/2 connection reuse, where a client coalesces two hostnames onto one connection because they share a certificate and IP, but the far end only serves one of them.

Clients recover by retrying on a fresh connection to the correct authority; 421 is defined as retryable that way.

When to use it

  • SNI/virtual-host mismatches: the TLS connection's server does not host the :authority the request names.

When not to use it

  • Ordinary routing errors inside an application you do control — fix the routing or answer 404.

Cacheability

Not cacheable by default: caches may store this response only when explicit freshness information — Cache-Control or Expires — permits it (RFC 9111).

Idempotency context

Defined as safe to retry over a new connection — even for non-idempotent methods, since the misdirected server never processed it.

Defined in

RFC 9110 §15.5.20

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(421).send("Misdirected Request");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=421,
        content={"detail": "Misdirected Request"},
    )
nginx
location /api/resource {
    return 421; # Misdirected Request
}
fetch
const res = await fetch("/api/resource");
if (res.status === 421) {
  // 421 Misdirected Request
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 421 Misdirected Request

422 Unprocessable Content

What it means

The server understood the content type and the syntax, yet cannot process the instructions inside: a date that ends before it starts, a reference to a nonexistent ID, a field that violates a business rule. RFC 9110 renamed it from WebDAV's 'Unprocessable Entity' and promoted it into core HTTP.

The working division of labor: 400 for 'could not parse it', 422 for 'parsed it, and it does not make sense' — the natural home of field-level validation errors.

When to use it

  • Schema-valid JSON failing domain validation — with per-field errors in the body.
  • REST APIs distinguishing malformed requests from semantically invalid ones.

When not to use it

  • Unparsable bodies or broken syntax — that is 400.
  • Conflicts with current resource state — that is 409.

Cacheability

Not cacheable by default: caches may store this response only when explicit freshness information — Cache-Control or Expires — permits it (RFC 9111).

Idempotency context

The request must change before a retry can succeed; resending the same body reproduces the same validation failure.

Defined in

RFC 9110 §15.5.21

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(422).send("Unprocessable Content");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=422,
        content={"detail": "Unprocessable Content"},
    )
nginx
location /api/resource {
    return 422; # Unprocessable Content
}
fetch
const res = await fetch("/api/resource");
if (res.status === 422) {
  // 422 Unprocessable Content
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 422 Unprocessable Content

423 Locked

What it means

The source or destination of the operation is locked — WebDAV's explicit checkout/checkin machinery at work — and the request did not present the right lock token. The body can say whose lock stands in the way.

When to use it

  • WebDAV servers enforcing LOCK/UNLOCK semantics against writers without the token.

When not to use it

  • Application-level locking in ordinary REST APIs — 409 with a descriptive body is the conventional answer there.

Cacheability

Not cacheable by default: caches may store this response only when explicit freshness information — Cache-Control or Expires — permits it (RFC 9111).

Idempotency context

Retry after the lock is released or with the correct Lock-Token — until then the answer will not change.

Defined in

RFC 4918 §11.3

Scope: WebDAV. General HTTP has no lock model; outside DAV use 409.

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(423).send("Locked");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=423,
        content={"detail": "Locked"},
    )
nginx
location /api/resource {
    return 423; # Locked
}
fetch
const res = await fetch("/api/resource");
if (res.status === 423) {
  // 423 Locked
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 423 Locked

424 Failed Dependency

What it means

Inside multi-step WebDAV operations (PROPPATCH's all-or-nothing property sets, chained MOVEs), 424 marks the steps that never ran because a prerequisite step failed — usually inside a 207 body next to the actual failure.

When to use it

  • WebDAV servers reporting cascade failures within compound operations.

When not to use it

  • General APIs describing upstream service failure — that is 502/503 territory, not a dependency between the client's own steps.

Cacheability

Not cacheable by default: caches may store this response only when explicit freshness information — Cache-Control or Expires — permits it (RFC 9111).

Idempotency context

Fix the failing prerequisite first; the dependent steps were never executed at all.

Defined in

RFC 4918 §11.4

Scope: WebDAV. Meaningful mainly inside 207 Multi-Status bodies.

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(424).send("Failed Dependency");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=424,
        content={"detail": "Failed Dependency"},
    )
nginx
location /api/resource {
    return 424; # Failed Dependency
}
fetch
const res = await fetch("/api/resource");
if (res.status === 424) {
  // 424 Failed Dependency
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 424 Failed Dependency

425 Too Early

What it means

TLS 1.3's 0-RTT mode lets clients send application data before the handshake completes — data an attacker can capture and replay. 425 is the server's refusal to process a possibly-replayed request, telling the client to retry once the handshake is done.

It is infrastructure-level plumbing: browsers and TLS-terminating proxies handle it; application code rarely sees it.

When to use it

  • TLS terminators and origins refusing non-idempotent or sensitive requests carried in 0-RTT early data.

When not to use it

  • Any 'come back later' outside the TLS-early-data context — that is 429 or 503 with Retry-After.

Cacheability

Not cacheable by default: caches may store this response only when explicit freshness information — Cache-Control or Expires — permits it (RFC 9111).

Idempotency context

The whole point: the request MIGHT be an attacker's replay, so the server refuses side effects; the client retries safely after the handshake, exactly once.

Defined in

RFC 8470 §5.2

Scope: Tied to TLS 1.3 0-RTT early data (RFC 8470); not a general-purpose 'too soon'.

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(425).send("Too Early");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=425,
        content={"detail": "Too Early"},
    )
nginx
location /api/resource {
    return 425; # Too Early
}
fetch
const res = await fetch("/api/resource");
if (res.status === 425) {
  // 425 Too Early
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 425 Too Early

426 Upgrade Required

What it means

The server declines to perform the request on the current protocol but will after the client upgrades — the response's Upgrade header names what it wants (a newer HTTP, or a protocol like WebSocket over the same port).

It is the demand-side sibling of 101: 101 accepts an upgrade the client offered; 426 demands one the client has not made.

When to use it

  • Endpoints that require a protocol the client is not speaking on this connection.

When not to use it

  • Steering clients from http:// to https:// — that is a 301/308 redirect to the https URI, not an Upgrade.

Cacheability

Not cacheable by default: caches may store this response only when explicit freshness information — Cache-Control or Expires — permits it (RFC 9111).

Idempotency context

Nothing was processed; retry after switching to the protocol the Upgrade header names.

Defined in

RFC 9110 §15.5.22

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.set("Upgrade", 'HTTP/2.0');
  res.status(426).send("Upgrade Required");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=426,
        content={"detail": "Upgrade Required"},
        headers={"Upgrade": "HTTP/2.0"},
    )
nginx
location /api/resource {
    add_header Upgrade 'HTTP/2.0' always;
    return 426; # Upgrade Required
}
fetch
const res = await fetch("/api/resource");
if (res.status === 426) {
  // 426 Upgrade Required
  const upgrade = res.headers.get("Upgrade");
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 426 Upgrade Required
# Upgrade: HTTP/2.0

428 Precondition Required

What it means

A guard against the lost-update problem: the origin requires state-changing requests to carry a precondition (typically If-Match with a current ETag), and this one arrived bare. RFC 6585 added it so servers can MANDATE the optimistic-concurrency discipline that 412 enforces.

The pair works as a protocol: 428 teaches clients to send preconditions; 412 tells them when their precondition lost the race.

When to use it

  • APIs that require If-Match on every PUT/PATCH/DELETE to prevent blind overwrites.

When not to use it

  • When a precondition WAS sent and merely failed — that is 412, not 428.

Cacheability

Not cacheable by default: caches may store this response only when explicit freshness information — Cache-Control or Expires — permits it (RFC 9111).

Idempotency context

Nothing executed; fetch the resource, capture its ETag, and resend the request conditionally.

Defined in

RFC 6585 §3

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(428).send("Precondition Required");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=428,
        content={"detail": "Precondition Required"},
    )
nginx
location /api/resource {
    return 428; # Precondition Required
}
fetch
const res = await fetch("/api/resource");
if (res.status === 428) {
  // 428 Precondition Required
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 428 Precondition Required

429 Too Many Requests

What it means

The standard rate-limiting response (RFC 6585): the client sent more traffic in a window than this server allows. The body should describe the limit, and Retry-After — seconds or an HTTP date — tells the client when trying again is welcome.

Well-behaved clients treat it as a scheduling instruction, not an error to hammer through: honor Retry-After when present, otherwise back off exponentially with jitter. Many APIs supplement it with RateLimit-* headers so clients can pace themselves before hitting the wall.

When to use it

  • API gateways and services enforcing per-client quotas — with Retry-After set to something honest.
  • Login and password endpoints throttling brute-force attempts.

When not to use it

  • Whole-service overload independent of any one client — that is 503.
  • Permanent plan-level caps where 'later' will not help; 402 or 403 with an explanatory body is more truthful.

Cacheability

Not cacheable by default: caches may store this response only when explicit freshness information — Cache-Control or Expires — permits it (RFC 9111).

Idempotency context

The request was rejected before execution, so retrying is side-effect-safe — but only AFTER the Retry-After delay; immediate retries typically extend the penalty.

Defined in

RFC 6585 §4

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.set("Retry-After", '120');
  res.status(429).send("Too Many Requests");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=429,
        content={"detail": "Too Many Requests"},
        headers={"Retry-After": "120"},
    )
nginx
location /api/resource {
    add_header Retry-After '120' always;
    return 429; # Too Many Requests
}
fetch
const res = await fetch("/api/resource");
if (res.status === 429) {
  // 429 Too Many Requests
  const retryAfter = res.headers.get("Retry-After");
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 429 Too Many Requests
# Retry-After: 120

431 Request Header Fields Too Large

What it means

The server refuses to process the request because its header fields are too big, individually or in total (RFC 6585). In the wild it is almost always cookie bloat: years of accumulated cookies on one domain crossing a proxy's header buffer.

The response can name the offending field; clearing cookies is the classic user-side fix, trimming what you set is the durable server-side one.

When to use it

  • Servers and proxies enforcing header-size limits — ideally saying which field overflowed.

When not to use it

  • Oversized bodies (413) or URLs (414); 431 is strictly about the header section.

Cacheability

Not cacheable by default: caches may store this response only when explicit freshness information — Cache-Control or Expires — permits it (RFC 9111).

Idempotency context

Nothing was processed; shrink the headers (usually cookies) and resend safely.

Defined in

RFC 6585 §5

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(431).send("Request Header Fields Too Large");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=431,
        content={"detail": "Request Header Fields Too Large"},
    )
nginx
location /api/resource {
    return 431; # Request Header Fields Too Large
}
fetch
const res = await fetch("/api/resource");
if (res.status === 431) {
  // 431 Request Header Fields Too Large
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 431 Request Header Fields Too Large

451 Unavailable For Legal Reasons

What it means

The server is refusing access as a consequence of a legal demand: a court order, a government block, a DMCA takedown, a geo-fenced regulatory regime. RFC 7725 encourages a body that names the demand and a Link header with rel="blocked-by" identifying who is doing the blocking.

The number is a deliberate literary reference to Ray Bradbury's Fahrenheit 451 — transparency about censorship built into the protocol.

When to use it

  • Content blocked in specific jurisdictions, takedown-compliant removals, sanctioned-region blocks — where honesty about the WHY is possible.

When not to use it

  • Ordinary policy denials of your own choosing — that is 403.
  • When the legal demand itself gags disclosure; operators in that position typically fall back to 403 or 404.

Cacheability

Not cacheable by default: caches may store this response only when explicit freshness information — Cache-Control or Expires — permits it (RFC 9111).

Idempotency context

Retrying does not help from the same vantage point — the block is jurisdictional or injunctive, not transient.

Defined in

RFC 7725 §3

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(451).send("Unavailable For Legal Reasons");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=451,
        content={"detail": "Unavailable For Legal Reasons"},
    )
nginx
location /api/resource {
    return 451; # Unavailable For Legal Reasons
}
fetch
const res = await fetch("/api/resource");
if (res.status === 451) {
  // 451 Unavailable For Legal Reasons
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 451 Unavailable For Legal Reasons

499 Client Closed Request

Non-standard

What it means

Not an HTTP status at all in the wire sense: nginx records 499 in its access log when the client closed the connection while nginx was still waiting on the response — nothing is ever SENT, because there is no one left to send to.

A burst of 499s reads like impatience made visible: client timeouts shorter than upstream latency, users refreshing away, or load balancers reaping connections. The upstream request may well have completed after the client left — which matters for non-idempotent writes.

When to use it

  • Reading nginx logs — it marks abandoned requests and is a latency smell worth graphing.

When not to use it

  • Emitting from applications — it is nginx's internal bookkeeping, not a response you can meaningfully send.

Cacheability

Not applicable: nothing is transmitted to the client, so there is nothing for any cache to store (nginx log artifact, not a wire response).

Idempotency context

The dangerous case: the abandoned request may have finished server-side after the client left, so a client retry can double-execute a POST — idempotency keys are the cure.

Defined in

nginx source — ngx_http_request.h

Scope: nginx-only, log-only. Never appears on the wire; other proxies log the same event differently (HAProxy's CQ/CC flags, Envoy's DOWNSTREAM_CONNECTION_TERMINATION).

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(499).send("Client Closed Request");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=499,
        content={"detail": "Client Closed Request"},
    )
nginx
location /api/resource {
    return 499; # Client Closed Request
}
fetch
const res = await fetch("/api/resource");
if (res.status === 499) {
  // 499 Client Closed Request
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 499 Client Closed Request

5xx — Server errors

5xx status codes — code, name, and one-line summary
CodeNameSummaryCopy
500Internal Server ErrorThe server hit an unexpected condition it has no better answer for — the generic server-side failure.
501Not ImplementedThe server does not support the functionality — typically the request method — needed to fulfil this.
502Bad GatewayA gateway or proxy got an invalid response from the upstream server it asked on your behalf.
503Service UnavailableThe server is temporarily unable to serve — overloaded or down for maintenance; Retry-After hints when to return.
504Gateway TimeoutA gateway or proxy gave up waiting for the upstream server to answer in time.
505HTTP Version Not SupportedThe server refuses to support the major HTTP version the request used.
506Variant Also NegotiatesTransparent content negotiation is misconfigured: the chosen variant is itself a negotiator, a loop.
507Insufficient StorageWebDAV: the server cannot store what this request needs stored — the allocation would not fit.
508Loop DetectedWebDAV: the server aborted because it found itself in an infinite loop while processing.
510Not ExtendedA relic of RFC 2774's HTTP Extension Framework: the request lacked a mandatory extension declaration.
511Network Authentication RequiredA captive portal is in the way: the NETWORK wants a login before it will carry your traffic anywhere.
999Request DeniedA folk code — LinkedIn most famously — for refusing automated traffic; outside HTTP's real 1xx–5xx grid.

The same 5xx codes in full — each row above links to its entry.

500 Internal Server Error

What it means

Something went wrong on the server and no more specific 5xx applies: an unhandled exception, a null dereference, a database driver throwing mid-request. The client's request may have been perfectly valid.

A disciplined 500 says little to the client (internals belong in your logs, not the body) but carries a correlation ID so support and telemetry can meet in the middle.

When to use it

  • Unhandled exceptions surfaced by your framework's last-resort error handler.
  • Invariant violations where continuing would corrupt state — fail loudly, log richly.

When not to use it

  • Conditions with truthful specific codes: 502 for a bad upstream answer, 503 for overload, 504 for upstream timeout.
  • Client mistakes — a 500 on bad input teaches clients nothing and pages your on-call for their typo.

Cacheability

Not cacheable by default: caches may store this response only when explicit freshness information — Cache-Control or Expires — permits it (RFC 9111).

Idempotency context

Retry with care: the failure point is unknown, so a POST may have half-executed before dying — idempotent methods retry safely, writes want idempotency keys.

Defined in

RFC 9110 §15.6.1

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(500).send("Internal Server Error");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=500,
        content={"detail": "Internal Server Error"},
    )
nginx
location /api/resource {
    return 500; # Internal Server Error
}
fetch
const res = await fetch("/api/resource");
if (res.status === 500) {
  // 500 Internal Server Error
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 500 Internal Server Error

501 Not Implemented

What it means

The server does not recognize or cannot support the request method for ANY resource — the whole capability is missing, not merely disallowed on this URI (that narrower case is 405 with Allow).

You meet it from minimal servers and proxies facing methods they never learned: a static file server given PATCH, an old gateway given a WebDAV verb.

When to use it

  • Servers refusing methods they genuinely do not implement at all.
  • Honest scaffolding for declared-but-unbuilt protocol features.

When not to use it

  • A supported method that this particular resource does not offer — that is 405.
  • Unbuilt application features behind normal routes — prefer 404 or 403; 501 speaks of protocol capability.

Cacheability

Cacheable by default: this is one of the status codes caches may store and reuse even without explicit freshness information (RFC 9111 heuristic caching).

Idempotency context

Retrying changes nothing until the server grows the capability; nothing was executed.

Defined in

RFC 9110 §15.6.2

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(501).send("Not Implemented");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=501,
        content={"detail": "Not Implemented"},
    )
nginx
location /api/resource {
    return 501; # Not Implemented
}
fetch
const res = await fetch("/api/resource");
if (res.status === 501) {
  // 501 Not Implemented
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 501 Not Implemented

502 Bad Gateway

What it means

The responder is an intermediary — reverse proxy, load balancer, CDN edge — reporting that the server BEHIND it answered garbage: a connection refused or reset, a truncated or unparsable response, an upstream TLS failure.

Diagnosis therefore starts behind the proxy: is the app process up, is the upstream port right, did the backend crash mid-response? The proxy is the messenger, not (usually) the culprit.

When to use it

  • Proxies relaying upstream connection failures and malformed upstream responses.

When not to use it

  • A healthy upstream that answered slowly — that is 504.
  • Deliberate refusal to serve (maintenance, overload) — that is 503.
  • Origin servers with no upstream; an origin's own failure is a 500.

Cacheability

Not cacheable by default: caches may store this response only when explicit freshness information — Cache-Control or Expires — permits it (RFC 9111).

Idempotency context

Whether the upstream executed anything before failing is unknowable from outside — retry idempotent requests freely, writes only with idempotency keys.

Defined in

RFC 9110 §15.6.3

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(502).send("Bad Gateway");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=502,
        content={"detail": "Bad Gateway"},
    )
nginx
location /api/resource {
    return 502; # Bad Gateway
}
fetch
const res = await fetch("/api/resource");
if (res.status === 502) {
  // 502 Bad Gateway
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 502 Bad Gateway

503 Service Unavailable

What it means

A deliberately temporary answer: the service exists and will return, but right now it is overloaded, draining, restarting or under scheduled maintenance. Retry-After — seconds or a date — turns it from a shrug into a schedule.

It is also load-shedding's status of choice: refusing excess work fast with a 503 keeps queues short and recovery quick, which is kinder than timing out slowly.

When to use it

  • Planned maintenance windows — with Retry-After and, for user-facing pages, an honest maintenance page.
  • Overload protection: shedding traffic a health-checked instance cannot take, circuit breakers holding a failing dependency open.

When not to use it

  • Permanent shutdowns — that is 410 for the resource or DNS-level retirement, not eternal 503.
  • Per-client rate limiting — that is 429; 503 says WE are the bottleneck, 429 says YOU are.

Cacheability

Not cacheable by default: caches may store this response only when explicit freshness information — Cache-Control or Expires — permits it (RFC 9111).

Idempotency context

The request was refused, not half-done — retry after Retry-After (with jitter, so a thundering herd does not re-create the overload).

Defined in

RFC 9110 §15.6.4

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.set("Retry-After", '120');
  res.status(503).send("Service Unavailable");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=503,
        content={"detail": "Service Unavailable"},
        headers={"Retry-After": "120"},
    )
nginx
location /api/resource {
    add_header Retry-After '120' always;
    return 503; # Service Unavailable
}
fetch
const res = await fetch("/api/resource");
if (res.status === 503) {
  // 503 Service Unavailable
  const retryAfter = res.headers.get("Retry-After");
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 503 Service Unavailable
# Retry-After: 120

504 Gateway Timeout

What it means

502's slower sibling: the intermediary reached its upstream but the response did not arrive within the proxy's timeout — a slow query, a deadlocked worker, a dependency chain stacking latencies past the edge's budget.

The crucial operational subtlety: the upstream may STILL be working after the proxy quit waiting, so the work might complete after the client has already seen an error.

When to use it

  • Proxies enforcing upstream response deadlines (nginx proxy_read_timeout, load-balancer idle timeouts).

When not to use it

  • Clients that were too slow SENDING their request — that is 408, on the other side of the exchange.
  • Upstreams that answered but answered badly — that is 502.

Cacheability

Not cacheable by default: caches may store this response only when explicit freshness information — Cache-Control or Expires — permits it (RFC 9111).

Idempotency context

The most retry-treacherous 5xx: the timed-out work may still finish, so a blind retry of a POST is a classic double-write — align timeout budgets and use idempotency keys.

Defined in

RFC 9110 §15.6.5

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(504).send("Gateway Timeout");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=504,
        content={"detail": "Gateway Timeout"},
    )
nginx
location /api/resource {
    return 504; # Gateway Timeout
}
fetch
const res = await fetch("/api/resource");
if (res.status === 504) {
  // 504 Gateway Timeout
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 504 Gateway Timeout

505 HTTP Version Not Supported

What it means

The server does not (or will not) speak the protocol major version of the request. Vanishingly rare in practice: version negotiation happens in ALPN and connection preambles long before application code, so a real 505 usually means something archaic or misconfigured on one end.

When to use it

  • Servers that genuinely refuse a request's major HTTP version and want to say so explicitly.

When not to use it

  • Demanding an upgrade mid-conversation — 426 with an Upgrade header carries that request.

Cacheability

Not cacheable by default: caches may store this response only when explicit freshness information — Cache-Control or Expires — permits it (RFC 9111).

Idempotency context

Idempotency belongs to the request method, not the status code: retrying a GET, PUT or DELETE is safe by definition, while resending a POST may repeat its side effects.

Defined in

RFC 9110 §15.6.6

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(505).send("HTTP Version Not Supported");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=505,
        content={"detail": "HTTP Version Not Supported"},
    )
nginx
location /api/resource {
    return 505; # HTTP Version Not Supported
}
fetch
const res = await fetch("/api/resource");
if (res.status === 505) {
  // 505 HTTP Version Not Supported
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 505 HTTP Version Not Supported

506 Variant Also Negotiates

What it means

From RFC 2295's experimental transparent content negotiation: the server picked a variant to end the negotiation, but that variant turns out to negotiate too — a circular configuration that can never resolve.

The extension saw almost no deployment, so 506 survives mainly as a registry entry and a very specific misconfiguration report.

When to use it

  • Servers implementing RFC 2295 that detect a negotiation loop in their variant configuration.

When not to use it

  • Anything outside transparent content negotiation — ordinary negotiation failures are 406.

Cacheability

Not cacheable by default: caches may store this response only when explicit freshness information — Cache-Control or Expires — permits it (RFC 9111).

Idempotency context

Idempotency belongs to the request method, not the status code: retrying a GET, PUT or DELETE is safe by definition, while resending a POST may repeat its side effects.

Defined in

RFC 2295 §8.1

Scope: Experimental extension (RFC 2295); registered, essentially undeployed.

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(506).send("Variant Also Negotiates");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=506,
        content={"detail": "Variant Also Negotiates"},
    )
nginx
location /api/resource {
    return 506; # Variant Also Negotiates
}
fetch
const res = await fetch("/api/resource");
if (res.status === 506) {
  // 506 Variant Also Negotiates
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 506 Variant Also Negotiates

507 Insufficient Storage

What it means

The method could not complete because the server cannot allocate the space the operation requires — a WebDAV PUT into a full quota, a COPY that would overflow the destination collection.

It is the server-side counterpart of 413: 413 says YOUR upload is too big; 507 says MY disk (or your quota here) is too full.

When to use it

  • WebDAV and storage-backed APIs reporting exhausted quotas or full volumes on write.

When not to use it

  • Refusing oversized uploads regardless of free space — that is 413.

Cacheability

Not cacheable by default: caches may store this response only when explicit freshness information — Cache-Control or Expires — permits it (RFC 9111).

Idempotency context

Retrying without freeing space fails identically; after space is freed, the method's own idempotency applies.

Defined in

RFC 4918 §11.5

Scope: WebDAV origin (RFC 4918); occasionally borrowed by storage APIs for quota-full conditions.

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(507).send("Insufficient Storage");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=507,
        content={"detail": "Insufficient Storage"},
    )
nginx
location /api/resource {
    return 507; # Insufficient Storage
}
fetch
const res = await fetch("/api/resource");
if (res.status === 507) {
  // 507 Insufficient Storage
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 507 Insufficient Storage

508 Loop Detected

What it means

While executing a Depth: infinity operation, the server discovered a binding loop — a collection that contains itself, however indirectly — and terminated rather than recurse forever (RFC 5842).

Its 2xx cousin 208 marks loop-avoidance that SUCCEEDED inside a multistatus body; 508 is the failure case where processing had to stop.

When to use it

  • WebDAV servers with the bindings extension detecting cyclic hierarchies mid-operation.

When not to use it

  • Application-level cycles (circular imports, recursive templates) — that is a 500 with a good log line.

Cacheability

Not cacheable by default: caches may store this response only when explicit freshness information — Cache-Control or Expires — permits it (RFC 9111).

Idempotency context

Deterministically reproducible — retrying re-walks the same cycle until the binding graph is fixed.

Defined in

RFC 5842 §7.2

Scope: WebDAV bindings extension (RFC 5842).

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(508).send("Loop Detected");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=508,
        content={"detail": "Loop Detected"},
    )
nginx
location /api/resource {
    return 508; # Loop Detected
}
fetch
const res = await fetch("/api/resource");
if (res.status === 508) {
  // 508 Loop Detected
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 508 Loop Detected

510 Not Extended

Semi-standard

What it means

RFC 2774 proposed a framework for mandatory HTTP extensions; 510 was its way of saying 'this resource requires an extension your request did not declare.' The framework never caught on and the RFC is classified Historic.

The code remains registered, so it appears in references like this one — and almost nowhere else.

When to use it

  • Realistically: recognizing it in a reference. The framework it belongs to is dead.

When not to use it

  • New APIs signalling missing parameters — 400 or 422 with a clear body is the living convention.

Cacheability

Not cacheable by default: caches may store this response only when explicit freshness information — Cache-Control or Expires — permits it (RFC 9111).

Idempotency context

Idempotency belongs to the request method, not the status code: retrying a GET, PUT or DELETE is safe by definition, while resending a POST may repeat its side effects.

Defined in

RFC 2774 §7

Scope: Semi-standard: RFC 2774 is Experimental, reclassified Historic; the code point stays IANA-registered.

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(510).send("Not Extended");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=510,
        content={"detail": "Not Extended"},
    )
nginx
location /api/resource {
    return 510; # Not Extended
}
fetch
const res = await fetch("/api/resource");
if (res.status === 510) {
  // 510 Not Extended
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 510 Not Extended

511 Network Authentication Required

What it means

Defined (RFC 6585) for captive portals — hotel, café and airport networks that intercept traffic until you accept terms or log in. The 511 body should contain a link to the portal, and the code exists precisely so machines can tell 'the network is blocking me' apart from 'the site denied me'.

Before 511, portals answered intercepted requests with fake 200s — poisoning caches with login pages, a failure mode the RFC recounts with feeling. It is emitted by network infrastructure, never by origin servers.

When to use it

  • Captive-portal gateways intercepting traffic from unauthenticated network clients.

When not to use it

  • Origin servers, ever — an origin wanting credentials sends 401; a proxy sends 407. 511 belongs to the network in between.

Cacheability

Explicitly MUST NOT be stored by caches (RFC 6585 §6) — the entire point is that this response is not from the origin.

Idempotency context

The original request never reached its destination; after portal login, retry it unchanged with a clear conscience.

Defined in

RFC 6585 §6

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(511).send("Network Authentication Required");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=511,
        content={"detail": "Network Authentication Required"},
    )
nginx
location /api/resource {
    return 511; # Network Authentication Required
}
fetch
const res = await fetch("/api/resource");
if (res.status === 511) {
  // 511 Network Authentication Required
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 511 Network Authentication Required

999 Request Denied

Non-standard

What it means

Not HTTP: no RFC or registry defines any 9xx class. LinkedIn became the famous emitter, answering suspected scrapers and unauthenticated crawlers with 999 Request Denied; a scattering of CDNs and anti-bot layers have copied the habit.

Because 999 falls outside the spec's class system, standards-following clients cannot even apply the 'treat unknown codes as x00' fallback meaningfully — which is arguably the point: it is a bouncer's shrug, not a protocol message.

When to use it

  • Recognizing bot-defense walls in scraping logs and third-party integrations — the practical reading is 'blocked, probably permanently, do not hammer'.

When not to use it

  • Your own services — 403 (refusal) and 429 (rate limiting) say the same things in a language every client speaks.

Cacheability

Undefined by any spec — caches have no rules for out-of-grid codes; assume nothing is stored and nothing should be.

Idempotency context

Retrying usually digs the hole deeper — anti-bot systems read persistence as confirmation; back off entirely.

Defined in

No formal spec — folk usage (LinkedIn)

Scope: Non-standard folk code with no defining document; sits outside the real 1xx–5xx grid and is grouped with 5xx here only for layout (statusClass is clamped to 5 — see the pack invariant).

Related codes

Handler snippets

Express
app.use("/api/resource", (req, res) => {
  res.status(999).send("Request Denied");
});
FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/api/resource")
def handler():
    return JSONResponse(
        status_code=999,
        content={"detail": "Request Denied"},
    )
nginx
location /api/resource {
    return 999; # Request Denied
}
fetch
const res = await fetch("/api/resource");
if (res.status === 999) {
  // 999 Request Denied
  // handle it here
}
curl -i
curl -i https://example.com/api/resource
# HTTP/1.1 999 Request Denied

Do it offline:$ curl -i https://example.com/

How to use it

  1. Filter as you type — a code (429), the start of one (40), a class (4xx), a reason phrase, or plain words: too many requests lands on 429. The 1xx–5xx chips narrow the query to one class; / focuses the filter box.
  2. Expand any code. Each row is a native disclosure — it opens even with JavaScript disabled — covering meaning, when to use it, when a neighbour fits better, caching, and retry implications.
  3. Copy at the granularity the job needs: the row button takes code plus reason phrase (404 Not Found); every handler snippet — Express, FastAPI, nginx, fetch, curl — has its own button.
  4. Send a colleague straight to one code: Copy link on a panel appends the code as a fragment, so /http-status-codes#429 opens with 429 expanded and announced — ordinary anchors, working in every browser.

Every status code the web actually uses is already on this page, served as plain HTML — find-in-page works before any script loads. Type a number, a name, or a phrase like too many requests into the filter; open a code for its meaning, cacheability and handler snippets; copy exactly what you need. Nothing is fetched and nothing you type leaves the page.

How it works

The first digit of a status code is a contract on its own. RFC 9110 §15 defines the five classes and requires a client that meets an unrecognised code to treat it as the x00 of its class: an unregistered 471 is handled as a 400, an unregistered 599 as a 500. That fallback lets new codes enter the protocol without breaking deployed software — and it is what this page's teaching block explains when a search asks for a code that never existed.

The authoritative list is the IANA HTTP Status Code Registry, changed only through the IETF review process RFC 9110 §16.2 sets out. The dataset here is a versioned snapshot of that registry, cut in CI, never edited by hand; each entry cites the section defining it, and the snapshot's review date is printed below.

Informational 1xx responses are interim: they arrive before the final status and are consumed at the protocol layer. fetch() resolves once, with the final response — response.status is never 100, 101 or 103, even when a 103 Early Hints started preloading long before the HTML arrived. They are documented here because they turn up in curl -i transcripts, proxy logs and server debugging.

The definitions have moved house twice: HTTP/1.1 began as RFC 2616 in 1999, the 2014 rewrite split it across RFC 7230–7235 with 7231 carrying the status codes, and RFC 9110 consolidated everything in 2022. 306 sits in the registry as unused and wears a Deprecated chip here; 418, born of a 1998 April-Fools joke, is implemented widely enough to document as semi-standard.

Examples

teapot
418 I'm a Teapot — Semi-standard — RFC 2324 §2.3.2

A free-text search: teapot is one of 418's aliases, so the filter narrows to one record. The chip is honest about standing — a joke RFC, not HTTP's own spec — and the citation names the defining section, as every panel does.

#301
301 Moved Permanently — The resource lives at the Location URI now and forever; clients and search engines should update their references.
302 Found — The resource is temporarily somewhere else; keep using the original URI next time.
308 Permanent Redirect — Permanent redirect that forbids method rewriting — 301's semantics with the method guaranteed.

Opening the page with #301 expands that panel, the alternatives one click away in its related row. Clients historically rewrote POST to GET following 301 and 302; 308 and 307 forbid that rewrite. Decide permanence first, method behaviour second.

5xx
12 codes in the 5xx class: 500, 501, 502, 503, 504, 505, 506, 507, 508, 510, 511, 999

A class query selects a whole section; the count is computed from the dataset, never typed into prose. The odd entry out is 999 — a folk code shelved here for layout, with a scope note that says so.

Every example on this page is executed against the same engine that powers the tool, on every build.

Gotchas worth knowing

420, 999 and 499 are folk codes, labelled as such

None of the three is registered, yet all show up in real logs, so each gets a full entry — Non-standard chip, scope note naming its owner: 499 is nginx noting the client hung up early, 420 was Twitter's old rate-limit reply, 999 is LinkedIn refusing automation.

306 is a reserved ghost

Earmarked for a proxy-switching mechanism in an expired draft, the idea died and RFC 9110 §15.4.7 lists the code point as unused. Its entry wears a Deprecated chip; a 306 in the wild is a bug in whatever sent it.

207 and 423 belong to WebDAV

Both come from RFC 4918, the WebDAV extension, not core HTTP: 207 Multi-Status wraps several per-resource results in one XML body; 423 Locked reports a resource under a DAV lock. Their scope notes keep both out of plain REST handlers.

You will never see a 1xx in fetch()

Interim responses are consumed below JavaScript, so the promise resolves with the final status only. Observe them with curl -i, which prints every status line. One caveat — curl -I switches to a HEAD request, and some servers answer HEAD differently from GET, so diagnose with -i.

Unknown codes fall back to their class

Search for 599 and instead of an empty result you get the rule that governs the live web: an unrecognised code is treated as the x00 of its class (RFC 9110 §15), the nearest documented neighbours offered — an unfamiliar number usually sits one digit from a real code.

Common errors

No such status code — here's how ranges work
The finder's no-match state for a three-digit query in the 100–599 range that matches nothing in the snapshot. Deliberately not a dead end: it lays out the five classes, states the x00 fallback, and offers the nearest documented codes on either side of the number you typed.
curl: (22) The requested URL returned error: 404
Not a transport failure: the server answered, and the answer was 404. curl exits this way only under -f/--fail, which its manual defines as turning any status of 400 or above into exit code 22 and suppressing the body. Drop the flag to see the response itself.
502 Bad Gateway — nginx
nginx's stock page for a proxied request whose upstream returned garbage — a refused connection, a reset, a malformed reply. Its sibling 504 means the upstream never answered inside the proxy's deadline. 502: check the app behind the proxy is up and speaking HTTP. 504: it is alive but too slow.

FAQ

How do HTTP status codes work?

The three-digit verdict on an HTTP exchange, sent in the response's first line: the first digit picks one of five classes, the remaining two the meaning within it. RFC 9110 §15 defines the semantics; the IANA registry records what officially exists.

When do I use 301, 302 or 308 for a redirect?

Two questions decide it. Permanent move? 301 or 308 — browsers and search engines shift to the new address; temporary, 302 or 307. Must the method survive? Legacy clients turned POST into GET after 301 and 302; 308 and 307 forbid that. For a moved API route, choose 308.

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

Real enough to meet in production, official never. Born in RFC 2324, the 1998 April Fools' coffee-pot protocol; HTTP's registry keeps the code point reserved, not adopted. Frameworks shipped it anyway — marked Semi-standard here: documented because you will meet it, flagged because no spec blesses it.

Why do my nginx logs show 499?

nginx's private bookkeeping, logged when the client closed the connection before the response was ready — a browser navigated away, or an upstream caller hit its own timeout. It never travels on the wire. A cluster of 499s is a latency signal: responses are slower than the callers' patience.

Which status codes can be cached?

Any response carrying explicit freshness information such as Cache-Control. Without it, RFC 9110 §15.1 lists the heuristically cacheable codes — 200, 203, 204, 206, 300, 301, 308, 404, 405, 410, 414 and 501 — which a cache may store on its own initiative. Each panel's cacheability line states which case applies under RFC 9111.

What happens on a code the client doesn't know, like 599?

Fall back to the class: an unrecognised code is treated as the x00 of its range — 599 as 500 — so the request still gets a sensible outcome (RFC 9110 §15). Search an unregistered number here and that rule is explained, nearest real codes offered.

Does a 4xx always mean the client is at fault?

It means the request, as received, could not be served — subtly different from blame. A 404 can be the server's fault for breaking a published URL; a 429 often punishes a polite client for a shared quota. Fix the request or the expectation; only 5xx invites retrying unchanged.

Keyboard shortcuts

/
Focus the filter box

Nothing you paste here leaves this tab. State only ever travels in links you explicitly create.

RFC 9110 — HTTP Semantics, §15: Status Codes · IANA Hypertext Transfer Protocol (HTTP) Status Code Registry · RFC 6585 — Additional HTTP Status Codes: 428, 429, 431 and 511 · RFC 4918 — HTTP Extensions for WebDAV: 207 Multi-Status and 423 Locked · RFC 2324 — Hyper Text Coffee Pot Control Protocol (the origin of 418)

Reviewed against RFC 9110 and the IANA HTTP Status Code Registry, July 2026 snapshot.

Last reviewed: 2026-07-29

esc

Data Formats & Conversion

  • JSON FormatterPretty-print JSON with configurable indentation — big numbers preserved exactly, entirely on this device.Data Formats & Conversion
  • JSON ValidatorSyntax-check JSON with the exact line, column and probable cause of every error — entirely on this device.Data Formats & Conversion
  • JSON MinifierStrip insignificant whitespace from JSON — values and key order byte-identical, gzip savings measured, entirely on this device.Data Formats & Conversion
  • JSON Tree ViewerNavigate huge JSON as a collapsible, searchable tree — copy any value or path, entirely on this device.Data Formats & Conversion
  • JSON EditorEdit JSON in a tree, table or text view — every change re-renders the other two and big numbers stay exact, entirely on this device.Data Formats & Conversion
  • JSON Diff / CompareCompare two JSON documents structurally — key order ignored, big numbers exact, RFC 6902 patch export — entirely on this device.Data Formats & Conversion
  • JSON Repair / FixerTurn almost-JSON into valid JSON with a logged, visible fix for every change — entirely on this device.Data Formats & Conversion
  • JSON SorterSort JSON object keys recursively — ascending or descending, on this device.Data Formats & Conversion
  • JSON Escape / UnescapeBackslash-escape text into a JSON string body — or unescape one back to text — entirely on this device.Data Formats & Conversion
  • JSON Stringify / UnstringifyWrap a JSON document as a quoted, escaped JSON string token — and unstringify it back — entirely on this device.Data Formats & Conversion
  • JSON to One LineCollapse JSON to a single line for logs, env vars and inline config — readable spacing or fully compact, big numbers preserved exactly, entirely on this device.Data Formats & Conversion
  • JSON Flatten / UnflattenFlatten nested JSON to dot- or bracket-path keys and unflatten it back — big numbers exact, entirely on this device.Data Formats & Conversion
  • JSON Graph VisualizerSee any JSON document as an interactive, collapsible node graph — pan, zoom and copy any path, entirely on this device.Data Formats & Conversion
  • NDJSON / JSON Lines ConverterReshape JSON between a single array and one-record-per-line NDJSON — losslessly, with every line validated, entirely on this device.Data Formats & Conversion
  • JSONPath TesterEvaluate a JSONPath expression against your JSON and see every match highlighted in the source — RFC 9535 semantics, entirely on this device.Data Formats & Conversion
  • JSON Path FinderClick any node in a JSON tree to copy its JSONPath, jq, JS, or RFC 6901 JSON Pointer path — entirely on this device.Data Formats & Conversion
  • jq PlaygroundRun jq filters over your JSON in-browser — jq 1.8.2 on WebAssembly, stdout and errors verbatim, entirely on this device.Data Formats & Conversion
  • JSON Schema ValidatorCheck a JSON document against a JSON Schema and see every violation with its data path and schema path — entirely on this device.Data Formats & Conversion
  • JSON Schema GeneratorPaste sample JSON, get a JSON Schema in the draft you target — required derived from what the samples actually show, entirely on this device.Data Formats & Conversion
  • JSON Schema to Sample JSONTurn a JSON Schema into valid example data — one integer seed makes it reproducible, entirely on this device.Data Formats & Conversion
  • JSON Schema to TypeScriptPaste a JSON Schema, get TypeScript types — local $ref and $defs resolved, every dropped keyword named, entirely on this device.Data Formats & Conversion
  • JSON Schema to ZodTurn a JSON Schema into Zod source with z.infer types — every dropped constraint named, entirely on this device.Data Formats & Conversion
  • JSON to TypeScriptPaste sample JSON, get idiomatic TypeScript interfaces — multi-sample optionality and real unions, entirely on this device.Data Formats & Conversion
  • JSON to Go StructGenerate idiomatic Go structs with correct json tags and initialisms from sample JSON — entirely on this device.Data Formats & Conversion
  • JSON to C# ClassesGenerate C# classes or records from sample JSON, matched to System.Text.Json or Newtonsoft — entirely on this device.Data Formats & Conversion
  • JSON to Java POJOGenerate Java POJOs or records with the right annotation stack from sample JSON — entirely on this device.Data Formats & Conversion
  • JSON to Python / PydanticGenerate Pydantic v2 models, dataclasses or TypedDicts from sample JSON — entirely on this device.Data Formats & Conversion
  • JSON to Rust SerdeGenerate Rust serde structs from sample JSON with correct Option<T> optionality and exact 64-bit integers — entirely on this device.Data Formats & Conversion
  • JSON to Kotlin Data ClassGenerate Kotlin data classes with kotlinx.serialization or Jackson annotations from sample JSON — entirely on this device.Data Formats & Conversion
  • JSON to Swift CodableGenerate Swift Codable structs or classes from sample JSON, with CodingKeys for wire names — entirely on this device.Data Formats & Conversion
  • JSON to Zod SchemaPaste sample JSON, get a Zod schema plus z.infer types — optionality from multiple samples, entirely on this device.Data Formats & Conversion
  • JSON to GraphQL SDLPaste sample JSON, get GraphQL SDL types — nullability read from your samples, entirely on this device.Data Formats & Conversion
  • JSON to SQL DDLGenerate CREATE TABLE DDL from sample JSON for four SQL dialects, with three honest shapes for nested data — entirely on this device.Data Formats & Conversion
  • TypeScript to JSON SchemaTurn TypeScript interfaces and type aliases into a JSON Schema or Zod schema — unsupported types are named, never guessed — entirely on this device.Data Formats & Conversion
  • JSON to Protobuf DefinitionTurn sample JSON into a proto3 .proto message with stable field numbers — entirely on this device.Data Formats & Conversion
  • YAML Validator / LinterSyntax-check YAML with the exact line, column and cause of every error — plus lint warnings on valid files, entirely on this device.Data Formats & Conversion
  • YAML FormatterRe-indent YAML without losing comments or rewriting your numbers — entirely on this device.Data Formats & Conversion
  • YAML to JSON ConverterConvert YAML to JSON or JSON to YAML with anchors, multi-document streams and type quirks handled honestly — entirely on this device.Data Formats & Conversion
  • YAML to XML / CSV ConverterConvert YAML to XML, XML back to YAML, or list-shaped YAML to CSV/TSV — every dropped construct counted — entirely on this device.Data Formats & Conversion
  • YAML Diff / CompareCompare two YAML documents structurally — added, removed, changed and retyped keys, order-insensitive by default, entirely on this device.Data Formats & Conversion
  • XML FormatterPretty-print XML without corrupting mixed content, CDATA or comments — entirely on this device.Data Formats & Conversion
  • XML ValidatorCheck XML well-formedness with the exact line, column and paired open-tag position of every error — entirely on this device.Data Formats & Conversion
  • XML MinifierStrip insignificant whitespace from XML — mixed content, CDATA and preserved subtrees byte-identical, savings measured, entirely on this device.Data Formats & Conversion
  • XML Tree ViewerNavigate large XML as a collapsible tree — search names, see namespaces, copy any node's XPath, entirely on this device.Data Formats & Conversion
  • XPath TesterEvaluate an XPath 1.0 expression against your XML and see every matched node with its line and path — namespace prefixes bound explicitly, on this device.Data Formats & Conversion
  • XML DiffCompare two XML documents by structure — added, removed and changed elements, attributes and text, addressed by node path — entirely on this device.Data Formats & Conversion
  • XML Escape / UnescapeEscape text for XML element or attribute contexts — or unescape entities and character references — entirely on this device.Data Formats & Conversion
  • XML to JSON ConverterConvert XML to JSON — and back — with explicit attribute, array, and mixed-content semantics, entirely on this device.Data Formats & Conversion
  • XML to CSV ConverterTurn repeating XML records into CSV, TSV or an .xlsx workbook — you pick the row element — entirely on this device.Data Formats & Conversion
  • CSV to JSON ConverterConvert CSV to JSON or JSON to CSV — streaming to 100 MB, type-safe by default — entirely on this device.Data Formats & Conversion
  • CSV Editor & ViewerOpen a CSV in a grid, edit cells, rows and columns, then export it with your delimiter and quoting intact — entirely on this device.Data Formats & Conversion
  • CSV to SQL ConverterGenerate CREATE TABLE and batched INSERT statements from CSV or JSON, with dialect-correct quoting and escaping — entirely on this device.Data Formats & Conversion
  • CSV to Excel ConverterCSV to XLSX and back without Excel's mangling — leading zeros, IDs and dates survive, entirely on this device.Data Formats & Conversion
  • CSV to Markdown TableTurn CSV or TSV into a GitHub-ready Markdown pipe table — or paste a Markdown table and get CSV back — entirely on this device.Data Formats & Conversion
  • CSV to HTML TableTurn CSV or TSV into a semantic, injection-safe HTML table — or paste a table back and get CSV — entirely on this device.Data Formats & Conversion
  • CSV to TSV ConverterChange a CSV's delimiter to tab, semicolon, pipe or anything you type — re-quoted correctly, entirely on this device.Data Formats & Conversion
  • CSV ValidatorCheck a CSV against RFC 4180 and get every ragged row, stray quote and encoding problem with its row and column — on this device.Data Formats & Conversion
  • CSV Diff / CompareCompare two CSV exports row by row — added, removed and changed rows, cell-level detail, optional key-column match — entirely on this device.Data Formats & Conversion
  • Remove Duplicate Rows (CSV)Drop repeated CSV rows by whole row or chosen columns, then sort and filter what is left — header kept, counts shown, all on this device.Data Formats & Conversion
  • CSV Split & MergeSplit a CSV into parts by rows, part count or size — header repeated in every part — and merge exports back into one file, entirely on this device.Data Formats & Conversion
  • CSV Column ToolsPull one column out of a CSV as a plain list, or drop, reorder, rename and insert columns and download the new file — entirely on this device.Data Formats & Conversion
  • Excel Paste to JSON/MarkdownTurn a range copied from Excel, Google Sheets or Numbers into JSON or a Markdown table — entirely on this device.Data Formats & Conversion
  • TOML to JSON ConverterConvert TOML to JSON or JSON to TOML with tables, dotted keys and all four datetime types handled honestly — entirely on this device.Data Formats & Conversion
  • TOML to YAML ConverterConvert TOML to YAML or YAML to TOML with datetimes, nulls, anchors and comments all accounted for — entirely on this device.Data Formats & Conversion
  • Properties to YAML ConverterConvert .properties to nested YAML or YAML back to .properties — dotted keys, indexed lists and \uXXXX escapes handled honestly — entirely on this device.Data Formats & Conversion
  • Protobuf Wire DecoderDecode protobuf bytes with no .proto — field numbers, wire types and ranked value guesses, entirely on this device.Data Formats & Conversion
  • Avro Schema GeneratorPaste sample JSON, get a valid Avro .avsc — nullable unions with defaults and honest int-versus-long, entirely on this device.Data Formats & Conversion

Encoding & Escaping

  • Base64 EncoderConvert text or files to Base64 with correct Unicode handling — entirely on this device.Encoding & Escaping
  • Base64 DecoderDecode Base64 to text, bytes, or a downloadable file — tolerant of the real-world mess.Encoding & Escaping
  • Base64URL Encoder/DecoderEncode and decode RFC 4648 §5 URL-safe Base64 with JWT-strict padding control — entirely on this device.Encoding & Escaping
  • Base64 to Image ConverterPaste Base64 or a data: URI and see the image instantly — or turn an image file into copy-ready Base64 snippets, on this device.Encoding & Escaping
  • Base64 File ConverterDrop any file and stream it to Base64 with live progress — or turn Base64 back into a named, downloadable file, entirely on this device.Encoding & Escaping
  • Base64 to Hex ConverterPivot Base64 to hex and hex back to Base64 without a text detour — entirely on this device.Encoding & Escaping
  • Base32 Encoder/DecoderDecode and encode Base32 — RFC 4648, base32hex and Crockford, strict or tolerant — entirely on this device.Encoding & Escaping
  • Base58 Encoder/DecoderEncode and decode Base58 with the Bitcoin/IPFS alphabet — leading zeros preserved, entirely on this device.Encoding & Escaping
  • Hex Encoder/Decoder + Dump ViewerConvert bytes to hex and back, and inspect any file in a classic offset/hex/ASCII dump — entirely on this device.Encoding & Escaping
  • Binary Text ConverterTurn binary byte groups into text and text into binary — with decimal, octal and hex views — entirely on this device.Encoding & Escaping
  • URL Encoder/DecoderPercent-encode and decode URLs with the encodeURIComponent vs encodeURI difference made explicit — entirely on this device.Encoding & Escaping
  • HTML Entity Encoder/DecoderConvert characters to HTML entities and back — named, decimal or hex — with a searchable reference table, entirely on this device.Encoding & Escaping
  • HTML Context EscaperEscape a string for the HTML element, attribute, JavaScript or URL context — OWASP output-encoding rules applied per sink, entirely on this device.Encoding & Escaping
  • Punycode / IDN ConverterConvert xn-- domains to Unicode and back, label by label, with mixed-script flags — entirely on this device.Encoding & Escaping
  • Unicode Escape ToolEscape text to \uXXXX, \u{…}, \xXX, CSS, U+ or HTML hex notation and decode any mix of them back — entirely on this device.Encoding & Escaping
  • String Escaper (Multi-language)Escape or unescape a string literal for JSON, JavaScript, Java, C#, C, Python, SQL or POSIX shell — entirely on this device.Encoding & Escaping
  • ROT13 / Caesar CipherRotate text through ROT13, any Caesar shift, ROT5, ROT18 or ROT47 — with an all-25-shifts panel for unknown puzzles, entirely on this device.Encoding & Escaping
  • XOR Encoder / Brute-forcerApply a repeating XOR key to text, hex or Base64, or rank all 256 single-byte keys by printable ratio — entirely on this device.Encoding & Escaping
  • Morse Code TranslatorTranslate text to ITU Morse code and Morse back to text, with tolerant decoding and optional audio — entirely on this device.Encoding & Escaping
  • GZip / zlib ToolDecompress or compress gzip, zlib and raw DEFLATE streams — pastes or files, entirely on this device.Encoding & Escaping
  • Data URI GeneratorTurn any file or text into a self-contained data: URI — MIME sniffed or chosen, Base64 or percent-encoded, entirely on this device.Encoding & Escaping

Hashing & Checksums

  • MD5 Hash GeneratorCompute MD5 checksums of text, hex or Base64 bytes and files up to 64 MB — entirely on this device.Hashing & Checksums
  • SHA-1 Hash GeneratorCompute the SHA-1 digest of text, hex or Base64 bytes — entirely on this device.Hashing & Checksums
  • SHA-256 Hash GeneratorCompute the SHA-256 digest of text or a file — hex and Base64, entirely on this device.Hashing & Checksums
  • SHA-384/512 Hash GeneratorCompute the SHA-512 or SHA-384 digest of text or raw bytes — hex and Base64, entirely on this device.Hashing & Checksums
  • SHA-3 / Keccak GeneratorSee the SHA-3 and Keccak digests of the same bytes side by side — including Ethereum keccak256, computed entirely on this device.Hashing & Checksums
  • CRC CalculatorCompute CRC32, CRC16 or CRC8 with any polynomial, init, reflection and xorout — entirely on this device.Hashing & Checksums
  • File Checksum VerifierDrop a file, paste the published checksum, get a MATCH or MISMATCH verdict — multi-GB downloads verified entirely on this device.Hashing & Checksums
  • Multi-hash GeneratorHash one input with 16 algorithms at once — MD5 to BLAKE3 — and see which rows match a digest you already hold, entirely on this device.Hashing & Checksums
  • HMAC GeneratorCompute HMAC-SHA-256 and family with the key and message decoded exactly as your API sees them — entirely on this device.Hashing & Checksums
  • Hash IdentifierPaste a hash and see every algorithm it could be — prefixes parsed, parameters read, ambiguity shown honestly.Hashing & Checksums

Passwords & Credentials

  • Bcrypt Generator + VerifierGenerate bcrypt hashes at any cost factor and check a password against an existing hash — the password never leaves this device.Passwords & Credentials
  • Argon2 Generator + VerifierHash a password with Argon2id at tunable memory, time and parallelism — or verify an existing hash, on this device.Passwords & Credentials
  • Htpasswd GeneratorBuild .htpasswd lines for Apache or Nginx basic auth — bcrypt, APR1 or SHA-1, hashed on this device.Passwords & Credentials
  • Password GeneratorGenerate provably unbiased, cryptographically secure passwords — on a page that stores nothing and sends nothing.Passwords & Credentials
  • Passphrase Generator (Diceware)Build a memorable passphrase from the EFF long wordlist — with the exact entropy, not a colour-coded guess.Passwords & Credentials
  • Password Strength CheckerSee exactly why a password scores the way it does — named rules, live entropy and an offline crack-time estimate, all on this device.Passwords & Credentials
  • Pwned Password CheckHash a password to its SHA-1 prefix and match a Pwned Passwords range response — entirely on this device.Passwords & Credentials
  • API Key & PIN GeneratorGenerate prefixed API keys and numeric PINs by the batch — on a page that stores nothing and sends nothing.Passwords & Credentials

OTP & 2FA

  • TOTP Generator / DebuggerPaste a Base32 secret and see the live RFC 6238 code, the drift window and every step of the math — on this device only.OTP & 2FA

IDs & Randomness

  • UUID v4 GeneratorGenerate one or 100,000 random v4 UUIDs in every notation a codebase demands — entirely on this device.IDs & Randomness
  • UUID v7 GeneratorGenerate time-sortable v7 UUIDs in bulk — the embedded timestamp decoded live, entirely on this device.IDs & Randomness
  • UUID v1 GeneratorGenerate v1 UUIDs in bulk with timestamp, clock sequence and node decoded live — entirely on this device.IDs & Randomness
  • UUID v3 GeneratorDerive deterministic v3 UUIDs from namespace + name via MD5 for legacy interop — same inputs, same UUID, entirely on this device.IDs & Randomness
  • UUID v5 GeneratorDerive deterministic v5 UUIDs from namespace + name via SHA-1 — the RFC-preferred name-based version, entirely on this device.IDs & Randomness
  • UUID v6 GeneratorGenerate time-sortable v6 UUIDs — v1's fields reordered for index locality, decoded live, entirely on this device.IDs & Randomness
  • UUID Decoder / InspectorPaste any UUID and read its version, variant and embedded timestamp — every notation accepted, entirely on this device.IDs & Randomness
  • GUID GeneratorGenerate .NET-style GUIDs in bulk — uppercase {braces}, registry form and copy-ready C# snippets, entirely on this device.IDs & Randomness
  • ULID Generator + DecoderGenerate time-sortable ULIDs — bulk, monotonic, Crockford base32 — and decode any ULID’s timestamp, entirely on this device.IDs & Randomness
  • Snowflake ID Generator + DecoderDecode a Snowflake ID to its timestamp, worker and sequence, or generate one for the Twitter or Discord epoch — entirely on this device.IDs & Randomness
  • MongoDB ObjectId GeneratorGenerate valid 24-hex MongoDB ObjectIds and decode any ObjectId to its embedded timestamp and BSON structure — entirely on this device.IDs & Randomness
  • Random String GeneratorGenerate cryptographically secure random strings, tokens and raw bytes — on a page that stores nothing and sends nothing.IDs & Randomness
  • Random Number GeneratorGenerate random numbers, roll dice, or shuffle and pick from a list — unbiased and entirely on this device.IDs & Randomness
  • ID Format Comparison HubCompare UUID, ULID, Snowflake and ObjectId on size, sortability, timestamps and use cases — with live samples, entirely on this device.IDs & Randomness

JWT & Tokens

  • JWT DecoderDecode any JWT into header, payload and a plain-language claims table — expiry checked live, zero third-party code on this page.JWT & Tokens
  • JWT VerifierCheck a JWT's signature against your own key — HS, RS, ES, PS or EdDSA — with claim and clock-skew checks, entirely on this device.JWT & Tokens
  • JWT Generator / SignerBuild a header and payload, sign with your own key, and copy the token — the key never leaves this tab.JWT & Tokens
  • JWK GeneratorGenerate a key and get a proper JWK — alg, use and an RFC 7638 kid already stamped, with the JWKS wrapper you actually deploy.JWT & Tokens
  • PEM to JWK ConverterPaste a PEM key or certificate, get a JWK with alg, use and kid stamped — and back again, entirely on this device.JWT & Tokens

PKI Certificates & SSH

  • Certificate DecoderRead what a certificate actually says — who it is for, when it expires, and every extension — without it leaving your device.PKI Certificates & SSH
  • CSR DecoderDecode a PKCS#10 request — subject, key, requested SANs and attributes — and see what a CA will reject, entirely on this device.PKI Certificates & SSH
  • RSA Key GeneratorGenerate an RSA, EC or Ed25519 keypair in your browser and download it as PKCS#8 and SPKI PEM.PKI Certificates & SSH
  • ASN.1 DecoderRead any DER or BER blob as a tag, length and offset tree beside a synchronized hex view — entirely on this device.PKI Certificates & SSH
  • SSH Key GeneratorGenerate an SSH keypair on this device and copy the exact two artifacts SSH consumes: the authorized_keys line and the openssh-key-v1 file.PKI Certificates & SSH

Encryption & PGP

  • AES Encrypt / DecryptEncrypt or decrypt text and files with AES-GCM, CBC or CTR — the passphrase and the data never leave this device.Encryption & PGP
  • RSA Encrypt / DecryptEncrypt a short message with an RSA public key and decrypt it with the private key — RSA-OAEP, entirely on this device.Encryption & PGP

Web Security

  • CSP GeneratorBuild a Content-Security-Policy directive by directive — with real nonce and hash sources, a Report-Only toggle and the server snippet for it.Web Security
  • CSP EvaluatorPaste a policy and read what the browser will enforce, what it will ignore, and every weakness it leaves open — each finding with its CSP Level 3 clause.Web Security
  • Security Headers ExplainerPaste a response header block and read its security posture header by header — present, missing or weak, each verdict citing its spec.Web Security
  • SRI Hash GeneratorHash a script or stylesheet and get the integrity= attribute the browser checks — computed on this device, never uploaded.Web Security
  • CORS TesterDescribe the request, paste the response headers, and see exactly which CORS check the browser fails — on this device.Web Security
  • CORS Header GeneratorEmit a complete CORS configuration for nginx, Apache, Express or Caddy — preflight, Vary: Origin and credentials handled — or read the headers you already have.Web Security

SAML OAuth & OIDC

  • SAML DecoderPaste a SAML blob from a browser trace and read it — both bindings auto-detected, assertion semantics extracted, entirely on this device.SAML OAuth & OIDC
  • PKCE GeneratorMint a PKCE code_verifier and its S256 code_challenge on this device — RFC 7636 lengths, and a verify mode for a pair you already have.SAML OAuth & OIDC

Regex

  • Regex Tester (JavaScript)Test JavaScript regular expressions live — highlighted matches, groups and replace preview, entirely on this device.Regex
  • Regex ExplainerRead someone else's JavaScript regular expression token by token — every group, quantifier and flag spelled out, entirely on this device.Regex
  • Regex VisualizerSee the shape of a regular expression: branches, loops and groups drawn as a railroad diagram you can download as SVG — entirely on this device.Regex
  • Regex Patterns LibraryBrowse copy-paste regex patterns — pragmatic and strict variants, CI-verified match tables and six-language usage for each.Regex
  • Email RegexThe email regex that tells the truth — pragmatic and RFC 5321 strict variants, fifteen CI-verified rows and the live tester preloaded.Regex
  • Phone Number RegexThe E.164 phone regex pair — an optional-plus gate and the strict international form, with honest libphonenumber advice and live testing.Regex
  • IP Address RegexOctet-accurate IPv4 matching — 999.1.1.1 fails; leading-zero-tolerant and canonical variants with CI-verified rows and the live tester.Regex
  • URL RegexA pragmatic http(s) link gate and a strict host-checking variant — CI-verified match rows, six language spellings, live tester preloaded.Regex
  • Date Regex (YYYY-MM-DD)The ISO date shape gate plus a range-checking strict variant — honest about calendars, CI-verified, preloaded in the live tester.Regex
  • Numbers-Only RegexDigits-only validation settled — the five-character gate plus a canonical-integer strict variant, CI-verified rows and live testing.Regex
  • Password RegexLookahead password policies explained honestly — 8-plus and strict 12-plus four-class gates, NIST caveats, safe on-device testing.Regex
  • UUID RegexUUID validation by layout and by meaning — a case-insensitive 8-4-4-4-12 gate plus a version-and-variant strict form, CI-verified.Regex
  • IPv6 RegexFull-form and ::-compressed IPv6 matching per RFC 4291 — the library's honest inversion, CI-verified rows, live tester preloaded.Regex
  • Regex Cheat SheetLook up any JavaScript regex construct — syntax, meaning and a worked example whose result this page computes, with the tester right above the table.Regex
  • Regex Replace & ExtractRun your own pattern over a whole body of text — replace across it, extract every match, or keep only matching lines, entirely on this device.Regex

Time, Date & Scheduling

  • Cron Expression Parser / ExplainerExplain any cron expression in plain English — per-field validation and the next 10 runs in any timezone, with DST flags — entirely on this device.Time, Date & Scheduling
  • Cron Expression GeneratorPick minutes, hours and days visually and get a correct cron expression with plain-English read-back — entirely on this device.Time, Date & Scheduling
  • Quartz Cron ToolParse and build Quartz cron expressions — seconds, year field, ? L W # tokens — with next fire times in any timezone, entirely on this device.Time, Date & Scheduling
  • AWS EventBridge Cron ToolValidate AWS cron() and rate() schedules with EventBridge's real rules — ? required, 1 = Sunday, UTC firing — entirely on this device.Time, Date & Scheduling
  • Jenkins Cron ToolValidate and explain Jenkins build schedules — H hash tokens, aliases and TZ lines — with honest run windows, entirely on this device.Time, Date & Scheduling
  • Spring Cron ToolParse and validate Spring @Scheduled 6-field cron — seconds first, ? equals *, 0 or 7 = Sunday — with next runs in any timezone, entirely on this device.Time, Date & Scheduling
  • Systemd OnCalendar ConverterTurn a crontab schedule into systemd OnCalendar syntax with a ready-to-install .timer unit — entirely on this device.Time, Date & Scheduling
  • Cron Examples LibraryBrowse copy-paste cron schedules — live next runs and Quartz, AWS, Kubernetes and GitHub Actions forms for each.Time, Date & Scheduling
  • Cron Every 5 MinutesThe five-minute cron line ready to paste — */5 * * * * with live next runs and the Quartz, AWS, Kubernetes and GitHub Actions forms beside it.Time, Date & Scheduling
  • Cron Every 30 MinutesHalf-hourly cron settled — */30 * * * * with live next runs, the 0,30 twin spelling, and every scheduler dialect on one page.Time, Date & Scheduling
  • Cron Every HourTop-of-hour cron at a glance — 0 * * * * with live next runs, the @hourly macro, and each dialect's form ready to copy.Time, Date & Scheduling
  • Cron Every Day at MidnightThe daily midnight line — 0 0 * * * with live next runs, whose-midnight caveats and all four dialect forms ready to paste.Time, Date & Scheduling
  • Cron Every MondayMonday cron without numbering doubt — 0 0 * * 1 previewed live, with the Sunday-first dialects called out explicitly.Time, Date & Scheduling
  • Cron Every Weekday at 9amWeekday-morning cron — 0 9 * * 1-5 with live next runs, the whose-9am question answered honestly, and every dialect form.Time, Date & Scheduling
  • Cron First of the MonthMonth-start cron — 0 0 1 * * with live next runs, the @monthly macro and each scheduler's spelling ready to copy.Time, Date & Scheduling
  • Cron Last Day of the MonthNo classic one-liner exists — the honest 28–31 date-guard recipe with live next runs, plus the Quartz and EventBridge L forms.Time, Date & Scheduling
  • Cron Every 90 MinutesNinety minutes takes two cron lines — the exact interleaved pair with live next runs, or one EventBridge rate rule.Time, Date & Scheduling
  • Crontab File ValidatorLint an entire crontab file — env lines, schedules, % gotchas, missing trailing newline — with per-line errors, entirely on this device.Time, Date & Scheduling
  • Cron Timezone ConverterConvert a cron schedule to another timezone — DST handled honestly with dated dual expressions, entirely on this device.Time, Date & Scheduling
  • Unix Timestamp ConverterConvert epoch timestamps to human dates and back — unit auto-detected, exact to the nanosecond, entirely on this device.Time, Date & Scheduling
  • ISO 8601 / RFC 3339 FormatterPaste any date or epoch and read it in every standard form at once — offset decoded, standards checked, entirely on this device.Time, Date & Scheduling
  • Timezone ConverterConvert a date and time between timezones and line up a meeting across cities — DST-aware, entirely on this device.Time, Date & Scheduling
  • Date Difference CalculatorCount the days between two dates — both conventions labeled, inclusive and exclusive — with weekday-only counts and a calendar breakdown, entirely on this device.Time, Date & Scheduling
  • Time Duration CalculatorTurn hh:mm:ss, unit words or ISO 8601 durations into every unit at once — or sum a whole list — entirely on this device.Time, Date & Scheduling
  • Week Number ToolSee the ISO week number for today or any date — US convention beside it — and turn a week number back into its Monday–Sunday dates, on this device.Time, Date & Scheduling
  • Date Add / Subtract CalculatorShift a date by years, months, weeks, days, hours or minutes — end-of-month clamping stated, never guessed — entirely on this device.Time, Date & Scheduling
  • Age CalculatorExact age in years, months and days from a date of birth — Feb 29 and month-end policies stated, never silently picked — entirely on this device.Time, Date & Scheduling
  • Strftime / Format Cheat SheetEvery strftime token with an engine-rendered example, portability columns and a live format preview — entirely on this device.Time, Date & Scheduling
  • Working Days / SLA CalculatorWorking-day counts and SLA deadlines over a calendar you control — weekend sets, paste-in holiday lists, counting conventions stated — entirely on this device.Time, Date & Scheduling
  • Discord Timestamp GeneratorTurn a date, epoch or pasted <t:…> code into all seven Discord timestamp styles — previewed in your zone, entirely on this device.Time, Date & Scheduling

Web & HTTP

  • HTTP Status Codes ReferenceEvery HTTP status code with its meaning, RFC citation, cacheability and handler snippets — searchable instantly, entirely on this device.Web & HTTP
  • HTTP Headers ReferenceEvery HTTP header field with its status, RFC clause and direction — plus builders for Cache-Control, CSP, HSTS and CORS values, all on this device.Web & HTTP
  • Curl to Code ConverterPaste a curl command and read back idiomatic client code in 12 languages — parsed on this device, with every unsupported flag named.Web & HTTP
  • Curl Command BuilderTurn a form into a correct curl command — POSIX-quoted values, per-flag explanations, and a round-trip check — entirely on this device.Web & HTTP
  • HAR File ViewerOpen a .har capture and read the waterfall, per-phase timings, sizes and failures — the file never leaves this device.Web & HTTP
  • URL Parser / InspectorSee every component of any URL — host in punycode and Unicode, decoded query table, homograph check — entirely on this device.Web & HTTP
  • Query String to JSONTurn any query string into structured JSON and back — bracket nesting, array conventions and + handling made explicit — entirely on this device.Web & HTTP
  • User-Agent ParserDecode any user-agent string — or 100,000 log lines — into browser, OS and device fields with bots called out, entirely on this device.Web & HTTP
  • What Is My User AgentSee the user-agent string this browser sends, parsed into browser, OS and device — with screen, locale and Client Hints, read on this device.Web & HTTP
  • MIME Type LookupFind the right Content-Type for any file extension — every known extension, compressibility and copyable server config, straight from mime-db.Web & HTTP
  • Basic Auth Header GeneratorBuild the exact Authorization: Basic line from a username and password — or read one back — with RFC 7617 checks on this device.Web & HTTP

Network, DNS & IP

  • DNS LookupLook up a domain's DNS records from the browser: you run the named resolver's request yourself, and the answer is decoded here.Network, DNS & IP
  • DMARC Record GeneratorCompose or check DMARC, SPF and DKIM records with the risky terms named and the SPF lookup count shown — on this device, with nothing resolved.Network, DNS & IP
  • IPv4 Subnet CalculatorEvery subnet number from one IP and prefix — with the binary math shown, and /31 and /32 handled correctly — entirely on this device.Network, DNS & IP
  • Visual Subnet CalculatorSplit any IPv4 block into a tree, join siblings back, and see what each cloud provider actually reserves — entirely on this device.Network, DNS & IP
  • MAC Address Vendor LookupPaste a MAC in any notation and get the IEEE-registered assignee, the block that covers it, and an honest answer when no vendor exists — on this device.Network, DNS & IP
  • Port Number ReferenceType a port number and see every service the IANA registry lists for it across TCP, UDP and SCTP — plus what really runs there.Network, DNS & IP

CSS Tools

  • CSS Gradient GeneratorCompose linear, radial and conic gradients with multi-stop editing and copy modern CSS — entirely on this device.CSS Tools
  • Box Shadow GeneratorCompose layered CSS box-shadows with live light and dark preview and a smooth-shadow wizard — entirely on this device.CSS Tools
  • Border Radius GeneratorDesign asymmetric 8-value corners and organic blob shapes against a live preview and copy working CSS — entirely on this device.CSS Tools
  • Clip-path GeneratorDraw a clip-path with draggable points on a live preview and copy the CSS — entirely on this device.CSS Tools
  • Glassmorphism GeneratorDesign frosted-glass CSS with live backdrop blur over a busy preview — entirely on this device.CSS Tools
  • Cubic Bezier GeneratorDrag an easing curve, preview the motion and copy cubic-bezier() — plus a modern linear() spring & bounce generator — on this device.CSS Tools
  • CSS Animation GeneratorBuild a @keyframes timeline, tune the animation shorthand and preview it live, then copy working CSS — entirely on this device.CSS Tools
  • Flexbox Playground / GeneratorToggle every flexbox container and item property against a live preview and copy working CSS — entirely on this device.CSS Tools
  • Grid Generator / PlaygroundBuild grid tracks and named template areas against a live preview and copy working CSS — entirely on this device.CSS Tools
  • Aspect Ratio CalculatorReduce any width and height to its simplest ratio and copy modern aspect-ratio CSS — entirely on this device.CSS Tools
  • Px to Rem ConverterPx ↔ rem at any root font size — single values, whole CSS blocks, and a live 1–100 px table — entirely on this device.CSS Tools
  • CSS clamp() CalculatorTurn min and max sizes at two viewports into a correct rem-based clamp() expression, with the math shown — entirely on this device.CSS Tools
  • Fluid Type Scale GeneratorTurn a base size, viewport range and modular ratio into a fluid clamp() type scale, exported as CSS custom-property tokens — entirely on this device.CSS Tools
  • Font Stack GeneratorPick a system or web-safe font stack, preview it in your own fonts, and copy a font-family value with a guaranteed fallback — entirely on this device.CSS Tools
  • CSS FormatterFormat messy or minified CSS, SCSS or LESS to editor-consistent Prettier output — entirely on this device.CSS Tools
  • CSS MinifierMinify CSS with an honest size report — raw, minified and gzip bytes — entirely on this device.CSS Tools
  • CSS ValidatorValidate CSS and see syntax errors, unknown properties and bad values with line and column — entirely on this device.CSS Tools
  • CSS Specificity CalculatorSee the (a,b,c) specificity of any selector, compare two to learn which wins, with a per-token breakdown — entirely on this device.CSS Tools
  • CSS to Tailwind ConverterPaste CSS and map each declaration to Tailwind utility classes, with every unmapped declaration listed honestly — entirely on this device.CSS Tools
  • CSS StatsAnalyze a whole stylesheet on this device: rule, selector and declaration counts, a specificity graph, unique colors and font sizes, and !important totals.CSS Tools

Color Tools

  • Color ConverterPaste any CSS color and read every notation at once — HEX, RGB, HSL, OKLCH, LAB and more — entirely on this device.Color Tools
  • OKLCH Picker / ConverterPick perceptual OKLCH colors and watch the sRGB and Display-P3 gamut boundaries instead of discovering the clip later — entirely on this device.Color Tools
  • Contrast CheckerCheck any two colors against the WCAG 2 contrast ratios for normal text, large text and UI components — entirely on this device.Color Tools
  • APCA Contrast CheckerCompute the APCA Lc value for a text and background pair, with polarity, the font size and weight lookup, and the WCAG 2 ratio beside it — entirely on this device.Color Tools
  • Tints & Shades Scale GeneratorTurn one brand color into an even 50–950 shade ramp interpolated in OKLCH — entirely on this device.Color Tools
  • Color Blindness SimulatorPreview a palette or an image as protanopia, deuteranopia and tritanopia render it — entirely on this device.Color Tools
  • Image Palette ExtractorExtract the dominant colors from any image with share percentages, plus a pixel-exact eyedropper — entirely on this device.Color Tools
  • Named CSS Colors ReferenceAll 148 CSS named colors with hex, rgb, hsl and oklch, plus contrast against white and black — entirely on this device.Color Tools

SVG Tools

  • SVG OptimizerRun SVGO with every toggle explained, measured before/after bytes and a real diff — entirely on this device.SVG Tools
  • SVG to JSX ConverterTurn SVG markup into a React or React Native component — attributes mapped, nothing uploaded.SVG Tools
  • SVG to CSS EncoderEncode an SVG into a url() data URI for background-image, mask-image or a custom property — url-encoded, xmlns-checked, entirely on this device.SVG Tools
  • SVG Viewer and EditorSee any SVG render beside its markup — viewBox and aspect ratio resolved, every script, handler and external reference named, entirely on this device.SVG Tools
  • SVG to PNG ConverterRasterize SVG markup to a PNG at any size, scale or background — rendered by your own browser, never uploaded.SVG Tools
  • Blob GeneratorGenerate a seeded SVG blob, wave or pattern and copy the exact markup — entirely on this device.SVG Tools

HTML & Markup

  • HTML FormatterPretty-print messy or minified HTML into clean, editor-consistent Prettier output — entirely on this device.HTML & Markup
  • HTML MinifierCollapse the whitespace a browser ignores while the whitespace it renders survives — pre, textarea and inline-tag gaps intact, every removal listed and measured.HTML & Markup
  • HTML Entities ReferenceFind the HTML code for any symbol — the named reference, its Unicode name, and its decimal and hex spellings, entirely on this device.HTML & Markup
  • Meta Tag GeneratorBuild a paste-ready <head> block — title, description, canonical and robots — with conflict checks, entirely on this device.HTML & Markup
  • Open Graph PreviewCompose Open Graph and Twitter card tags and preview the card locally — nothing is fetched, nothing uploaded.HTML & Markup
  • HTML Table GeneratorLay out a table in a grid and get accessible markup — captions, header scopes and spans — entirely on this device.HTML & Markup
  • HTML to JSX ConverterTurn HTML into a React component or a Pug template — attributes mapped to React props, entirely on this device.HTML & Markup
  • HTML to Text ConverterTurn HTML into readable plain text with block structure preserved and entities decoded — entirely on this device.HTML & Markup
  • Schema Markup GeneratorFill a typed form and get a valid JSON-LD script block for eight schema.org types, with required fields checked — entirely on this device.HTML & Markup

JavaScript & TypeScript

  • JavaScript BeautifierBeautify messy or minified JavaScript and JSX into clean, editor-consistent Prettier output — entirely on this device.JavaScript & TypeScript
  • JS MinifierMinify JavaScript with Terser and read an honest size report — original, minified and gzip bytes — entirely on this device.JavaScript & TypeScript
  • JavaScript ObfuscatorObfuscate JavaScript to deter casual reading — not encryption — entirely on this device.JavaScript & TypeScript
  • TypeScript to JavaScriptStrip TypeScript types to plain JavaScript as you type — interfaces, generics and annotations gone, your syntax untouched — entirely on this device.JavaScript & TypeScript
  • Keycode / KeyboardEvent InspectorPress any key to see event.key, event.code and legacy keyCode with location and modifier state — entirely on this device.JavaScript & TypeScript
  • Big-O Cheat SheetLook up the time and space complexity of every common data structure and sorting algorithm — best, average and worst case, entirely on this device.JavaScript & TypeScript

Favicons & App Icons

  • Favicon GeneratorTurn one image into the complete modern favicon set — ICO, SVG, Apple touch and PWA icons, manifest and HTML — entirely on this device.Favicons & App Icons
  • Favicon from Text / EmojiType a letter or emoji, pick shape and colors, and download the complete modern favicon set — generated entirely on this device.Favicons & App Icons
  • Web Manifest GeneratorFill in name, colors, display mode and icons and get a valid site.webmanifest plus the link tag — built entirely on this device.Favicons & App Icons
  • App Icon Set GeneratorDrop one 1024px image and download every iOS and Android icon size — Contents.json and mipmap folders included, nothing uploaded.Favicons & App Icons

Server Config & SEO Files

  • Robots.txt Tester (Paste)Check whether a URL is allowed or blocked for any crawler by pasted robots.txt rules — with the deciding rule quoted, entirely on this device.Server Config & SEO Files
  • Robots.txt GeneratorCompose robots.txt groups, paths and sitemap lines from a form, then read the parser's report on the emitted file before you copy it — entirely on this device.Server Config & SEO Files
  • Llms.txt GeneratorBuild an llms.txt index for your site — title, summary and curated link sections — entirely on this device.Server Config & SEO Files
  • Htaccess Redirect GeneratorBuild .htaccess redirect rules — bulk 301/302 maps plus HTTPS, www and trailing-slash canonicals — with paths escaped and rule order checked.Server Config & SEO Files
  • Ads.txt Generator & ValidatorGenerate and validate IAB Tech Lab compliant Authorized Digital Sellers (ads.txt) files — entirely on this device.Server Config & SEO Files
  • Caddyfile GeneratorGenerate modern Caddy web server configurations with automated HTTPS, reverse proxy forwarding, compression, and security headers.Server Config & SEO Files

Docker

  • Docker Run to Compose ConverterConvert docker run commands into a modern compose.yaml with a flag-by-flag conversion report — entirely on this device.Docker
  • Compose to Docker Run ConverterTurn compose services back into docker run commands with a flag-by-flag conversion report — entirely on this device.Docker
  • Compose to Kubernetes ConverterConvert a compose file into Kubernetes manifests with Kompose-compatible semantics — entirely on this device.Docker
  • Dockerfile LinterLint a Dockerfile against 27 hadolint-compatible rules with line-anchored findings — entirely on this device.Docker
  • Dockerfile GeneratorPick a stack, choose the options, get a commented multi-stage Dockerfile — entirely on this device.Docker
  • Dockerignore GeneratorGenerate clean, production-shaped .dockerignore files with stack presets to shrink build contexts and protect secrets.Docker
  • Compose Validator / FormatterValidate and format compose.yaml against the official compose-spec schema — entirely on this device.Docker
  • Docker Healthcheck GeneratorGenerate robust Dockerfile HEALTHCHECK and docker-compose health probes with presets for Node, Postgres, Redis, and MySQL — entirely in your browser.Docker
  • Docker EXPOSE vs Ports ExplainerUnderstand container port exposure, host publishing (-p), interface binding, and firewall implications — entirely on this device.Docker
  • Docker Image Name Parser & FormatterParse, decompose, and format OCI and Docker image references into canonical registry, namespace, and tag components — entirely on this device.Docker

Kubernetes

  • Kubernetes CronJob HelperEdit a CronJob schedule with a live plain-English readout, timezone-aware next runs and a ready-to-apply manifest — entirely on this device.Kubernetes
  • Kubernetes Manifest GeneratorFill a guided form, get schema-validated Deployment, Service and Ingress YAML — entirely on this device.Kubernetes
  • Kubernetes YAML ValidatorCheck manifests against strict per-kind Kubernetes schemas with line-anchored findings — entirely on this device.Kubernetes
  • Kubernetes Resource CalculatorTurn usage numbers into requests, limits and quota YAML with the QoS class explained — entirely on this device.Kubernetes
  • Kubernetes RBAC Viewer & Role BuilderVisualize Kubernetes Role and ClusterRole permissions as a security matrix or build least-privilege RBAC YAML safely in your browser.Kubernetes
  • Kubectl Command BuilderCompose kubectl commands task-first and keep the cheat sheet at hand — entirely on this device.Kubernetes
  • Kubernetes Secret Base64 ToolEncode and decode Secret values with the YAML wrapper handled and the newline trap defused — entirely on this device.Kubernetes
  • API Deprecation CheckerFind deprecated apiVersions in pasted manifests and get the exact replacement — entirely on this device.Kubernetes
  • Pod QoS Class CheckerDeduce Kubernetes QoS classes (Guaranteed, Burstable, BestEffort) and node eviction priorities from container resource specs — entirely on this device.Kubernetes
  • Kubernetes Taints & Tolerations SimulatorSimulate pod scheduling against tainted nodes, verify matching logic, and output clean toleration YAML — entirely on this device.Kubernetes
  • Pod CIDR PlannerPlan Kubernetes Cluster Pod CIDR topologies, calculate max node capacity, subnet slices, and address exhaustion limits — entirely on this device.Kubernetes
  • Kubernetes Label Selector TesterTest equality-based and set-based Kubernetes label selector queries against pod metadata with matched resource breakdowns — entirely on this device.Kubernetes

Git & Version Control

  • Git Undo Commit & Command BuilderPick the task, get the exact git command — with safety labels and a verify step.Git & Version Control
  • Gitignore GeneratorMulti-select your stacks and get one merged, deduplicated .gitignore — with every rule explained, not just dumped.Git & Version Control
  • Conventional Commits HelperCompose a spec-correct Conventional Commits message from a form — or paste one and lint it with commitlint-compatible checks.Git & Version Control
  • Semver ToolkitValidate versions, compare precedence, test npm ranges — caret vs tilde made explicit — and calculate bumps.Git & Version Control
  • Changelog GeneratorPaste git log output, get a grouped CHANGELOG.md section — Conventional Commits sorted into Features, Fixes and Breaking Changes.Git & Version Control
  • Git Config GeneratorGenerate an optimized .gitconfig with identity, default branch, pull rebase, and time-saving aliases.Git & Version Control
  • Gitattributes GeneratorGenerate cross-platform .gitattributes configurations with normalized line endings, Git LFS tracking, and binary guards.Git & Version Control
  • Git Branch Naming Rule Builder & ValidatorCompose and validate git branch names against team conventions and git-check-ref-format syntax rules — entirely on this device.Git & Version Control
  • Git URL ConverterConvert Git repository URLs instantly between SSH, HTTPS, and Web formats with organization and repository parsing.Git & Version Control

CI/CD

  • GitHub Actions Cron HelperCompose a correct on.schedule cron for GitHub Actions — local time to UTC, DST duality, next runs and YAML — entirely on this device.CI/CD
  • GitHub Actions Workflow GeneratorCompose a workflow YAML from triggers, a stack preset and jobs — with GitHub's real constraints checked as you build.CI/CD
  • GitLab CI Generator / ValidatorBuild a .gitlab-ci.yml from stages, jobs and rules — or paste yours and validate it against the GitLab CI schema.CI/CD
  • Dependabot Config GeneratorBuild a valid dependabot.yml — ecosystems, directories, schedules, groups and ignore rules — without memorizing the options reference.CI/CD
  • CI Workflow Validator (Multi-CI)Paste a CI workflow and validate it against its vendored SchemaStore schema — GitHub Actions, GitLab CI, CircleCI and more.CI/CD
  • CODEOWNERS File GeneratorBuild production-grade CODEOWNERS files for GitHub, GitLab, and Bitbucket with path rules and team handles — entirely on this device.CI/CD
  • Pre-Commit Config GeneratorBuild production-grade .pre-commit-config.yaml hook configurations with curated multi-language presets — entirely on this device.CI/CD

Linux & CLI

  • Chmod CalculatorConvert file permissions between checkbox, octal and symbolic forms, decode ls -l strings, and copy the exact chmod command — entirely on this device.Linux & CLI
  • Systemd Unit GeneratorFill in what your service does and get a .service unit with each directive explained and cited — built entirely on this device.Linux & CLI
  • Sed TesterWrite a sed script, paste your text, and watch every address, substitution and hold-space command run on this device.Linux & CLI
  • Awk TesterRun real awk on your own text in this tab — fields, BEGIN/END, printf and arrays, with stdout, stderr and the exit code shown.Linux & CLI
  • Tar Command BuilderPick the task and get the exact tar command — quoted for POSIX shells, with bsdtar and GNU tar shown separately where they differ.Linux & CLI
  • Find Command BuilderDescribe what you are looking for and get the find command, with every predicate explained and the destructive actions marked.Linux & CLI
  • Rsync Command BuilderPick the sync you mean and get the rsync command — the -a flags spelled out, the dangerous ones marked, and a dry run offered first.Linux & CLI
  • FFmpeg Command BuilderPick the job — convert, extract audio, scale, trim, GIF, compress or strip metadata — and copy the ffmpeg command; nothing is transcoded on this page.Linux & CLI
  • OpenSSL Command BuilderPick a PKI job and read off the exact openssl line — every flag explained, quoting handled, and nothing executed on this page.Linux & CLI
  • Bash Parameter Expansion ExplainerEvery ${…} form — defaults, substrings, pattern removal, substitution — with what it does, which bash added it, and a worked example.Linux & CLI
  • Exit Code & Signal ReferenceYour process exited 137 — this page says what killed it, how the 128+N signal band works, and where macOS and Linux numbering differs.Linux & CLI
  • Bash getopts Script BuilderScaffold POSIX-compliant, error-hardened Bash CLI scripts with getopts option parsing and help menus — entirely on this device.Linux & CLI
  • Bash Test Operators ReferenceInteractive reference for Bash conditional test operators: file, string, and integer comparisons in [ ... ] and [[ ... ]].Linux & CLI
  • ANSI Color Codes & Terminal FormatterInteractive ANSI escape sequence generator for terminal styling, 16/256/TrueColor palettes, and code snippets — entirely on this device.Linux & CLI
  • Linux Sysctl & Ulimit Tuner ReferenceInteractive kernel tunables reference for sysctl.conf and limits.conf covering network performance and memory — entirely on this device.Linux & CLI
  • SSHD Hardening Config GeneratorGenerate production-grade, CIS and Mozilla compliant OpenSSH server (sshd_config) hardening configurations.Linux & CLI
  • Linux /etc/fstab Generator & ValidatorGenerate and validate Linux /etc/fstab mount entries with persistent UUIDs, mount options, and boot safety linting — entirely on this device.Linux & CLI
  • Linux iptables & UFW Rule GeneratorGenerate secure iptables, UFW, and nftables firewall rules with stateful connection tracking and rate limiting — entirely on this device.Linux & CLI
  • SSH / SCP Command BuilderConstruct syntactically validated, flag-optimized SCP and Rsync remote copy commands with port, key, and protocol options — entirely on this device.Linux & CLI

SQL & Databases

  • SQL FormatterPretty-print or minify SQL across 13 dialects with configurable style — entirely on this device.SQL & Databases
  • SQL to ER DiagramTurn CREATE TABLE DDL into a crow's-foot ER diagram — keys, foreign-key cardinality and SVG export, entirely on this device.SQL & Databases
  • Connection String BuilderBuild or parse PostgreSQL, MySQL, MongoDB, Redis, SQL Server and JDBC connection strings with correct percent-encoding — entirely on this device.SQL & Databases
  • SQLite Viewer / PlaygroundOpen a .sqlite file, browse tables and run real SQL in your browser — SQLite compiled to WebAssembly, nothing uploaded.SQL & Databases
  • SQL-on-CSV Workbench (DuckDB)Run real SQL on CSV and Parquet files in your browser with DuckDB — joins, group-bys and window functions, nothing uploaded.SQL & Databases
  • SQL Syntax CheckerCheck SQL syntax per dialect — unbalanced quotes, clause order and dialect slips flagged with line and column, entirely on this device.SQL & Databases
  • EXPLAIN Plan VisualizerPaste EXPLAIN ANALYZE output and see the plan as a tree with per-node timing, rows and hot spots — entirely on this device.SQL & Databases
  • DDL to ORM ModelsConvert CREATE TABLE DDL into Prisma schema, SQLAlchemy models or TypeORM entities — with a cited type mapping, entirely on this device.SQL & Databases

Text & Writing

  • Word / Character CounterLive word, character, sentence and byte counts with platform limit meters — entirely on this device.Text & Writing
  • Case ConverterConvert text between UPPERCASE, lowercase, Title Case, camelCase, snake_case and more — every variant at once, entirely on this device.Text & Writing
  • Text Diff / CompareCompare two texts or files side by side or inline — line, word or character granularity — entirely on this device.Text & Writing
  • Remove Duplicate LinesDeduplicate any list with explicit case, trim and Unicode options — order preserved, removed lines auditable, entirely on this device.Text & Writing
  • Sort LinesSort any list alphabetically, naturally, numerically, by length, or shuffle it — locale-aware and stable, entirely on this device.Text & Writing
  • Line Break ToolsRemove, add, join or split line breaks — hard-wrapped paste to flowing text, columns to SQL IN lists — entirely on this device.Text & Writing
  • Remove Extra Spaces (Whitespace Tools)Trim, collapse and normalize spaces, tabs, empty lines and invisible characters — entirely on this device.Text & Writing
  • Text ReverserReverse any text by characters, words, each line, or line order — grapheme-safe, entirely on this device.Text & Writing
  • Upside Down TextFlip your text upside down or mirror it into copy-paste Unicode for social bios — entirely on this device.Text & Writing
  • Slug GeneratorTurn any title into a clean URL slug — language-aware diacritics folding, batch mode with CSV — entirely on this device.Text & Writing
  • Remove Accents & PunctuationStrip diacritics and punctuation from any text — independent toggles, base letters kept — entirely on this device.Text & Writing
  • Word Frequency AnalyzerRank how often each word appears — case-folding, stopword and top-N filters, CSV export — entirely on this device.Text & Writing
  • Email / URL / Phone ExtractorPull every email, URL and phone number out of messy text — dedupe, count and copy each list, entirely on this device.Text & Writing

Fake & Mock Data

  • Lorem Ipsum GeneratorGenerate placeholder text by paragraphs, sentences, words, or an exact character budget — entirely on this device.Fake & Mock Data
  • Themed Ipsum GeneratorGenerate themed placeholder text — hipster, corporate, tech, pirate, or bacon — by paragraphs, sentences, or words, entirely on this device.Fake & Mock Data
  • Fake Name GeneratorGenerate random names by locale and gender — seeded, reproducible, entirely on this device.Fake & Mock Data
  • Fake Address GeneratorGenerate synthetic street addresses by locale — components and a formatted block, seeded and reproducible, entirely on this device.Fake & Mock Data
  • Fake User Profile GeneratorGenerate a complete fake identity — name, email, avatar, address, phone, company — as a card or JSON, seeded and reproducible, entirely on this device.Fake & Mock Data
  • Mock Data GeneratorBuild a schema and generate realistic fake data as CSV, JSON, SQL, or XML — seeded, reproducible, entirely on this device.Fake & Mock Data
  • JSON Data GeneratorGenerate fake JSON from a small template of Faker tokens and repeat() — seeded, reproducible, entirely on this device.Fake & Mock Data

Markdown & Docs

  • Markdown Editor + PreviewWrite Markdown beside a sanitized live preview with scroll that stays in sync — entirely on this device.Markdown & Docs
  • Markdown to HTML ConverterConvert GitHub-flavored Markdown to clean, sanitized HTML with a faithful preview — entirely on this device.Markdown & Docs
  • HTML to Markdown ConverterTurn HTML into GitHub-flavoured Markdown — headings, nested lists, code fences and pipe tables — with everything Markdown cannot say named and counted.Markdown & Docs
  • Markdown Table GeneratorBuild a GFM table in a visual grid — paste straight from Excel or Google Sheets — entirely on this device.Markdown & Docs
  • Markdown TOC GeneratorTurn your headings into a Markdown table of contents — GitHub and GitLab anchor styles side by side, entirely on this device.Markdown & Docs
  • README GeneratorPick the sections a project README needs, order them with the keyboard, and copy the Markdown — entirely on this device.Markdown & Docs
  • GitHub Badge GeneratorDesign a badge, watch it render here as SVG, and copy the shields.io URL or the ready-to-paste Markdown — nothing is fetched from this page.Markdown & Docs
  • GitHub Profile README GeneratorBuild the README for your username/username repo — sections, badges and stats-card links — previewed entirely on this device.Markdown & Docs
  • Mermaid Diagram PreviewType Mermaid diagram text, or paste a whole Markdown file and step through its mermaid fences — the renderer loads only when you ask it to.Markdown & Docs

Unicode & Characters

  • String / Unicode InspectorBreak any string into per-character code points, categories, byte lengths and escapes — entirely on this device.Unicode & Characters
  • Unicode Character LookupPaste a character, type U+2014 or search by name, and get its Unicode name, block, script, category and every escape spelling — all on this device.Unicode & Characters
  • Zalgo Text GeneratorTurn any text into zalgo — cursed, glitchy Unicode — by stacking combining marks, with up/mid/down intensity and a reproducible seed, entirely on this device.Unicode & Characters
  • Fancy Text GeneratorTurn text into bold, italic, script, circled and fullwidth Unicode styles for social bios and usernames — every style at once, entirely on this device.Unicode & Characters
  • Emoji PickerEvery Emoji 17.0 character, searchable by name, tag or shortcode — click to copy the emoji, its shortcode or its code points, entirely on this device.Unicode & Characters
  • Invisible Character DetectorReveal and strip zero-width, bidi and other hidden characters — code point, name and position for every hit, entirely on this device.Unicode & Characters
  • ASCII Table ReferenceEvery ASCII code 0–127 with its decimal, hex, octal and binary value, glyph and control-code name — searchable instantly, entirely on this device.Unicode & Characters
  • ASCII Art GeneratorTurn text into big ASCII-art banners with built-in monospace fonts — entirely on this device.Unicode & Characters

Numbers & Units

  • Number Base ConverterConvert between binary, octal, decimal, hex and any base 2–36 — exact at any size, entirely on this device.Numbers & Units
  • Roman Numeral ConverterConvert Roman numerals to numbers and back — 1 to 3,999 in standard form, entirely on this device.Numbers & Units
  • Data Size ConverterConvert MB, GB and TB across SI (1000) and binary IEC (1024) units — exact to the last digit, entirely on this device.Numbers & Units
  • Download Time CalculatorEnter a file size and a transfer rate — Mbps or MB/s — and get the download time with the bits-vs-bytes math shown, entirely on this device.Numbers & Units
  • IEEE-754 Float InspectorSee any float's sign, exponent and mantissa bits and its exact decimal value — 32-bit or 64-bit, entirely on this device.Numbers & Units
  • Bitwise CalculatorRun AND, OR, XOR, NOT and shifts on integers in any base at 8-64 bit width — entirely on this device.Numbers & Units
  • Percentage CalculatorPercent of a number, what percent one value is of another, percent change, and adding or subtracting a percentage — worked exactly on this device.Numbers & Units

QR & Barcodes

  • QR Code GeneratorTurn any link or text into a permanent, static QR code — crisp SVG or high-resolution PNG, no signup, no expiry, entirely on this device.QR & Barcodes
  • WiFi QR Code GeneratorType your network name and password and get a printable WiFi QR code guests can scan to join — generated entirely on this device.QR & Barcodes
  • vCard QR Code GeneratorTurn contact details into a QR code that saves straight to the address book — vCard 3.0, generated entirely on this device.QR & Barcodes
  • SMS QR Code GeneratorCreate a QR code that opens a prefilled text message — number and body set by you, generated entirely on this device.QR & Barcodes
  • Email QR Code GeneratorCreate a QR code that opens a prefilled email — address, subject and body set by you, generated entirely on this device.QR & Barcodes
  • Location QR Code GeneratorTurn coordinates into a QR code that opens the point in any map app — geo: URI, generated entirely on this device.QR & Barcodes
  • Event QR Code GeneratorCreate a QR code that adds an event to the calendar — title, time and place in a standard VEVENT, generated on this device.QR & Barcodes
  • QR Code ReaderDrop a photo or point your camera and read any QR code — decoded on this device with open-source ZXing, never uploaded.QR & Barcodes
  • Barcode GeneratorPick a symbology, type your data and download a print-ready barcode — check digits computed and validated on this device.QR & Barcodes
  • Bulk QR GeneratorUpload a CSV and download a ZIP of QR codes — one per row, named by your chosen column, generated entirely in your browser.QR & Barcodes

Miscellaneous

  • Phone Number FormatterPaste a number, pick a region, and read every canonical form plus number type and an honest valid-or-possible verdict — parsed entirely on this device.Miscellaneous

Infrastructure & Cloud

  • HCL / Terraform Converter + FormatterConvert HCL to JSON and format Terraform files with the real HashiCorp HCL library — compiled to WebAssembly, running locally.Infrastructure & Cloud
  • AWS IAM Policy GeneratorCompose an IAM policy statement by statement — actions, resources and conditions — with the JSON structure checked as you build.Infrastructure & Cloud
  • IAM Policy Explainer / LinterPaste an IAM policy and read it in plain English — statement by statement — with wildcard and risk findings, each one cited.Infrastructure & Cloud
  • AWS S3 Bucket Policy GeneratorGenerate secure AWS S3 bucket policies for HTTPS enforcement, CloudFront OAC, and IP whitelisting — entirely on this device.Infrastructure & Cloud
  • AWS S3 CORS Configuration GeneratorGenerate AWS S3 CORS configurations in JSON and XML for web apps, SPAs, and cross-origin uploads — entirely in your browser.Infrastructure & Cloud
  • Terraform Backend Block GeneratorGenerate secure remote state backend blocks for AWS S3, GCS, Azure, and HCP Terraform with locking and encryption.Infrastructure & Cloud
  • Terraform Version Constraint HelperEvaluate Terraform pessimistic (~>) operators, test candidate versions, and build required_providers blocks.Infrastructure & Cloud
  • Terraform tfvars GeneratorParse variables.tf declarations and scaffold clean terraform.tfvars or JSON files with comments and default values.Infrastructure & Cloud

Realtime WS & SSE

  • WebSocket TesterCompose frames, script replies and step a WebSocket session on this device — with the handshake key computed and every close code decoded.Realtime WS & SSE
  • Socket.IO TesterDecode any Socket.IO wire packet into type, namespace, ack id and args — or build one from an event form — right on this device.Realtime WS & SSE
  • SSE / EventSource TesterPaste a raw text/event-stream transcript and see every event parsed by the spec grammar — then replay it with real timing, all on this device.Realtime WS & SSE

APIs & Protocols

  • OpenAPI Validator & ViewerLint a Swagger 2.0 or OpenAPI 3.x spec against spec-cited rules and browse it as docs — findings jump to the exact line, entirely on this device.APIs & Protocols
  • Swagger 2 to OpenAPI 3 ConverterUpgrade a Swagger 2.0 spec to OpenAPI 3.0 with every mapping shown — servers, requestBody, components — without the spec leaving this device.APIs & Protocols
  • OpenAPI Mock Response GeneratorTurn the schemas in your OpenAPI spec into realistic example payloads — seeded, deterministic and format-aware — without hosting anything.APIs & Protocols
  • OpenAPI to Client SnippetsPick any operation in your OpenAPI spec and get a ready request snippet — fetch, axios, curl or Python requests — parameters and auth placeholders included.APIs & Protocols
  • GraphQL FormatterFormat or minify GraphQL queries and SDL with a canonical printer — errors pinned to line and column, entirely on this device.APIs & Protocols
  • GraphQL Schema VisualizerSee your GraphQL schema as an interactive type graph — fields, relations and reachability from Query — from pasted SDL or introspection JSON.APIs & Protocols
  • GraphQL to TypeScriptGenerate TypeScript types from GraphQL SDL — objects, inputs, enums, unions and operation result types — with nullability mapped exactly.APIs & Protocols
  • gRPC Status Codes ReferenceAll 17 gRPC status codes with meaning, retry guidance, common causes and per-language constants — searchable instantly on this device.APIs & Protocols
  • Webhook Signature VerifierRecompute a Stripe, GitHub or Slack webhook signature from the raw payload and your secret — and see exactly why it does or does not match.APIs & Protocols

NoSQL

  • SQL to MongoDB ConverterTranslate SQL SELECT statements into MongoDB find() or aggregation pipelines for mongosh — entirely on this device.NoSQL
  • Mongo Query FormatterFormat MongoDB shell queries with ISODate, ObjectId and NumberLong kept intact — where plain JSON formatters choke, entirely on this device.NoSQL
  • Redis Command ReferenceSearch every Redis 7.2 command with syntax, complexity and since-version, and build common commands for redis-cli — entirely on this device.NoSQL
  • DynamoDB JSON ConverterConvert DynamoDB marshalled JSON to plain JSON and back — S, N, B, M, L and set types handled with number precision preserved, on this device.NoSQL

Images & Media

  • Image Resizer / CropperResize, crop, rotate and flip any image to exact pixels or social presets — processed on this device, never uploaded.Images & Media
  • EXIF Viewer / StripperSee every EXIF tag in a photo — including GPS — and strip metadata losslessly. Photos are read on this device, never uploaded.Images & Media
  • OG Image GeneratorType a title, pick a template and export a pixel-exact 1200×630 Open Graph image — rendered entirely in your browser.Images & Media
  • Screenshot BeautifierDrop a screenshot, add a window frame, gradient background and shadow, and export a share-ready PNG — all on this device.Images & Media
  • Code Screenshot GeneratorPaste code, pick a theme and window style, and export a crisp PNG or SVG — highlighted and rendered entirely on this device.Images & Media

Pages

  • All tools/tools
  • Privacy/privacy
  • Home/