Skip to content
Tools

User Agent Parser

Parse a browser User-Agent string and identify the browser, operating system, device, rendering engine and other available client information.

Line breaks and a leading User-Agent: are stripped. Nothing else is altered — the raw string is shown exactly as parsed.

Summary

You appear to be using Chrome 131 on Windows 10 or 11 from a desktop device.

This is a claim, not an identity. A User-Agent is whatever the client chose to send, and anything can send anything. Nothing above or below is verified, and none of it is a security control — for a real check on a crawler you need a reverse DNS lookup on the requesting IP, which no parser can do from the string alone.

Parsed fields

9 of 11 detected
Browser
Chrome
Browser version
131.0.0.0

Chrome freezes the last three parts at 0.0.0. The major version is real; the rest carries no information.

Operating system
Windows
OS version
10 or 11Likely

Windows 11 also reports NT 10.0, so the string cannot tell the two apart. Only Client Hints can.

Device type
Desktop

A desktop operating system with no mobile or tablet token.

Device brand
Not detected
Device model
Not detected

Desktop User-Agent strings do not carry a make or model, and laptops are indistinguishable from desktops.

Rendering engine
Blink

Blink has no separate version — Chromium's is shown.

Engine version
131.0.0.0
Architecture
x86-64
Bot / crawler
No

Nothing in the string claims to be a bot — which is not evidence that it is not one.

Raw User-Agent

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36

Example strings

Representative rather than current — browser versions move every few weeks. Each one is here for something specific it demonstrates.

Everything runs locally in your browser. Your User-Agent strings are not uploaded to our server, and this tool does not put them in a shareable link.

What is a User-Agent string?

The User-Agent is an HTTP request header. Its value is a line of text the client sends with every request to describe itself — the software making the request, its version, and usually something about the platform it is running on.

It is the oldest piece of client identification on the web and the least structured. There is no schema. Every vendor picked a format, then copied enough of everyone else’s format to avoid being served a degraded page, and the result is a string that is part description and part historical sediment.

The most important thing about it is what it is not: it is a self-description. The client says what it likes and nothing checks. Everything a parser tells you is a reading of that claim.

How does User-Agent detection work?

By matching product tokens — Chrome/131.0.0.0, Firefox/133.0, Edg/131.0.0.0 — and reading the version that follows the slash. The platform section in the first parentheses gives the operating system, and a handful of marker words give the device type.

The difficulty is entirely in the ordering.Almost every token belongs to more than one browser, because each new browser inherited the previous one’s string to stay compatible:

Four different browsers, all containing Chrome/
Chrome    …AppleWebKit/537.36 … Chrome/131.0.0.0 Safari/537.36Edge      …AppleWebKit/537.36 … Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0Opera     …AppleWebKit/537.36 … Chrome/125.0.0.0 Safari/537.36 OPR/111.0.0.0Samsung   …AppleWebKit/537.36 … SamsungBrowser/27.0 Chrome/125.0.0.0 … Test for Chrome/ first and three of these four disappear.

So a parser is an ordered list of signatures where the first match wins, and the order is the algorithm: most specific first, generic last. Edge, Opera, Samsung Internet, Vivaldi, Yandex and Chromium all before Chrome; Safari after all of them, because every string above also ends in a Safari/ token.

The same problem appears in platform detection. Android strings contain the word Linux, and ChromeOS strings contain X11 — so both have to be checked before any Linux rule, or every Android phone is reported as a Linux desktop.

How to read a User-Agent string

Take a standard Chrome-on-Windows string and split it at the boundaries:

Chrome on Windows, broken into its parts
Mozilla/5.0                      product token — means nothing(Windows NT 10.0; Win64; x64)    platform: OS, version, architectureAppleWebKit/537.36               engine token — a pre-2013 leftover(KHTML, like Gecko)              compatibility tokenChrome/131.0.0.0                 the actual browser and versionSafari/537.36                    compatibility token
Each token in a typical Chrome User-Agent string and what it actually means.
TokenPartWhat it means
Mozilla/5.0Product tokenNothing. A compatibility relic from Netscape that every browser now sends. It is not a claim about Firefox.
(Windows NT 10.0; Win64; x64)Platform tokenThe operating system, its version and the architecture. NT 10.0 is sent by both Windows 10 and Windows 11.
AppleWebKit/537.36Engine tokenA leftover from before Chromium forked Blink out of WebKit in 2013. Frozen at 537.36 ever since, and not a claim about WebKit.
(KHTML, like Gecko)Compatibility tokenWebKit's own inherited bluff — KHTML was the engine WebKit forked from, and “like Gecko” was aimed at sniffers checking for Firefox.
Chrome/131.0.0.0Browser tokenThe actual browser and version. The trailing 0.0.0 is frozen: only the major number carries information.
Safari/537.36Compatibility tokenKept so sites sniffing for Safari serve modern content. Real Safari is distinguished by a Version/ token, which Chromium does not send.

