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 always0.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
- 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. - 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.
- Check the result against the frozen values below. The parser marks
Windows NT 10.0,Android 10,macOS 10.15.7andiOS 18.6as "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 it | Key tokens | Parser result |
|---|---|---|
| Chrome 143, Windows | Windows NT 10.0; Win64; x64, Chrome/143.0.0.0 | Chrome 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, Mobile | Chrome 143.0.0.0 · Android 10 (frozen by the browser) · Mobile phone |
| Chrome 143, Mac | Macintosh; Intel Mac OS X 10_15_7 | Chrome 143.0.0.0 · macOS 10.15.7 (frozen by the browser) · Desktop |
| Safari 26, iPhone | iPhone OS 18_6, Version/26.0 | Safari 26.0 · iOS 18.6 (frozen by the browser) · Mobile phone |
| Googlebot Smartphone | compatible; Googlebot/2.1 | Googlebot 2.1 · Not reported (bot or tool) · Bot or tool |
| Headless Chrome 156 (our test machine) | HeadlessChrome/156.0.0.0 | Chrome 156.0.0.0 (Automated / headless browser) · Linux · Automated / headless browser |
| Edge 143, Windows | Edg/143.0.0.0 | Edge 143.0.0.0 · Windows 10 or 11 (NT 10.0) (frozen by the browser) · Desktop |
| Chrome, Android tablet (reduced) | Android 10; K, no Mobile | Chrome 93.0.0.0 · Android 10 (frozen by the browser) · Tablet |
| Firefox 47, Windows 7 | Windows NT 6.1; rv:47.0 | Firefox 47.0 · Windows 7 (NT 6.1) · Desktop |
| curl 8.14.1 | curl/8.14.1 | Curl 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 containsSafari/. Test for the most specific token first (Edg/,OPR/), thenChrome/, and only call it Safari when there's noChrome/. - Trusting a bot name. Anyone can type
Googlebotinto 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 turned66.249.66.1intocrawl-66-249-66-1.googlebot.com, and the DNS lookup resolved that name back to66.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 forHeadlessChromeyourself, 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
- Paste the strings you're curious about into the user agent parser. It's free and needs no account; 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.
- Found a bot you don't trust? Verify it with the reverse IP lookup and DNS lookup, and see who owns the address with the IP lookup. Our guide on finding out who hosts a website explains what the network owner tells you.
- Worried that real crawlers see your pages differently? Our guide on checking if a page is noindex shows how to inspect what Googlebot gets, and how to check DNS records covers the lookups above in more depth.
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.