User-Agent Parser

Detect browser, engine, OS, and device from any user-agent string.

Parsed here — the string is never sent

Parse a user-agent string online

Examples

About this user-agent parser

Paste a user-agent string — from a server log, an analytics report, or a bug ticket — and see what it identifies: browser and version, rendering engine, operating system, and device type. A hand-written rule table checks signatures in the order that actually works: bots first (crawlers embed real browser tokens), Edge and Opera before Chrome, and Chrome before Safari, because every Chromium fork keeps both "Chrome" and "Safari" in its string.

It’s built for support engineers triaging "works on my machine" tickets, developers reading access logs, and anyone curious what their own browser sends — there’s a "use mine" button for that. Parsing happens entirely in this page’s JavaScript: no lookup API, no database call, nothing leaves your device, so it’s safe to paste user agents straight from production logs.

How to read a user-agent string: 9 real examples and their tells

Every row below is a real, current user-agent shape taken from a primary source — MDN's User-Agent reference, Google's crawler docs, and the curl and requests defaults. The trick to reading any string is spotting one token, the tell, that the client cannot drop without breaking something. Browser versions float, so read 1XX as 'whatever ships this month.'

What it isRepresentative user-agent stringThe tell
Desktop Chrome (Windows)Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/1XX.0.0.0 Safari/537.36Chrome/ present, Safari/537.36 at the end, and no Edg/ or OPR/. Every Chromium browser keeps the Safari token, so the absence of any fork token is the signal.
Safari on iPhoneMozilla/5.0 (iPhone; CPU iPhone OS 18_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Mobile/15E148 Safari/604.1Version/… just before Safari/604.1. Real Safari carries a Version/ token; Chrome on iOS says CriOS instead and Firefox says FxiOS.
Firefox (desktop)Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:1XX.0) Gecko/20100101 Firefox/1XX.0Gecko/20100101 and Firefox/, with rv: in the platform and no AppleWebKit. It is the only major engine that never claims to be WebKit.
Edge (Chromium)Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/1XX.0.0.0 Safari/537.36 Edg/1XX.0.0.0Edg/ at the very end. Note it still says both Chrome/ and Safari/, so match Edg/ before Chrome/ or you will mislabel it.
Chrome on AndroidMozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/1XX.0.0.0 Mobile Safari/537.36Mobile Safari plus the frozen 'Android 10; K'. UA reduction replaced the real OS version and phone model with fixed placeholders — K is not a device.
Googlebot (smartphone)Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/W.X.Y.Z Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)Googlebot/2.1 and the +http://www.google.com/bot.html URL. It embeds a full Chrome token, so bot rules have to run before browser rules.
curlcurl/8.x.xThe whole string is 'curl/' plus a version — no Mozilla/5.0, no parentheses. A dead giveaway of a command-line or scripted client.
python-requestspython-requests/2.x.xLiterally 'python-requests/'. It is the default of Python's requests library; in logs it almost always means a script, not a person.
facebookexternalhitfacebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)facebookexternalhit/. Meta's link-preview crawler, fired when a URL is shared on Facebook, Instagram or Messenger.

Two of these — desktop Chrome and Android Chrome — are already 'reduced': Chrome zeroes the minor version and freezes the platform, so Chrome/1XX.0.0.0 and 'Android 10; K' carry no real detail. That is deliberate. The precise browser, OS and device are moving into User-Agent Client Hints (the Sec-CH-UA-* headers a server has to request), which is why the string is best read as a rough label, not a fingerprint.

FAQ

Why do all user-agent strings start with Mozilla/5.0?

Historical compatibility. Early websites served better pages to Netscape ("Mozilla"), so every later browser claimed to be it — and then to be each other. That’s why detection order matters: Edge and Opera include "Chrome" in their strings, and everything Chromium-based includes "Safari".

Why does the OS show "Windows 10 / 11"?

Windows 11 still reports "Windows NT 10.0" in the user agent, so the two are indistinguishable from the string alone. Only User-Agent Client Hints (Sec-CH-UA-Platform-Version) can tell them apart, and those are sent as separate headers, not in the UA string.

How accurate is user-agent parsing?

Best-effort, and getting less precise by design. Modern browsers freeze or reduce their strings — Safari has reported macOS 10.15.7 for years, and Chrome trims OS details — while Client Hints replace them. Strings can also be spoofed freely, so treat the result as a strong hint, not proof.

Related tools