Three of those six tokens carry no information about the browser at all. They are there because each was once required by some site’s sniffing code, and removing one risks breaking whatever is still checking for it. That is why the strings only ever get longer.

It is worth being precise about the two that mislead most often. Mozilla/5.0 does not mean Firefox — it dates to Netscape and is on essentially every browser. AppleWebKit does not mean the browser uses WebKit — Chromium forked Blink out of WebKit in 2013 and kept the token, frozen at 537.36, ever since. And a trailing Safari/ token does not mean Safari; real Safari is identified by Version/, which Chromium does not send.

Common User-Agent patterns

The token to match for each major browser, and what else matches it. The right column is the reason a real parser is an ordered list rather than a set of independent checks.

The identifying token for each major browser, and what else it matches.
BrowserTokenWatch out for
ChromeChrome/<version>Also present in Edge, Opera, Samsung Internet, Vivaldi and Yandex.
FirefoxFirefox/<version>Also matched by SeaMonkey and Waterfox.
SafariVersion/<version> … Safari/<version>The Version/ token is what separates it from Chromium.
EdgeEdg/<version>EdgA/ on Android, EdgiOS/ on iOS, Edge/ for the pre-Chromium one.
OperaOPR/<version>OPiOS/ on iOS. Old Presto-era Opera used Opera/ instead.
Samsung InternetSamsungBrowser/<version>Carries a Chrome/ token too.
Chrome on iOSCriOS/<version>Renders with WebKit, not Blink.
Internet ExplorerMSIE <version> or Trident/… rv:<version>IE 11 dropped MSIE entirely.

One case deserves singling out because it is counter-intuitive. Chrome on iPhone does not use Blink.Apple’s App Store rules require browsers on iOS to use the system WebKit, so CriOS/is Chrome’s interface over WebKit. Firefox on iOS (FxiOS/) is the same — Firefox’s interface over WebKit, not Gecko. A parser that maps the browser name to an engine gets both wrong, which is why this one treats the engine as a separate question with its own answer.

What information can a User-Agent reveal?

Less than it used to, and less than most people expect. Reliably:

  • Browser and major version — dependable for mainstream browsers, given correct ordering.
  • Operating system family — Windows, macOS, Android, iOS, Linux, ChromeOS are all clearly marked.
  • Device type — desktop, mobile or tablet, from explicit tokens.
  • Rendering engine — reliable once derived from the browser rather than from the WebKit token.

Frequently unavailable, and worth knowing why:

  • Exact OS version. Windows 10 and 11 both send Windows NT 10.0 — Microsoft never bumped it — so no parser can tell them apart. macOS has reported 10_15_7 since Big Sur whatever the real version is.
  • Device model. Android often carries one. Apple never does: every iPhone sends the same token regardless of model. Desktops carry nothing, and a laptop is indistinguishable from a tower.
  • Architecture. Windows and desktop Linux usually say. Macs say Intel even when they are Apple Silicon, because Apple kept the token for compatibility — so a Mac string cannot distinguish the two. iOS and Android say nothing at all.
  • Full browser version. Chrome freezes the last three parts at 0.0.0, so Chrome/131.0.0.0 means 131 and nothing more.

This tool marks every field Detected, Likely or Not detectedand leaves the undetected ones visible rather than hiding them. A missing row could be read as a value of zero or as a field that did not apply; a row that says “Not detected” says the thing that actually happened.

Can User-Agent strings be spoofed?

Completely, trivially, and by design. It is a request header the client sets, and nothing anywhere in HTTP verifies it.

Sending any User-Agent you like
curl -A "Mozilla/5.0 (compatible; Googlebot/2.1)" https://example.com Browsers offer it in developer tools. Extensions rewrite it.Every HTTP library sets it with one argument.

