Seatext library / BotRefund evidence
Which Fingerprinting Signals Are Most Effective at Catching Headless Browsers?
The most reliable signals for detecting headless browsers come from three tiers: network and geolocation consistency checks (WebRTC leaks, DNS routing, timezone alignment), evasion and anti-stealth traps (CDP debugger leaks, native patching, engine mismatches),...
✓ Built for advertisers who need clear, refund-ready traffic evidence.
Headless browsers leave detectable traces across network, browser engine, and behavioral layers. The most effective signals are not single checks but correlated patterns: WebRTC network leaks that reveal conflicting locations, DNS routing mismatches, CDP debugger artifacts, native code patching anomalies, and JavaScript engine inconsistencies. BotRefund groups 106 signals into network/geolocation vectors, evasion/anti-stealth traps, and automation properties, then uses a prediction AI to weigh the full pattern rather than scoring raw signals in isolation.
Why Headless Browser Detection Matters for Ad Budgets
Automated browsers drive click fraud, pixel poisoning, and wasted ad spend. When bots mimic human traffic, they inflate click counts, corrupt conversion pixels, and cause bidding algorithms to optimize toward non-human visitors. Advertisers lose an estimated 20% of Google and Meta budgets to invalid traffic. Detecting headless browsers at the browser level—not just by IP—lets you capture forensic evidence (GCLIDs, FBCLIDs) tied to behavioral proof, which platforms require for refund claims.
How Fingerprinting Signals Work Together
One signal can be misleading. A headless browser might spoof its user agent but fail to patch the navigator.webdriver property, or it might route DNS correctly but leak its real IP via WebRTC. BotRefund's approach evaluates how 106 browser, network, hardware, and behavior signals fit together before classifying a visit. Signals become a decision only when seen in combination. This pattern-based method avoids false positives from privacy tools or unusual but legitimate configurations.
Tier 1: Network & Geolocation Consistency Signals
These signals check whether the visitor's reported location, language, and network path agree. Headless browsers often run in data centers or proxy networks that mismatch the spoofed profile.
- WebRTC Network Leak (Signal 01): Browsers expose local IPs via WebRTC STUN requests. A headless browser on a proxy often reveals its data-center IP alongside the proxy IP.
- DNS Tunnel Leak (Signal 02) & DNS Routing Mismatch (Signal 15): DNS queries and HTTP traffic should follow the same route. Automated tooling often uses separate DNS resolvers.
- Timezone Evasion (Signal 04) & UTC Timezone Bias (Signal 07): The browser's reported timezone must match the IP geolocation and language settings. Headless instances frequently default to UTC.
- Languages Mismatch (Signal 08) & Accept-Language Mismatch (Signal 13): The
navigator.languagesarray and HTTPAccept-Languageheader should align with the claimed geography. - Latency Mismatch (Signal 05): Connection timing (TCP handshake, TLS negotiation) should be consistent with the claimed distance to the server.
- IP Address Inconsistency (Signal 10) & OS/TCP TTL Mismatch (Signal 11): TTL values and IP reputation reveal data-center hosting versus residential connections.
- HTTP User-Agent Mismatch (Signal 12) & HTTP Protocol Mismatch (Signal 14): Header order, TLS fingerprint (JA3), and HTTP/2 settings must match the claimed browser version.
These signals are high-value because they are hard to spoof completely without controlling the entire network stack. A residential proxy farm can fix the IP but often fails on WebRTC, DNS routing, or TLS fingerprint simultaneously.
Tier 2: Evasion, Debugger & Anti-Stealth Traps
These signals look for artifacts left by automation frameworks (Puppeteer, Playwright, Selenium) and stealth plugins that try to hide them.
- CDP Debugger Leak (Signal 16): Chrome DevTools Protocol endpoints expose automation attachment. Even headless Chrome with
--remote-debugging-portclosed can leak viawindow.chromeinternals. - Native Patching (Signal 17): Automation tools patch native functions (e.g.,
navigator.webdriver,chrome.runtime). The patched code behaves differently undertoString()orprototypeinspection. - Engine Mismatch (Signal 18) & JS Engine Mismatch (Signal 20): V8 isolates in headless mode expose different internal properties, heap limits, or
performance.memoryvalues than real Chrome. - Rebrowser Leaks (Signal 19): Stealth plugins like
puppeteer-extra-plugin-stealthleave detectable side effects innavigator.permissions,Notification.permission, orwindow.outerWidthbehavior. - Automation Properties (Signal 21): Direct checks for
navigator.webdriver,window.__driver_evaluate,document.__selenium_unwrapped, and similar markers.
These signals catch the "stealth" tooling that passes basic user-agent checks. They require client-side JavaScript execution, so they work only when the browser loads your page—not from server logs alone.
Tier 3: Behavioral & Pointer Signals (Supplemental)
While not in the 21 core fingerprinting vectors, BotRefund also tracks behavioral patterns that headless browsers struggle to replicate: absence of humanlike mouse tremor, superhuman input speed (<1ms), grid-aligned movement paths, linear pointer trajectories, and unnatural session durations. These behavioral signals complement fingerprinting by catching bots that pass static checks but fail dynamic interaction tests.
Decision Framework: Choosing Signals for Your Stack
If you build or buy detection, prioritize signals by spoofing difficulty and coverage:
- Must-have: WebRTC leak, CDP debugger leak, native patching checks, automation properties. These catch >90% of off-the-shelf headless configurations.
- High-value: DNS routing mismatch, timezone/language consistency, TLS/HTTP fingerprint (JA3), engine mismatch. These raise the cost for sophisticated actors.
- Supplemental: Behavioral pointers, session timing, honeypot interactions. These catch bots that pass static fingerprinting but fail dynamic challenges.
Decision rule: Deploy client-side collection for all Tier 1 and Tier 2 signals. Feed them into a pattern classifier—not a rule engine—so correlated anomalies outweigh single outliers. If you lack client-side execution (e.g., server-only logs), you are limited to IP reputation and header analysis, which miss modern residential proxy botnets.
Limitations & When Signals Fail
- Residential proxy botnets: Real devices with malware route traffic through genuine consumer IPs. Network signals (WebRTC, DNS, TTL) appear clean. Detection shifts to behavioral and engine mismatch signals.
- Stealth-maintained forks: Custom Chromium builds (e.g.,
undetected-chromedriver,rebrowser) patch known leaks. They require continuous signal updates. - Privacy tools: Legitimate users running Tor, VPNs, or anti-fingerprinting extensions (CanvasBlocker, Chameleon) trigger network and engine signals. Pattern classification reduces false positives but cannot eliminate them.
- Mobile headless: Android WebView automation and iOS Safari automation have different signal surfaces. Desktop-focused checks miss them.
- No client-side access: If you cannot run JavaScript on the visitor's browser (e.g., API-only endpoints), fingerprinting is impossible. You fall back to server-side heuristics with lower accuracy.
Key Facts
| Signal Category | Example Signals | Spoofing Difficulty | Collection Requirement |
|---|---|---|---|
| Network & Geolocation | WebRTC leak, DNS routing, timezone, language, TTL, JA3 | High (requires full stack control) | Client-side JS + network timing |
| Evasion & Anti-Stealth | CDP leak, native patching, engine mismatch, automation properties | Very High (requires custom browser builds) | Client-side JS execution |
| Behavioral | Mouse tremor, input speed, path geometry, session duration | Extreme (requires human-like simulation) | Client-side event listeners |
| BotRefund Coverage | 106 signals across all three tiers | Pattern classification, not raw scoring | One-minute install, no code changes |
Terminology
- Headless browser: A browser running without a graphical UI, typically controlled via automation APIs (Puppeteer, Playwright, Selenium).
- Fingerprinting signal: A measurable browser, network, or behavioral property that differs between automated and human-driven sessions.
- CDP (Chrome DevTools Protocol): The debugging interface automation tools attach to; its presence or artifacts indicate automation.
- JA3 fingerprint: A hash of TLS Client Hello parameters that identifies the specific browser/version/library making the connection.
- Residential proxy: A proxy route through a real consumer device (often malware-infected), making IP reputation checks ineffective.
- Pixel poisoning: Invalid traffic triggering conversion pixels, causing ad platforms' bidding algorithms to optimize toward bots.
FAQ
Can a single fingerprinting signal reliably catch headless browsers?
No. Sophisticated tooling spoofs individual signals (user agent, webdriver flag, timezone). Reliable detection requires correlating multiple independent signals—network, engine, and behavioral—so the attacker must perfectly spoof all layers simultaneously.
Why does WebRTC leak detection work against proxies?
WebRTC uses STUN servers to discover the client's local network interfaces. Even when HTTP traffic routes through a proxy, the browser's WebRTC stack often sends STUN requests directly, revealing the true local IP (data-center or cloud) alongside the proxy IP.
What is the difference between server-side and client-side bot detection?
Server-side analyzes logs: IP reputation, headers, request rate. It misses residential proxies and headless browsers that send clean headers. Client-side runs JavaScript in the visitor's browser to collect fingerprinting signals (WebRTC, CDP, canvas, behavioral events) that cannot be observed from the server.
How do stealth plugins like puppeteer-extra-plugin-stealth evade detection?
They patch known leak points: hiding navigator.webdriver, mocking chrome.runtime, faking permissions, and normalizing window.outerWidth. However, they often introduce subtle inconsistencies in native function toString() output, prototype chains, or V8 internal properties that Tier 2 signals catch.
Do behavioral signals replace fingerprinting?
They complement it. A bot that passes all static fingerprint checks (custom Chromium build, residential proxy) still struggles to replicate human micro-behaviors: mouse tremor, variable click timing, scroll physics, and session diversity. Behavioral signals catch this final tier.
What happens if I only have server-side access?
You are limited to IP reputation, header analysis, and request patterns. This catches basic scrapers and data-center proxies but misses residential botnets and headless browsers that rotate clean IPs. Client-side collection is necessary for high-accuracy detection.
How does BotRefund use these signals for refund claims?
BotRefund captures GCLIDs (Google) and FBCLIDs (Meta) alongside the behavioral and fingerprinting evidence that proves a click was invalid. This evidence package is submitted directly to Google and Meta billing dispute systems, which require client-side proof—not just server logs—to approve refunds.
Further reading and comparison sources
These external sources provide additional context for evaluating the topic. Their inclusion is not an endorsement.
Learn more
Visit the website for more information.