HTTP 304 Not Modified
HTTP 304 Not Modified means the server checked the client's cached version of a resource and confirmed it is still current. The server does not return the resource body โ the client already has it. The browser uses its cached copy, saving bandwidth and reducing load time.
Quick reference
| Code | 304 |
|---|---|
| Name | Not Modified |
| Category | 3xx Redirect |
| Specification | RFC 9110 ยง15.4.5 |
| IANA status | Assigned |
| Cacheable | N/A โ the response is a cache validation signal, not cacheable itself |
| Client action | Use the cached copy โ it has not been modified. No response body is included. |
| In-depth guide | HTTP 304 full guide โ |
What HTTP 304 means
RFC 9110 defines 304 as indicating that a conditional GET or HEAD request has been received and would have resulted in a 200 response if it were not for the fact that the condition evaluated to false. In other words: the client asked "has this changed?" and the server answered "no." The client's cached copy is still valid.
304 has no response body. The server returns only headers โ the same headers the full response would have included. The browser combines these headers with the cached body to form the complete response in memory.
304 is part of the HTTP conditional request mechanism. Clients send conditional request headers โ If-None-Match with an ETag, or If-Modified-Since with a timestamp โ and the server compares them to the current resource state. If unchanged, it returns 304 instead of 200 with the full body.
How conditional requests work
With ETags:
// First request: server returns ETag GET /api/data.json โ 200 OK โ ETag: "a1b2c3d4" โ [full response body] // Subsequent request: client sends ETag GET /api/data.json If-None-Match: "a1b2c3d4" โ 304 Not Modified (if unchanged) โ [no body โ client uses cache] // Or if changed: GET /api/data.json If-None-Match: "a1b2c3d4" โ 200 OK โ ETag: "e5f6g7h8" (new ETag) โ [new response body]
With Last-Modified:
GET /page.html โ 200 OK โ Last-Modified: Sat, 20 Apr 2026 10:00:00 GMT GET /page.html If-Modified-Since: Sat, 20 Apr 2026 10:00:00 GMT โ 304 Not Modified (if not modified since that date)
304 and browser caching
Browsers automatically include If-None-Match or If-Modified-Since headers when revalidating cached resources. This happens transparently โ the browser manages the conditional request lifecycle based on the cache headers it received with the original response (Cache-Control, ETag, Last-Modified).
304 responses update the cache entry's freshness information. After a 304, the browser extends the cached resource's validity period and updates its timestamp, so subsequent requests within the new max-age window skip the server entirely.
Common in browser DevTools: you will see 304 next to a resource in the Network tab when the browser validated its cache and the server confirmed it was still fresh. The resource size column shows "(from cache)" or the transfer size shows as very small (just headers).
FAQ
What does HTTP 304 Not Modified mean?
HTTP 304 means the server confirmed that the resource has not changed since the client last retrieved it. The client uses its cached copy. No response body is sent.
Why do I see 304 in my browser's Network tab?
304 in DevTools means the browser sent a conditional request for a cached resource, and the server confirmed the cache is still valid. The browser is using its cached copy of the resource. This is efficient โ the server is confirming "use what you have" instead of resending everything.
How is 304 different from a cache hit?
A cache hit (served from cache without a server request) shows as "from cache" in DevTools with no network request. A 304 involves a network request โ the browser asks the server "is this still fresh?" and the server says yes. A cache hit is faster (no network), but 304 confirms freshness.
Can an API return 304?
Yes. Any HTTP resource supports conditional requests if the server implements ETags or Last-Modified. REST APIs can return 304 to allow clients to skip processing when data has not changed โ useful for polling endpoints.
Related resources
On this site: HTTP 304 Not Modified โ full guide ยท HTTP 200 OK ยท HTTP 412 Precondition Failed ยท HTTP 428 Precondition Required ยท All 3xx codes
Standards: RFC 9110 ยง15.4.5 ยท IANA HTTP Status Code Registry ยท MDN Web Docs: 304