The consequences are worth stating plainly:

  • Do not use it for authentication or authorisation. Any control that a single header defeats is not a control.
  • Do not treat bot detection as definitive. A string claiming to be Googlebot may be anything; a string claiming to be Chrome may be a scraper.
  • Do not make security decisions on it. Rate limiting, access rules and abuse prevention all need something the client cannot simply assert.

What it is genuinely good for: analytics, support diagnostics, choosing which build to offer on a download page, and deciding whether to show a browser-upgrade prompt. Cases where being wrong is an inconvenience rather than a breach.

User-Agent Client Hints

Client Hints are the structured replacement for the string. Instead of one line containing everything, the browser sends separate headers — Sec-CH-UA, Sec-CH-UA-Platform, Sec-CH-UA-Mobile and others — each carrying one piece of information in a parseable form.

Three things follow from how they work:

  • Information in the legacy string is being reduced. Chrome froze its version at 0.0.0 from Chrome 101 and replaced the platform detail from Chrome 110 — Android strings now report a fixed Android 10; K whatever the device is.
  • Hints are requested, not automatic. Only a small default set is sent; anything more requires the server to ask via Accept-CH, and the browser to agree. They are also not implemented across every browser.
  • A parser cannot recover what was never sent. If the model is a placeholder in the string, no amount of parsing produces the real one. That is the point of the reduction, not a gap to be worked around.

So a User-Agent parser is increasingly a tool for reading what a client claimed — which is exactly what it is useful for in a log file, and exactly what it was never a good basis for a decision on.

User-Agent vs browser detection

These solve different problems and are not substitutes.

Parsing a User-Agent reads a string the client sent about itself. It is the right tool when you want to know what a client claimed — server logs, analytics, a support ticket where someone says the page looks wrong.

Feature detection asks the runtime whether the thing you need exists: if ('structuredClone' in window)rather than “is this Chrome 98 or later”. It is the right tool for deciding what your code can do, because it tests the actual capability instead of inferring it from a name and a number that may have been reduced, frozen or forged.

The practical rule: never branch your code on a parsed User-Agent when a feature check would answer the same question. Version-gating breaks on every browser you did not think of, and on every browser that changes what it reports — which, as the reduction shows, they do.

Detecting bots and crawlers

Well-behaved crawlers identify themselves, because being identifiable is the point — it is how they get governed by the rules in robots.txt rather than blocked outright. So the named ones are straightforward to spot:

Two forms of the same crawler
Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 MobileSafari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)

The second is Googlebot’s smartphone crawler, and both readings of it are true: it is Googlebot, and it really is running Chromium. This tool reports the bot alongside the browser rather than instead of it, because a bot verdict that discards the engine information loses half the answer.

Beyond the named crawlers, generic markers — bot, crawler, spider — catch the rest. That is weaker evidence and is labelled as such. The tool also shows which substring matched, so a heuristic verdict can be checked rather than taken on trust. If the same check is going into a log pipeline, a regex tester is where to get the pattern right before it runs on real traffic.

None of it is verification.A negative means only that the string did not claim to be a bot, which is precisely what a scraper trying not to be spotted would arrange. And a positive is a claim anyone can make. Google’s own guidance for confirming Googlebot is a reverse DNS lookup on the requesting IP followed by a forward lookup back — a server-side check no parser can perform from the string alone.

Frequently asked questions

What is a User-Agent string?

The value of the User-Agent HTTP request header — a line of text a client sends with every request to describe itself. Browsers use it to name their product, version and platform, and it is the oldest and least structured piece of client identification on the web.

What does a User-Agent contain?

Usually a product token and version, a platform section in parentheses, and a chain of compatibility tokens inherited from browsers that no longer exist. A typical Chrome string carries Mozilla/5.0, an operating system section, AppleWebKit/537.36, KHTML like Gecko, the real Chrome version, and a trailing Safari token. Only two of those describe the browser you are actually using.

How do I parse a User-Agent string?

Match product tokens in a specific order, most specific first, and take the first that fits. Order is the whole algorithm: an Edge string contains Chrome/, an Opera string contains Chrome/, and a Chrome string contains Safari/. Test for Chrome before Edge and Edge disappears. This parser runs its signatures as an ordered list for exactly that reason.

How can I identify the browser from a User-Agent?

Look for the distinguishing token rather than the familiar one. Edge is Edg/, Opera is OPR/, Samsung Internet is SamsungBrowser/, Vivaldi is Vivaldi/ and Yandex is YaBrowser/ — each of which also carries Chrome/ and would be misread as Chrome by a naive check. Chrome is what is left once all of those have been ruled out.

