300 Redirection πŸ“‹

300 Multiple Choices: When a Resource Has Many Representations

Last updated: June 28, 2026 β€’ 4 min read

✦ The Golden Answer: The 300 Multiple Choices status code indicates that the requested resource has multiple possible representations (e.g., different content types, languages, or encodings) and the client must choose one. The server may provide a list of URIs in the response body, or the client can use content negotiation headers (like Accept-Language or Accept-Encoding) to automatically select the appropriate version.

When Is 300 Used?

300 is rarely used in practice. It is a fallback for cases where content negotiation fails or where the server wants to present a menu of options to the user. Typical scenarios include:

  • Multiple file formats – a resource available as HTML, JSON, XML, or PDF.
  • Multiple languages – the same content in English, Spanish, French, etc.
  • Multiple encodings – plain text, gzip-compressed, etc.
  • Ambiguous URI – when the requested URI maps to several resources.

How the Server Responds

The server can respond with a list of alternatives in the body, typically in HTML or plain text, with a Location header pointing to a default choice, and the body containing the full list.

HTTP/1.1 300 Multiple Choices Location: /resource/en Content-Type: text/html <html> <body> <h1>Multiple Choices</h1> <p>This resource is available in several formats:</p> <ul> <li><a href="/resource/en">English (HTML)</a></li> <li><a href="/resource/es">Spanish (HTML)</a></li> <li><a href="/resource/fr">French (HTML)</a></li> <li><a href="/resource/data.json">JSON data</a></li> </ul> </body> </html>

Client‑Driven Content Negotiation

In many cases, the server uses Accept-* headers to automatically choose the best representation without a 300. For example:

  • Accept-Language: es β†’ server sends Spanish version.
  • Accept: application/json β†’ server sends JSON.

If the server cannot determine a preferred choice (e.g., the headers are missing or conflicting), it may respond with 300 and let the client choose.

Why 300 Is Rarely Used

  • Content negotiation is automatic – most modern servers and clients handle negotiation via headers, so 300 is unnecessary.
  • Better alternatives – using Vary and cache headers is more efficient.
  • User experience – showing a menu to the user is often clunky; redirecting to a default is preferred.

Best Practices

  • Avoid using 300 – prefer automated content negotiation.
  • If you must use it, provide a clear list of choices and a default Location.
  • Use Vary header – to inform caches that the response varies based on request headers.
  • For APIs, use 200 with a JSON list of available representations rather than 300.

Frequently Asked Questions

Is 300 Multiple Choices the same as 301?

No. 301 is a permanent redirect to a single specific URI. 300 is a menu of multiple choices, not a redirect to one.

What should a client do when it receives 300?

Ideally, the client should present the list of choices to the user or automatically select one based on its preferences (if it has configured priorities for language, format, etc.). However, many clients simply follow the Location header if present.

Can 300 be cached?

Yes, but the cache must respect the Vary header to ensure different representations are served correctly.