🔥 New: Test our proxy detection database (more than 10M proxy IPs, updated every 2h)

Update (for devs): I recently created a new page with similar tests but with an obfuscated version of the fingerprinting scripts. It uses a sort of "cheap VM-based obfuscation" combined with a few features of obfuscator.io. Feel free to play with it. Note that some attributes like CDP detection have not yet been implemented since some JS features have not yet been supported by the obfuscator.

Are you a bot?

Raw detection details

How does this test work?

You can use this page to test whether or not your bot is detected. The test is based only on fingerprinting signals:

  • Client-side signals: Browser fingerprinting (requires JavaScript)
  • Server-side signals: HTTP headers (future: TCP/TLS fingerprinting)

This test does not use IP reputation or user behavior. You can run several tests in a row; it won't affect the result.

New: We have added a new test that detects suspicious client-side behavior, such as mouse movements, typing speed, and form submission. It also detects CDP mouse leak. You can find it here.

â–¶Detection signals explained

hasBotUserAgent: True if the User-Agent string (navigator.userAgent) matches known bot, crawler, or automation tool patterns.

hasWebdriverTrue: True if navigator.webdriver is set to true, which is a direct indicator of browser automation (e.g., Selenium, Puppeteer, Playwright).

hasWebdriverInFrameTrue: True if navigator.webdriver is detected as true inside an iframe.

isPlaywright: True if Playwright-specific global variables or bindings (such as __pwInitScripts or __playwright__binding__) are present in the window object.

hasInconsistentChromeObject: True if the window.chrome object is missing or inconsistent for a Chromium-based browser.

isPhantom: True if PhantomJS-specific properties (window.callPhantom, window._phantom, or window.phantom) are detected, indicating the use of the PhantomJS headless browser.

isNightmare: True if the window.__nightmare property is present, which is injected by the Nightmare.js automation framework.

isSequentum: True if the Sequentum web scraping tool is detected, typically by checking if window.external contains a string with 'Sequentum'.

isSeleniumChromeDefault: True if the Selenium Chrome default automation object (document.$cdc_asdjflasutopfhvcZLmcfl_) is present, which is a known Selenium signature.

isHeadlessChrome: True if the browser is running in headless Chrome mode, detected by checking for headless-specific features.

isWebGLInconsistent: True if the WebGL renderer or vendor information (from WebGLRenderingContext.getParameter with UNMASKED_VENDOR_WEBGL/UNMASKED_RENDERER_WEBGL) is inconsistent, missing, or spoofed.

isAutomatedWithCDP: True if Chrome DevTools Protocol (CDP) automation is detected (main JavaScript execution context), cf article here.

isAutomatedWithCDPInWebWorker: True if CDP automation is detected inside a web worker context (web worker execution context).

hasInconsistentClientHints: True if browser client hints (like navigator.userAgentData, brands, platform, or getHighEntropyValues) are inconsistent, manipulated, or do not match the expected values for the browser.

hasInconsistentGPUFeatures: True if reported GPU features (from WebGL or WebGPU APIs) do not match the expected values for the browser/device.

isIframeOverridden: True if iframe behavior is overridden, such as by detecting modifications to iframe contentWindow or overridden methods, which can indicate anti-detection scripts or automation.

hasInconsistentWorkerValues: True if values collected in web workers (e.g., userAgent, languages, hardwareConcurrency, platform, WebGL vendor/renderer) differ from those in the main JS context, suggesting environment spoofing.

hasHighHardwareConcurrency: True if the reported number of CPU cores (navigator.hardwareConcurrency) is unusually high or inconsistent with typical consumer devices, which can be a sign of a virtualized or automated environment.

hasHeadlessChromeDefaultScreenResolution: True if the screen resolution matches known defaults for headless Chrome (e.g., 800x600), which is a common signature of headless automation.

hasSuspiciousWeakSignals: True if a combination of minor signals (such as subtle inconsistencies or rare values) together suggest possible automation or bot activity, even if no single signal is conclusive, cf article here.