HTTP 300 Multiple Choices – Free, Online, Private
300 Multiple Choices means more than one representation exists and the client must pick.
What HTTP 300 means
300 says the target has more than one representation and the server is offering a choice. The body should list the options and their URIs. In practice browsers do not present a menu for 300, and APIs rarely use it. Automatic selection belongs in content negotiation with a specific 200, or in a redirect to the chosen URL.
300 Multiple Choices belongs to the 3xx redirection class. Clients that only look at the class will group it with its neighbors. Clients that care about the exact code should use the narrower rule on this page, because the class is only the first digit.
When you see HTTP 300
When you see HTTP 300 Multiple Choices, stop on that exact status line. 300 Multiple Choices means more than one representation exists and the client must pick. The trace that usually produces it: A resource exists in several formats and the server refused to negotiate. The 3xx redirection class only tells you the first digit. A neighbor in that class is a different fault, and the fix on this page does not transfer to it.
Return 300 only when you truly want the client to choose and you put the choices in the body. If you have already chosen, send 200. If one of the choices is the canonical URL, send 301 or 308 to it. Do not use 300 as a generic 'see the docs' response.
How to fix HTTP 300
To fix HTTP 300, change the condition that made the server choose Multiple Choices. If you can parse the list, pick the representation you support and request it. If you cannot, treat 300 as a contract problem, not as success. Retrying the same request returns the same choice. Change Accept or follow one of the listed URLs. If the log line is a different code, leave this page. The mix-up people make with 300 is this one: 406 means none of the client's preferences were acceptable. 300 means several are acceptable and someone has to choose.
- A client sent an Accept header the server answered with a list instead of a single type.
- The body of the 300 did not include URIs, so the choice could not be made.
- An API used 300 where 406 Not Acceptable was the accurate refusal.
An access log that only stores 300 is not enough to tell these apart. Keep the method, the path, and a request id. Do not keep the Authorization header or a request body that might be a token. The status explains the outcome. It is not a place to echo secrets back to the client either.
Example response
HTTP 300 Multiple ChoicesHTTP/1.1 300 Multiple Choices
Content-Type: text/html
The body should link to each alternative. Without those links the status is a dead end. Browsers may show the body. API clients usually throw, because they have no rule for picking an option.
What the client should do
If you can parse the list, pick the representation you support and request it. If you cannot, treat 300 as a contract problem, not as success.
A 300 may be cached, but caching a choice list as if it were the resource will serve the menu to the next client. Prefer not to cache it unless the list is the resource.
Retrying the same request returns the same choice. Change Accept or follow one of the listed URLs.
Codes people confuse with HTTP 300
406 means none of the client's preferences were acceptable. 300 means several are acceptable and someone has to choose.
Frequently asked questions
Do browsers show a menu for 300?
Not reliably. Put real links in the body or send a redirect instead.
Is 300 an error?
It is a redirect-class response. Clients that only accept 200 will treat it as failure.
What belongs in the body?
The alternative URIs and enough description to choose between them.
When is 200 better?
When the server can pick the representation itself through content negotiation.
What should I do first when I see HTTP 300?
Read the status as 300 Multiple Choices specifically. 300 Multiple Choices means more than one representation exists and the client must pick. Then check the cause that matches the request you sent, starting with: A resource exists in several formats and the server refused to negotiate.