Skip to main content
FingerprintJS Pro is the detector Apostate is measured against first. Its public playground shows the verdict for the browser that opens it: a suspect score, and the flags that add to it.

What the playground reports

A clean browser on a flagged IP address still scores above zero. Read the flags, not only the score.

From the live tier

The live tier loads the playground in every browser it tests and records these fields:
It passes when none of bot, tampering, anti_detect_browser, virtual_machine, developer_tools and incognito is set. Network flags are recorded and do not fail the test. Latest results shows the newest run.

Behind a proxy with measure-fpjs.py

scripts/measure-fpjs.py measures one headed launch through a proxy. It looks up the exit’s country and timezone through the proxy with curl, gives the persona that locale and timezone, loads the playground, and prints every flag.
It runs headed, so a Linux server needs Xvfb. Use a fresh proxy session for each run: FingerprintJS remembers a visitor, and a returning visitor with a new machine scores differently from a new one. APOSTATE_BINARY points it at a local build.

Compare fairly

  • Measure a control on the same exit: --platform host for the real machine, or Google Chrome. Their difference from the persona is what Apostate changes; what they share is the network and the host.
  • Use the driver your users use. Under plain Playwright, FingerprintJS reports developer_tools on every run; under Patchright, which the packages use, it does not.
  • Several runs, several seeds. One run is one sample.