What is my user agent?
Your browser's User-Agent string and Client Hints, exactly as our server received them and as scripts read them, and whether they all tell the same story.
Reading your browser…
The current Chrome user agents (Chrome 157)
Every Chrome 157 sends one of these, whatever the exact build, OS version or device: the rest is frozen. The Chrome user agent page has every platform, the Client Hints that go with them and a generator for other versions.
| Windows | Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/157.0.0.0 Safari/537.36 |
|---|---|
| macOS | Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/157.0.0.0 Safari/537.36 |
| Linux | Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/157.0.0.0 Safari/537.36 |
| Android (phone) | Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/157.0.0.0 Mobile Safari/537.36 |
With it, on every request: Sec-CH-UA: "Not-A.Brand";v="99", "Google Chrome";v="157", "Chromium";v="157".
How this page reads your user agent
Three places, compared with each other. The request: our server reports back the User-Agent and Sec-CH-UA headers your browser sent it, because page scripts cannot read those; the page asks for the detailed Client Hints with an Accept-CH header, so they are included too. The page: navigator.userAgent, navigator.userAgentData and its high-entropy values. A worker: the same values read in a background thread, which overrides applied to the page often miss.
A real browser derives all of them from one version and one platform, so they agree. Each check above compares two of them and fails only on a contradiction; none of them looks your browser up in a list. The browser fingerprint test runs the same idea across a few hundred signals.
What is a user agent?
A user agent is the software that acts for you on the web, usually your browser, and the user agent string is the line of text it uses to introduce itself. It goes to every server in the User-Agent header and is readable by every page as navigator.userAgent. Sites use it to pick a layout or a download, to collect statistics, and to decide whether a visitor is a browser or a script.
It looks like a jumble because each part is history. Here is what the current Chrome on Windows sends, token by token:
| Mozilla/5.0 | A compatibility token every browser sends. In the 1990s sites served better pages to Netscape (code-named Mozilla), so other browsers claimed to be Mozilla too, and the token stayed. |
|---|---|
| (Windows NT 10.0; Win64; x64) | The platform: here 64-bit Windows. Chrome freezes this part, so Windows 11 also says Windows NT 10.0. |
| AppleWebKit/537.36 | The rendering engine family. Chrome's Blink grew out of WebKit and still names it, with a version that no longer changes. |
| (KHTML, like Gecko) | More compatibility history: KHTML is the engine WebKit came from, Gecko is Firefox's. |
| Chrome/157.0.0.0 | The browser and its major version. The minor, build and patch numbers are always zero since Chrome reduced its user agent. |
| Safari/537.36 | Added so that sites checking for Safari treat Chrome like a WebKit browser. |
Firefox sends a shorter, more honest string (Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:…) Gecko/20100101 Firefox/…), Safari its own, and HTTP libraries a one-word name and version. The Chrome user agent page lists every Chrome platform, and the random user agent generator produces current strings for Chrome, Edge and Firefox.
The User-Agent header and Client Hints
The User-Agent request header carries the string to the server with every request: the page, its images, its scripts and every API call. Because it said too much (the exact version, the operating system version, sometimes the device model), Chrome reduced it: the version is 157.0.0.0, Windows always reads Windows NT 10.0, every Mac Intel Mac OS X 10_15_7 and every Android phone Android 10; K.
The detail moved to User-Agent Client Hints. Chromium browsers send three of them with every request: Sec-CH-UA (the brands and major version), Sec-CH-UA-Mobile and Sec-CH-UA-Platform. A site that needs more asks with an Accept-CH response header and then also receives the full version, the platform version, the CPU architecture and the device model. Scripts read the same values with navigator.userAgentData.getHighEntropyValues(). Firefox and Safari do not send Client Hints. More in what User-Agent Client Hints are.
How to change your user agent
In the browser. In Chrome or Edge, open DevTools (F12), open the menu, choose More tools, then Network conditions, untick “Use browser default” and pick a device or type a string. It applies to that tab while DevTools is open. Extensions do the same permanently. In Firefox, general.useragent.override in about:config sets one for the whole browser.
In code, set the header on an HTTP client, or the user agent of a browser context:
curl -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/157.0.0.0 Safari/537.36" https://example.comChanging the string changes only the string. A real browser still reports its own version and platform in the Client Hints, in workers and through its engine's features, and an HTTP library still has its own TLS handshake (see the JA4 fingerprint checker). The checks at the top of this page compare exactly those, so run them after you change anything.
User agents of crawlers and HTTP clients
Not every visitor is a browser. Crawlers and HTTP libraries send their own user agents. Version numbers below are examples; each one sends its own version.
| 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 Desktop | Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Googlebot/2.1; +http://www.google.com/bot.html) Chrome/W.X.Y.Z Safari/537.36 |
| curl | curl/8.5.0 |
| Python Requests | python-requests/2.32.3 |
| Python urllib | Python-urllib/3.12 |
| axios (Node.js) | axios/1.7.7 |
| Go net/http | Go-http-client/1.1 (Go-http-client/2.0 over HTTP/2) |
| Scrapy | Scrapy/2.11.2 (+https://scrapy.org) |
A user agent is self-reported, so anyone can send Googlebot's. Google's own advice for checking a visit: run a reverse DNS lookup on the IP address, confirm the name ends in googlebot.com, google.com or googleusercontent.com, then look that name up again and make sure it resolves to the same IP. For many requests, compare the IPs with the ranges Google publishes as JSON instead. How sites tell good bots from bad ones is in what bot detection is.
FAQ
What is a user agent?
A short text a browser sends with every request, in the User-Agent header, and exposes to scripts as navigator.userAgent. It names the browser, its version and the operating system, so a site can adapt what it serves. It is also one of the first things bot detection reads.
Why does my user agent say Chrome/157.0.0.0 instead of my exact version?
Chrome reduced its User-Agent string: only the major version is real, and the minor, build and patch numbers are always zero. The full version is still available, but only as a Client Hint (Sec-CH-UA-Full-Version-List) that a site has to ask for.
Why does it say Windows NT 10.0 on Windows 11?
Chrome freezes the operating system part of the string: every Windows version reports Windows NT 10.0; Win64; x64, every Mac reports Intel Mac OS X 10_15_7 (Apple silicon too), and every Android phone Android 10; K. The real OS version is in the Sec-CH-UA-Platform-Version Client Hint; on Windows 11 it is 13.0.0 or higher.
What are User-Agent Client Hints?
Headers that carry what the User-Agent string used to: Sec-CH-UA (the brands and major version), Sec-CH-UA-Mobile and Sec-CH-UA-Platform go with every request; the detailed ones (full version, OS version, CPU architecture, device model) only when a site asks with an Accept-CH header. Scripts read the same values through navigator.userAgentData. Chromium browsers send them; Firefox and Safari do not.
What is "Not A(Brand" in my Sec-CH-UA header?
A deliberately fake brand, called GREASE, that Chrome adds so that servers do not hard-code the exact list. Its name, its version (8, 24 or 99) and the order of the whole list are computed from the major version, so every Chrome of one version sends the same list, and the next version a different one. The Chrome user agent page lists them per version and links the Chromium source.
Can websites see my real user agent if I change it?
Usually, yes. A user-agent switcher or an automation setting typically changes the User-Agent header and navigator.userAgent, but not the Client Hints, not the value inside a worker, not navigator.platform, and not the dozens of engine features that differ between versions. The checks above compare exactly those, and a site can do the same.
What is the User-Agent header?
The HTTP request header that carries the user agent string: User-Agent: Mozilla/5.0 (…). Browsers send it with every request, including images and scripts, and HTTP libraries send their own short value (for example curl/8.5.0 or python-requests/2.32.3) unless you set one.
What is Googlebot's user agent?
Googlebot Smartphone sends 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), where W.X.Y.Z is a current Chrome version. Because anyone can send that string, verify a visit with a reverse DNS lookup instead; the steps are in the crawler section above.
How do I change my user agent?
In Chrome, open DevTools, then Network conditions, untick “Use browser default” and pick or type one. In code, set the User-Agent header (curl -A, a headers argument in Requests or axios) or the browser context's user agent in Playwright, Puppeteer or Selenium. The examples are above. A real browser keeps reporting its true version elsewhere, so the change is easy to spot.
Is anything stored?
No. The page asks our server to report the headers it received and returns them to you; nothing is written anywhere. Everything else runs in your browser.
Related free tools
Chrome user agent strings
The latest Chrome user agents and Sec-CH-UA headers, and a generator for any version.
Random user agent generator
Current Chrome, Edge and Firefox user agents, each with its Client Hints.
What browser am I using?
Your browser and version, and whether it is up to date.
JA4 fingerprint checker
Your TLS and HTTP/2 fingerprints next to Chrome's and common HTTP clients'.
This page read your user agent and client hints.
In Clearcote the header, the client hints and JavaScript all report the same browser.
Pro build: 240 patches · 35,915 lines added · 345 Chromium files
What Clearcote sets in the engine
- Canvas
- WebGL
- WebGPU
- Audio
- Fonts
- Screen and window
- WebRTC
- TLS
- Client hints
- Input timing
- Voices and codecs