Tutorial10 min read

List of User Agents for Scraping

Short answer

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
  1. Desktop user agents (October 2026)
  2. Mobile user agents
  3. The list as code
  4. Where to get longer lists
  5. Default user agents of HTTP clients
  6. Crawler user agents, and why not to copy them
  7. How to use this list
  8. Keep the list current
  9. List of User Agents for Scraping FAQ

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 OSUser agent string
Chrome 156, WindowsMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36
Chrome 156, macOSMozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36
Chrome 156, LinuxMozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36
Edge 156, WindowsMozilla/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
Edge 156, macOSMozilla/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
Firefox 158, WindowsMozilla/5.0 (Windows NT 10.0; Win64; x64; rv:158.0) Gecko/20100101 Firefox/158.0
Firefox 158, macOSMozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:158.0) Gecko/20100101 Firefox/158.0
Firefox 158, LinuxMozilla/5.0 (X11; Linux x86_64; rv:158.0) Gecko/20100101 Firefox/158.0
Safari 27, macOSMozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/27.0 Safari/605.1.15

Three things look odd and are correct:

  • Windows NT 10.0 on Windows 11. Browsers don't put Windows 11 in the string; it stays 10.0.
  • Intel Mac OS X 10_15_7 on every Mac, including Apple silicon and new macOS versions. Chrome and Safari froze it; Firefox freezes it at 10.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 deviceUser agent string
Chrome 156, Android phoneMozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Mobile Safari/537.36
Chrome 156, Android tabletMozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/156.0.0.0 Safari/537.36
Firefox 158, AndroidMozilla/5.0 (Android 15; Mobile; rv:158.0) Gecko/158.0 Firefox/158.0
Samsung Internet 30, AndroidMozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/30.0 Chrome/143.0.0.0 Mobile Safari/537.36
Safari 27, iPhoneMozilla/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
Chrome 155, iPhoneMozilla/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
Safari, iPadUsually 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 drops Mobile. Samsung Internet does the same, with its own token and an older Chromium base (Chrome/143).
  • iPhone OS 18_7 with Safari 27. Safari no longer tracks the iOS version in this token: MDN's Safari 26 example shows 18_6, and the Safari 27 strings in Microlink's list show 18_7.
  • CriOS/155.0.8059.37. Chrome on iPhone runs on WebKit, adds CriOS with 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 desktop Gecko/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:

Python
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",
    ],
}
Easy Trial: 1 GB for $2.95.
Try for the price of 1 GB, no subscription, traffic never expires.

Where to get longer lists

Four maintained sources.

SourceWhat you getUpdatedFormatWatch for
Microlink user agents100 browser strings (Windows, macOS, Linux, ChromeOS, Android, iPhone), plus separate crawler and AI-agent listsWeekly (the file we read was dated 2026-10-26)curl -L https://microlink.io/user-agents.json: a JSON object with user, crawler and ai arrays25 of the 100 browser strings carried a Chrome version below 140, as old as Chrome 99
UserAgents.meFour "most common" lists of 20: desktop, mobile, tablet and bots, with OS, browser and deviceWeekly (data for 2026-10-18 to 2026-10-25 on our visit)Table on the page, JSON and TSV downloads, an APIOnly 20 strings per list
useragents.ioA browsable database with a parser (browser, OS, device) and a random generatorDaily, per the siteWeb pagesBuilt for lookups, not a single download
npm user-agentsA JavaScript library that generates user agents weighted by how often they are seen, with filters such as deviceCategoryA new release every day (2.1.224 on 2026-10-25, 2.1.225 on 2026-10-26)Node.js package, BSD-2-ClauseJavaScript 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:

ClientDefault user agentSource
curlcurl/<version>, for example curl/8.23.1curl man page
wgetWget/<version>GNU Wget manual
Python requestspython-requests/<version>requests source
ScrapyScrapy/<version> (+https://scrapy.org)Scrapy settings
Go net/httpGo-http-client/1.1Go source
Node.js fetchnodeundici source
Axios (Node.js)axios/<version>Axios source
PostmanPostmanRuntime/<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

  1. Use current versions only. Chrome, Edge and Firefox update themselves, so a string several versions old stands out.
  2. 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.
  3. Send the full header set of the browser you claim, including client hints for Chrome and Edge.
  4. 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.
  5. 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):

Python
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:

Python
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-27

On 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.

Easy Trial: 1 GB for $2.95.

Try for the price of 1 GB, no subscription, traffic never expires.