How can I identify the operating system from a User-Agent?

From the platform section in the first set of parentheses: Windows NT for Windows, Macintosh for macOS, Android, iPhone or iPad for Apple mobile devices, CrOS for ChromeOS, X11 for desktop Linux. Order matters here too — Android strings contain the word Linux, and ChromeOS strings contain X11, so both must be checked before any Linux rule.

Why does Windows 11 show as Windows 10?

Because Windows 11 sends Windows NT 10.0, exactly as Windows 10 does. Microsoft never incremented the token, so no parser can tell the two apart from the string alone — anything claiming to is guessing. This tool reports “10 or 11” and labels it Likely rather than Detected. The real version is only available through User-Agent Client Hints.

Why does macOS always report 10.15.7?

Safari froze the reported macOS version at 10.15.7 from Big Sur onwards, as a fingerprinting-reduction measure, and Chrome on macOS does the same. The number is real but it is a floor, not a reading: it means 10.15.7 or anything later. This tool shows it as “10.15.7 or later” rather than pretending to a precision the string does not have.

Can a User-Agent identify a device?

The type, usually. The specific device, rarely. Android strings often carry a model code such as Pixel 8 or SM-S928B, which is genuinely useful. Desktop strings carry nothing — a laptop and a tower are indistinguishable. And Apple exposes nothing beyond “iPhone” or “iPad”.

Can a User-Agent identify a phone model?

On Android, sometimes — the model code is in the platform section, and the brand can often be inferred from its prefix. On iOS, never: every iPhone sends the same iPhone token regardless of the model, so any tool that names an iPhone 15 from a User-Agent has invented it. Chrome's reduced User-Agent has also replaced the Android model with a placeholder, described below.

Why does the device model show as “K”?

That is Chrome's reduced User-Agent. Since Chrome 110, Android strings report a fixed “Android 10; K” whatever the real version and device are. K is not a phone — it is the placeholder Chrome sends instead of one. This tool detects the pattern, reports no model, and says why rather than leaving a blank.

What is the difference between the User-Agent and User-Agent Client Hints?

The User-Agent is one unstructured string sent with every request whether it is wanted or not. Client Hints are separate, structured headers — Sec-CH-UA, Sec-CH-UA-Platform, Sec-CH-UA-Mobile and others — that a server requests and a browser may choose to send. Hints give better data in a parseable form, but they are opt-in, request-time, and not implemented everywhere. A parser cannot recover from the string what the string did not contain.

Can User-Agent strings be spoofed?

Completely and trivially. It is a header the client sets. Browsers offer it in developer tools, extensions rewrite it, every HTTP library sets it with one argument, and curl does it with a flag. There is no mechanism anywhere in HTTP that verifies it.

Can User-Agent detection be trusted for security?

No. Never use it for authentication, authorisation, access control or anything a determined party benefits from bypassing, because bypassing it is a single header. It is fine for analytics, for choosing which download to offer, and for deciding whether to show a browser-upgrade prompt — cases where being wrong is an inconvenience rather than a breach.

How can I detect Googlebot?

The string is the first step and not the last. Googlebot identifies itself with a Googlebot/2.1 token, which this tool detects and shows the matching evidence for. But anyone can send that token, so Google's own guidance is to verify with a reverse DNS lookup on the requesting IP and a forward lookup back — a server-side check no parser can perform from the string.

What is a bot User-Agent?

Any string a non-browser client sends. Well-behaved crawlers name themselves and include a URL explaining what they are, because they want to be identifiable and to be governed by robots.txt. Beyond the named ones, generic markers like bot, crawler and spider catch the rest — weaker evidence, and this tool labels it as such rather than reporting it with the same confidence.

What does Mozilla/5.0 mean?

Nothing, now. In 1994 Netscape identified itself as Mozilla; servers began requiring the token before serving modern pages; Internet Explorer copied it to avoid being downgraded; everything since has copied it too. Today essentially every browser sends Mozilla/5.0 and it means only “I am a web browser”. It is not a claim about Firefox.

What does AppleWebKit mean in a Chrome User-Agent?

It is a leftover from before Chromium forked. Chrome was built on WebKit until 2013, when Blink split off; the AppleWebKit/537.36 token stayed for compatibility and has been frozen at that version ever since. Reading it literally makes every Chrome user a WebKit user, which is why this tool derives the engine from the browser rather than from that token.

