User-Agent Parser
Decode any user-agent string — or 100,000 log lines — into browser, OS and device fields with bots called out, entirely on this device.
Browser, OS and device fields appear here when you paste a user-agent string.
Press ? for shortcuts
Do it offline:$ npx ua-parser-js@1 "Mozilla/5.0 (Linux; Android 15; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.7204.63 Mobile Safari/537.36"
How to use it
- Paste a user-agent string, or press Use my user agent — this browser's own string, read locally, never transmitted.
- Read the fields: browser and version, layout engine, OS, device, CPU — plus a classification badge and caveat notes.
- Paste several lines or drop a log file for batch mode: one row per line, ended by a browser-share summary.
- Copy the breakdown as JSON, or download it — .json for one parse, .csv for a batch.
Paste one user-agent string — or a hundred thousand log lines — and read what it claims: browser and version, layout engine, OS, device type and model, CPU architecture. Known crawlers and HTTP tools are labeled from a curated pattern pack, reduced-UA placeholders are called out instead of guessed, and batch runs end in a browser-share summary. Every string is parsed on this device.
How it works
A User-Agent header is a whitespace-separated run of product/version tokens with parenthesized comments — the RFC 9110 §10.1.5 grammar. The page shows that raw token breakdown first, then fills the fields by pattern-matching: a curated crawler-and-tool pack runs before the ua-parser-js rule set, and post-2024 fixtures patch known gaps. Every field group carries its source — token, fixture override, or none — and a string with no recognized tokens is reported as unknown, never dressed up as a browser.
Modern Chrome sends a reduced user-agent: minor digits frozen to .0.0.0, the Android model replaced by K, Windows 10 and 11 sharing one token. The detail moved to User-Agent Client Hints (navigator.userAgentData); in browsers that support them, inspecting your own user agent here lists the low-entropy hint values too.
Examples
Mozilla/5.0 (Linux; Android 15; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.7204.63 Mobile Safari/537.36classification browser
browser Chrome 138.0.7204.63
layout engine Blink 138.0.7204.63
OS Android 15
device mobile · Google Pixel 8
CPU —A full pre-reduction string: the real minor version and the Pixel 8 model appear only because this build still sends them — no caveat notes fire.
curl/8.5.0classification tool
tool curl — HTTP tool
browser —
layout engine —
OS —
device —
CPU —
note Labeled curl from its user-agent pattern — user-agent strings are trivially spoofed; this string alone proves nothing.Generic parsers return empty objects for curl; the label comes from this page's pattern pack, and the note is candid about what a match proves.
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36
Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Mobile Safari/537.36
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Safari/605.1.15
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Safari/605.1.15
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4.1 Safari/605.1.15
Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
66.249.66.1 - - [04/Aug/2026:07:21:33 +0000] "GET /robots.txt HTTP/1.1" 200 2326 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" 1 Chrome 138 Windows 10 browser
2 Chrome 138 Mac OS 10.15.7 browser
3 Chrome 137 Windows 10 browser
4 Chrome 138 Android 10 browser
5 Chrome 138 Linux browser
6 Chrome 136 Windows 10 browser
7 Chrome 137 Mac OS 10.15.7 browser
8 Chrome 138 Windows 10 browser
9 Safari 17 Mac OS 10.15.7 browser
10 Safari 16 Mac OS 10.15.7 browser
11 Safari 17 Mac OS 10.15.7 browser
12 Googlebot — bot
13 Googlebot — bot · extracted
Chrome 62%, Safari 23%, bots 15%Line 13 is a raw nginx log entry: the user-agent was read from its last quoted field, and the row says so. Shares are rounded to whole percents.
Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)classification bot
bot Googlebot — search crawler, operated by Google
browser —
layout engine —
OS —
device —
CPU —
note Labeled Googlebot from its user-agent pattern — a real Googlebot verifies via reverse DNS; this string alone proves nothing.The label is a pattern match, so the note under it is the point: anyone can send this string, and only reverse DNS separates Google's crawler from an impostor.
Every example on this page is executed against the same engine that powers the tool, on every build.
Gotchas worth knowing
Franken-strings claim two operating systems
A stitched-together string can carry Windows NT and iPhone tokens at once. Each field is still reported from its own token, and a contradiction warning names both claims — useful when hunting spoofed traffic.
Past 4,096 characters, the head is analyzed
Oversized strings are not refused: the first 4,096 characters are parsed and a notice states the original length and the cut. Real user agents sit far below this line.
Ancient user agents still resolve
MSIE 6.0 comes back as IE 6.0 on Windows XP; a 2010 BlackBerry token resolves to its 9700 handset with an empty browser row — partial strings yield partial tables.
Android 10; K is a placeholder, not a phone
Reduced Chrome on Android reports model K and OS version 10 regardless of hardware. The row keeps the placeholder, with a note — inventing a model name would be a lie.
Windows NT 10.0 stopped meaning Windows 10
Windows 11 sends the same frozen NT 10.0 token, so the OS row reads Windows 10 for both — that is all the string proves. Telling them apart needs Client Hints.
A hundred thousand lines is the ceiling
Batches cap at 100,000 non-empty lines and 32 MiB; over-cap input is refused with the exact limit printed. Big runs move to a background worker with progress and cancel.
Common errors
No browser/OS tokens recognized — this may not be a user-agent string.- Garbage in, honesty out: the parse still succeeds, the classification reads unknown, and the raw token breakdown shows what the text actually contains.
This user-agent string is 5,000 characters long — only the first 4,096 characters were analyzed.- Both numbers are printed so the cut is auditable. Fields, tokens and classification all come from the analyzed head.
Contradictory OS tokens: this string contains both `Windows NT 10.0` and `iPhone` — one device cannot be both, so each field is reported from its own token.- The warning names both claims instead of quietly picking a winner. Such contradictions usually mean a spoofed or hand-edited client — exactly what you want surfaced.
Input is larger than the 32 MiB limit for this tool. For bigger logs use the CLI per line: npx ua-parser-js@1 "Mozilla/5.0 (…)"- The whole input is declined, not partly parsed — a truncated batch would report wrong line numbers and shares. The pinned CLI parses any one line locally.
Input has more than 100,000 lines — the limit for this tool. For bigger logs use the CLI per line: npx ua-parser-js@1 "Mozilla/5.0 (…)"- The line cap keeps a batch inside one worker run with an accurate summary. Blank lines never count against it, and each unique string is parsed once.
FAQ
What is a user-agent string?
The User-Agent request header a client sends to name itself: product/version tokens with parenthesized comments, defined in RFC 9110. It is self-declared — good for log triage and compatibility stats, never proof of identity.
Why does the version show as 138.0.0.0?
User-agent reduction: Chrome froze the minor digits to zeros, so only the major number is real. This page marks such values instead of presenting fake precision; the full version now travels in Client Hints when a site asks.
How do I verify a real Googlebot?
Reverse-DNS the requesting IP, confirm the name ends in googlebot.com or google.com, then resolve it forward to the same IP — Google's published procedure. A matching string only tells you what the client claimed.
Keyboard shortcuts
- ⌘/Ctrl + Enter
- Re-run the parse, single or batch.
- ⌘/Ctrl + C
- With nothing selected, copy the parsed JSON; a selection still copies itself.
- ⌘/Ctrl + Shift + C
- Force-copy the parsed JSON, selection or not.
- ⌘/Ctrl + S
- Download — .json for a single parse, .csv for a batch.
- t
- Next theme; idle while a field has focus.
- ? or ⌘/Ctrl + /
- Open the help card naming these seven bindings.
- Esc
- Close the topmost dialog; focus returns to its opener.