Priority proxy both
Signals the relative priority of a request to servers and intermediaries — part of the Extensible Prioritization Scheme for HTTP.
What it does
Priority lets clients signal the relative importance of a request to servers and intermediaries. A browser can tell the server "this request is urgent (blocking render)" vs "this request is low priority (background prefetch)". The server can use this to schedule responses or allocate resources accordingly.
It's part of RFC 9218 — the Extensible Prioritization Scheme for HTTP — which replaced HTTP/2's built-in (but poorly adopted) stream priority mechanism.
Syntax
Priority: u=<urgency>[, i]
Two parameters:
u— urgency level, integer 0–7 (0 = highest, 7 = lowest, default = 3)i— incremental flag (presence meanstrue; absence meansfalse)
Examples:
Priority: u=0
Priority: u=3, i
Priority: u=7
Priority: u=1, i=?1
Urgency levels
| Level | Meaning | Typical use |
|---|---|---|
| 0 | Blocking | Critical render-blocking resources |
| 1 | Very high | Main resource (HTML document) |
| 2 | High | Render-blocking CSS, fonts |
| 3 | Normal (default) | Images visible in viewport |
| 4 | Low | Images below fold, non-critical scripts |
| 5 | Very low | Speculative loads |
| 6 | Background | Background fetch, analytics |
| 7 | Idle | Least important |
The incremental flag
i (incremental) tells the server whether partial responses are useful:
iabsent (default) — send the full response before moving to lower-priority requests. The entire response is needed before the client can use it (e.g., JavaScript files).ipresent — partial responses are useful, interleave with other responses. The client can process chunks as they arrive (e.g., progressive images, streaming JSON).
Priority: u=2 # High urgency, non-incremental (CSS file — need the whole thing)
Priority: u=3, i # Normal urgency, incremental (progressive image — chunks are useful)
Why it replaces HTTP/2 stream priority
HTTP/2 had a complex tree-based dependency priority system that almost no server or CDN implemented correctly or consistently. It was technically powerful but practically useless — implementations varied wildly, and the complexity made it hard to reason about. RFC 9218 replaced it with this simpler scheme: just two meaningful parameters that servers can actually implement correctly.
HTTP/3 never adopted HTTP/2's priority scheme — it went straight to this extensible scheme. HTTP/2 implementations are gradually updating too.
Server response header
Servers can also send Priority in responses to indicate their assessment of the resource's priority or to signal changes:
HTTP/1.1 200 OK
Priority: u=2
This can be used by intermediaries to schedule forwarding to downstream clients.
Real-world examples
Browser requesting a render-blocking stylesheet:
GET /styles/main.css HTTP/2
Priority: u=2
Low-priority prefetch:
GET /next-page.html HTTP/2
Priority: u=6, i
Streaming response where partial data is useful:
GET /api/large-dataset HTTP/2
Priority: u=3, i
FAQ
Do browsers automatically set Priority?
Chromium-based browsers set Priority automatically based on resource type and position in the page. You don't need to set it manually in most cases. It's more relevant when building custom HTTP clients, CDNs, or proxies that need to schedule request handling.
Is Priority the same as HTTP/2 stream priority?
No — they replaced it. HTTP/2 stream priority (PRIORITY frames) was complex and widely ignored. RFC 9218's Priority header is simpler, works across HTTP versions (HTTP/1.1, HTTP/2, HTTP/3), and is what current browsers and servers implement.
Fun fact
The failure of HTTP/2's priority system is one of the web standards' cautionary tales about over-engineering. The HTTP/2 dependency tree was theoretically capable of expressing any priority relationship between streams, but its complexity meant browser vendors implemented it differently, server vendors implemented it partially or incorrectly, and CDNs mostly ignored it. A 2020 study found that the majority of HTTP/2 servers either ignored priorities entirely or implemented them incorrectly. The lesson taken into RFC 9218: two parameters that everyone will implement correctly beat ten parameters that no one will.