What does Safari mean in a Chrome User-Agent?

The same kind of leftover, one layer further on. Chrome kept a trailing Safari/537.36 so sites sniffing for Safari would serve it modern content. The distinguishing feature of real Safari is the Version/ token, which Safari sends and Chromium does not — that is what this parser tests.

How do I detect Chrome from a User-Agent?

Match Chrome/ and its version, but only after ruling out Edg/, OPR/, SamsungBrowser/, Vivaldi/, YaBrowser/, Chromium/ and HeadlessChrome/. All of them carry Chrome/ as well. On iOS, Chrome is CriOS/ instead, and it is not running Blink — see below.

How do I detect Firefox from a User-Agent?

Match Firefox/ and read the version after it; the Gecko engine version is in the rv: token. Firefox is the easiest of the major browsers to detect because it never adopted the WebKit or Safari compatibility tokens — a Firefox string contains no AppleWebKit at all. Watch for SeaMonkey and Waterfox, which also carry a Firefox token.

How do I detect Safari from a User-Agent?

Require both a Version/ token and a Safari/ token, and require the absence of Chrome, Chromium, CriOS, FxiOS, EdgiOS and OPiOS. Testing for Safari/ alone matches nearly every Chromium browser ever released, which is the most common single mistake in browser sniffing.

How do I detect Edge from a User-Agent?

Match Edg/ for the Chromium-based Edge, EdgA/ on Android and EdgiOS/ on iOS. The legacy pre-Chromium Edge used Edge/ with a slash and ran EdgeHTML — a different browser and a different engine, so it is worth reporting separately. All of them must be checked before Chrome.

How do I detect mobile devices from a User-Agent?

Look for the Mobile token, and know the Android convention: Google's guidance is that phones include Mobile and tablets omit it, so on Android the absence of a token is what identifies a tablet. iPhone and iPad have their own tokens. This is reliable for the broad type and is not a substitute for a CSS media query if what you actually care about is screen size.

Does Chrome on iPhone use Blink?

No, and this catches a lot of parsers out. Apple's App Store rules require browsers on iOS to use the system WebKit, so Chrome on iPhone is Chrome's interface over WebKit rather than Blink. Firefox on iOS is the same — Firefox's interface over WebKit, not Gecko. This tool reports the engine that actually renders the page.

Can User-Agent strings reveal the browser version?

The major version, reliably. The full version, less so than it used to be: Chrome has frozen the minor, build and patch numbers at 0.0.0 since Chrome 101, so a string reading Chrome/131.0.0.0 tells you 131 and nothing more. The exact build is available through Client Hints, if the server asks and the browser agrees.

Why do browsers have such long User-Agent strings?

Because every token in them was added to stop some site from serving a degraded page, and removing one risks breaking sites that are still checking for it thirty years later. The string is an archaeological record of compatibility bluffs, and it grows because nothing in it can safely be taken away.

What is the difference between User-Agent parsing and browser detection?

Parsing reads a string the client sent about itself. Browser detection in the modern sense means feature detection — asking whether the API you need actually exists, rather than inferring it from a name and a version. Feature detection is correct for deciding what your code can do; parsing is for analytics, logging and support, where you want to know what a client claimed rather than what it can do.

How accurate is User-Agent parsing?

Accurate about what the string says, which is a different question from what the client is. For mainstream browsers the browser, version family, OS family and device type are reliable. OS version, device model and architecture are frequently unavailable, and both Chrome's reduction and Safari's version freeze are removing more over time. This tool marks every field Detected, Likely or Not detected rather than filling gaps with plausible guesses.

Why is the architecture not detected on a Mac?

Because every Mac reports Intel, including Apple Silicon ones — Apple kept the token so existing sniffers would not break. A Mac string cannot distinguish an M-series chip from an Intel one, so reporting x86-64 from it would be repeating a compatibility fiction as a fact. This tool reports nothing there and explains why.

Is this User Agent Parser free?

Yes. Every feature is free, with no account, no sign-up and no limit on how many strings you parse.

Does this tool upload my User-Agent?

No. Parsing a User-Agent is string matching, and all of it happens in your browser — there is no backend involved and no request made. Nothing is stored, and unlike the other tools here this one deliberately does not offer a shareable link, because a User-Agent identifies the person who sent it much more closely than a formatted document does.

Popular tools

↑ ↓NavigateOpenEscClose