Client Hints Explained
How User-Agent Client Hints provide structured, privacy-respecting browser and device information to replace the legacy user agent string.
Why Client Hints?
The traditional user agent string has three fundamental problems: it is unstructured (requiring fragile regex parsing), it leaks information (exposing OS version, CPU architecture, and device model by default), and it is frozen (browsers are reducing its specificity to limit fingerprinting).
User-Agent Client Hints (UA-CH) solve all three problems by replacing the single opaque string with individual, structured HTTP headers that servers must explicitly request. By default, browsers send only low-entropy hints (brand and major version). High-entropy hints (full version, platform version, architecture) require the server to opt in.
How It Works
Default (Low-Entropy) Hints
Browsers send these headers automatically with every request:
Sec-CH-UA: "Chromium";v="120", "Google Chrome";v="120", "Not_A Brand";v="8"
Sec-CH-UA-Mobile: ?0
Sec-CH-UA-Platform: "Windows"These three headers tell you the browser brand, whether it is mobile, and the platform family - enough for most content-adaptation decisions. The Not_A Brand entry with a deliberate version mismatch prevents naive string parsing from working; you must parse the structured header format.
Requesting High-Entropy Hints
For more detailed information, the server responds with an Accept-CH header listing the hints it wants:
HTTP/1.1 200 OK
Accept-CH: Sec-CH-UA-Full-Version-List, Sec-CH-UA-Platform-Version, Sec-CH-UA-Arch, Sec-CH-UA-ModelOn subsequent requests, the browser includes the requested hints:
Sec-CH-UA-Full-Version-List: "Chromium";v="120.0.6099.109", "Google Chrome";v="120.0.6099.109"
Sec-CH-UA-Platform-Version: "15.0.0"
Sec-CH-UA-Arch: "x86"
Sec-CH-UA-Model: ""Available Hints
| Header | Entropy | Example Value |
|---|---|---|
| Sec-CH-UA | Low | "Chrome";v="120" |
| Sec-CH-UA-Mobile | Low | ?0 |
| Sec-CH-UA-Platform | Low | "Windows" |
| Sec-CH-UA-Full-Version-List | High | "Chrome";v="120.0.6099.109" |
| Sec-CH-UA-Platform-Version | High | "15.0.0" |
| Sec-CH-UA-Arch | High | "x86" |
| Sec-CH-UA-Model | High | "Pixel 7" |
| Sec-CH-UA-Bitness | High | "64" |
JavaScript API
Client-side code can access hints through the navigator.userAgentData API:
// Low-entropy data (always available)
const uaData = navigator.userAgentData;
console.log(uaData.brands); // [{brand: "Chrome", version: "120"}, ...]
console.log(uaData.mobile); // false
console.log(uaData.platform); // "Windows"
// High-entropy data (requires async call, may prompt user)
const highEntropy = await navigator.userAgentData.getHighEntropyValues([
"platformVersion",
"architecture",
"model",
"fullVersionList",
]);
console.log(highEntropy.platformVersion); // "15.0.0"
console.log(highEntropy.architecture); // "x86"Privacy Benefits
Client Hints reduce passive fingerprinting by limiting the information sent by default. The traditional UA string exposes the full browser version, OS version, and sometimes device model on every request. With Client Hints:
- Only brand and major version are sent by default
- Detailed information requires explicit server opt-in
- Users and browser policies can control which hints are shared
- Third-party contexts receive even less information
Browser Support
Client Hints are fully supported in Chromium-based browsers (Chrome, Edge, Opera, Brave) since 2021. Firefox and Safari have not implemented them as of 2026, continuing to rely on the traditional UA string. This means you will need to support both approaches for the foreseeable future.
Try It
See what Client Hints your browser provides with our User Agent Parser - select the Client Hints tab to view all available hints from your current browser.
Further Reading
- User-Agent Client Hints — web.dev
Google developer guide to implementing and migrating to Client Hints.
- Client Hints Infrastructure — WICG
The W3C specification for User-Agent Client Hints.
- Sec-CH-UA — MDN
MDN reference for the Sec-CH-UA HTTP header.