a live field manual for client hints
Your browser talks about you. Here is the transcript.
HTTP Client Hints are the structured replacement for the User-Agent string: small Sec-CH-* headers a browser volunteers, or reveals only when a server asks politely. The capture on the right is not an example. It is your visit, right now.
the mechanism
A negotiation in three moves
The old User-Agent string shouted everything at everyone. Client hints invert that: cheap facts flow by default, revealing facts flow on request. The sequence above your scrollbar is the entire protocol.
Three hints, for free
Every Chromium request carries Sec-CH-UA, Sec-CH-UA-Mobile and Sec-CH-UA-Platform: browser, form factor, OS. Low entropy by design: enough to adapt a page, not enough to identify a person.
Accept-CH names the rest
A response header lists what else the server would like, such as CPU architecture, exact versions and dark-mode preference. The browser remembers the request per origin, over HTTPS only.
Hints ride every request after
From the next request on, granted hints arrive as ordinary headers your server reads directly: no JavaScript, no round-trips, cacheable with Vary.
the registry
22 hints, one page each
Wire format, live values from your own browser, JavaScript equivalents, and the gotchas the specs keep quiet about: GREASE brands, the Windows 11 decoder ring, the empty-string model.
User-agent hints, sent by default
Low-entropy hints every Chromium browser volunteers on every request, no opt-in needed. Together they reveal roughly what a shop window reveals about a store: browser, major version, platform, mobile or not.
See the hints → 8 hints · UA · opt-inUser-agent hints, on request
High-entropy hints the browser only attaches after your server opts in with Accept-CH. They carry real fingerprinting surface (CPU architecture, exact versions, device model), which is exactly why they are off by default.
See the hints → 3 hints · PreferenceUser preference hints
Media-feature preferences promoted to request headers, so the very first HTML response can honor dark mode or reduced motion without a flash of the wrong theme.
See the hints → 4 hints · DeviceDevice hints
Screen and hardware characteristics for responsive image and asset selection on the server. Each modern Sec-CH-* name supersedes an older unprefixed header from the 2015 draft.
See the hints → 4 hints · NetworkNetwork hints
Connection quality as the browser estimates it. Useful for serving lighter payloads on slow links, and the only group where one hint, Save-Data, is sent without any opt-in.
See the hints →reality check
Only Chromium is talking
Every hint on this site ships in Chrome, Edge, Opera, Brave and Android WebView, and in no version of Firefox or Safari. Neither has announced plans to implement UA client hints. Depending on your audience, a quarter to a third of traffic sends no hints at all, and neither do most bots, crawlers and HTTP libraries.
So every serious deployment is a hybrid: read the hints when present, fall back to parsing the classic User-Agent string when not, all while that string itself is being frozen and reduced under you. That is not an argument against client hints. It is the reason to understand both halves properly.
client hint headers sent by Firefox, Safari, and most bots. Real-world detection reads the hints when present and parses the User-Agent string when not.
the other half
Server-side intelligence for every browser
Maintaining a User-Agent parser (GREASE tricks, frozen strings, ten thousand device models) is a full-time job nobody wants. Ipregistry does it as an API: send any UA string (or just let it read the request), get structured browser, engine, OS and device data back, alongside IP geolocation, VPN and threat detection in the same call.
-
GET https://api.ipregistry.co/?key=…for an origin lookup with a parseduser_agentobject included GET /user_agent?ua=…to parse any string, batchable up to 256 at once- SDKs for JavaScript, Python, Java, Go, PHP, Rust and more
{
"ip": "203.0.113.42",
"location": {
"country": { "name": "Australia" },
"city": "Sydney"
},
"security": {
"is_vpn": false,
"is_threat": false
},
"user_agent": {
"name": "Chrome",
"type": "browser",
"version": "126.0.6478.127",
"device": { "brand": "Google", "name": "Pixel 8" },
"engine": { "name": "Blink" },
"os": { "name": "Android", "version": "14" }
}
} go deeper
The guides
What are Client Hints?
Why the User-Agent string had to die, what replaced it, and how the low/high entropy split actually protects users.
Read the explainer → the mechanicsAccept-CH & Critical-CH
Opt-in lifetimes, the first-request gap, the Critical-CH retry, caching with Vary, and delegating hints to third parties.
Master the negotiation → the migrationUser-Agent reduction
What Chrome froze in the UA string, what silently broke, and a field-by-field migration map from regex parsing to hints.
See what changed →