Layer 1: anonymity at login
A per-request Risk Score on each login attempt. Datacenter, VPN, proxy, Tor, and anti-detect signals are common on stuffing traffic and arrive in real time on the webhook.
Layer 2: fan-out across accounts
Server-side Abuse Patterns that link one source to many accounts: “Many Accounts on One Device”, “Many Accounts on One Local IP”. Read on the dashboard.
Rate-limit on the DeviceID, not just the IP
The reason per-IP limits fail against stuffing is that attackers rotate IPs cheaply (proxy pools, residential proxies, a new exit per request). The DeviceID is harder to move: it is derived from dozens of stable browser components, so it stays the same across an IP rotation within the same browser. Keying your throttle on the DeviceID (alongside the IP and the account) makes rotation stop working.Throttle by DeviceID across rotated IPs
Layer 1: score the login session
A login arriving from a datacenter range, a VPN, Tor, or an anti-detect browser is not proof of an attack, but it is exactly the profile stuffing traffic tends to carry. Read theDetails and weigh the specific signals, not just the number.
Honest framing: a legitimate user on a corporate VPN logs in every day. Anonymity raises friction (a CAPTCHA, a second factor), it does not justify a hard block on its own. Reserve outright rejection for the combination of anonymity, a high failed-attempt count, and a device or IP that is already fanning out across accounts.
Layer 2: catch the fan-out across accounts
The defining shape of stuffing is one source touching many accounts. ShieldLabs links sessions over time and grades each entity Normal → Suspicious → Dangerous as that count climbs.Many Accounts on One Device
Many Accounts on One Device
One device attempting or reaching many different accounts. The grouping identity is the durable DeviceID, so it holds even as the attacker rotates IPs and clears cookies between attempts.
Many Accounts on One Local IP
Many Accounts on One Local IP
Many accounts reached through the same local IP. Catches a single machine or NAT fanning out across accounts behind a rotating public IP.
Changing IDs on One Account
Changing IDs on One Account
The same account whose VisitorID or DeviceID keeps changing, a hint of scripted attempts or anti-detect tooling cycling its environment between tries.
How many accounts has this device touched?
Escalate a known fan-out device
Putting it together
Score every login
Call
checkAuthenticatedUser (or checkAnonymous before the account is known) at the login step. See Snippet setup.Throttle on the DeviceID
Key your failed-attempt counter on the DeviceID as well as the IP and the account, so rotating IPs no longer resets the limit.
Add friction on anonymity (Layer 1)
Require a CAPTCHA on datacenter, VPN, or proxy logins; require a second factor on Tor or anti-detect, or on High scores.
Watchlist the fan-out (Layer 2)
Export “Many Accounts on One Device” and “Many Accounts on One Local IP” from the dashboard and block or step up the Dangerous entities.
Recommended starting policy
A guide, not a rule. Layer the conditions: friction should rise as more of them stack.| Condition | Suggested login action |
|---|---|
| Clean session, normal attempt count | Allow |
VPN / Proxy / Datacenter in Details | Require a CAPTCHA |
Tor or Anti-detect Browser in Details, or Score 60+ | Require a second factor |
| DeviceID over your failed-attempt limit (across rotated IPs) | Rate-limit (HTTP 429) |
| Device or local IP flagged “Many Accounts on One…” | Step up to 2FA or block the device, then review |
Next: Login and 2FA
The step-up authentication pattern that pairs with this throttle: when to escalate a risky login to a second factor.