Key the ban on the DeviceID
Record the DeviceID (and the local IP) on a device-level banlist when you ban someone. It survives the cookie clear that a cookie-keyed ban does not.
Check it before the cookie matters
On every visit, compare the incoming DeviceID against your banlist first. A banned DeviceID under a new VisitorID or a new account is the return you are looking for.
The DeviceID is browser-bound. A different browser on the same machine, or a wiped or materially changed device, can produce a new DeviceID, so treat your device-level counts as estimates and pair the DeviceID with the local IP. The honest limits are spelled out below.
Ban the device, not the cookie
When you ban a user, write down what travels with them. The cookie and the account both reset on demand; the DeviceID and the local IP are what a returning user has to keep using.When you issue a ban
waitForScore is the shared webhook-cache read (poll the cache, then fall back to a History API read by request_id) that the Cookbook defines once, so this recipe only carries the banlist logic that is unique to ban evasion.
Check the banlist on every visit
Run the lookup at the start of the session, before you trust the cookie or even know which account this is. A banned DeviceID arriving under a fresh VisitorID is the tell that someone cleared storage to get back in.Gate the session on the device banlist
Description is a human-readable label for visibility and logging. Branch on the Score and each entry’s Value, not on the label text, which can change.Why the DeviceID holds when the cookie does not
The VisitorID lives in browser storage, so clearing cookies or opening an incognito window resets it, exactly the move a returning banned user makes. The DeviceID is computed on the server from stable browser and device characteristics rather than read from a cookie. Because it is derived and not stored, the same browser hands back the same DeviceID after the storage is gone. That durability across cookie clears, incognito, and IP rotation is what makes it a banlist key, and the identification reference covers how the two identifiers differ.Where the all-zero DeviceID comes from
A session that blocks the fingerprint or runs with JavaScript disabled cannot produce stable device characteristics, so the server has nothing to derive a real DeviceID from. It returns the all-zero DeviceID (00000000-0000-0000-0000-000000000000) and scores it 90, in the High band. That high score reflects an evasive or non-cooperating client, not a confirmed ban.
Spot the evasion pattern in the dashboard
The per-visit banlist stops a known device at the door. The dashboard Abuse Patterns show you the evasion shape over time, grading each flagged entity Suspicious or Dangerous as the count crosses a threshold in a rolling window. An entity below the first threshold is simply the unflagged baseline, never recorded as a grade.Changing IDs on One Account
Changing IDs on One Account
One account whose VisitorID or DeviceID keeps changing, a hint of cleared storage, anti-detect tooling, or an environment cycled between visits to look new each time.
Many Accounts on One Device
Many Accounts on One Device
One device tied to many accounts, the shape of a banned user who keeps registering fresh accounts from the same machine to get back in.
Shared Local IP Across Multiple Accounts
Shared Local IP Across Multiple Accounts
Reconstruct a device’s history programmatically
You can also check what a device has done from the History API. Read bydevice_id to see every session and account that machine has touched, newest first.
Read one device's history
Confirm a banned device's return
The History API bills 1 request per returned row (an empty result still bills 1), whereas the webhook delivery is free. Lean on the per-visit banlist lookup and the pre-computed pattern export for routine enforcement, and reserve live
device_id reads for the cases you are actively confirming.Putting it together
Identify the session
Load the snippet and run an identification at the start of the visit so the DeviceID and local IP are available before you trust the cookie.
Record device keys at ban time
When you ban a user, persist their DeviceID and local IP on a device-level banlist, not just the account id, as covered in the webhooks setup for getting those fields.
Check the banlist before the cookie
On every visit, look up the incoming DeviceID first. Block a banned device; review a banned local IP on a new device.
Route the all-zero DeviceID to review
A blocked or JS-disabled session returns the all-zero DeviceID and scores 90. Never auto-ban it. Send it to manual review with the IP and account context.
Watch the patterns and tune
Pull “Changing IDs on One Account”, “Many Accounts on One Device”, and “Shared Local IP Across Multiple Accounts” from the dashboard, feed the Dangerous entities into your banlist, and start in logging-only mode before you turn on hard blocks.
Recommended starting policy
A guide, not a rule. The local IP is a soft key on purpose, since legitimate visitors share networks.| Condition | Suggested action |
|---|---|
| Incoming DeviceID on your banlist | Block, the banned device has returned |
| New device, but local IP matches a banned session | Review, could be a shared network |
| All-zero DeviceID (blocked or JS-disabled, score 90) | Manual review, never auto-ban |
| ”Changing IDs on One Account” or “Many Accounts on One Device” (Dangerous) | Add the entity to your banlist, then review |
| Clean device, no banlist match | Allow |
Next: Stop Multi-Accounting at Signup
The companion pattern for the registration step: catch the fresh accounts a banned user opens before they get created.