418

I'm a teapot

This route can't brew coffee, because it is, permanently, a teapot.

egg foundRFC 2324April 1, 1998

The actual history

RFC 2324 defined the Hyper Text Coffee Pot Control Protocol as an April Fools' joke — a serious-looking specification for controlling internet-connected coffee pots, complete with a BREW method and a coffee:// URI scheme. Status 418 was its punchline: the response a teapot returns when you ask it for coffee.

In 2017 a proposal moved to remove 418 from implementations on the grounds that it wasn't a real status code. Enough of the web pushed back — including a genuine Save 418 Movement — that it stayed, and it's now reserved specifically so nobody can reuse the number.

There's a real lesson under the joke: on a platform that can't break backwards compatibility, even the mistakes become permanent features. Same reason typeof null === "object" is never getting fixed.

There's a real one on this site

This page is an ordinary 200 — it's a document, and lying about its status would be worse than the joke is good. But /api/brew actually answers 418. Try it:

terminal
curl -i -X POST https://nodedata.dev/api/brew
# HTTP/1.1 418 I'm a teapot
# x-teapot: short and stout
# x-rfc: 2324
app/api/brew/route.ts
export async function POST() {
return Response.json(
{ error: { code: "im_a_teapot", message: "…" } },
{ status: 418, headers: { "x-teapot": "short and stout" } },
);
}

Some people use 418 as a quiet signal for “request rejected by a bot filter” — it's unambiguous, since nothing legitimate ever returns it.