List of User Agents for Scraping
The 15 strings below are a current list of user agents for scraping: Chrome 156 on Windows, macOS, Linux and Android; Edge 156 on Windows and macOS; Firefox 158 on Windows, macOS, Linux and Android; Safari 27 on macOS and iPhone; plus Chrome and Samsung Internet strings seen on phones. They are below as tables and as one copy-paste Python list. For longer lists that update on their own, use Microlink's user-agents.json (100 browser strings, weekly), UserAgents.me (four lists of 20, weekly, JSON and TSV), the useragents.io database or the npm user-agents package (a new release every day); filter any downloaded list by version, because Microlink's file still held 25 strings older than Chrome 140 on 2026-10-27. Send one string per session with the headers that browser really sends. The IP matters as much as the string: ProxyField residential proxies give you 412M+ residential IPs from $1.95/GB; start with the Easy Trial: 1 GB for $2.95.
- residential IPs
- 412M+
- from, traffic never expires
- $1.95/GB
- Easy Trial
- 1 GB for $2.95
On this page 9 sections
Desktop user agents (October 2026)
Versions: Chrome 156 stable (156.0.8078.47 in Chrome for Testing), Edge 156 (Microsoft Edge release notes), Firefox 158.0.1 (Mozilla product details) and Safari 27 (Safari release notes; Version/27.0 strings appear in Microlink's list). Formats follow MDN's User-Agent reference.
| Browser and OS | User agent string |
|---|---|
| Chrome 156, Windows | Mozilla/5.0 ( |
| Chrome 156, macOS | Mozilla/5.0 ( |
| Chrome 156, Linux | Mozilla/5.0 ( |
| Edge 156, Windows | Mozilla/5.0 ( |
| Edge 156, macOS | Mozilla/5.0 ( |
| Firefox 158, Windows | Mozilla/5.0 ( |
| Firefox 158, macOS | Mozilla/5.0 ( |
| Firefox 158, Linux | Mozilla/5.0 ( |
| Safari 27, macOS | Mozilla/5.0 ( |
Three things look odd and are correct:
Windows NT 10.0on Windows 11. Browsers don't put Windows 11 in the string; it stays10.0.Intel Mac OS X 10_15_7on every Mac, including Apple silicon and new macOS versions. Chrome and Safari froze it; Firefox freezes it at10.15.Chrome/156.0.0.0. Since user-agent reduction, Chromium browsers send only the major version; the full version goes into client hints (Chromium: user-agent reduction).
Because of that last point, a Chrome string alone isn't a complete identity: real Chrome also sends Sec-CH-UA, Sec-CH-UA-Mobile and Sec-CH-UA-Platform. Which headers to send with each string, and how to set them in each tool, is in HTTP headers for web scraping.
Mobile user agents
| Browser and device | User agent string |
|---|---|
| Chrome 156, Android phone | Mozilla/5.0 ( |
| Chrome 156, Android tablet | Mozilla/5.0 ( |
| Firefox 158, Android | Mozilla/5.0 ( |
| Samsung Internet 30, Android | Mozilla/5.0 ( |
| Safari 27, iPhone | Mozilla/5.0 ( |
| Chrome 155, iPhone | Mozilla/5.0 ( |
| Safari, iPad | Usually the macOS Safari string above: iPadOS asks for desktop sites by default |
Four tokens here look wrong and are not:
Android 10; K. Reduced Chrome on Android sends that fixed value instead of the real Android version and device model; a tablet dropsMobile. Samsung Internet does the same, with its own token and an older Chromium base (Chrome/143).iPhone OS 18_7with Safari 27. Safari no longer tracks the iOS version in this token: MDN's Safari 26 example shows18_6, and the Safari 27 strings in Microlink's list show18_7.CriOS/155.0.8059.37. Chrome on iPhone runs on WebKit, addsCriOSwith a full version and reports the real iOS version (26_6_2). The string in the table is the newest one in Microlink's list on 2026-10-27.- Firefox on Android reports the real Android version and uses
Gecko/<version>instead of the desktopGecko/20100101.
Send a mobile string only with a mobile-sized viewport, touch support and, ideally, a mobile IP; a phone user agent from a desktop-sized browser on a data-center IP is a contradiction. Mobile proxies give you IPs on 5G, 4G and LTE carrier networks.
The list as code
The same 15 strings as one Python list. In JavaScript, the same brackets are a valid array:
USER_AGENTS = {
"desktop": [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36 Edg/156.0.0.0",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36 Edg/156.0.0.0",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:158.0) Gecko/20100101 Firefox/158.0",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:158.0) Gecko/20100101 Firefox/158.0",
"Mozilla/5.0 (X11; Linux x86_64; rv:158.0) Gecko/20100101 Firefox/158.0",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/27.0 Safari/605.1.15",
],
"mobile": [
"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Mobile Safari/537.36",
"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36",
"Mozilla/5.0 (Android 15; Mobile; rv:158.0) Gecko/158.0 Firefox/158.0",
"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/30.0 Chrome/143.0.0.0 Mobile Safari/537.36",
"Mozilla/5.0 (iPhone; CPU iPhone OS 18_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/27.0 Mobile/15E148 Safari/604.1",
"Mozilla/5.0 (iPhone; CPU iPhone OS 26_6_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/155.0.8059.37 Mobile/15E148 Safari/604.1",
],
}Where to get longer lists
Four maintained sources.
| Source | What you get | Updated | Format | Watch for |
|---|---|---|---|---|
| Microlink user agents | 100 browser strings (Windows, macOS, Linux, ChromeOS, Android, iPhone), plus separate crawler and AI-agent lists | Weekly (the file we read was dated 2026-10-26) | curl -L https://: a JSON object with user, crawler and ai arrays | 25 of the 100 browser strings carried a Chrome version below 140, as old as Chrome 99 |
| UserAgents.me | Four "most common" lists of 20: desktop, mobile, tablet and bots, with OS, browser and device | Weekly (data for 2026-10-18 to 2026-10-25 on our visit) | Table on the page, JSON and TSV downloads, an API | Only 20 strings per list |
| useragents.io | A browsable database with a parser (browser, OS, device) and a random generator | Daily, per the site | Web pages | Built for lookups, not a single download |
npm user-agents | A JavaScript library that generates user agents weighted by how often they are seen, with filters such as deviceCategory | A new release every day (2.1.224 on 2026-10-25, 2.1.225 on 2026-10-26) | Node.js package, BSD-2-Clause | JavaScript only; it generates, it doesn't list |
To check the string your own browser sends, open https://httpbin.org/user-agent or MDN's reference above. Whatever source you use, run the filter in Keep the list current before the strings go into a scraper.
Default user agents of HTTP clients
These are what tools send when you don't set a user agent. Sites block several of them by name, so replace them in production:
| Client | Default user agent | Source |
|---|---|---|
| curl | curl/<version>, for example curl/8.23.1 | curl man page |
| wget | Wget/<version> | GNU Wget manual |
| Python requests | python-requests/<version> | requests source |
| Scrapy | Scrapy/<version> (+https:// | Scrapy settings |
| Go net/http | Go-http-client/1.1 | Go source |
Node.js fetch | node | undici source |
| Axios (Node.js) | axios/<version> | Axios source |
| Postman | PostmanRuntime/<version> | Postman's auto-generated header |
| Headless Chrome (Puppeteer, Playwright, Selenium) | The Chrome string with HeadlessChrome/<version> in place of Chrome/<version> | Chrome headless mode |
curl's -A "" removes the header entirely, which some servers refuse.
Crawler user agents, and why not to copy them
Search engine crawlers announce themselves, for example Googlebot's classic string Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) (listed on MDN) and Bing's Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm). Don't send them from a scraper. Sites can verify a real Googlebot with a reverse DNS lookup of the IP, as Google documents (verifying Googlebot), so a fake one from any other IP is easy to catch, and pretending to be a search engine is a misrepresentation many sites' terms forbid. If you run your own crawler and want to be identified, use an honest string with a contact URL, such as MyCrawler/1.0 (+https://example.com/bot).
How to use this list
- Use current versions only. Chrome, Edge and Firefox update themselves, so a string several versions old stands out.
- Keep one user agent per session. Tie it to the cookies and the sticky IP of that session, and don't change it mid-session.
- Send the full header set of the browser you claim, including client hints for Chrome and Edge.
- Match the platform. A Windows string should come with Windows-like screen sizes and fonts in a browser; browser fingerprinting in web scraping explains the checks.
- Rotate between a few strings, not thousands. A small set of real, current browsers looks like real traffic; a random string per request does not.
This Python sketch gives each session one user agent from a short list and sends it through the ProxyField gateway; as written, each request gets a new IP until you add a session id (below):
import random
import requests
USER_AGENTS = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:158.0) Gecko/20100101 Firefox/158.0",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:158.0) Gecko/20100101 Firefox/158.0",
"Mozilla/5.0 (X11; Linux x86_64; rv:158.0) Gecko/20100101 Firefox/158.0",
]
def new_session():
s = requests.Session()
s.headers.update({
"User-Agent": random.choice(USER_AGENTS), # one per session, not per request
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.5",
})
proxy = "http://<login>-country-us-city-new_york:<password>@gate.proxyfield.io:7000" # add a sticky session id: see below
s.proxies = {"http": proxy, "https": proxy}
return s
s = new_session()
print(s.get("https://httpbin.org/user-agent", timeout=30).json())The list uses Firefox strings on purpose: plain requests sends no client hints, and Firefox doesn't send them either, so the headers stay consistent. Keeping the same IP for the whole session needs a sticky session: -region-<region>, -session-<id> and -ttl-<seconds> (30 to 129,600 seconds, 20 minutes by default) after the location, as in <login>-country-us-region-new_york-city-new_york-session-he9f2qga-ttl-600. ProxyField sticky sessions last from 30 s to 36 h.
Keep the list current
Chrome, Edge and Firefox ship a major version about every two weeks. Rather than copying strings from old lists, read the current versions from the vendors' own feeds, build the strings from the formats above, and drop anything more than two major versions behind from a downloaded list:
import json, re, urllib.request
chrome = json.load(urllib.request.urlopen(
"https://googlechromelabs.github.io/chrome-for-testing/last-known-good-versions.json"))
firefox = json.load(urllib.request.urlopen(
"https://product-details.mozilla.org/1.0/firefox_versions.json"))
CURRENT = {
"Chrome": int(chrome["channels"]["Stable"]["version"].split(".")[0]), # 156 on 2026-10-27
"Firefox": int(firefox["LATEST_FIREFOX_VERSION"].split(".")[0]), # 158
}
print(f"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/{CURRENT['Chrome']}.0.0.0 Safari/537.36")
print(f"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:{CURRENT['Firefox']}.0) Gecko/20100101 Firefox/{CURRENT['Firefox']}.0")
def fresh(ua, lag=2):
for name, major in CURRENT.items():
m = re.search(rf"\b{name}/(\d+)", ua)
if m:
return int(m.group(1)) >= major - lag
return False # no Chrome or Firefox token (Safari, CriOS, bots): check those by hand
req = urllib.request.Request("https://microlink.io/user-agents.json",
headers={"User-Agent": "ua-list-check/1.0"}) # Python's default "Python-urllib/3.x" gets a 403
downloaded = json.load(urllib.request.urlopen(req))["user"]
current = [ua for ua in downloaded if fresh(ua)]
print(len(downloaded), len(current)) # 100 23 on 2026-10-27On 2026-10-27 the filter kept 23 of Microlink's 100 browser strings (Chrome 154 to 156, Firefox 157 and 158); 19 strings had no Chrome or Firefox token and need a look by hand, and Samsung Internet's Chrome/143 base fails the test even when the browser is current. What a user agent is, how to read one and why sites care is in what is a user agent.
The right string, from the right place. ProxyField residential proxies with country, region and city targeting and sticky sessions up to 36 h, from $1.95/GB with no subscription. Start with the Easy Trial (1 GB for $2.95); traffic never expires, and all purchases are final.
List of User Agents for Scraping FAQ
Where can I get an up-to-date list of real desktop and mobile browser user agents for scraping?
ProxyField's list above gives 15 strings: Chrome 156, Edge 156, Firefox 158 and Safari 27 on desktop, and Chrome, Firefox, Samsung Internet and Safari on phones. For longer lists that update themselves, download Microlink's user-agents.json (100 browser strings, weekly) or UserAgents.me's desktop and mobile lists (20 each, weekly), or generate them with the npm user-agents package (a release every day). Filter downloads by version first: Microlink's file held 25 strings older than Chrome 140.
What is a good list of user agents for scraping?
A short one: about 5 to 10 current strings from real browsers, such as Chrome 156, Edge 156, Firefox 158 and Safari 27 in October 2026, each sent with that browser's other headers. Keep one string per session and refresh the list when the browsers update, about every two weeks.
What are the best user agents for scraping?
ProxyField's list above starts with them: the current versions of the browsers most people use: Chrome and Edge on Windows, Safari and Chrome on macOS, and Chrome on Android. Firefox strings are the easiest to keep consistent from plain HTTP clients, because Firefox sends no client hints.
What is the curl user agent?
curl sends curl/ and its version, for example curl/8.23.1. Change it with -A "your string", or remove the header with -A "".
What is the wget user agent?
wget sends Wget/ and its version, such as Wget/1.25.0. Set your own with --user-agent="your string".
What is the latest Chrome user agent?
In October 2026, Chrome 156 on Windows sends Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36. Only the major version changes from release to release; the rest of the reduced string stays fixed.
What is a mobile user agent?
It is the user agent a phone or tablet browser sends, marked by tokens such as Mobile, Android or iPhone. Chrome on Android sends Mozilla/5.0 (Linux; Android 10; K) ... Chrome/156.0.0.0 Mobile Safari/537.36, and sites use the string to serve their mobile layout.
What is the iOS 26 user agent?
Safari on iOS 26 reports an iOS 18 token, as in MDN's example Mozilla/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.1; Safari 27 strings show 18_7. The OS token no longer tracks iOS, so read the Version/ number for the Safari release.
What is a cell phone user agent for scraping mobile sites?
Use a current Chrome on Android or Safari on iPhone string, together with a phone-sized viewport and touch support in the browser. Pair it with a mobile IP where the site checks the network, so the device and the connection agree.
What is the most common user agent?
Chrome's: StatCounter put Chrome at 66.36% of browser use worldwide and Windows at 76.36% of desktop systems in September 2026, so the current Chrome-on-Windows string is very likely the most common desktop user agent. Because Chrome sends a reduced string, millions of users share exactly the same one.
Show 5 more questionsShow fewer questions
What user agent does Puppeteer send by default?
In headless mode, Puppeteer's Chrome sends the Chrome string with HeadlessChrome/<version> instead of Chrome/<version>, which many sites block. Set your own with page.setUserAgent({ userAgent }).
What is the Go net/http user agent?
Go's standard HTTP client sends Go-http-client/1.1 unless you set the header on the request. Set it with req.Header.Set("User-Agent", "...") before client.Do(req).
What is the Axios user agent?
In Node.js, Axios sends axios/ and its version. Pass headers: { "User-Agent": "..." } in the request config to replace it; in a browser, Axios can't change the browser's own user agent.
Should I use the Googlebot user agent for scraping?
No. Sites verify a real Googlebot by a reverse DNS lookup of its IP, so a fake one is easy to catch, and pretending to be a search engine breaks many sites' terms. Use a current browser string, or an honest crawler string with a contact URL.
How often do user agent strings change?
With every major browser release: Chrome, Edge and Firefox ship one about every two weeks, and Safari a major one each year with smaller updates between. Rebuild your list from the vendors' version feeds rather than copying an old one.
Related pages
Easy Trial: 1 GB for $2.95.
Try for the price of 1 GB, no subscription, traffic never expires.