418 I'm a teapot
4xx client error
An April Fools' joke from 1998: the server refuses to brew coffee because it is a teapot.
418 comes from RFC 2324, the Hyper Text Coffee Pot Control Protocol — an April Fools' RFC from 1998. It was never part of HTTP proper, but it became so beloved that when people proposed removing it from Node.js and Go in 2017, developers pushed back under the banner 'Save 418'.
RFC 9110 now lists 418 as reserved and unused, so it can never be given a real meaning.
| Class | 4xx Client Error |
|---|---|
| Retry? | No — change the request first |
| Cacheable by default | No — only with explicit Cache-Control |
| Response body | Allowed |
| Defined in | RFC 9110 §15.5.19 — 418 (Unused) |
HTTP/1.1 418 I'm a teapot
Content-Type: application/json
Content-Length: 24
{"error":"I'm a teapot"}Common causes
- Easter eggs — Google has served a teapot page with 418.
- Some APIs and WAFs return 418 to bots and scrapers they want to brush off.
How to fix it
- If an API returns 418, you're probably being blocked or rate-limited as a bot — check its documentation.
- Don't use 418 for real errors; clients won't know what to do with it.
Send a 418 from your server
res.status(418).json({ error: "I'm a teapot" });return Response.json({ error: "I'm a teapot" }, { status: 418 });return {"error": "I'm a teapot"}, 418http.Error(w, "I'm a teapot", http.StatusTeapot)
return 418;
Check what a URL returns
Print just the status line from the command line, or check a whole list of URLs at once, with their response headers, in the HTTP Status Checker.
curl -sI https://example.com/your-path | head -n 1
Frequently asked questions
Is 418 a real HTTP status code?
It's reserved but unused: RFC 9110 lists 418 as 'Unused' so it can't be assigned. Most frameworks still know its name, and it lives on as an easter egg.