What is new account fraud?
New account fraud, also called fake signup fraud, is the mass creation of bogus or duplicate accounts by one person to abuse signup-bound perks (free trials, promos, referral payouts) or to seed downstream abuse. The accounts look distinct on the surface but trace back to a small number of real devices or networks.How ShieldLabs surfaces it
ShieldLabs gives you four things at each signup, and your code decides what to do with them:| Layer | What it answers | Where you read it | Latency |
|---|---|---|---|
| Identification | ”Is this the same device behind a ‘new’ signup, even after cleared cookies, incognito, or a fresh IP?” | The durable device_id on the webhook / History API | About a second |
| Anonymity detection | ”Is this signup masked, spoofed, or anonymous right now?” | The signals array on the webhook / History API | About a second |
| Risk Score | ”How risky is the visit overall, as one 0-100 number?” | risk_score on the webhook / History API | About a second |
| Patterns | ”Has this device or local IP already created many accounts?” | Dashboard Patterns + export | Background (~10 min) |
cookie_id and visitor_id per cleared-cookie or incognito session, and a new IP each time the VPN exit node changes), but the server-derived DeviceID does not, so it collapses those “new” signups back to one machine. The Risk Score flags the obviously anonymous signup the moment it happens, so your code can stop it, and Patterns catch the slow farm that spreads creation over hours or days, each signup looking clean on its own. You want all four.
A high Risk Score (0–100) is not proof of fraud. A legitimate user behind a corporate proxy, a VPN, or a privacy browser can score in the High band. ShieldLabs surfaces the score and the reasons; your signup handler owns the threshold and the verdict.
Prevent fake signups
The rule your code applies: read the session’s Risk Score and named signals at your signup endpoint, before you activate the account — a High-band score requires a second factor, a Medium-band score holds the account for email verification, a Clean or Low score passes through. Layer the patterns on top: a signup whose DeviceID or local IP already carries many accounts escalates one step. The outcome is that the obviously masked signup, and the farm spreading creation across sessions, both meet friction while a real first-time visitor sails in. Two signal sources drive that decision:- Per session (the Risk Score): the Risk Score (0–100) and the anonymity signals behind it — VPN, Proxy, Tor, Privacy Relay, Browser VPN/Proxy, Datacenter IP, Abuser Flag, plus consistency tells like OS Mismatch, Timezone Mismatch, and environment tells like Anti-detect Browser and JavaScript Disabled. Each signal adds its weight to the score, so the automation tells carry the heaviest weights and one alone can push a session into High, while the pure network signals are light, so a VPN-only or Datacenter-only session lands in Low until they stack. You branch on the band, and read each signal’s weight for context.
- Across sessions (Patterns): the dashboard Patterns Many Accounts on One Device (keyed on the durable DeviceID) and Many Accounts on One Local IP (the farm behind one router or NAT, even when each session uses a fresh cookie and a different public IP) link the farm the per-session score cannot see in one request.
Build it
Create a ShieldLabs account and get your keys
Sign up for free and get 5,000 identifications, or log in if you already have an account. Register the domain you want to identify visitors on, then open the Keys page. Use the Public Key to initialize the snippet in the browser, and keep your server-side credentials on your backend: the Private API Key authenticates the History API, and each webhook endpoint has its own
whsec_… signing secret. See Keys.Install the snippet on your signup page
Add the snippet to your signup page and call
checkAnonymous. The callback hands you the requestID to correlate with the score later; the first argument is the client IP, not a score (the score arrives by webhook). Pass undefined for the userHID slot so the callback lands in place.signup.html
Gate signup on the Risk Score
Receive the webhook, verify its HMAC, and cache the score indexed by Branch on the
RequestID. At the signup endpoint, read the score for that session with the shared waitForScore helper (your webhook cache, with a short timeout; falls back to a History API read by request_id), then branch on its band.api/signup.js
score band and, when you need a fast condition for a specific tell, on the boolean detection_flags (vpn, proxy, tor, anti_detect_browser, javascript_disabled, ip_mismatch, and more) — never on the human-readable signal labels, which can change.Read the real network behind a mask. The webhook carries two IPs. public_ip is the public IP and its country, which any VPN or proxy can fake per signup. local_ip is the real network IP, which can expose the network behind the mask. When the two disagree, detection_flags.ip_mismatch is set to true. For a farm rotating fresh public IPs, a shared local_ip is often the durable network tell — the same value the “Many Accounts on One Local IP” pattern correlates on.Catch the farm with Patterns
A single anonymous signup is easy to score. The harder problem is the farm that creates 50 accounts over a week, each one clean in isolation. Patterns link sessions over time and grade flagged entities Suspicious, then Dangerous, as the linked account count crosses thresholds in a rolling window (default 30 days). Levels never downgrade. An entity below the first threshold stays the unflagged baseline, which is never recorded.
Export the flagged entities from the dashboard (CSV or JSON) as a denylist, then check new signups against them. You can also reconstruct a device’s history live: read the History API by
Many Accounts on One Device
Many Accounts on One Device
One device linked to many different accounts — the classic account-farm shape. The grouping identity is the DeviceID, durable across a cookie clear, an incognito window, and an IP rotation. A farm clears cookies and goes incognito between signups specifically to look new every time; the DeviceID links those signups back to one machine anyway.
Many Accounts on One Local IP
Many Accounts on One Local IP
Many accounts created through the same local IP. Catches farms behind one router or one NAT, even when each session uses a fresh cookie and a different public IP. Pair it with the device pattern to catch what spans several browsers but shares a network.
device_id to see every account that device has touched. The response is { data, total }; each element of data is a snapshot (newest first) carrying the user_hid for that session, so distinct user_hid values on one device_id are distinct accounts behind that machine.Gate signup on device history
Account History reads on
account.shieldlabs.ai and webhook delivery are free; the Management History path bills 1 request per returned row (an empty result still bills 1). For high-volume signup flows, prefer the pre-computed pattern export as your denylist and reserve any billed Management reads for the borderline cases.Test it
Reproduce a farm signup before you trust the gate. Load your signup page, complete it once, and note thedevice_id from the webhook. Then clear cookies (or open a new incognito window, or rotate your IP through a VPN) and sign up again: the cookie_id and visitor_id change each time, but the same device_id comes back, which is exactly what “Many Accounts on One Device” links on. Open a genuinely different browser and you will see a new DeviceID — the limit to be aware of when one person uses several separate browsers.
Recommended starting thresholds
The four bands are defined in Risk Scoring, and the per-band action playbook lives in Acting on the Risk Score. Mapped to a signup gate:| Risk Score band | Suggested signup action |
|---|---|
| Clean (0–9) | Create the account, no friction |
| Low (10–29) | Create the account, log the session |
| Medium (30–59) | Require email verification before activating |
| High (60–100) | Require a second factor, or reject and route to support |
Next: Acting on the Risk Score
The full per-band decision playbook, including signal-aware decisioning and how to combine the score with specific signals.