How to Read a User Agent String (With Real Examples)

By • 2 November, 2026 • Developer Tools • 10 minutes read

Learn to read any user agent string: which tokens matter, which values browsers freeze on purpose, and how to verify bots. Real parser results.

To read a user agent string, ignore the Mozilla/5.0 at the start and look for three things: the platform inside the first parentheses (Windows NT 10.0, Android 10; K, iPhone OS 18_6), the last browser token before or after Safari/ (Edg/, OPR/, Chrome/, Version/), and whether the word Mobile is there. Then remember that modern browsers freeze parts of the string on purpose, so some of what you read is a fixed value, not the truth. Our free user agent parser does the first part for you: paste a string, get the browser, OS and device type, with no account needed.

Every parser result in this guide was produced on November 2, 2026, either live in our tool or with the same parser library on the server behind it. Browser strings come from Chrome 156 on our test machine and from the formats published by Chromium, Mozilla (MDN), Apple's WebKit team and Google Search Central.

Have a string in front of you? Paste it into the free user agent parser and keep reading to see which parts you can trust.

The anatomy of a user agent string

Here is Chrome on Windows, exactly as MDN documents it:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36
  • Mozilla/5.0: a compatibility leftover. Almost every browser sends it, so it tells you nothing.
  • (Windows NT 10.0; Win64; x64): the platform. This is where the operating system lives.
  • AppleWebKit/537.36 (KHTML, like Gecko): the engine, sort of. Chrome's Blink engine still claims WebKit 537.36 for compatibility.
  • Chrome/143.0.0.0: the browser and its version. Since Chrome 101 the last three numbers are always 0.0.0; only the major version is real.
  • Safari/537.36: another compatibility token. Chrome is not Safari.

Browsers built on Chromium append their own token at the end: Edg/ for Edge on desktop, EdgA/ on Android, OPR/ for Opera. So the rule is to read the string from the right: the most specific token usually comes last. Safari is the exception: its real version is in Version/26.0, while Safari/605.1.15 is a build number.

How to parse a user agent in 3 steps

  1. Get the exact string. For your own browser, open the developer console (F12) and run navigator.userAgent. For a visitor, copy the user agent field from your server log or analytics export. Copy it whole; a missing parenthesis changes the result.
  2. Paste it into the parser. Open the user agent parser, replace whatever is in the box with your string, and press Submit. You get three rows: Browser, Operating system and Device type.
  3. Check the result against the frozen values below. The parser marks Windows NT 10.0, Android 10, macOS 10.15.7 and iOS 18.6 as "frozen by the browser", because the real version may be newer. Section by section, here is why.

Worked examples: what the parser shows

These are real runs. All but one were submitted to the live tool; the tablet string went through the same parser call on our server.

Who sent itKey tokensParser result
Chrome 143, WindowsWindows NT 10.0; Win64; x64, Chrome/143.0.0.0Chrome 143.0.0.0 · Windows 10 or 11 (NT 10.0) (frozen by the browser) · Desktop
Chrome 143, Android phone (reduced)Linux; Android 10; K, MobileChrome 143.0.0.0 · Android 10 (frozen by the browser) · Mobile phone
Chrome 143, MacMacintosh; Intel Mac OS X 10_15_7Chrome 143.0.0.0 · macOS 10.15.7 (frozen by the browser) · Desktop
Safari 26, iPhoneiPhone OS 18_6, Version/26.0Safari 26.0 · iOS 18.6 (frozen by the browser) · Mobile phone
Googlebot Smartphonecompatible; Googlebot/2.1Googlebot 2.1 · Not reported (bot or tool) · Bot or tool
Headless Chrome 156 (our test machine)HeadlessChrome/156.0.0.0Chrome 156.0.0.0 (Automated / headless browser) · Linux · Automated / headless browser
Edge 143, WindowsEdg/143.0.0.0Edge 143.0.0.0 · Windows 10 or 11 (NT 10.0) (frozen by the browser) · Desktop
Chrome, Android tablet (reduced)Android 10; K, no MobileChrome 93.0.0.0 · Android 10 (frozen by the browser) · Tablet
Firefox 47, Windows 7Windows NT 6.1; rv:47.0Firefox 47.0 · Windows 7 (NT 6.1) · Desktop
curl 8.14.1curl/8.14.1Curl 8.14.1 · Not reported (bot or tool) · Bot or tool

Four of those rows deserve a second look. The Android phone is not really on Android 10, the Mac is almost certainly not on Catalina, and the iPhone is not on iOS 18. The parser flags all three as frozen, and it labels the headless browser as an automated client instead of an ordinary desktop Chrome.

The frozen values that fool everyone

Windows NT 10.0 covers Windows 10 and Windows 11

Microsoft's own documentation states that user agent strings won't be updated to tell Windows 11 from Windows 10. Chrome, Edge and Firefox on Windows 11 all send Windows NT 10.0. Our parser now turns the NT number into a name with this map: 10.0 = Windows 10 or 11, 6.3 = 8.1, 6.2 = 8, 6.1 = 7. In Chromium browsers, Windows 11 shows up only in the Sec-CH-UA-Platform-Version client hint, where 13.0.0 or higher means Windows 11. Firefox doesn't send client hints, so for Firefox users you can't tell at all.

Android 10; K is a placeholder

Since Chrome 110, Chrome on Android sends the literal values Android 10 and K instead of the real Android version and phone model. Compare the older format, still documented by MDN: Linux; Android 16; Pixel 9 with Chrome/143.0.12.45. Our parser reads that one as Chrome 143.0.12.45 on Android 16. If your logs show a real model name next to a recent Chrome version, it's usually a different browser or a WebView, since the reduction doesn't apply to Android WebView.

