Skip to main content
Blog
Blog

How to Detect AI Agents and Stealth Browsers: The Signals That Give Them Away

A signal-by-signal guide to detecting stealth and anti-detect browsers: CDP and webdriver tells, headless quirks, font and WebGL drift, and behavior.

Jul 15, 2026 7 min read
How to Detect AI Agents and Stealth Browsers: The Signals That Give Them Away

No single magic header detects a stealth browser. You catch the small inconsistencies that automation and fingerprint-spoofing tooling leave behind, then confirm them with behavior over the session. A modern stealth setup patches the obvious tells (navigator.webdriver, the missing window.chrome object, headless rendering quirks), so detection has to read the layers those patches can't fully cover: the automation control surface, the internal coherence of the fingerprint, and how the session behaves once it is on the page.

This is the operator's how-to. Below are the concrete signal classes worth instrumenting, what each one catches, and what a well-configured stealth browser defeats. cside collects these from inside the browser runtime, so the goal here is to make the signals legible. If you want the conceptual background on what stealth and anti-detect browsers are, read the stealth browsers explainer first; this post assumes you already want to find them.

Which signals actually reveal a stealth browser?

No single class is sufficient. Strong detection stacks all four and weights them by how hard each is to fake.

Signal classWhat it catchesWhat good stealth tooling defeats
Automation / CDP tellsUnpatched headless and DevTools-driven sessionsnavigator.webdriver override, injected window.chrome
Headless rendering quirksVanilla headless ChromeHeadful Chrome driven via CDP, virtual display servers
Fingerprint inconsistencySpoofed devices with internal mismatchesWell-built anti-detect profiles that stay self-consistent
Behavioral signalsMachine timing, input entropy, navigation rhythmSlowed, jittered, human-in-the-loop scripted sessions

Automation and CDP tells

The cheapest tells come from the automation control surface itself. Plain Playwright or Selenium-driven Chrome sets navigator.webdriver to true, ships a missing or hollow window.chrome object, and exposes permissions.query behavior that disagrees with what a real Chrome returns (for example, notification permission reading denied while Notification.permission says default). Each of these is a one-line read.

Stealth libraries exist specifically to erase these. playwright-stealth and its peers override navigator.webdriver, inject a realistic window.chrome, normalize navigator.plugins, and fix the permissions mismatch, which is why blocking Playwright automation takes more than reading a single flag. cside's 2026 web security research reports that playwright-stealth installs rose roughly 10x through 2025, a useful proxy for how fast this evasion moved into mainstream tooling (cside 2026 research).

The patched flags become confirming evidence rather than primary evidence. The harder tell is the Chrome DevTools Protocol binding underneath the automation. CDP-driven sessions can leak through side effects: the runtime's behavior under specific Runtime/Console interactions, serialization quirks in error stacks, or timing differences when the protocol is attached. Those are far more expensive for an operator to fully suppress than a single boolean, because they emerge from how the browser is being controlled, not from a property they can rewrite.

Headless rendering and environment quirks

Vanilla headless Chrome still betrays itself through the rendering and device environment. The classics: a user-agent string containing HeadlessChrome, zero installed plugins where a real desktop Chrome reports a small set, a missing or fixed-size outer window, no battery or media-device APIs populated, and subtle differences in how fonts and images rasterize without a real display.

In 2026, serious operators have moved past headless mode. An AI agent can drive a full, headful Chrome through CDP on a virtual display, which removes every headless-specific tell while keeping the automation underneath. Headless detection catches the lazy tier and forces everyone else up a level, where the fingerprint and behavior layers take over. This is also where legacy bot-detection tools miss AI agents: they were built to flag headless signatures, not the control surface beneath a headful browser.

Fingerprint inconsistencies: the cracks in a spoofed device

Anti-detect browsers replace fingerprint-generating APIs with synthetic values so each session looks like a fresh device. The detectable failure mode is internal incoherence: the spoofed values don't agree with each other. Lower-quality profiles are where the cracks show.

  1. Font list vs. claimed OS. A profile claiming macOS that enumerates Windows-only fonts (or omits the fonts every Mac ships) is spoofed. The font set has to match the platform it pretends to be.
  2. WebGL renderer vs. plausible hardware. A WEBGL_debug_renderer_info string that names a GPU no shipping device pairs with the claimed OS and screen profile is a tell. Spoofers pull from a library of real strings, but pairing them coherently with everything else is hard.
  3. Canvas and AudioContext output. Anti-detect browsers return deterministic synthetic canvas pixels and audio output to defeat hashing. Output that is statistically implausible, too uniform, or identical across "different" sessions flags the synthesis.
  4. Hardware concurrency, memory, and screen geometry. navigator.hardwareConcurrency, deviceMemory, and screen/viewport dimensions that contradict the claimed device class (a phone UA reporting a 32-core desktop) break coherence.

