What Is My User Agent?

See the user agent string your browser is sending right now, and what it says about your browser, operating system, device and rendering engine. You can also paste any user agent string to decode it, which happens entirely in your own browser.

Your user agent

Reading your user agent...

Read from your browser with JavaScript. The header your browser actually sends can differ if an extension, proxy or developer-tools override rewrites it.

Parsed breakdown

BrowserReading...
Operating systemReading...
Device typeReading...
Rendering engineReading...
CPU architectureReading...

Parsed in your browser from the string above. Nothing is sent to a server, and every field here is only as honest as the string itself, which any client is free to change.

Parse any user agent string

Decoded locally in your browser. The string you paste is never sent to our servers, and the parser works on the text alone, so it also reads strings copied out of a server log.

Your user agent is the line of text your browser sends with every request. It names your browser and version, your operating system and the engine that renders pages — the User-Agent header defined by RFC 9110. The box above shows yours, split into five fields; anything you paste below is decoded in your browser, and every site you visit reads it.

What Is a User Agent and What Does This Tool Do?

What does this tool do?

It reads the user agent string your browser exposes to JavaScript and breaks it into five fields: browser and version, operating system, device type, rendering engine and CPU architecture. The second half of the page does the same for any string you paste, so you can decode a line from a server log, a bug report or a screenshot without installing anything.

Why is this useful?

Raw user agent strings are deliberately messy. Every browser still starts with Mozilla/5.0 for compatibility with servers written in the 1990s, Chrome pretends to be Safari, Edge pretends to be Chrome, and version numbers are scattered across several tokens. Reading one at a glance is hard even for developers, so a parsed view is faster and less error-prone than picking the string apart by hand. It also matters when you need to know what a visitor really is: support tickets, layout bugs and suspicious log entries all start with this line.

Who uses this tool?

• Front-end developers: to confirm which engine is rendering a page before blaming a CSS bug on the browser.

• QA and support teams: to get an exact browser and OS from a user in one copy and paste, instead of asking a series of questions.

• Site owners reading server logs: to tell a real visitor from a crawler, a scanner or a script that forgot to set a header.

• Anyone testing a scraper or an API client: to check what header their own code is sending.

• Privacy-minded readers: to see how much a single header gives away before any cookie is set.

How Do You Use This Tool?

1. Open the page. Your current user agent appears in the first box automatically, with no button to press.

2. Read the parsed breakdown underneath it for browser, operating system, device, engine and CPU.

3. Press Copy to put the exact string on your clipboard for a bug report or support ticket.

4. To decode a different string, paste it into the box and press Parse, or the Enter key. Your own browser is not involved in that result.

5. Reuse a previous check from the recent checks list, which is stored in your browser only and cleared with the Clear button.

Example

A desktop Chrome string on Windows looks like this:

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

Parsed, that is Google Chrome 128, engine Blink, Windows 10 or 11, desktop, x86 64-bit. Two details are worth noticing: the version ends in .0.0.0 because Chromium now freezes the minor version, and Windows NT 10.0 is reported by both Windows 10 and Windows 11, so no parser can tell those two apart from this string.

The four parts of a modern user agent string

A user agent string is built from four parts in order: the legacy Mozilla compatibility token, the platform and operating system, the rendering engine, and the browser name with its build version. Mozilla/5.0 1. Legacy compatibility token. Every browser still sends it. (Windows NT 10.0; Win64; x64) 2. Platform, operating system and CPU, in brackets. AppleWebKit/537.36 (KHTML, like Gecko) 3. Rendering engine, plus tokens kept only for compatibility. Chrome/128.0.0.0 Safari/537.36 4. Browser name and build version. This is the part that matters.

Read left to right, top to bottom: the string is these four parts joined together, which is why the browser you are actually using appears last.

How Do You Read the Results?

The breakdown has five fields, all derived from the string itself.

Browser

The browser name and major version. Order matters when parsing this: an Edge string contains Chrome and Safari as well as Edg, and Chrome contains Safari, so the most specific token has to win. Some browsers cannot be identified at all, because they deliberately send an unmodified Chrome string.

Operating system

The platform, and its version where the string gives one. Three limits are built in, and all three are values the browser freezes rather than gaps in the parsing: Windows NT 10.0 covers both Windows 10 and Windows 11, browsers on macOS have reported Mac OS X 10_15_7 since 2020 no matter which version is installed, and Chrome on Android has sent a fixed Android 10 on a device model called K since 2023, so a phone running Android 15 sends the same token as one running Android 10. In each case this row says "or later" rather than quoting the number as a fact.

Device type

Desktop, mobile, tablet, or bot. This is a heuristic, not a field, and no string ever says desktop outright. The usual signal is the Mobi token, so an Android device without it reads as a tablet, and an iPad set to request desktop sites identifies itself as a Mac. Desktop is reported only when the string names a desktop platform such as Windows NT, Macintosh or X11; a string that names no platform at all leaves this row unstated rather than defaulting to desktop.

