Free user agent parser
Paste any user agent string to see the browser, version, operating system, device type and rendering engine. Your own user agent is filled in already.
Showing a sample string until your browser's own is read.
| Browser | Chrome 128.0.0.0 |
|---|---|
| Rendering engine | Blink 128.0.0.0 |
| Operating system | Windows 10 |
| Device type | desktop |
| Device | Unknown |
| CPU architecture | amd64 |
| Bot or automation | No known bot token |
What a user agent string tells you
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36
- 1
Mozilla/5.0 - A compatibility token every major browser still sends. Servers in the 1990s only served advanced pages to Netscape, whose codename was Mozilla, so everyone else copied it.
- 2
(Windows NT 10.0; Win64; x64) - The platform. Windows NT 10.0 is Windows 10 or 11, Win64 and x64 say the browser and the processor are both 64-bit.
- 3
AppleWebKit/537.36 - The engine token. Chrome froze this number at 537.36 in 2013 when it forked WebKit into Blink, so the value no longer changes.
- 4
(KHTML, like Gecko) - A claim of compatibility with Firefox's Gecko engine, inherited from Konqueror's KHTML by way of Safari.
- 5
Chrome/128.0.0.0 - The real browser and its major version. Since Chrome 101 the minor, build and patch numbers are zeroed to reduce fingerprinting.
- 6
Safari/537.36 - A second compatibility token, kept so that sites which look for Safari also serve Chrome.
How to read a user agent string
- 1
Find the fixed tokens first
Mozilla/5.0, AppleWebKit/537.36 and (KHTML, like Gecko) appear in almost every string and carry no information on their own.
- 2
Read the parentheses for the platform
The first parenthesised group names the operating system and CPU: Windows NT 10.0, Macintosh; Intel Mac OS X 10_15_7, Linux; Android 14, or iPhone; CPU iPhone OS 17_5.
- 3
Take the last product token as the browser
Chrome/128, Edg/128, OPR/113 or Firefox/129 near the end is the real browser. Safari is the browser only when no other product token follows it.
Why user agent strings look so strange
Every major browser claims to be Mozilla, most claim to be Safari, and Chrome mentions KHTML, an engine it never used. The reason is thirty years of browsers copying each other so that servers would send them the good version of a page.
-
1993 to 1996: Mosaic and Mozilla
NCSA Mosaic sent NCSA_Mosaic/2.0. Netscape Navigator, built by Mosaic's authors and codenamed Mozilla for "Mosaic killer", sent Mozilla/1.0. Servers began sending frames only to strings containing Mozilla.
-
1996: Internet Explorer joins in
Internet Explorer 3 wanted those frames too, so Microsoft shipped Mozilla/2.0 (compatible; MSIE 3.0; Windows 95). Every browser since has started with Mozilla.
-
2000s: KHTML, like Gecko
Konqueror's KHTML engine was refused Gecko-only pages, so it added (KHTML, like Gecko). Apple built Safari on KHTML, kept the phrase and added AppleWebKit.
-
2008: Chrome claims Safari
Chrome used WebKit and needed the pages served to Safari, so it appended Chrome/x and kept Safari/x at the end. Edge and Opera later added Edg/x and OPR/x after Chrome/x.
-
2022 onward: reduction
Chrome now freezes the OS and minor version parts and moves the detail into Client Hints headers such as Sec-CH-UA-Platform, so the classic string keeps shrinking.
User agents and web scraping
-
Default strings are refused first
python-requests/2.32, curl/8.7, Go-http-client/1.1 and axios/1.7 name the library outright. Many WAF rules block them before any other check.
-
A realistic string looks like current Chrome
The sample above is what Chrome 128 on Windows sends. Keep the version current, because a Chrome 90 string in 2026 is its own signal.
-
The rest of the request has to agree
Accept-Language, header order, the Sec-CH-UA headers and the TLS handshake all have to match what that browser really sends.
When changing your user agent is not enough
-
Necessary but not sufficient. Anti-bot systems cross-check the user agent against the TLS fingerprint, JavaScript properties, header order and IP reputation.
-
A mismatch is a stronger signal than a fake. A user agent that does not match the rest of the browser is a clearer sign of automation than an obviously invented one.
-
Random rotation usually makes it worse. Rotating user agents at random, without matching everything else, tends to raise detection rather than lower it.
If you need the whole browser to be consistent rather than just the header, that is what MrScraper's Web Unblocker does.
How to parse user agents in code
from user_agents import parse
ua = parse("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36")
print(ua.browser.family, ua.browser.version_string)
print(ua.os.family, ua.os.version_string)
print(ua.is_mobile, ua.is_bot) import { UAParser } from 'ua-parser-js'
const { browser, engine, os, device } = UAParser(navigator.userAgent)
console.log(browser.name, browser.version)
console.log(engine.name, os.name, os.version, device.type ?? 'desktop') User agent parser FAQ
What is a user agent string?
A user agent string is a line of text a browser or HTTP client sends with every request, identifying its name, version, operating system and rendering engine. Chrome on Windows sends a string of about 110 characters that begins with Mozilla/5.0 and ends with Safari/537.36. Servers read the string to decide what content and layout to return.
How do I parse a user agent string?
A user agent string is parsed by matching its tokens against known patterns for browsers, engines, operating systems and devices. The MrScraper user agent parser runs the ua-parser-js library in the browser to do that matching and shows the result as a table. Developers can run the same library in JavaScript, or the user-agents package in Python.
What does a user agent string tell a website?
A user agent string tells a website the browser family and version, the operating system and its version, the rendering engine, and often the device type such as mobile or tablet. The string carries no name, email address or location. Modern browsers also send Client Hints headers that repeat the same facts in a structured form.
What is my user agent?
Your user agent is the string your browser sent when it loaded this page, and the parser above fills it into the box automatically. Chrome, Edge and Safari all start the string with Mozilla/5.0 for historical reasons. The exact value depends on the browser version and the operating system, and the value changes with every browser update.
Why do websites block certain user agents?
Websites block certain user agents because the string identifies the client as an automated tool rather than a browser. Default strings such as python-requests/2.32 or curl/8.7 are refused outright by many sites. A browser-like user agent passes that first check, although anti-bot systems then compare the string with the rest of the request.
What user agent should I use for web scraping?
A scraper should send a current, mainstream browser user agent, such as the latest stable Chrome on Windows 10, and keep it fixed for the length of a session. The string must match the other request headers, the TLS fingerprint and, in a real browser, the JavaScript environment. A user agent that claims Chrome while sending Python's TLS handshake is easy to detect.
What is the difference between a user agent and a browser fingerprint?
A user agent is a single header the client chooses to send, while a browser fingerprint is a set of measurements the website takes, such as installed fonts, canvas rendering, screen size, timezone and TLS handshake details. The user agent can be changed with one line of code, whereas the fingerprint comes from the whole browser and is far harder to fake consistently.
Does changing my user agent stop me getting blocked?
Changing the user agent alone rarely stops a block on a site with modern anti-bot protection, because the protection cross-checks the string against the TLS fingerprint, header order, JavaScript properties and IP reputation. A mismatch between the user agent and those signals is a stronger sign of automation than an honest tool name. Consistency across the whole browser is what passes.