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.
| Check | What Puppeteer does |
|---|---|
| User agent | HeadlessChrome in shell mode, normal Chrome in new headless |
| Web Bot Auth signature | None. It is a library |
| IP ranges | No list. Usually datacenter, often proxied |
| robots.txt | Not 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.
"agent": {
"id": "headless_chrome",
"name": "Headless Chrome",
"provider": "Open source",
"type": "headless_automation",
"detection_method": "self_declared",
"detection_signals": [
"network",
"device",
"behavioral"
]
}idisheadless_chromehere, orcdp_automationwhen the DevTools artifacts are what gives the session awaytypeisheadless_automation, a scripted browser with no person at the controlsdetection_methodisself_declared, because the browser exposed its own automation markersdetection_signalslistsdevicefor the headless or DevTools artifacts andbehavioralfor scripted navigation
Agent Atlas has entries for Headless Chrome and DevTools automation, and the AI agent detection docs explain the response.
- 01Script launches Chrome with Puppeteer
- 02Puppeteer drives it over CDP
- 03Your sign-up form fills in milliseconds
- 04Your page sees headless markers
How to detect Puppeteer step by step
- Add the Verisoul SDK to sign-up, login and payout pages using the Verisoul docs
- Block or challenge
headless_chromeandcdp_automationon those steps - Allowlist your own test and monitoring traffic by account or environment, not by user agent
- 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.