Skip to main content
Sign up for free and get 5,000 identifications, or log in if you already have an account. Then follow these steps to your first Risk Score.
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:
The Secret Key and each webhook whsec_… secret stay on the backend, like a database password. See Keys and Webhooks.
2

Install the snippet

The snippet is an ES module loaded from the CDN with a dynamic import(). It runs in the browser only.Drop this into your page and swap in your Public Key.
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 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 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.
Always verify 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
HMAC the raw request body bytes as received. Re-serializing the parsed JSON changes the bytes and the signature will not match.
Two behaviors to handle up front:
  • One webhook per scored identification. The server waits up to ~60s for optional follow-up network checks, then sends the final score once. 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.
More detail lives in Webhooks.
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.
A legitimate user can score high (corporate proxy, VPN, or a privacy browser). Decide on Score + signals + action context, never the number alone. Tune thresholds gradually.

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.