Seatext library / BotRefund evidence
Browser Fingerprinting Techniques That Detect Playwright: A Practical Reference
Playwright detection relies on inconsistencies between automated and real browsers — navigator.webdriver flags, canvas and WebGL rendering differences, missing or patched APIs, and behavioral timing gaps. No single signal proves automation; reliable detection correlates...
✓ Built for advertisers who need clear, refund-ready traffic evidence.
Typical browser fingerprinting techniques that detect Playwright include checking the navigator.webdriver property, analyzing canvas and WebGL rendering output for subtle differences, detecting patched or missing browser APIs, measuring JavaScript execution timing anomalies, and evaluating behavioral patterns like mouse movement, scroll velocity, and click timing. These signals are rarely used in isolation; production systems correlate 50–110 independent checks to reach high-confidence verdicts.
What Browser Fingerprinting Actually Checks
Fingerprinting collects observable properties of a browser session — properties that a real user's browser exposes consistently and an automated browser often distorts. The goal is not to find a single "gotcha" but to build a pattern that distinguishes human-driven sessions from scripted ones.
Common collection points include:
- Navigator and window properties:
navigator.webdriver,navigator.plugins,navigator.mimeTypes,window.chromeruntime objects. - Rendering fingerprints: Canvas
toDataURL()output, WebGLgetParameter()values, font enumeration viameasureText(). - API surface integrity: Presence and behavior of
document.createElement,Element.prototype.attachShadow,PerformanceObserver, and permission APIs. - Timing and behavior: Event loop latency,
requestAnimationFramecadence, mouse trajectory entropy, scroll physics, click-to-load intervals. - Network and TLS: JA3/JA3S fingerprints, HTTP/2 frame ordering, header consistency, cookie handling.
Each vector produces a data point. A detection engine weighs the ensemble, not the outlier.
How Playwright Leaves Traces
Playwright drives real browser binaries (Chromium, Firefox, WebKit) via the DevTools Protocol or CDP. That architecture gives it high fidelity but also creates detectable seams:
- Init-script injection: Playwright often injects initialization scripts before page load to mask automation markers. Those scripts can be detected by re-checking the same APIs from a different context — for example, evaluating a property in an iframe versus the top frame, or comparing
Object.getOwnPropertyDescriptorresults across realms. BotRefund's Playwright Init Scripts check is built on this principle: it looks for a mismatch that a real browsing session does not normally create (S1). - CDP side effects: Even when
navigator.webdriveris hidden, the presence of a CDP session can alter internal browser state — such asPerformanceNavigationTimingentries orchrome.loadTimes()— that a normal user never triggers. - Permission and prompt handling: Automated flows often auto-grant or dismiss permissions (geolocation, notifications, clipboard) in ways that differ from human interaction timing.
- Input synthesis: Playwright's
page.mouse.move(),click(), andtype()generate synthetic input events. High-resolution event listeners can observe missingmovementX/Y, uniform velocity profiles, or absent pressure/tilt data on pointer events.
Common Detection Vectors in Detail
1. navigator.webdriver and Automation Flags
The most basic check. In a standard browser, navigator.webdriver === false (or undefined). Automation frameworks historically set it to true. Modern stealth plugins override the property, but the override itself can be detected by checking the property descriptor (Object.getOwnPropertyDescriptor(navigator, 'webdriver')) or by reading the value from a cross-origin iframe where the override may not apply.
2. Canvas Fingerprinting
Drawing a fixed set of shapes, text, and gradients to a <canvas> and exporting toDataURL() produces a hash that varies by GPU, driver, OS, and browser version. Playwright running in headless mode or on a different OS than the claimed user-agent often yields a different hash. Some stealth setups add noise to the canvas, but consistent noise patterns are themselves a signal.
3. WebGL Parameter Enumeration
gl.getParameter(gl.RENDERER) and gl.getParameter(gl.VENDOR) expose the GPU driver string. A mismatch between the claimed device (e.g., macOS Chrome) and the reported renderer (e.g., "Google SwiftShader" or a Linux Mesa driver) is a strong indicator of automation or spoofing.
4. Font and Emoji Metrics
Measuring glyph bounding boxes for a curated font stack (system fonts, emoji, fallback fonts) reveals the actual font rendering stack. Headless environments often lack proprietary fonts (San Francisco, Segoe UI) or render emoji differently, producing measurable deviations.
5. AudioContext Fingerprinting
Creating an OfflineAudioContext, rendering a known oscillator signal, and hashing the output captures audio stack differences. This is less common but used in high-sensitivity environments.
6. Behavioral Timing and Interaction Entropy
Human input exhibits micro-variance: mouse curves follow Fitts's law, scroll deceleration is non-linear, click intervals follow a log-normal distribution. Scripted interactions often show linear interpolation, fixed delays, or zero-jitter paths. Collecting hundreds of events per session lets a model separate the distributions.
Why Single Signals Aren't Verdicts
Privacy tools (anti-fingerprinting extensions, Tor Browser), corporate proxies, VPNs, unusual hardware, and accessibility settings can all produce fingerprint anomalies for genuine users. Treating any one anomaly as proof of automation generates false positives that block real customers and poison analytics.
BotRefund's approach illustrates the principle: a single anomaly is kept as evidence — not a verdict — and cross-checked against independent browser, network, device, and behavior data (S1). The system runs 106 independent checks (S1) and, across the full platform, 110+ signals spanning behavioral, browser, hardware, network, and attribution layers (S2). Accuracy comes from corroboration, not one browser tell.
How BotRefund Corroborates Evidence
When a Playwright Init Scripts mismatch appears, the engine asks:
- Do network signals (TLS fingerprint, IP reputation, ASN) align with a residential user?
- Do device signals (screen resolution, battery API, hardware concurrency) match the claimed user-agent?
- Do behavioral signals (scroll depth, dwell time, click paths) resemble human distributions for this page type?
- Do attribution signals (click ID, campaign parameters, referrer chain) show a coherent paid-click journey?
Only when multiple independent layers point to automation does the AI prediction assign high confidence — up to 99% when the session evidence supports it (S1, S5). Each finding includes a session-by-session explanation with click IDs, timestamps, and signal-by-signal reasoning formatted for Google and Meta review teams (S2).
Practical Implications for Advertisers
If you run paid campaigns on Google or Meta, undetected Playwright traffic does three things:
- Inflates click costs: You pay for visits that never convert.
- Poisons pixel training: Conversion pixels fire on bot sessions, teaching smart-bidding algorithms to optimize for bot-like behavior. BotRefund calls this "pixel poisoning" (S3, S6).
- Blocks refund eligibility: Platforms only credit invalid activity when you supply forensic evidence — click IDs, session recordings, and a signal breakdown their reviewers can verify (S2, S4).
Client-side detection that survives proxy rotation and headless spoofing is the evidence layer that makes refund claims viable. Server-side logs alone cannot see canvas hashes, WebGL strings, or mouse entropy.
Key Facts
| Fact | Detail | Source |
|---|---|---|
| Independent checks per session | 106 (Playwright-specific); 110+ across full platform | S1, S2 |
| Playwright Init Scripts detection principle | Looks for mismatch created by automation patching APIs; re-checks from another angle | S1 |
| Single-anomaly policy | Treated as evidence, not verdict; cross-checked against browser, network, device, behavior | S1 |
| Confidence threshold | Up to 99% when session evidence supports it | S1, S5 |
| Refund-ready report contents | Click IDs, campaign details, timestamps, session recordings, signal-by-signal reasoning | S2 |
| Client refund recovery rate | 83% of 2,500+ audited brands recover funds from Google and Meta | S2 |
| Detection vectors | 50+ vectors covering browser, device, network, pointer/scroll behavior, rendering, navigation flow | S5 |
Limitations and When This Advice Doesn't Apply
- Testing and QA environments: Playwright used for legitimate end-to-end testing on staging domains should be allow-listed; fingerprinting there is noise.
- Accessibility tooling: Screen readers, voice control, and switch devices produce input patterns that resemble automation. Detection must accommodate them.
- Privacy-focused browsers: Tor, Brave with fingerprinting protection, and hardened Firefox builds intentionally normalize or randomize fingerprints. They will flag on many vectors but are human.
- Corporate VDI and remote desktop: Virtualized desktops often show GPU renderer mismatches (e.g., Citrix/VMware virtual GPUs) and uniform input timing.
- Single-signal blockers: Any solution that blocks on
navigator.webdriveralone will produce high false-positive rates.
FAQ
Can Playwright stealth plugins evade all fingerprinting?
They reduce the surface — hiding navigator.webdriver, patching canvas, spoofing WebGL — but each patch creates a new consistency check. Cross-context verification (iframe vs top frame, main world vs isolated world) and behavioral entropy remain hard to fake at scale.
Does headless mode make detection easier?
Yes. Headless Chromium historically exposed distinct flags (e.g., missing chrome.loadTimes(), different navigator.plugins length, SwiftShader renderer). Modern headless ("new headless") closes many gaps, but rendering and timing differences persist.
What's the difference between server-side and client-side detection?
Server-side sees IP, headers, TLS, and request patterns. Client-side sees the rendered browser: canvas, WebGL, fonts, audio, mouse, scroll, and API integrity. Sophisticated bots rotate residential proxies and valid headers; only client-side signals catch the browser itself.
How many signals are needed for a reliable verdict?
There is no fixed number. BotRefund uses 106+ independent checks and requires corroboration across layers. A cluster of 3–5 aligned anomalies (e.g., canvas mismatch + WebGL renderer mismatch + linear mouse path + data-center IP) is often sufficient; a single anomaly never is.
Can fingerprinting data be used for Google/Meta refund claims?
Yes, when packaged as a session-level report with click IDs (GCLID, FBCLID), timestamps, campaign context, and a signal-by-signal narrative. Platform reviewers expect that structure; raw logs are rarely accepted (S2, S4).
Does blocking detected bots hurt real users?
If you block on a single signal, yes. If you block only on high-confidence, multi-layer verdicts and provide a challenge (CAPTCHA, device attestation) for edge cases, false positives drop to near zero. BotRefund's model is designed for that threshold (S1).
What should I compare when evaluating bot-detection vendors?
Compare: (1) number and independence of detection vectors, (2) client-side vs server-side coverage, (3) refund-report format acceptance by Google/Meta, (4) false-positive rate on privacy tools and corporate networks, (5) integration effort (tag vs SDK vs proxy), (6) negotiation support with platforms.
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.