Free · Client + server view · No signup
The full browser fingerprint report
One page, every signal a website can read from your browser. Canvas, WebGL, audio, fonts, WebRTC, client hints, hardware, storage, TLS, and the exact HTTP request your server sees. Reflected back to you, side by side.
Running fingerprint checks in your browser…
User-Agent
The claim your browser opens with
A single string that names your browser, version, and OS. The first thing every anti-bot script reads, and one of the easiest to spoof, and get wrong.
Go deeper →Running fingerprint checks in your browser…
Client hints
The structured UA of the future
Chromium sends UA info in a set of Sec-CH-UA-* headers and exposes it via navigator.userAgentData. Two views, one truth, they'd better agree.
Go deeper →Client hints (JavaScript view)
From navigator.userAgentData
Requesting high-entropy client hints...
Client hints (server view)
From the Sec-CH-UA-* headers the browser sent to the server
Fetching /api/headers.php...
Canvas
Your GPU rendering, hashed
Draw text and shapes on a hidden canvas, read the pixels back, hash them. Stable across sessions, unique across GPUs, near-impossible to spoof without hardware.
Go deeper →Running fingerprint checks in your browser…
WebGL
Your unmasked GPU vendor and model
WEBGL_debug_renderer_info exposes a string like ANGLE (NVIDIA, GeForce RTX 4060). If it says SwiftShader or llvmpipe, you're headless on a server.
Go deeper →Running fingerprint checks in your browser…
Audio
Your DynamicsCompressor DSP signature
An offline audio context rendering a triangle wave through a compressor. The floating-point output is CPU-specific and cheap to hash.
Go deeper →Audio fingerprint
Rendering 44100 offline samples...
Fonts
Which fonts you have installed
Probed with a width-comparison trick that needs no permission. The exact combination is often unique enough to identify you across sites.
Go deeper →Font enumeration
Probing 134 fonts...
Hardware
Cores, memory, GPU tier, battery
What your browser lets scripts read about the machine: CPU cores, deviceMemory bucket, touch points, battery state, and the Web Bluetooth / USB / HID surfaces.
Go deeper →Hardware profile
Reading signal in your browser...
Display
Resolution, DPI, color, refresh rate
Screen size, DPR, color depth, gamut, HDR, orientation, plus CSS media-query preferences and a rough measured refresh rate.
Go deeper →Screen & display
Measuring refresh rate over ~300 ms...
Timezone & locale
Your time and language, in detail
IANA timezone, UTC offset, navigator.languages, locale, calendar system, numbering system, and first day of the week. The classic proxy-mismatch signal.
Go deeper →Timezone & locale
Reading signal in your browser...
Media devices & codecs
Cameras, microphones, codecs
Device counts from enumerateDevices (no labels), plus the codec matrix from canPlayType. The codec answers narrow down browser + OS + version.
Go deeper →Media devices & codecs
Reading signal in your browser...
Permissions
Every well-known permission state
Silent query for geolocation, notifications, camera, mic, midi, clipboard, sensors, and more. The set of supported names is browser-specific.
Go deeper →Permissions
Querying browser permission states...
Storage
Which persistence surfaces you expose
Cookies, localStorage, sessionStorage, IndexedDB, Cache Storage, Service Worker, WebSQL, and the storage quota bucket.
Go deeper →Storage APIs
Reading signal in your browser...
Plugins & MIME
What navigator.plugins says
Modern Chrome exposes the internal PDF Viewer here; Firefox and Safari expose different sets. Empty on a Chrome UA is a classic headless leak.
Go deeper →Plugins & MIME types
Reading signal in your browser...
WebRTC leak
Are your LAN and public IPs exposed?
RTCPeerConnection gathers ICE candidates that reveal your LAN and post-NAT public IPs. Bypasses many VPN configurations.
Go deeper →WebRTC leak check
Gathering ICE candidates (up to 2 s)...
HTTP headers
Exactly what you sent to the server
Server-side dump of the HTTP request your browser just made: standard headers, client hints, Sec-Fetch-* metadata, IP, and privacy signals.
Go deeper →HTTP headers
Fetching /api/headers.php...
TLS & HTTP transport
Your TLS handshake, reflected back
Version, cipher suite, ALPN, and HTTP/1.1 vs HTTP/2 vs HTTP/3, whatever the front-end server chose to expose. Plus any JA3 / JA4 headers from the edge.
Go deeper →TLS & HTTP transport
Fetching /api/tls.php...
How to read the report
The overview at the top runs 20 headless-detection heuristics and produces a bot score. Everything below it is a raw readout, grouped by signal category, so you can copy the value, compare it against the browser you're targeting, and find the exact mismatch. Each section links to a deep-dive page with more context, spoofing tips, and FAQs.
Client-side signals
User-Agent, canvas, WebGL, audio, fonts, hardware, screen, locale, permissions, storage, plugins, WebRTC. All read by JavaScript in your browser. No network calls beyond fetching /api/headers.php and /api/tls.php.
Server-side signals
HTTP request headers, client hints as sent on the wire, IP, TLS version and cipher, HTTP protocol version. Reflected back by our PHP endpoints; nothing is stored or logged.
Programmatic version
Hit /api/check from your HTTP client for a headers-only bot score. Good for curl / Python / Go without a browser.
What we don't have
Full JA3/JA4 unless the edge proxy publishes them, real TCP-layer probes (need kernel access), and any commercial IP reputation feed. For those, pair this tool with your proxy provider's dashboard.
Frequently asked questions
→What is a browser fingerprint?
A browser fingerprint is the combination of signals a website can read from your browser, User-Agent, screen size, fonts, canvas rendering, WebGL hardware, timezone, language, plugins, and dozens of other properties. Together those signals are usually unique enough to identify a specific device, even with cookies disabled. Sites use this for tracking and for bot detection.
→Why is my scraper being detected even with proxies?
Proxies only change your IP. They don't change your fingerprint. If your headless browser still reports navigator.webdriver=true, missing chrome.runtime, an unusual WebGL renderer like 'Google SwiftShader', or a timezone that doesn't match the proxy's country, you're flagged regardless of how clean the IP is. Run the test on this page to see what you're actually leaking.
→How do I make my headless browser undetectable?
Start with stealth plugins (puppeteer-extra-plugin-stealth, playwright-stealth, undetected-chromedriver). Then patch the obvious leaks: spoof navigator.webdriver, fix the WebGL UNMASKED_RENDERER_WEBGL string, match timezone and language to your proxy, ensure window.chrome exists, and check that Notification.permission isn't stuck on 'denied'. Test after each fix using this page.
→Can a website really see my GPU?
Yes, via the WebGL UNMASKED_RENDERER_WEBGL extension, sites can read your real GPU vendor and model. Headless browsers running in cloud VMs typically report things like 'Google SwiftShader' or 'llvmpipe', which is an instant bot signal. Spoofing this requires patching the WebGL extension at the driver level.
→What is canvas fingerprinting?
A site draws text and shapes onto a hidden HTML canvas, then reads back the pixel data and hashes it. Tiny differences in your GPU, drivers, anti-aliasing, and font rendering produce a stable hash unique to your hardware. Two clean Chrome installs on identical OSes will still produce different hashes if the GPUs differ.
→Does this tool send my fingerprint to a server?
Almost entirely client-side. Canvas, WebGL, audio, fonts, WebRTC, hardware, screen, permissions, storage, plugins, timezone, and locale all run in your browser and never leave it. Two sections do call the server, /http-headers and /tls, because HTTP request headers and TLS handshake data aren't visible to JavaScript. Those endpoints (/api/headers.php and /api/tls.php) reflect the request back to you and store nothing.
→Is browser fingerprinting legal?
Yes, but disclosure is regulated under GDPR (EU) and similar privacy laws, sites using fingerprinting for tracking generally need consent. For bot detection (your case as a scraper) it's universal and unregulated.
→How do I generate a fake but realistic User-Agent?
Don't randomize blindly, bot detectors check whether your User-Agent string matches your other signals. A Windows UA with a macOS timezone and Linux WebGL renderer is a giveaway. Pick a real, current UA (Chrome on Windows is safest), then make sure platform, languages, timezone, and screen size all match a real machine with that UA. The /user-agent page on this site shows what your current UA actually claims.
Learning web scraping?
Foundations, static scraping, dynamic web, and APIs. A full curriculum on getting past bot detection.
Start the curriculum →