# 304 Not Modified

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

**Family:** 3xx Redirection

## Rationale

Conditional GET or HEAD matched the current representation, so the client should reuse its cached copy.

## In Plain Terms

You already have the latest version! The thing you're asking for hasn't changed since you last got it.

## Description

The HTTP 304 Not Modified status code indicates that a conditional GET or HEAD request would otherwise have produced a normal success response, but the client's condition evaluated in a way that means the cached representation is still current. The server therefore skips retransmitting the body.

## Server Perspective

### Usage
- Return 304 when If-None-Match or If-Modified-Since validates successfully
- Use it to save bandwidth for unchanged cacheable resources
- Conditional GET requests with If-None-Match
- Conditional GET requests with If-Modified-Since
- Conditional HEAD requests using validators

### Implementation
- Do not include a response body
- Include the headers that would accompany a 200 response for the same resource — at minimum Date, ETag, Cache-Control, Expires, Vary, and Content-Location when applicable

### Common Headers
- Date
- ETag
- Last-Modified
- Cache-Control
- Expires
- Vary
- Content-Location

### Body
- Do not include a response body in a 304 response.

### Pitfalls
- Do not return 304 for unconditional requests
- Return 200 with the representation when the resource changed
- For unconditional requests (use 200 OK)
- When content has actually changed (use 200 OK)
- For non-GET/HEAD methods

## Client Perspective

### Pitfalls
- Do not try to parse a 304 response body

## Examples

### Cached resource validation

Client's cached version with ETag "abc123" is still current

**Request:**
```
GET https://api.example.test/api/data
If-None-Match: "abc123"
```

**Response:**
```
304 Not Modified
ETag: "abc123"
```

## Related Codes

- [200 OK](/docs/200.md)
- [412 Precondition Failed](/docs/412.md)

