User Agent Parser
Parse a User-Agent into browser, engine, OS and device — and see which rule matched.
Paste one from a server log, a support ticket, or your own browser.
- Browser
- Edg/126.0.2592.87
- Engine
- Chrome/126.0.0.0
- OS
- Windows NT 10.0
- Device
- no mobile or tablet token
bot table → browser table (narrowest token first) → engine derived → OS → device
A User-Agent is a header the client chooses, and every browser can change it. Read the result as what the request CLAIMS to be. Fine for logs, analytics and bug reports; never an identity check, and never the way to decide which code to run — feature-detect instead.
How it works
Paste a User-Agent string into the field, or press "Use my browser’s" to load the one this browser is sending right now.
An ordered table of token rules is tested against the string. The first rule that matches wins, and the rules run most-specific first, because nearly every browser prints the tokens of the browsers it was compatible with.
Four answers come out: browser and version, rendering engine and version, operating system and version, and device type. A bot rule table runs first and reports separately.
The matched token is shown beside each answer, so you can check the reasoning rather than trust it. Copy the one-line summary if you need it in a ticket.
Why the rule order is the whole algorithm
A User-Agent is a compatibility ledger, not an identifier. Edge prints Chrome and Safari; Chrome prints Safari; Amazon Silk prints "like Chrome/"; Headless Chrome prints the substring "Chrome/" inside its own token. So a parser that tests for Chrome first calls all four of them Chrome. The table is ordered from the narrowest token to the widest, and the first match wins — which means adding a rule in the wrong position silently rewrites the answer for every browser below it.
Edg/ → OPR/ → SamsungBrowser/ → Silk/ → HeadlessChrome/ → CriOS/ → Chromium/ → Chrome/ → Firefox/ → Version/+Safari/ → Safari/
Use cases
Reading a User-Agent out of a server log
Access logs store the raw string. Pasting one line here turns "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.2592.87" into Edge 126 on Windows, which is the fact the log was being read for.
Reproducing a bug from a support ticket
A ticket that says "it breaks on my phone" plus a pasted UA gives you the engine and the OS version, which is what decides whether the bug is a WebKit issue, a Blink issue, or an old OS with no support for the API being called.
Telling a crawler from a visitor
Googlebot sends a full Chrome UA with "(compatible; Googlebot/2.1; +http://www.google.com/bot.html)" appended, so a browser-only rule reports it as Chrome on Android. The bot table runs first and names it. Bingbot, Applebot, GPTBot, ClaudeBot, PerplexityBot, AhrefsBot and the common HTTP clients are covered too.
In-app browsers: Facebook, Instagram, WeChat, LINE
A tap from a social app opens a WebView, not the default browser, and those WebViews append their own token (FBAV/, Instagram, MicroMessenger/, Line/) to an otherwise ordinary Chrome or Safari string. That is often the explanation for a conversion rate that only drops on one traffic source.
Android tablet versus Android phone
Android does not carry a tablet token. Google’s convention is that phones include "Mobile" in the UA and tablets omit it, so the tablet rule here is Android with no Mobile token. Manufacturers do not always follow it, which is why the matched rule is shown rather than just the verdict.
Why an iPad can report as a Mac
iPadOS in its default desktop-class mode sends "Macintosh; Intel Mac OS X 10_15_7" with no iPad token anywhere in the string. No parser can recover the difference from the UA alone — it needs a touch-points check in JavaScript, or the Sec-CH-UA-Platform client hint.
What UA reduction froze
Chrome now reports the Windows version as NT 10.0 whatever it is running on, zeroes the Chrome minor version to 0.0.0, and reports a fixed Android model. Safari has reported macOS as 10_15_7 since Big Sur. Those fields are still parsed here, but they are frozen values and not measurements.
Client Hints as the replacement
Sec-CH-UA, Sec-CH-UA-Platform and Sec-CH-UA-Mobile are sent as separate headers with structured values, and the high-entropy ones (full version, model, architecture) are requested explicitly via Accept-CH. That is where accurate values now live; the UA string is the legacy fallback.
Spotting automation in traffic
Headless Chrome, curl, Wget, python-requests, Go-http-client, okhttp, axios and PostmanRuntime all identify themselves plainly, and none of them is a person. They are flagged separately from crawlers because they usually mean a script or a monitor rather than a search engine.
Questions
- Can a User-Agent be trusted?
- No. It is a request header the client chooses, and every browser has a setting or an extension that changes it. Treat the answer as what the request claims to be. It is fine for logs, analytics and bug reports; it is not an identity check and it is not a security control.
- Why does Edge say it is Chrome and Safari?
- History. Every browser added the previous market leader’s tokens so that servers sniffing for it would serve the good page — which is why almost every string still starts with Mozilla/5.0. Edge prints Chrome and Safari and then Edg/ at the end, so the only correct way to read it is narrowest token first.
- Why is my browser reported as Chrome or Safari?
- Some browsers deliberately do not identify themselves. Brave has shipped no Brave token since 2016 and reports as Chrome; Tor Browser reports a fixed generic Firefox string; several privacy modes do the same. There is nothing in the string to detect, so this tool does not guess.
- Why does Windows always come back as 10 or 11, and macOS as 10.15.7?
- Both are frozen. Windows 11 reports NT 10.0 with no separate token, so the two cannot be told apart from the UA. Safari has reported Mac OS X 10_15_7 since Big Sur regardless of the real version. Sec-CH-UA-Platform-Version carries the real number if the server asks for it.
- Can it tell an iPad from a Mac?
- Only when the iPad sends an iPad token. In desktop-class mode iPadOS sends a Macintosh string that is byte-for-byte a Mac’s, and no parser can undo that. The usual workaround is checking navigator.maxTouchPoints in the page, which this tool does not do because it parses a string you paste rather than probing your device.
- Should I use this to decide which code to run?
- No. Feature-detect instead — test for the API you are about to call. UA sniffing breaks on the next release, on every fork, and on anything spoofing. Parsing a UA is for reading logs after the fact, which is a different job from branching in production code.
- Is anything sent to a server?
- No. The rule tables are a few dozen regular expressions and all of them run in the page. The string is not uploaded, logged, or stored between visits, and pressing the button to load your own User-Agent reads it locally and does nothing else with it.
More tools
One of 18 free tools here. They come out of building utility apps for macOS, iOS and the browser — all of it by one person.
See the apps