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.