
Documenting the internals of Fingerprint Pro's commercial agent, not the open-source FingerprintJS library
143 signals named. The bundle unpacked. The wire format decoded.
Run it on your browser · Read the docs · Signal map · Collector sources
| 143 signals, one row each | surfaces touched, status codes, constants compared, value shape |
| The agent, readable | CRC32 names resolved, tables decrypted, wrappers folded, bindings renamed, hash-pinned |
| Every collector as its own file | one signal plus only the helpers it reaches, instead of a 200 KB bundle |
| The collectors, runnable | collect, buildPayload, frame, send from a console. No agent, no network |
| Wire format, end to end | JSON to bytes, deflate-raw over 1024, sealed with a key that ships inside the frame |
What visitor_id is a function of | 7 fields break a match alone, s56 is a bearer token, not a fingerprint |
The whole repository is published at
proofofbots.github.io/fingerprint-pro-internals:
the guide, every generated map as a filterable table, all 143 collector sources syntax highlighted,
and the live explorer. npm run site builds it into docs/, which is what GitHub Pages
serves from main. Open docs/index.html over HTTP to preview a build locally.
npm install
npm run fetch # download the pinned bundle, verify its hash
npm run all # deobfuscate, verify, regenerate every map
npm run site # rebuild the documentation site into docs/
npm run capture # serve the capture page, open it once per browser
To read rather than run, start at the signal map for the inventory and the collector sources for the code behind any single signal.
To watch the agent on a live site, paste spy/fpspy.js into DevTools.
To run the collectors with no agent and no network, open
the explorer, or serve the
repository and open collector/index.html for the raw table.
Everything here describes one pinned build: jsl/4.0.0, sha256 250c7dfe…, fetched 2026-08-07. The
tenant ships new builds and the paths rotate. npm run fetch checks the pin and npm run diff says
what changed.
sources table mapping the wire id to the
collector, so the map is the agent's labels, not assigned ones. 143 ids, 4 of them scheduled first
because they are slow.
01-architecture,
04-collections56, the blob the server issues over the GET leg and the client replays, is a bearer token. Any
payload carrying a bound one answers as that visitor whatever the device reports. With it empty,
seven fields break the identity match on their own, and the rest hold until six groups of them move
at once. 06-identityvisitor_id is a function ofThe shipped bundle is not redistributed here. agent/agent.clean.js is derived work: the same
program with the obfuscation removed and every binding renamed. agent/pin.json carries the hash of
the original so anyone can fetch it and check.
The captures and evidence files are runs against Fingerprint's own public demo tenant with its public API key. Third-party storage entries, proxy sessions and IP addresses are stripped before anything lands in the tree, and the stored frames are rebuilt from the published payloads rather than kept as sent.
Public domain, Unlicense. Use it however you like, anywhere, commercially or not, with no attribution required.
"Fingerprint" and the fingerprint mark are trademarks of Fingerprint. This project is unofficial and not affiliated with, endorsed by or supported by them, and the logo above is a derivative of their mark used to identify what is documented here.
Contact, including takedown and legal enquiries: [email protected]
| directory | what is in it |
|---|
docs/ | the writeup, plus the generated site GitHub Pages serves |
agent/ | the deobfuscated bundle and worker, the decrypted string tables, the pin |
reference/ | generated maps: signals, slices, schema, envelope, codes, endpoints, observed |
collector/ | fp-collect.js, the collectors and codec as one plain module |
site/ | source of the generated site |
spy/ | the DevTools instrumentation script |
captures/ | three browser captures of the pinned build |
profiles/ | a device profile that compiles to a payload |
evidence/ | raw rows behind the identity and attribution findings |
tools/ | the toolchain, one job per file |
artifacts/ | everything generated that is not committed |