Signup and free-trial abuse

One person with a proxy list is not a hundred customers

Checking the network at registration costs a single call and closes the cheapest way there is to farm a free tier.

The problem

Free tiers are farmed by volume. A proxy list turns one person into as many accounts as they have addresses, and every one of them reads as organic growth in your dashboard right up until the infrastructure bill arrives.

The check belongs at registration, not on every request afterwards. One call per new account is nothing, and registration is the only moment where refusing costs you nothing either.

What to read in the response

Field Why it matters here
residential_proxy Traffic relayed through somebody's home connection. It is the expensive kind to buy and the hardest to spot, which is exactly why the accounts behind it are worth refusing.
proxy True for HTTP, SOCKS and residential proxies together. Use it when you want one flag instead of three.
score A number from 0 to 1, weighing every signal together. Use it when you would rather keep one threshold than a rule per flag.

The residential proxy flag is the one that should change your mind. A datacentre address on a signup form is often just a developer testing from a VM, and refusing it costs you a real user. A consumer connection being resold by the gigabyte is not an accident.

Wiring it up

import requests

def screen_signup(address: str) -> str:
    r = requests.get(
        f"https://novpn.fr/v1/check/{address}",
        headers={"Authorization": f"Bearer {NOVPN_KEY}"},
        timeout=2,
    )

    # Never seen, or we are having a bad day. Neither is the applicant's fault.
    if r.status_code == 404 or not r.ok:
        return "allow"

    check = r.json()

    if check["residential_proxy"]:
        return "refuse"
    if check["proxy"] or check["vpn"]:
        return "verify_email_first"

    return "allow"

Where to draw the line

Refuse on residential_proxy, hold for email verification on proxy or vpn, and let hosting through with a note on the account. Then watch what those accounts actually do for a fortnight before tightening anything.

What happens on an address nobody has seen

An address the database holds nothing on answers 404, not a low score. That is deliberate: there is no country, no operator and no ASN to return either, so a result would be a row of nulls dressed up as an answer. Treat it as no opinion rather than as clean, and decide for your own case whether to let the request through. The address goes into the scan queue and usually resolves within minutes, and the call is free on a paid plan.

Every field, every error code and the exact billing rules are in the documentation. Endpoints

Other things people use it for

Try it against your own traffic.

The free tier is a plan, not a trial. Sign up, copy your key, and make the first call before you decide anything.

Get started