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.
#1 Best Overall
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.
Quick wins for a faster PC:
Scan for outdated or missing drivers - takes under a minuteDriver Scan →Repair Windows errors before they cause bigger problemsFix Now →Fix the driver behind crashes, sound loss and screen glitchesFind Drivers →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
- 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.
Outdated Drivers Are Slowing You Down
One free scan finds every outdated or missing driver and matches the right update for your exact hardware.Free scan · exact hardware matchWindows Errors? Fix Them Before They Spread
Repair common Windows errors and clear accumulated junk for a smoother, more stable PC - no reinstall needed.Free scan · no reinstallInspect 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.
Rank #3
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.
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
- 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.
Do these 3 things before closing this tab:
1Scan for outdated or missing drivers - takes under a minute2Clear out junk files and repair common Windows errors3Fix the driver behind crashes, sound loss and screen glitches“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.
Best Value
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.
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.
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.
Quick Recap
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.

