All posts
Research2 min read

bauta and stock Playwright on eight bot detectors

One run through one proxy exit: how BrowserScan, CreepJS, pixelscan and five more detectors read bauta beside stock Playwright, and what a page reads of each.

Bot detectors read a browser from inside the page: what navigator says, how the page is being driven, and whether the parts of the fingerprint agree with each other. We ran eight of them, and the page reads they rest on, against stock Playwright and against bauta, on October 21, 2026.

How we ran it

  • Stock Playwright 1.60.0, as a script launches it: its own Chromium 148, headless, a new page per site.
  • bauta, through its gateway on a virtual display: a Windows device, with humanize on, its timezone and locale taken from where the proxy exits.
  • The same proxy exit for both, one browser after the other, within twelve minutes.

The detectors

detectorstock Playwrightbauta
BrowserScan's verdictRobotNormal
incolumitas's failed checks13 checks failedWEBDRIVER alone (any Chrome)
deviceandbrowserinfo's verdictbot, 7 flagshuman
rebrowser's leaks11 leaksmainWorldExecution alone (Playwright's evaluate in the page's world)
pixelscan's fingerprintinconsistent: masking detected, automated behavior detectedconsistent
iphey's score3070
fingerprint-scan's bot score, out of 10010029
CreepJS's like-headless score94 % like headless, 100 % headless25 % like headless, 0 % headless

The two flags left on bauta are Playwright's own: incolumitas's WEBDRIVER rule, which any Chrome fails, and rebrowser's report of Playwright's evaluate running in the page's world.

What a page reads

readstock Playwrightbauta
navigator.webdrivertruefalse
window.chromemissingpresent
navigator.plugins.length05
User-AgentHeadlessChrome/148Chrome/155
a CDP client on the page (deviceandbrowserinfo)detectednot detected
TLS handshake, JA4 (tls.peet.ws)Chromium 148's ownGoogle Chrome 155's

Why the readings differ

bauta answers these reads inside the engine, from a persona. The User-Agent and its Client Hints, navigator, the screen and WebGL agree because they come from one description of one device, and no JavaScript is injected into the page to change them, so a page still finds Chromium's own native getters. Stock Playwright's headless Chromium reports what it is.

Try it

Getting started installs bauta and connects a first script; the comparison on the home page keeps the same tables.