The word Mobile is what still works: Chrome sends it on phones and leaves it out on tablets. That's how our parser put the second Android string in the tablet row.

macOS 10_15_7 is frozen in Chrome and Safari

Chrome capped the macOS version at 10_15_7 in Chrome 90, and Safari reports the same value. Firefox reports 10.15. Our parser therefore says macOS 10.15.7 for any current Mac and marks it as frozen by the browser. The string also says Intel on Apple silicon Macs, so don't use it to choose between an Intel and an ARM download.

Safari 26 on iPhone reports iOS 18

Starting with Safari 26, Apple froze the iOS version in the user agent. WebKit's bug tracker confirms that iPhone OS 18_6 like Mac OS X is intentional and meant to be permanent, and later builds moved the frozen value to 18.7. The parser shows iOS 18.6 because that's what the string says, and marks it as frozen by the browser. On iPhone and iPad, the Version/26.0 token is the better guide: Safari's major version follows the iOS major version.

iPads add another twist. By default, Safari on iPadOS requests desktop websites and sends the same Macintosh string as a Mac, so no server-side parser can tell them apart. In JavaScript, a Macintosh string together with navigator.maxTouchPoints greater than 1 points to an iPad.

Pitfalls when you sniff user agents

  • Checking for "Chrome" or "Safari" alone. Edge and Opera contain Chrome/, and Chrome contains Safari/. Test for the most specific token first (Edg/, OPR/), then Chrome/, and only call it Safari when there's no Chrome/.
  • Trusting a bot name. Anyone can type Googlebot into a user agent. Google's own instructions are to run a reverse DNS lookup on the visitor's IP, check that the name ends in googlebot.com, google.com or googleusercontent.com, then run a forward lookup and confirm it returns the same IP. We did this for Google's documented example: the reverse IP lookup turned 66.249.66.1 into crawl-66-249-66-1.googlebot.com, and the DNS lookup resolved that name back to 66.249.66.1. If the reverse lookup returns a hosting company instead, the bot is fake.
  • Treating headless Chrome as a person. Our test machine sent HeadlessChrome/156.0.0.0, and the parser now labels it as an automated / headless browser. Search your logs for HeadlessChrome yourself, and remember that a scraper can easily remove that token.
  • Expecting the exact version. The user agent of our Chrome said 156.0.0.0. The full version, 156.0.8078.47, came only from the high-entropy client hints API (navigator.userAgentData.getHighEntropyValues(['fullVersionList'])).
  • Using the user agent for features. To find out whether a browser supports something, test the feature directly. Use the user agent for analytics, debugging and bot triage.

When you need more: User-Agent Client Hints

Chromium browsers (Chrome, Edge, Opera) send a short set of client hints with every HTTPS request. Our Chrome 156 sent these alongside its user agent:

Sec-Ch-Ua: "Not:A-Brand";v="8", "Chromium";v="156", "Google Chrome";v="156"
Sec-Ch-Ua-Mobile: ?0
Sec-Ch-Ua-Platform: "Linux"

For more detail, such as the platform version, model, architecture or full version list, your server sends an Accept-CH response header naming the hints it wants, and the browser includes them on later requests. Firefox and Safari don't support client hints, so always keep the user agent as a fallback. The HTTP headers lookup shows whether a site sends Accept-CH.

What to do next

Frequently asked questions

Why does every user agent start with Mozilla/5.0?

It's a historical compatibility token. Early websites served better pages to Netscape (Mozilla), so other browsers copied the token, and nobody can remove it now without breaking old sites. It carries no information.

Can I tell Windows 11 from Windows 10 by the user agent?

No. Both send Windows NT 10.0, as Microsoft documents. Chromium browsers expose Windows 11 through the Sec-CH-UA-Platform-Version client hint (13.0.0 or higher). Firefox has no equivalent.

Why does Chrome on my phone say Android 10 and K?

Since Chrome 110, Chrome on Android sends those fixed values to reduce fingerprinting. The real Android version and model are only available through client hints such as Sec-CH-UA-Platform-Version and Sec-CH-UA-Model.

Why does my iPhone show iOS 18 in the user agent?

Safari 26 freezes the iOS version at an 18.x value on purpose, and Apple's WebKit team says this is permanent. Use the Version/ token instead: Safari 26 means iOS 26.

How do I know if a Googlebot visit is real?

Run a reverse DNS lookup on the IP from your log, check that the name ends in googlebot.com, google.com or googleusercontent.com, then look up that name and confirm it returns the same IP. The user agent alone proves nothing.

Is the user agent parser free?

Yes. It's free and needs no account, and it sends only the string you paste to our server. Visitors get 5 parses a day, and a free account (no spam) removes that limit.

How to URL Encode a String (%20 vs + Explained)

1 November, 2026

URL encode any text in seconds with a free tool, learn when a space should be %20 or +, and avoid double encoding. Real tests in JS, Python ..

How to Minify CSS (and How Much It Really Saves)

31 October, 2026

Minify CSS in seconds with a free tool, see the real savings after gzip and Brotli, and avoid the mistakes that silently break styles. Real ..

How to Decode Base64 (Text, Images and JWTs) Free

30 October, 2026

Decode any Base64 string in seconds: real examples for text, images, JWTs and Basic Auth, plus why output turns to gibberish and how to fix ..