Rendering engine

The engine that lays out the page: Blink for Chrome, Edge, Opera, Brave and most Android browsers, Gecko for Firefox, WebKit for Safari. On iOS and iPadOS every browser is WebKit, including Chrome and Firefox, so a CriOS string is Chrome running on WebKit rather than Blink. Apple required that outright for years, and since 2024 European rules have obliged it to allow other engines, but none has shipped in a released browser, so this row still reports WebKit for any iPhone or iPad string.

CPU architecture

Whether the string mentions 64-bit x86, ARM or 32-bit x86. Often it says nothing useful: Safari reports Intel Mac OS X on Apple silicon Macs too, and iPhones do not state an architecture at all. When the string is silent, this tool says so instead of guessing.

Not stated in the string

Any row can read this. It means the string genuinely does not carry that piece of information, not that the parser failed or that something went wrong. A user agent is a short self-reported line, and real ones routinely omit the architecture, the platform version, or any platform at all. Where that happens the row says so, because an honest blank is more useful than a plausible guess.

What a user agent cannot tell you

• It is self-reported, so it can be false: any browser extension, script or command-line tool can send whatever string it likes. Bots that want to be seen announce themselves, and bots that do not, copy a real browser string. Never treat this header as authentication.

• It is deliberately getting less detailed: Chromium reduced the string, freezing the minor version and the platform version, and moved the detail to User-Agent Client Hints, which a site has to request. Firefox and Safari have trimmed theirs for similar anti-fingerprinting reasons.

• It is not your identity: the string is the same for millions of people on the same browser and platform. On its own it identifies a configuration, not a person, although combined with other signals it contributes to a fingerprint.

• It says nothing about your network: your address, provider and location come from the connection, not this header. For those, use the IP Address Lookup tool.

How the Parse Is Worked Out

Every field in the breakdown is derived in your browser from the string alone. No request is made, no database is consulted, and pasted strings are never uploaded. What follows is the order the parser works in, and the specific decisions it makes when a string is ambiguous, because those decisions are what determine whether the row in front of you says Chrome 128 or Not identified.

1. Bots are checked before browsers

The very first pass scans for a fixed list of about twenty known crawler and command-line tokens by plain substring match: Googlebot, bingbot, Applebot, DuckDuckBot, YandexBot, Baiduspider, GPTBot, OAI-SearchBot, ClaudeBot, PerplexityBot, facebookexternalhit, Twitterbot, AhrefsBot, SemrushBot, curl, Wget, python-requests, axios, PostmanRuntime and HeadlessChrome. The first one that appears wins, and the browser detection is skipped entirely.

That order is not cosmetic. Googlebot sends a complete Chrome signature, so a browser pass run first would report Google Chrome 128 for a request that came from a crawler, which is exactly backwards when you are reading a server log. The reverse mistake is guarded too: if no named token matched but the string still carries a real browser signature — a Chrome/, Firefox/, Safari/ or one of the mobile equivalents — the parser does not fall through to Unnamed bot or crawler on the strength of the word "bot" appearing in some comment. Only when there is no real browser signature and the string mentions bot, crawler or spider anywhere does that label apply, and a crawler that sends no distinctive token of its own cannot be told apart from a browser by this header at all.

2. Browser tokens are tried from most specific to least

When the string is not a bot, browser detection runs an ordered list of token patterns, and the first one that matches produces the label. The order is fixed because most of these tokens can appear in the same string — an Edge string carries Chrome/ and Safari/ alongside its own Edg/, and a Chrome string carries Safari/ too. Testing for Safari/ first would label every Chrome user as a Safari user:

  1. Edge — Edg/, EdgiOS/ or EdgA/
  2. Legacy Edge — Edge/
  3. Opera — OPR/ or Opera/
  4. Samsung Internet — SamsungBrowser/
  5. Yandex Browser — YaBrowser/
  6. Vivaldi — Vivaldi/
  7. Chrome on iOS — CriOS/
  8. Firefox on iOS — FxiOS/
  9. Firefox — Firefox/
  10. Chrome — Chrome/
  11. Safari — Safari/ alongside Version/
  12. Internet Explorer — MSIE or the Trident/ token
  13. Anything else that carries AppleWebKitA WebKit browser, vendor not stated

Only the major version is reported, taken by splitting the matched version at its first dot, because the minor digits are the part Chromium now freezes and reporting 128.0.0.0 as a whole would suggest a precision the string no longer carries. A browser that reaches the end of the list with none of those tokens matched is reported as Not identified, not guessed at from the platform.

3. The operating system reads around three frozen tokens

