103 Early Hints
An interim response carrying Link headers so the browser can start preloading assets before the final response is ready.
Status
HTTP/1.1 103 Early Hints
Details
- Category: 1xx
- Status: Standard. Registered with IANA and defined by a current standards-track RFC.
- Specification: RFC 8297
- Cacheable: Not cacheable
- Response body: Must not be sent
- Retry: Not applicable
103 Early Hints exists to fill the dead time while a server assembles a page. The server flushes a 103 containing Link headers with rel=preload or rel=preconnect, the browser starts fetching stylesheets, fonts, and scripts immediately, and the real 200 with the HTML follows once the backend finishes. On slow backends this can remove hundreds of milliseconds from largest contentful paint.
Hints are advisory. The final response is not required to include the same links, and a client is free to ignore the 103 entirely. Support is real in Chrome and in CDNs such as Cloudflare and Fastly, but any intermediary that does not understand interim responses will drop them, so the technique must degrade cleanly.
Headers
- Link: One or more preload, modulepreload, or preconnect hints. This is the entire point of the response.
Common causes
- A server or CDN was configured to emit early hints for HTML documents.
- An origin framework flushed hints before rendering a page that depends on slow database or API calls.
How to fix it
As the client
- Treat 103 as advisory and keep the connection open for the final response.
- In a scraper or HTTP library, make sure interim responses are consumed rather than parsed as the final result. Older clients can misread the 103 header block as the response.
As the server
- Send only hints you are confident about. A wrong preload wastes bandwidth and competes with the real page for connections.
- Send 103 only over HTTP/2 or HTTP/1.1 to clients known to handle it, and never to HTTP/1.0 clients.
- Measure. Early hints help when server think time is long and the asset list is stable, and do nothing when the backend is already fast.
Examples
GET /product/12345 HTTP/1.1 Host: shop.example.com HTTP/1.1 103 Early Hints Link: </css/app.css>; rel=preload; as=style Link: </fonts/inter.woff2>; rel=preload; as=font; crossorigin HTTP/1.1 200 OK Content-Type: text/html; charset=utf-8 Link: </css/app.css>; rel=preload; as=style
Notes for proxy users
Early hints reach the client only if every hop forwards interim responses. Scraping through a proxy pool, expect them to be dropped, which is harmless: the final response still carries everything needed.