99tools

User-Agent Parser

runs in your browser

Read a user-agent string: browser and version, engine, operating system, device, crawler or HTTP client — and, honestly, what the string can no longer tell you.

Paste a user-agent string from a log, a request or a bug report. The notes say what the string cannot tell you, which is more than it used to.

User agent

What it says

Paste a string, pick an example, or read your own browser’s.

Your browser’s Client Hints

Client Hints are what replaced the frozen parts of the user agent: the real Windows or Android version, the device model, the CPU. Chromium browsers provide them on request; Firefox and Safari do not.

about this tool

What it reads

A user-agent string is a list of tokens that browsers have appended to for thirty years without ever removing one, which is why Chrome still claims to be Mozilla, KHTML, Gecko and Safari. The parser reads it in a fixed order: known crawlers and HTTP clients first, then browsers that ship Chromium but add their own token (Edge, Opera, Samsung Internet, Vivaldi, Electron), then Firefox, Chrome, Internet Explorer and finally Safari, which is the only browser identified by what the string lacks. The engine, the operating system and the device are read separately, so an unusual combination is reported as it is rather than forced into a known one.

What it can no longer tell you

Most of the value is in the notes. Browsers have been deliberately freezing parts of the string since 2021 to make fingerprinting harder, and a parser that reports the frozen value as fact is lying:

  • Windows 11 sends "Windows NT 10.0", the same as Windows 10.
  • Chrome on Android sends "Android 10; K" for every version and every device. The version and the model are placeholders.
  • Safari on macOS sends "10_15_7" whatever the real version, and an iPad on iPadOS 13 or later sends a Macintosh string, so a Mac Safari might be an iPad.
  • Brave and some other Chromium browsers are byte-for-byte Chrome.
  • Every browser on iOS is a shell over the system WebKit; Chrome for iOS renders exactly as Safari does, and the engine field says so.

Client Hints

The replacement for the frozen parts is User-Agent Client Hints, which Chromium browsers provide on request: brands and full versions, the real platform version (for Windows, 13 and above means Windows 11), the device model, the CPU architecture. The tool reads them for the browser you are using when you press the button; nothing is sent anywhere. Firefox and Safari do not implement Client Hints, and the tool says so plainly instead of showing an empty table. Server-side, the same values arrive as Sec-CH-UA-* headers once the server has asked for them with Accept-CH.

Crawlers and clients

Known crawlers (Googlebot, Bingbot, the AI crawlers, link-preview fetchers) and HTTP clients (curl, Postman, python-requests, Node's fetch) are named as what they are, with no browser field, since the browser tokens a crawler carries are a disguise. An unknown string containing "bot", "crawler" or "spider" is reported by that token.

Limits

This is a parser for the strings that make up nearly all real traffic, not a device database. It names the vendor for common Android model prefixes (Samsung, Google, Xiaomi, OnePlus and a few others) and leaves the rest as the raw model. Versions are shown exactly as the string gives them, so Chrome's "128.0.0.0" is kept, not trimmed. Rare browsers, smart TVs and consoles are identified by their engine and system at best. The corpus the tests use is in logic.test.ts and is the honest statement of what is covered.

questions

Why does it say "Windows 10 or 11"?
Because Windows 11 sends exactly the same token as Windows 10: "Windows NT 10.0". The string cannot distinguish them. Chromium browsers reveal the real version only through Client Hints, where a platformVersion of 13 or more means Windows 11; the tool reads those for your own browser when you ask.
Every Android phone shows as "Android 10" with no model. Is the parser wrong?
No, the string is. Since 2023 Chrome sends a reduced user agent on Android: the version is frozen at 10 and the model is the letter K, for every device. The tool says so rather than guessing. The real values are in Client Hints.
Why can it not detect Brave?
Brave sends a user agent identical to Chrome’s, on purpose, so that sites cannot single it out. Nothing in the string differs. The same is true of a few other Chromium browsers, and the tool notes that whenever it reports desktop Chrome.
My iPad shows as a Mac.
Since iPadOS 13 Safari on an iPad requests desktop sites and sends a Macintosh user agent, indistinguishable from a real Mac. Only an iPad on an older system, or one set to request mobile sites, still says iPad. The tool notes the possibility whenever it sees the frozen macOS 10.15.7 token.
Why does it not use a library?
The obvious one, ua-parser-js, moved to the AGPL licence in version 2, which would require this site’s source to be released under the same terms. The rules here are written for the browsers, engines, systems and clients that make up nearly all traffic, and are tested against a corpus of real strings.