Operating system detection walks its own ordered list, but the important part is what it refuses to state as fact. Three tokens in the wild are frozen by the browsers that send them, and each one is reported with an "or later" rather than the literal number:

Token in the string What the row says Why
Windows NT 10.0 Windows 10 or 11 Windows 11 reports the same NT version as Windows 10, so the two are indistinguishable from this string alone.
Mac OS X 10_15_7 macOS 10.15.7 or later Every browser on macOS has reported this since 2020, whatever the installed version. It is not Safari alone; Chrome reports the same.
Android 10 Android 10 or later Chrome on Android has sent a fixed "Android 10" on a device model called K since 2023, so a phone on Android 15 reports the same token as one on Android 10.

Everything else is read literally when the string gives a version. Windows uses a lookup table so that 6.3, 6.2, 6.1, 6.0 and 5.1 resolve to the names people actually use — 8.1, 8, 7, Vista and XP respectively — rather than being printed as NT numbers. iOS and iPadOS pull their version out of the OS X_Y token with underscores turned back into dots, so 18_0 reads as iOS 18.0.

One ordering detail matters: the iPadOS check runs before the Mac check. An iPad set to request desktop sites sends a string containing Macintosh, and a Mac check run first would classify every such iPad as a Mac, which is precisely the false positive the FAQ entry warns about.

4. Device type is a heuristic, not a field

No user agent string ever says "desktop", so device type is inferred in a fixed order, and each step can only accept or fall through to the next:

  1. A bot match from step one ends the matter: Bot or automated client.
  2. TV and set-top tokens — SmartTV, AppleTV, HbbTV and similar — read as TV or set-top box.
  3. iPad, Tablet, PlayBook or Silk reads as Tablet.
  4. The Mobi token, or an iPhone, iPod, Windows Phone or Opera Mini token, reads as Mobile.
  5. Android without Mobi reads as Tablet, since that is what Android sends when a device wants the full site.
  6. A named desktop platform — Windows NT, Macintosh, CrOS, X11, Linux or one of the BSD names — reads as Desktop or laptop.
  7. Anything left over is Not stated in the string, because guessing desktop for a string that names no platform is how a bare curl/8.4.0 ends up being reported as a desktop browser.

5. The engine has one hard override

Rendering engine detection looks for the classic engine tokens in order — Trident/ or MSIE first, then legacy Edge/, then anything that looks like Blink (Chrome, Chromium, Edg/, OPR/, SamsungBrowser), then Firefox/ or a Gecko version for Gecko, then a bare AppleWebKit for WebKit, then Presto. Each of those returns a fixed engine name.

There is one exception ahead of the whole list. Any string containing iPhone, iPad or iPod is reported as WebKit and nothing else, before any other engine token is even considered. That is not a shortcut around a gap; it is a fact about the platform. Every browser on iOS and iPadOS is WebKit under Apple's rules, so a CriOS string is Chrome on WebKit rather than Chrome on Blink, and the row reflects what is actually rendering rather than the vendor token.

6. CPU architecture is the weakest field, and admits it

CPU architecture is tested in this order: arm64 or aarch64 for ARM 64-bit, then the 64-bit x86 tokens (Win64, x86_64, amd64, WOW64, ; x64), then armv7 and arm for 32-bit ARM, then the 32-bit x86 tokens (i686, i386, WOW32). If none of them matched, the field is left as Not stated in the string rather than defaulted to any of the four, and two specific cases are called out instead of being passed off as facts: Safari reports Intel Mac OS X on Apple silicon Macs as well as on Intel ones, and iPhones do not state an architecture in their user agent at all.

Two different blanks, deliberately kept apart

When a row reads blank, the reason is always one of exactly two things, and the wording distinguishes them because they mean different things. Not stated in the string is what a field says when the string is present and simply does not carry that information: an iPhone that omits its CPU, a Safari string that reports Intel on an M-series Mac. No user agent string was reported is what every row says when the browser exposed nothing at all — the fetch returned an empty string, usually because of a privacy extension or a locked-down environment — and the second message is about a silence where the first would be about a stated absence.

One further source is kept separate on purpose. Where your browser supports User-Agent Client Hints, the note under the string reports what navigator.userAgentData exposes, but none of the five parsed rows read from that source. It is a different signal with different rules, deliberately reduced by the browser vendors, and mixing it into the string parse would make the two indistinguishable in the output.

When Would You Use This Tool?

Reproducing a layout bug

A screenshot rarely says which engine drew it. The parsed engine and version tell you whether to test in Blink, Gecko or WebKit before you start changing CSS.

Filling in a support ticket

One copied line replaces a back-and-forth about which browser, which version and which operating system the person is on.

Reading server logs

Paste a line from your access log to see whether a request came from a real browser, a search engine crawler, an AI crawler such as GPTBot or ClaudeBot, or a bare script with no browser tokens at all.

Testing your own client

