300 Multiple Choices
The request matched more than one representation and the server is asking the client to pick, rather than choosing for it.
At a glance
- Status code
- 300 Multiple Choices
- Class
- 3xx, redirection, further action is needed to complete the request
- Defined in
- RFC 9110
- Cacheable by default
- yes
- Response body
- A list of the available representations.
In detail
Agent-driven negotiation. The server knows there are several variants (languages, formats, qualities) and no rule to choose between them, so it lists them and lets the client decide.
Rare, because server-driven negotiation using Accept headers with a Vary response works without a round trip. 300 costs an extra request and needs a client that understands the list format, which is not standardised.
If you control both ends, prefer Accept plus Vary. If you must return 300, include a Location header naming the preferred variant so simple clients can follow it.
Examples
HTTP/1.1 300 Multiple Choices
Location: /doc.en.html
Content-Type: text/html
<ul><li><a href="/doc.en.html">English</a></li></ul>Things that catch people out
- Browsers do not follow 300 automatically. The user sees whatever body you sent, so it has to be readable.
- The response body format is not specified, so no two implementations agree on it.
Try it: HTTP Request Builder
Build a request with any method, headers and body, send it, and read the status line the server returns.
HTTP Request Builder
LOCAL · Browser-OnlyBuild and test HTTP requests with custom headers and body
Authentication
Headers
Generate Code
curl -X GET 'https://api.example.com/endpoint' \
-H 'Content-Type: application/json'Showing a sample URL. Enter your endpoint above to update the snippet.
Related HTTP status codes
All http status codes →301 Moved Permanently
The resource has a new permanent URL, given in Location. Search engines transfer ranking signals to the target and clients may cache the redirect.
406 Not Acceptable
The server cannot produce a representation that matches the Accept headers the client sent.
200 OK
The request succeeded. What the body contains depends on the method: a GET returns the resource, a POST returns the result of the action.
302 Found
The resource is temporarily at a different URL. The original URL stays authoritative and should keep being used for future requests.
303 See Other
The result of the request is at another URL, and the client should fetch it with GET regardless of the original method.
304 Not Modified
The cached copy the client already holds is still current, so the server sent no body. This is what makes conditional requests cheap.
Tools for this
- HTTP Request Builder Free online HTTP request builder - build and test HTTP requests with custom headers and body
- HTTP Headers Checker Free online HTTP headers checker - view HTTP response headers for any URL