Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

There is no single current “Headless Chrome” user-agent string. Older Headless Chrome builds commonly inserted a HeadlessChrome/<version> token, but modern Chrome’s default --headless mode uses the same browser implementation as headful Chrome. The value you observe depends on Chrome version, operating system, User-Agent reduction, the headless implementation, and any override made by your automation framework.

For reliable automation and diagnostics, inspect the actual request and JavaScript values in your target environment. Treat a literal HeadlessChrome token as a historical clue—not a complete detector.

What a User-Agent string identifies

Chromium defines the User-Agent (UA) request header as a characteristic string that lets servers and network peers identify the requesting application, operating system, vendor, and version. A browser sends it with HTTP requests. Page scripts can also read a related value through navigator.userAgent.

These surfaces are related but not identical to User-Agent Client Hints (UA-CH). UA-CH exposes structured browser and platform data through headers and JavaScript, including higher-entropy values when the site is permitted to request them.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Historical versus current Headless Chrome behavior

Chrome era or binary Implementation What you may observe How to interpret it
Legacy Headless shell Separate, older implementation Examples included HeadlessChrome/60.0.3082.0 Historical example only; do not treat it as a universal current value.
Chrome 112 and later unified mode Regular Chrome without a visible window, using the headful implementation Usually a normal Chrome UA for the platform, subject to UA reduction and overrides The absence of HeadlessChrome does not prove a browser is headful.
Chrome 132 and later with --headless=old The old implementation is no longer inside the Chrome binary The flag produces an error rather than launching legacy Headless Use the standalone chrome-headless-shell binary when legacy behavior is specifically required.
Chrome 132 and later with --headless or --headless=new Unified Chrome UA behavior follows ordinary Chrome for the selected platform and configuration Observe the live value instead of hard-coding a string.

Google’s current Headless documentation describes the unified model as “unified Headless and headful modes.” Since Chrome 132.0.6793.0, the old mode is available only as the standalone chrome-headless-shell, downloadable through Chrome for Testing.

Why examples online disagree

Version and implementation

A string copied from a legacy blog post may describe the old shell, not current Chrome. Chrome 112 introduced the unified Headless mode, and Chrome 132 removed the old implementation from the main binary. Automation libraries can also select a bundled browser, a system Chrome, or the standalone shell.

User-Agent reduction

Chromium’s User-Agent Reduction project began its desktop rollout in Chrome 107. Reduced UAs intentionally reveal fewer passive fingerprinting details. A reduced string can hide granular operating-system and build information that older examples displayed.

Explicit configuration

Command-line flags, DevTools Protocol commands, proxy layers, and automation-library options can all change what a server receives. A page can therefore see a different value from the one you expected unless you test both the HTTP header and JavaScript-visible APIs.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

How to see the value your browser actually sends

Check the HTTP request

Use your server’s request logs or a request-inspection endpoint you control. Record the complete User-Agent header, the Sec-CH-UA family of headers when present, and the browser version used to launch the session. Request headers are the authoritative view for server-side behavior.

Rank #2
Sale
HTML and CSS: Design and Build Websites
  • HTML CSS Design and Build Web Sites
  • Comes with secure packaging
  • It can be a gift option

Check JavaScript values

In DevTools, open the Console and run:

navigator.userAgent
navigator.userAgentData?.brands
navigator.userAgentData?.mobile
navigator.userAgentData?.platform

navigator.userAgentData is unavailable in some browsers and contexts, so feature-detect it. High-entropy values are exposed only when requested and permitted; do not assume every detail is present by default.

Inspect a real headless launch with Puppeteer

This Node.js example prints the JavaScript UA and navigates to a page where you can inspect the incoming request in your own logs.

import puppeteer from 'puppeteer';

const browser = await puppeteer.launch({headless: true});
const page = await browser.newPage();
console.log('navigator.userAgent:', await page.evaluate(() => navigator.userAgent));
console.log('userAgentData:', await page.evaluate(() => ({
  brands: navigator.userAgentData?.brands,
  mobile: navigator.userAgentData?.mobile,
  platform: navigator.userAgentData?.platform
})));
await page.goto('https://example.com', {waitUntil: 'networkidle2'});
await browser.close();

