Stop credential stuffing that ignores rate limits

Rate limiting assumes the attacker comes from a few addresses. Residential proxy networks sell millions, so every attempt arrives from a different IP and no single one looks suspicious.

How ZeroBot fits Credential stuffing

This is the attack rate limiting is worst at. The defence that survives it is scoring the client rather than the address: the automation stack behind a stuffing run has a recognisable shape even when the IP has never been seen before. ZeroBot returns that signal per request, so a login attempt from a residential proxy running a headless browser is caught on its first try rather than its hundredth. Pair it with a lockout on the account itself, which is the only layer that stops a genuinely distributed attack once one credential pair has been tried dozens of ways.

Scoring the login attempt

python (login view)

import requests r = requests.post( 'https://api.zerobot.info/v3/openapi', headers={'Authorization': f'Bearer {ZEROBOT_KEY}'}, data={ 'ip': request.remote_addr, 'domain': request.host, 'useragent': request.headers.get('User-Agent', ''), }, timeout=2, # this sits in the login path — keep it short ).json() if r.get('query') == 'failed': r = {} # API error envelope -> fail open if r.get('is_bot') or r.get('risk_score', 0) >= 60: # Same response and timing as a wrong password — do not confirm # to the attacker that the credential itself was valid. audit.log('login_blocked', ip=request.remote_addr, reason=r.get('reason')) return render_login_error() # normal authentication continues here

Full endpoint reference and an interactive tester are in the API docs. Get a key from the free tier — no card required.

Why the usual defences miss it

Per-IP rate limiting

Defeated by design. Each credential pair is attempted once from a different residential IP, so no address ever crosses a threshold.

Account lockout alone

Roughly 1 in 100 attempts succeeds with leaked credentials. Lockout helps, but only after the attempt has been made — and it hands the attacker a way to lock your real users out.

CAPTCHA on login

Stops cheap scripts and is solved for cents by services built for exactly this. It also taxes every one of your real users.

Password breach lists

Useful, but only tell you a credential was leaked — not whether this request is the attacker or the legitimate owner coming back.

Frequently asked questions

Why is the threshold 60 here rather than 80?

Login is where the damage is worst and a false positive is cheap — the user retries or resets. Tighten it, and keep an audit log so you can see what you blocked.

Why return a normal "wrong password" error?

A distinct block message tells the attacker the credential pair was valid, which is exactly what they are paying the proxy network to find out.

Does this replace account lockout?

No, run both. Scoring catches the client; lockout is the only thing that limits damage once a correct credential has been found.

Protect your Credential stuffing app this week.

Free tier, real verdicts, and documentation with a built-in tester.

Get started free →

Related problems ZeroBot solves

Stop scrapers Prevent fake signups Block form bots Stop card testing