If you write a scraper, a monitor or an API client, paste the header it sends to confirm it identifies itself the way you intended rather than defaulting to a library name.

Checking a device-detection rule

Before you ship a rule that keys off the Mobi token or an OS name, decode a few real strings and see which of them your rule would misclassify.

Seeing what you give away

The string is sent before any cookie exists and before you interact with a page, which makes it a good starting point for understanding passive fingerprinting.

How Does a Parser Identify the Browser?

Each browser family marks itself with a token that the others do not use, which is what a parser looks for. The patterns below follow MDN's browser detection reference, which also explains why detection by user agent should be a last resort behind feature detection.

Identifying tokens by browser family. The token to trust is the most specific one present.
Browser Engine Token to look for
Google Chrome Blink, or WebKit on iOS Chrome/ with Safari/537.36 and no other vendor token, or CriOS/ on iPhone and iPad
Microsoft Edge Blink, or WebKit on iOS Edg/ at the end of an otherwise Chrome-shaped string, or EdgiOS/ and EdgA/ on mobile
Opera Blink OPR/
Samsung Internet Blink SamsungBrowser/
Mozilla Firefox Gecko, or WebKit on iOS Firefox/, or FxiOS/ on iPhone and iPad
Apple Safari WebKit Version/ with Safari/ and no Chrome/

How Does a User Agent Differ From IP and Cookies?

These three are often confused, and they answer different questions. The user agent describes the software: browser, engine, platform. Your IP address describes the connection: which network you are on and roughly where it is registered, which is what an IP lookup reads, and what a VPN check examines. A cookie is storage a site sets on your device to recognize a return visit.

Only the cookie needs consent in most jurisdictions, because the other two are sent automatically as part of making the request at all. That is also why changing your user agent does not make you anonymous: your address still arrives with every request, and vice versa. If you want to reduce what a site can infer, both have to be handled, and neither is handled by this tool. It only shows you what is already being sent.

About the data

Everything on this page is produced in your browser. Your own string comes from navigator.userAgent, and pasted strings are parsed by the same JavaScript without being uploaded. Where your browser supports Client Hints, the note under the string also reports what navigator.userAgentData exposes, which is a separate source from the string and is not used by the five parsed rows.

Recent checks live in your browser's local storage and are removed by the Clear button. The parser knows the browser tokens in the table above, the common platform tokens, and around twenty named crawlers and command-line clients including Googlebot, bingbot, GPTBot, ClaudeBot, PerplexityBot, curl and Wget. Anything it does not recognize is reported as not identified rather than guessed at, because a wrong label is worse than an honest blank. A named crawler token wins over the browser tokens beside it: Googlebot and bingbot both send a complete Chrome signature, and naming the crawler is the answer that helps when you are reading a log. A crawler that sends no token of its own cannot be told apart from a real browser by this header at all, and no parser can fix that.

What Other Tools Work With This One?

Frequently Asked Questions

What is my user agent?

It is the line of text shown in the first box on this page, which your browser attaches to every request it makes. It names your browser and version, the rendering engine, and your operating system and CPU type. Every browser sends one, and the same string goes to every site you visit until you update your browser.

Can I change or hide my user agent?

Yes. Browser developer tools can override it for testing, and extensions can rotate it on every request. It rarely helps privacy though: an unusual string makes you more distinctive rather than less, and sites can also break when they receive a string that does not match the features your browser actually supports.

Is it safe to share my user agent string?

Generally yes, and support teams ask for it routinely. It contains no account details and no address, only software versions. The one thing worth knowing is that an old version in that string tells a reader which known browser vulnerabilities you have not patched, so keeping the browser current matters more than hiding the line.

Why does my Chrome user agent mention Mozilla and Safari?

For backward compatibility. Old servers checked for Mozilla before serving modern pages, so every browser kept the token, and Chrome kept Safari/537.36 because it started from the same WebKit code and did not want to be locked out of sites that tested for Safari. The tokens survive as historical baggage, which is exactly why the last vendor token in the string is the one to read.

Why does my iPad say Macintosh?

Because iPadOS requests desktop versions of sites by default, and it does that by sending a Mac user agent. It is not a fault in the parser: from the string alone an iPad in that mode is indistinguishable from a Mac. Turning on Request Mobile Website for a site brings the iPad token back.

Can a website tell whether I am a bot or a real browser?

Not from this header alone, because it is self-reported. Well-behaved crawlers identify themselves honestly and can be verified by a reverse lookup of the address they connect from. Anything trying to hide copies a normal browser string, so sites rely on behavior, rate limits and address reputation instead.

Do you store the strings I paste?

No. Parsing happens in your browser, and the pasted text is not sent anywhere. The recent checks list is saved in your own browser's local storage and the Clear button deletes it. Like any website, our server does log the user agent your browser sends when you load this page, which the privacy policy covers.