HTTP 300 Multiple Choices

HTTP 300 Multiple Choices means the server has more than one representation of the requested resource and is presenting the client with a list rather than automatically selecting one. Unlike other 3xx codes that redirect automatically, 300 leaves the selection to the client or user. It is the only standard 3xx code where the server does not commit to a single destination.

HTTP 300 quick reference →

Quick reference

Code300
NameMultiple Choices
Category3xx Redirect
SpecificationRFC 9110 §15.4.1
IANA statusAssigned
CacheableYes — cacheable by default
Client actionFollow the Location header if present, or select from the available representations listed in the response body.
In-depth guideHTTP 300 full guide →

What HTTP 300 means

RFC 9110 defines 300 as indicating that the target resource has more than one representation, each with its own more specific identifier, and information about the alternatives is being provided so that the user (or user agent) can select a preferred representation by redirecting its request to that identifier.

The server may include a Location header with a preferred choice — if it does, user agents will typically follow it automatically, treating 300 like a 302 in that scenario. Without a Location header, the client must parse the response body, which lists available representations and their URLs, and select one.

In practice, HTTP 300 is extremely rare on the modern web. It was more relevant in the 1990s when transparent content negotiation between different file formats and languages was handled at the server level. Today, content negotiation is handled at the application layer, and specific redirect codes (301, 302, 307) handle routing.

When 300 occurs

Apache mod_negotiation with no default

Apache's transparent content negotiation feature (mod_negotiation with type-map files or MultiViews) returns 300 when the client's Accept-Language or Accept headers do not provide enough context to select a single best variant. For example, if document.en.html and document.fr.html both exist and the client has not expressed a language preference, Apache may return 300.

Server cannot automatically negotiate

Multiple equally valid variants exist and the server's negotiation algorithm cannot select one without more client input. This can occur when the client's Accept header lists multiple types with equal quality factors (all at q=1.0) and the server has representations matching all of them.

Legacy application misuse

Older applications occasionally return 300 with a Location header when 301 or 302 would be correct. This typically works in browsers because they follow the Location header, but it is technically incorrect.

300 vs other 3xx codes

CodeAuto-follows?Permanent?Use when
300Only if Location presentNoMultiple valid representations, client must choose
301YesYesContent permanently moved
302YesNoTemporary redirect
303Yes (GET)NoAfter POST, redirect to GET result

FAQ

What does HTTP 300 Multiple Choices mean?

HTTP 300 means the server has more than one representation of the requested resource and is asking the client to choose. If a Location header is present, it indicates the server's preferred choice.

Why is HTTP 300 so rare?

Content negotiation is almost entirely handled at the application layer in modern web development. Servers select the appropriate representation based on Accept headers and return 200 with the chosen format, rather than returning 300 and asking the client to choose.

Should my API ever return 300?

No. Use 200 with the correct Content-Type for the negotiated format. Use 406 if no acceptable format is available. Reserve 300 for the rare case where the server genuinely cannot automatically select between equally valid representations.

How is 300 different from 301?

301 is a permanent redirect to a single destination, automatically followed by clients. 300 presents multiple options without automatically redirecting. 300 is about choice; 301 is about relocation.

Related resources

On this site: HTTP 300 Multiple Choices — full guide · HTTP 301 Moved Permanently · HTTP 302 Found · HTTP 406 Not Acceptable · All 3xx redirect codes

Comparisons: 300 vs 301 · 300 vs 302

Standards: RFC 9110 §15.4.1 · IANA HTTP Status Code Registry · MDN Web Docs: 300