Reference guide · http-status · Published 2026-08-16 · 3 min read

Unused and reserved HTTP status codes (306, 418)

Why HTTP status codes like 306 and 418 are reserved and unused, and what to do if you encounter them.

HTTP reserves a handful of status codes that it never uses for real responses. The two you will most often read about are 306, which was removed after an early draft, and 418, the teapot. They sit in the 3xx and 4xx registries, but no compliant server sends them in production and no normal client does anything meaningful with them. Understanding why they exist explains how the HTTP status code registry is managed.

Why codes are reserved

The status code space is governed so that each number has one registered meaning, which is what lets a client map a response to a behaviour. When a code was assigned in an earlier draft and then abandoned, it is marked as reserved rather than reassigned, both to preserve its documented history and to avoid two different meanings for the same number. The Internet Assigned Numbers Authority, or IANA, registry tracks this, and the current authority for the codes is the HTTP standard, RFC 9110, which lists them as unused while keeping the number blocked.

Being reserved and being unreachable are not the same thing. A reserved code can still be sent by a rogue or custom server, and a client has to treat it according to its class, for example as a 3xx or 4xx, even though no standard behaviour is defined for the specific number. That is why some coding libraries expose these codes explicitly: the enum exists so a program can name the value it saw.

306 and 418

The two notable examples illustrate opposite poles of the process.

306 was at one point intended as a "switch proxy" response in a proposal that never became a standard. The code was withdrawn, and today RFC 9110 lists 306 as unused, with the historical name noting the earlier intent. No current browser or server implements it, and you will not see a real server send it.

418 I'm a teapot comes from an April Fools' joke in an early draft, an RFC that light-heartedly defined a teapot that refuses to brew coffee. It was never intended for real use, and it remains in the registry mainly because the HTTP community refused to remove it. Some services still return it as an easter egg or as a deliberately nonstandard error, but it has no behavioural meaning, and clients treat it by its 4xx class, if at all.

What to do with them

If you see 306 or 418 on a page, treat the result as data from a nonstandard server rather than a documented error. A 418, for example, is occasionally sent by an API as a joke or by a proxy for an internal failure, and the practical response is to log the reason alongside the status and treat it as a generic 4xx from your handling code, since the code itself tells you nothing about what to do next.

If you are choosing a status code for your own service, never invent or reuse a reserved code. Pick a real, registered status from the list of HTTP status codes that matches the situation, because a client or monitoring tool that understands 404 or 500 will respond correctly, while one that sees a reserved code can only fall back on its class. For the 4xx and 5xx that genuinely describe problems, 404 not found and 500 internal server error cover the two most common cases.

Need a website built, fixed, optimised, migrated or replaced?

This technical resource is written by CSMBAC, a small design and development studio. If you would rather hand the problem to a professional, the website service page explains how we build enquiry-ready websites.

Explore website services