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.
Quick reference
| Code | 300 |
|---|---|
| Name | Multiple Choices |
| Category | 3xx Redirect |
| Specification | RFC 9110 §15.4.1 |
| IANA status | Assigned |
| Cacheable | Yes — cacheable by default |
| Client action | Follow the Location header if present, or select from the available representations listed in the response body. |
| In-depth guide | HTTP 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
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