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.

No cookies, no analytics, no tracking. This site only reads what your browser already sends, and keeps none of it.

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.

01 1 · browser sends

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.

02 2 · server asks

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.

03 3 · browser answers

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.

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.

0

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 parsed user_agent object 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

Explore the user-agent API

api.ipregistry.co · sample response
{
  "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