# 300 Multiple Choices

> https://http-status.org/docs/300

**Family:** 3xx Redirection

## Rationale

Multiple representations or targets are available, and the client should choose among them.

## In Plain Terms

There are several valid versions of this thing, and the server is asking you to pick one.

## Description

The HTTP 300 Multiple Choices status code indicates that the target resource has more than one representation or more than one specific identifier. It is commonly associated with reactive negotiation, where the server returns the alternatives and the user agent or user chooses which one to fetch next.

## Server Perspective

### Usage
- Return 300 for reactive negotiation when the response should list alternatives instead of choosing for the client
- If there is a preferred target, you may also include Location to point at that preference
- A resource is available in multiple representations and the server wants the client to choose
- Different formats, languages, or variants are available and automatic selection is not desired
- The server can provide a list of alternatives instead of forcing one redirect target

### Implementation
- Include a machine- or human-readable list of alternatives in the response body
- Keep each alternative specific enough that the client can make a meaningful choice
- Expose machine-readable alternatives via Link headers with rel=alternate when the client can act on them programmatically

### Common Headers
- Location
- Link

### Body
- Include a list of alternative representations or URIs; Location is optional, not mandatory

### Pitfalls
- Do not use 300 as a generic redirect when there is only one real target
- Do not expect clients to understand an undocumented custom alternatives format automatically
- There is one clearly preferred redirect target; use 301, 302, 307, or 308 as appropriate
- The server can confidently choose the best representation and return 200
- You need to indicate the requested representation is unacceptable; use 406

## Client Perspective

### Pitfalls
- Do not treat 300 like a normal single-target redirect

## Examples

### Same report in multiple formats

The server exposes several valid representations and lets the client choose.

**Request:**
```
GET https://api.example.test/report
```

**Response:**
```
300 Multiple Choices
Content-Type: application/json

{
  "choices": [
    "/report.html",
    "/report.pdf",
    "/report.csv"
  ]
}
```

## Related Codes

- [301 Moved Permanently](/docs/301.md)
- [302 Found](/docs/302.md)
- [303 See Other](/docs/303.md)
- [406 Not Acceptable](/docs/406.md)

