1
Create an account
In the dashboard, create a domain (for example
myshop.com) — no credit card required. Each domain gets its own key pair:2
Install the snippet
The snippet is an ES module loaded from the CDN with a dynamic The snippet POSTs the signals automatically and returns a Promise. The browser computes no VisitorID, DeviceID, or Risk Score. Those come back server-side.The signature is
import(). It runs in the browser only.Drop this into your page and swap in your Public Key.checkAnonymous(userHID?, callback?) and checkAuthenticatedUser(userHID, callback?). The optional callback fires after the POST and gives you the client ip and the requestID. Use the requestID to correlate this check with the webhook you receive — forward it to your backend (shown below) so your server can match the webhook or read the History API for this visit. The first argument is the client IP, not the score. The Risk Score arrives later by webhook.Copy-paste versions for Native JS, React, Angular, Vue, Preact, and Svelte live at Install the snippet.
Want to confirm it works right now? Load a page with the snippet, then open your dashboard. The visit and its Risk Score show up within a few seconds — the fastest check before you wire the score into your own backend (the webhook below, or a read from the History API).
3
Register and verify the webhook
This step wires the score into your own backend. (If you only wanted to see it work, the dashboard check above already did that.)Register an endpoint in the dashboard (Webhooks tab on your domain). Within about 1 second of the browser check, ShieldLabs POSTs a JSON event to that URL. The signature travels in the Always verify Two behaviors to handle up front:
X-Shield-Signature header, not in the body.Each signal
name is a stable slug — branch on name, detection_flags, and risk_score, not on display labels from the History API.X-Shield-Signature before trusting the payload. It is sha256= plus the hex HMAC-SHA256 of the raw request body, keyed with that endpoint’s whsec_… signing secret.Node.js
- One webhook per scored identification. The server waits up to ~60s for optional follow-up network checks, then sends the final
scoreonce. When no follow-up is expected, it arrives in about a second. - There are no retries. Delivery is at-most-once. Make your handler idempotent on
request_id, and poll the History API for guaranteed reads.
4
Act on the Risk Score
The Risk Score is 0 to 100, capped at 100. Higher means more anonymous, more likely masked, spoofed, or abusive. Every score ships with
signals, so you see which signals fired.Decide what to do per band. These are recommendations, not enforced rules. Your code owns the verdict.Next steps
Identification
Persistent VisitorID and DeviceID, and how they survive cleared cookies.
Anonymity Signals
VPN, proxy, Tor, and anti-detect browser signals, with the scoring reference.
Risk Scoring
How the 0 to 100 score is built, what
signals contains, and the bands.Patterns
Ready-made patterns computed across your historical traffic. They refresh periodically, so newly seen entities surface after a short delay, not instantly.
Traffic Analytics
Rank every source by the risk and anonymous-traffic share it delivers.
Acting on the Risk Score
Turn the score and signals into allow, challenge, review, and block logic.