A well-built anti-detect profile keeps all of these consistent with each other, which is exactly why fingerprinting alone can't be the whole answer. It raises the cost and catches the sloppy tier; behavior closes the rest.

Behavioral signals: what spoofing can't suppress

The fingerprint layer describes the device. The behavioral layer describes the operator, and that is much harder to fake because it has to be produced live, every session. Humans interact imprecisely: mouse paths curve and overshoot, scroll speed varies, form fills include pauses, typos, and corrections, and there is a measurable gap between page-ready and first interaction.

Automated sessions tend toward the opposite: instant form fills with no correction, navigation with no hesitation, scrolling at fixed intervals, and event timing with near-zero jitter. None of that is suppressed by a navigator.webdriver override or a clean canvas hash, because it comes from how the agent acts, not from what it claims to be. Cross-session correlation finishes the job. Many sessions inside a short window that share structural fingerprint traits, behavioral timing, and post-session actions reveal coordination that no single session would expose. For how agentic tooling specifically tries to mimic human rhythm, see how OpenClaw agents bypass bot detection.

How to turn signals into a decision

Detection is only useful if it drives a graduated response. Don't block on one signal; weight several and act on convergence.

  1. Instrument all four signal classes at runtime, inside the browser session.
  2. Compare the claimed environment (user-agent, platform, device class) against the observed one and record every mismatch.
  3. Add network context (datacenter vs. residential IP, ASN, proxy and geo-shift behavior) as a weight, never as a sole verdict.
  4. Score the session on converging independent signals, and keep the raw signal set, risk reason, and challenge outcome as evidence.
  5. Block high-confidence sessions at the points that matter most, such as registration, where browser-layer detection catches fake account creation, and checkout. Challenge medium-confidence ones with step-up friction, and allow-with-monitoring for legitimate agent traffic.

cside's AI Agent Detection runs this from inside the page: it reads automation and CDP tells, captures device and real-IP signals, surfaces fingerprint inconsistencies, and watches behavior over the session, then lets teams allow known-good automation, challenge suspicious sessions, and block high-risk agents with a full audit trail.

Further reading on cside

Simon Wijckmans
Founder & CEO

Founder and CEO of cside. Previously a product manager on Cloudflare Page Shield (now Cloudflare Client-Side Security). Co-chair of the W3C Anti-Fraud Community Group and a Forbes 30 Under 30 honoree. Building accessible security against client-side attacks — web security is not an enterprise-only problem.

FAQ

Frequently Asked Questions

On its own, no. Stealth libraries override `navigator.webdriver` to return `false` before your script ever reads it, so a clean value proves nothing. It still has value as a confirming signal: a session that asserts it is a normal Chrome build but leaves `webdriver` true is almost certainly unpatched automation. Treat the flag as one input among many, not a verdict.

Sometimes, when the operator is sloppy. A leaked CDP `Runtime` binding, a missing `window.chrome` object, or a WebGL renderer that no real device ships will surface on the first request. Well-configured stealth browsers leave none of those tells on a single view. Those you catch by accumulating fingerprint and behavioral evidence across the session, then correlating with other sessions from the same operator.

Headless detection answers a narrow question: is this a browser running without a visible UI? AI-agent detection is broader. An agent can drive a full, headful Chrome through the DevTools Protocol, so the headless tells are absent. You detect the agent by its automation control surface and its behavior (instant form fills, no human input entropy, machine-perfect timing), not by whether a window is drawn.

Any single signal produces false positives. Privacy browsers spoof fingerprints, corporate proxies share IPs, and accessibility tools automate input. A graduated model (block when several independent signals converge, challenge when one or two appear, allow-with-monitoring for legitimate agent traffic) keeps real customers moving while still stopping coordinated abuse.

Monitor and Secure Your Third-Party Scripts

Gain full visibility and control over every script delivered to your users to enhance site security and performance.

Start free, or try Business with a 14-day trial.

cside dashboard interface showing script monitoring and security analytics
Related Articles
Book a demo