VerisoulAgent Atlas
All agents

Puppeteer

An open source tool anyone can run

Type: Automation librarySelf-declaredDetection guide
Verisoul ResearchUpdated 4 min read

Puppeteer is the most-downloaded way to script Chrome, and its default setup still leaves clear automation markers

How to detect Puppeteer

You detect Puppeteer and headless Chrome from the browser itself, because stock setups leave clear markers: navigator.webdriver is true, chrome-headless-shell sends a HeadlessChrome user agent, and DevTools-protocol control leaves automation artifacts. New headless mode, the Puppeteer default since v22, sends a normal Chrome user agent, and stealth plugins hide the easy tells, so detection has to add behavior. Verisoul returns these sessions as agent id headless_chrome or cdp_automation.

Detection method
Self-declaredThe agent names itself in its user agent, and Verisoul confirms it with network, device or behavioral data. A user agent alone is never enough.
Signals that identify it
  • DeviceHeadless browser markers in the device fingerprint, and DevTools-protocol automation artifacts in the browser
  • BehavioralScripted navigation with no human input

Puppeteer is a Node.js library from Google's Chrome DevTools team that drives Chrome or Chromium over the Chrome DevTools Protocol, so code can load pages, click, type and read results without a person. It was first released on Aug 16, 2017, reached 1.0 in Jan 2018, and is free under Apache 2.0. In the week of Oct 23 to Oct 29, 2026, npm counted 15.4M downloads of puppeteer and 31.8M of puppeteer-core, the version without a bundled browser.

Most of that is testing, screenshots and PDF rendering. The same library also powers scraping, account creation bots and credential stuffing, and many AI agent stacks still sit on the DevTools Protocol that Puppeteer made popular. One more number says a lot about how it gets used: puppeteer-extra-plugin-stealth, a plugin built to hide Puppeteer's automation markers, still drew about 1.5M weekly downloads in the same week despite no release since Mar 2023.

How Puppeteer and headless Chrome show up on your site

Puppeteer launches Chrome for Testing in new headless mode by default since v22 (Feb 5, 2024), or the older chrome-headless-shell binary with headless: 'shell'. Chrome removed old headless from Chrome 132 and ships it only as that separate binary, as Chrome for Developers explains. The difference matters for detection, because old headless puts HeadlessChrome in the user agent and sec-ch-ua, while new headless shares the regular Chrome codebase and sends a normal Chrome token.

CheckWhat Puppeteer does
User agentHeadlessChrome in shell mode, normal Chrome in new headless
Web Bot Auth signatureNone. It is a library
IP rangesNo list. Usually datacenter, often proxied
robots.txtNot read. Up to the developer

Why Puppeteer is easy to catch until someone hides it

Stock Puppeteer is easy to catch, because navigator.webdriver is true, DevTools-protocol control leaves automation artifacts, shell mode announces HeadlessChrome, the sessions usually come from datacenter IPs, and a Chromium browser that sends no Accept-Language header is a classic headless tell. Those checks hold up well against careless scripts.

Each of them can be removed. New headless already drops the user agent token, the Chrome flag --disable-blink-features=AutomationControlled turns off the webdriver flag, a custom user agent hides the rest, and residential proxies take care of the IP. New headless also shares the regular Chrome codebase, so most of the JavaScript fingerprint differences that used to give headless away are gone, and a well-known DevTools probe that relied on a custom stack getter stopped working after V8 changes in May 2025. What stealth setups struggle to fake is behavior, such as mouse movement, typing rhythm and scrolling, which is why mature detection looks at the session as a whole rather than one flag.

How Verisoul detects Puppeteer

Verisoul names these sessions from what the browser exposes. Headless browser markers in the device fingerprint come back as headless_chrome, and DevTools-protocol automation artifacts come back as cdp_automation. Both are paired with scripted navigation and no human input. Sessions where stealth hides the markers are flagged through bot score.

API response
"agent": {
  "id": "headless_chrome",
  "name": "Headless Chrome",
  "provider": "Open source",
  "type": "headless_automation",
  "detection_method": "self_declared",
  "detection_signals": [
    "network",
    "device",
    "behavioral"
  ]
}
  • id is headless_chrome here, or cdp_automation when the DevTools artifacts are what gives the session away
  • type is headless_automation, a scripted browser with no person at the controls
  • detection_method is self_declared, because the browser exposed its own automation markers
  • detection_signals lists device for the headless or DevTools artifacts and behavioral for scripted navigation

Agent Atlas has entries for Headless Chrome and DevTools automation, and the AI agent detection docs explain the response.

  1. 01Script launches Chrome with Puppeteer
  2. 02Puppeteer drives it over CDP
  3. 03Your sign-up form fills in milliseconds
  4. 04Your page sees headless markers
How Puppeteer reaches your site

How to detect Puppeteer step by step

  1. Add the Verisoul SDK to sign-up, login and payout pages using the Verisoul docs
  2. Block or challenge headless_chrome and cdp_automation on those steps
  3. Allowlist your own test and monitoring traffic by account or environment, not by user agent
  4. Review high bot score sessions with no agent name, since stealth-plugin traffic lands there

Should you block Puppeteer?

On sign-up, login and payout pages, Puppeteer sessions are almost always scripts, from fake account farms to credential stuffing. Most teams block headless_chrome and cdp_automation on those steps and keep a separate allowlist for their own testing.

Content pages are a scraping and load question, so rate limits usually make more sense there than outright blocks. Checkout is where sneaker and ticket bots live, and it deserves the same strict rules as sign-up.

How Puppeteer shows up in the Atlas

Verisoul returns these Atlas entries for Puppeteer sessions it can name.

Questions about Puppeteer

Can websites detect Puppeteer?

Usually, in its default setup, because navigator.webdriver is true and DevTools-protocol control leaves artifacts. Stealth plugins and new headless mode remove the easy tells, so good detection also looks at behavior and network.

Does new headless Chrome still say HeadlessChrome in the user agent?

No. New headless, the Puppeteer default since v22, sends a normal Chrome token. Only old headless, now shipped as chrome-headless-shell, still sends HeadlessChrome.

Does puppeteer-extra-plugin-stealth still work?

It still gets about 1.5M weekly downloads but has had no release since Mar 1, 2023. It hides common markers such as the webdriver flag, while behavioral and network signals still expose scripted sessions.

Why does Cloudflare block Puppeteer?

Stock Puppeteer leaks automation markers and usually runs from datacenter IPs, both of which bot protection like Cloudflare's scores as automated. Scripted typing and missing mouse movement add to that.

How do people hide navigator.webdriver in Puppeteer?

Usually with the Chrome flag --disable-blink-features=AutomationControlled or a stealth plugin, which is why the webdriver check alone is not enough.

Sources

  1. Headless mode, Puppeteer docs
  2. Removing --headless=old from Chrome, Chrome for Developers
  3. Chrome Headless mode, Chrome for Developers
  4. Google releases Puppeteer, InfoQ
  5. puppeteer weekly downloads, npm
  6. puppeteer-extra-plugin-stealth weekly downloads, npm