Replace https://example.com with an endpoint you operate when you need to capture request headers. The exact UA depends on the Chrome executable Puppeteer launches.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Inspect with Selenium in Python

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument('--headless')
driver = webdriver.Chrome(options=options)
try:
    driver.get('https://example.com')
    print(driver.execute_script('return navigator.userAgent'))
    print(driver.execute_script('return navigator.userAgentData ? {
      brands: navigator.userAgentData.brands,
      mobile: navigator.userAgentData.mobile,
      platform: navigator.userAgentData.platform
    } : null'))
finally:
    driver.quit()

Use the same Chrome major version in local, CI, and production when comparing results. A different binary or operating system can legitimately produce a different string.

How to override the UA correctly

DevTools Protocol

The Chrome DevTools Protocol method Emulation.setUserAgentOverride accepts a replacement UA string. If you want Client Hint headers as well, provide matching userAgentMetadata; the protocol reference requires metadata for those headers to be sent.

const client = await page.target().createCDPSession();
await client.send('Emulation.setUserAgentOverride', {
  userAgent: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36',
  acceptLanguage: 'en-US,en;q=0.9',
  platform: 'Linux x86_64',
  userAgentMetadata: {
    brands: [
      {brand: 'Chromium', version: '131'},
      {brand: 'Google Chrome', version: '131'}
    ],
    fullVersion: '131.0.0.0',
    platform: 'Linux',
    platformVersion: '0.0.0',
    architecture: 'x86',
    model: '',
    mobile: false
  }
});

The values above are an example configuration, not a claim about the current release. Keep the UA string, metadata versions, platform, and mobile flag internally consistent. Then verify both network headers and navigator.userAgentData.

Puppeteer convenience API

await page.setUserAgent({
  userAgent: 'MyTestAgent/1.0',
  platform: 'Linux x86_64',
  userAgentMetadata: {
    brands: [{brand: 'Chromium', version: '131'}],
    fullVersion: '131.0.0.0',
    platform: 'Linux',
    platformVersion: '0.0.0',
    architecture: 'x86',
    model: '',
    mobile: false
  }
});

Library signatures vary by version. If your installed Puppeteer does not accept an object, use the DevTools Protocol call directly and consult that version’s API reference.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Selenium command-line option

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument('--headless')
options.add_argument('--user-agent=MyTestAgent/1.0')
driver = webdriver.Chrome(options=options)
try:
    driver.get('https://example.com')
    print(driver.execute_script('return navigator.userAgent'))
finally:
    driver.quit()

A command-line UA override changes the string, but it may not create matching Client Hint metadata. For tests involving UA-CH, use a DevTools override with metadata and verify the result.

Can a site detect Headless Chrome?

Sometimes, but no single UA test is dependable. A literal HeadlessChrome token is useful historical evidence for old shell sessions. Modern unified Headless uses the ordinary Chrome implementation, UA reduction removes passive detail, and explicit overrides can replace the token.

Use multiple signals

  • Compare the HTTP UA with JavaScript’s navigator.userAgent.
  • Inspect UA-CH brands and platform values when available.
  • Correlate browser behavior, headers, timing, and session consistency rather than relying on one substring.
  • Version your rules and test them against the exact Chrome and automation versions you support.

Detection should support a legitimate security or compatibility decision, not assume that every automated session is malicious. A false positive can block accessibility tools, testing systems, and ordinary users behind unusual configurations.

Rank #4
Sale
Web Design with HTML, CSS, JavaScript and jQuery Set
  • Brand: Wiley
  • Set of 2 Volumes
  • A handy two-book set that uniquely combines related technologies Highly visual format and accessible language makes these books highly effective learning tools Perfect for beginning web designers and front-end developers

Common problems and fixes

“My headless UA does not contain HeadlessChrome.”

That is expected in unified Headless. Confirm the Chrome major version and launch mode, then inspect the live header and JavaScript value. Do not add a fake token unless a controlled test specifically requires one.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

“The --headless=old flag fails.”

Chrome 132 and later no longer include the old implementation in the main binary. Install and launch the separate chrome-headless-shell only when compatibility with legacy behavior is a hard requirement.

“The server and browser report different values.”

Check for proxies, service workers, request interception, and per-page overrides. Log the outgoing request at the server and query navigator.userAgent in the same page. Also check whether a redirect moved the request to another host.

“UA-CH headers are missing after an override.”

Include userAgentMetadata in the DevTools Protocol override and ensure the metadata matches the replacement string. Client Hints are negotiated and may not appear on the first request or for every origin.

“A parser breaks after Chrome updates.”

Move away from brittle full-string parsing. Prefer feature detection and UA-CH for structured data, and maintain a small compatibility table for the browser versions your application actually supports.

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Performance, reliability, and privacy considerations

  • Launch cost: Starting a browser for every check is slower and more resource-intensive than reusing a controlled browser process or collecting server logs.
  • Reproducibility: Pin the Chrome major version, operating-system image, and automation-library version in CI when UA-sensitive tests matter.
  • Consistency: Keep request headers, JavaScript properties, and UA-CH metadata coherent; contradictory values are more diagnostic than any particular token.
  • Privacy: UA reduction exists to limit passive fingerprinting. Request only the detail your compatibility decision needs.
  • Security: A UA is user-controlled input. Never use it as sole authentication, authorization, or bot-proof evidence.

Or skip the browser setup

If your goal is to capture a page rather than study browser identity, ScreenshotNeo provides a website screenshot API and MCP server. A single request returns a PNG, JPEG, WebP, or PDF:

curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp

See the ScreenshotNeo documentation for all parameters and response details. ScreenshotNeo removes cookie-consent banners, newsletter popups, and chat widgets before capture; bot checks, blank pages, timeouts, failed loads, and cache hits are not billed, and response headers identify the page verdict and billing status. Its MCP server exposes take_screenshot, get_page_info, and capture_pdf to Claude, Cursor, and other MCP clients. The Free plan includes 1,000 screenshots per month with no card, and paid plans start at $5 for 3,000 shots. Create a free ScreenshotNeo account to get started.

FAQ

Is HeadlessChrome/60.0.3082.0 the current UA?

No. It is a historical example from the legacy Headless shell.

Does --headless=new hide automation completely?

No. It selects unified Headless behavior; it does not guarantee that every automation or behavioral signal disappears.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Which value should application code trust: the header or JavaScript?

Use the surface relevant to your decision, validate consistency, and prefer UA-CH or feature detection over brittle parsing.

Can I force Client Hints with only a custom UA string?

Not reliably. A DevTools Protocol override must include matching userAgentMetadata for Client Hint headers.

Frequently Asked Questions

Is Headless Chrome a separate browser?

In current Chrome, default Headless is the regular Chrome implementation running without a visible UI. The separate chrome-headless-shell exists for the legacy implementation.

Will changing the UA make a session indistinguishable from a normal user?

No. It changes an identity surface only; other headers, APIs, behavior, and timing can still differ.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

The Bottom Line

Use the live value from your exact Chrome environment, not a copied HeadlessChrome string. Modern unified Headless normally follows Chrome’s ordinary UA behavior, while UA-CH and carefully matched DevTools overrides provide more structured control.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.