spyderproxy

CreepJS: The Browser Fingerprint Tester (2026 Guide)

A

Alex R.

|
Published date

Sun May 10 2026

Quick verdict: CreepJS is the most thorough open-source browser fingerprinting test — it detects more signals than commercial tools like FingerprintJS, plus catches anti-fingerprinting tools themselves (Tor, Brave shields, antidetect spoofs). Use it to validate your antidetect browser setup before deploying to production. The key score: "Trust Score" reflects how consistent and natural-looking your fingerprint is. Below 70% = obvious spoofing; 85%+ = production-ready.

What CreepJS Tests

CreepJS runs 30+ tests against your browser:

  • Canvas, WebGL, audio context fingerprints
  • Font list, system font availability
  • Screen resolution, color depth, pixel density
  • Timezone consistency (TZ vs IP geolocation)
  • Math precision (floating-point quirks per CPU/OS)
  • Plugins, MIME types
  • Permissions API (notifications, geolocation)
  • Network info (effective connection type)
  • Lie detection — tests for inconsistent values that suggest spoofing

The "lie detection" piece is what makes CreepJS unique. Most fingerprinting libraries collect signals; CreepJS additionally checks whether the signals make sense together.

How to Run It

  1. Visit https://abrahamjuliot.github.io/creepjs/
  2. Wait ~5 seconds for all tests to run
  3. Read the result panels

For automated testing (e.g., validating antidetect profiles in CI), self-host CreepJS via the GitHub repo.

Reading the Output

CreepJS produces several distinct outputs:

Trust Score

Top of the page. 0-100%. Reflects:

  • How consistent your signals are (high score = consistent)
  • How rare your fingerprint is in CreepJS's observation database
  • How many "lies" CreepJS detected

Real browsers usually score 95%+. Tor Browser scores ~50% (very consistent within Tor users but extremely rare overall). Antidetect browsers should score 85%+ for production use.

Fingerprint Hash

The persistent identifier CreepJS computes. Same value across page reloads, same value across sessions if your fingerprint is stable. Useful for testing that your antidetect profile maintains consistency.

Lies Detected

The key panel. CreepJS lists every inconsistency it found:

  • "Canvas data unstable" — consecutive canvas reads return different hashes. Your spoof randomizes too aggressively.
  • "WebGL parameters mismatched" — the GL_VENDOR and GL_RENDERER strings do not correspond to a real GPU.
  • "Function lies" — native browser functions (toString, toDataURL) have been overridden, which CreepJS detects via toString length.
  • "User-Agent mismatch" — UA says Chrome but the actual browser features do not match Chrome's capabilities.
  • "Math fingerprint mismatch" — floating-point operations produce results inconsistent with the claimed OS.

Each lie is a vulnerability. For a clean fingerprint, the goal is 0 lies detected.

Per-Section Details

CreepJS breaks results into ~20 sections (Canvas, WebGL, Audio, Fonts, Headless, ...). Each shows the raw value and any anomalies. Useful for debugging which specific spoof is failing.

What "Real" vs "Spoofed" Looks Like

PropertyReal ChromeGood AntidetectBad Spoof
Trust Score95-99%85-95%20-70%
Lies detected00-25+
Canvas stabilityStable across readsStableOften unstable
WebGL rendererReal GPU stringReal GPU string (matched)"Mesa LLVM" or empty
navigator.webdriverundefinedundefinedtrue (headless tell)
Function toStringNative codeNative code"function() { [patched] }"

Using CreepJS to Validate Antidetect Setups

Before deploying antidetect browser profiles to production:

  1. Open the profile in your antidetect browser
  2. Visit creepjs URL
  3. Take a screenshot of the Trust Score + Lies panel
  4. Reload the page and verify the fingerprint hash is identical (consistency check)
  5. Open the SAME profile in 24 hours and verify hash is still the same (persistence check)

If the hash changes between reloads, your spoof is randomizing too aggressively — an obvious anti-fingerprinting signal. Real users have stable fingerprints across all their sessions.

Common Antidetect Browser Failures

1. Canvas Noise Too Aggressive

Adding 5+ pixels of noise per read produces visually-imperceptible but hash-distinct outputs. Real browsers always produce the same hash. CreepJS flags as "Canvas data unstable."

Fix: lower noise (1-2 pixel max) AND seed it deterministically per profile, so the same profile produces the same hash across sessions.

2. WebGL Mismatch

Spoofing the renderer string to "Intel HD Graphics 620" while running on an NVIDIA system — CreepJS notices the WebGL extensions list does not match what an Intel iGPU would actually expose.

Fix: use a renderer string that matches a complete profile (NVIDIA GPU + matching extension list). Antidetect browsers ship preset profiles for this.

3. Function Patching Detectable

Overriding HTMLCanvasElement.prototype.toDataURL with a plain function makes toDataURL.toString() return the patched function source. Real natives return "function toDataURL() { [native code] }".

Fix: use Object.defineProperty + custom toString override that returns the native string. Most antidetect browsers handle this; DIY patches often miss it.

4. Headless Mode Tells

navigator.webdriver = true, missing permissions API, no notifications support. CreepJS flags all of these.

Fix: use stealth plugins (playwright-stealth, undetected-chromedriver).

Alternative Testers

  • EFF Cover Your Tracks (formerly Panopticlick) — less thorough than CreepJS but more user-friendly. Good for general privacy audit.
  • amiunique.org — research project tracking fingerprint uniqueness across users.
  • FingerprintJS demo — commercial fingerprinting library's demo. See exactly what FingerprintJS sees about you.
  • SannySoft bot test — specifically tests for headless browser and bot tells.

For a complete pre-deployment audit, run all four. They catch different issues.

CreepJS + Proxies

Run CreepJS through the SAME proxy your scraper will use. The IP geolocation gets compared to your timezone; if your antidetect browser claims America/Los_Angeles but your proxy IP is in Germany, CreepJS flags it.

Best practice: pair each antidetect profile with a proxy in the matching country. For LTE-mobile workflows, SpyderProxy LTE ($2/IP) supports city-level targeting in 150+ countries.

Related: Canvas fingerprinting, How fingerprints are detected, Top antidetect browsers, Verify your fingerprint.