Documentation
Install, identify, verify
From zero to a stable visitorId in a few minutes.
01 Install
npm install @prynt/js
Or load it from a CDN — or your own self-hosted server — with no build step:
<script src="http://127.0.0.1:5050/cdn/prynt.umd.js"></script>
02 Identify a browser
import Prynt from '@prynt/js';
const prynt = await Prynt.load({
apiKey: 'pk_live_your_public_key',
endpoint: 'http://127.0.0.1:5050',
extendedResult: true, // include Smart Signals
});
const result = await prynt.identify({ tag: { action: 'signup' } });
console.log(result.visitorId); // vst_… (stable)
console.log(result.confidence.score); // 0.985
console.log(result.smartSignals.bot); // { result: false } 03 Verify on your server
Never trust the browser response alone. Confirm it from your backend with the secret key:
curl "http://127.0.0.1:5050/v1/events/REQUEST_ID" \ -H "Authorization: Bearer sk_live_your_secret_key"
Response shape
{
"requestId": "req_…",
"visitorId": "vst_…",
"visitorFound": true,
"confidence": { "score": 0.985, "level": "high" },
"smartSignals": {
"bot": { "result": false },
"incognito": { "result": false },
"vpn": { "result": false },
"tor": { "result": false },
"datacenter": { "result": false },
"residentialProxy": { "result": false },
"ipReputation": { "result": false, "score": 0.0 }
}
} How matching works
The agent collects ~20 entropy signals — canvas, WebGL, audio, fonts, math/FPU, hardware,
timezone and more — and hashes the high-entropy ones on-device, so raw data never leaves the
browser. The server fuses them with entropy-weighted scoring and reconciles redundant client
storage (cookie + localStorage + IndexedDB) into a stable visitorId plus a
confidence score. Drift is healed on every visit, so the identity survives browser updates and
partial signal changes.