VPN Blocker

A Service tracking over 125 Million VPN and Hosting IP Addresses

One API call tells you if an IP is a VPN, proxy, Tor exit or hosting address, and how sure we are.

No charge · 10,000 free lookups a month

VPN, Proxy, Tor and Hosting

Every answer says what kind of address it is (VPN, proxy, Tor exit or hosting) and comes with a confidence score. Block exactly what you want, as strictly as you want.

Developer Friendly

Our API supports output in JSON, XML, and HTML, giving you the flexibility to choose the format that works best for your application. Authenticate with your API key and easily integrate our API into your existing workflow, platform, or development environment.

Always Updated

Our machine learning models categorize networks continuously, and every change goes live straight away, with no deploys or downtime on your side. Tor exits are refreshed every hour, and fixes from IP reports apply to every customer at once.

Plans That Grow With You

Start free with 10,000 lookups a month, then scale up to 5 million. Every plan includes the dashboard, usage stats and alerts, and IP reports. Paid plans keep working 10% past their limit, so a busy month won't cut you off by surprise.

See it in action

Real answers for real IP addresses

VPN Blocker is an API that detects IP addresses belonging to VPN, proxy, Tor and hosting networks, so you can keep fraud, abuse and ban evasion away from your payment pages, sign-up forms, game servers and chat rooms.

Each lookup tells you who owns the network, what kind of address it is and how confident we are. Pick an example to see a full Professional response:

A Hetzner server in Nuremberg, Germany. It’s a data center address, so host-ip is true and the category is hosting.

Create a free account Read the docs

Hosting: A Hetzner server in Nuremberg, Germany. It’s a data center address, so host-ip is true and the category is hosting.

GET https://api.vpnblocker.net/v2/json/116.203.10.10
{
    "status": "success",
    "package": "Professional",
    "remaining_requests": 987654,
    "ipaddress": "116.203.10.10",
    "host-ip": true,
    "categories": ["hosting"],
    "confidence": 90,
    "hostname": "static.10.10.203.116.clients.your-server.de",
    "org": "Hetzner Online GmbH",
    "country": {
        "name": "Germany",
        "code": "DE"
    },
    "subdivision": {
        "name": "Bavaria",
        "code": "BY"
    },
    "city": "Nuremberg",
    "postal": "90403",
    "location": {
        "lat": 49.4527,
        "long": 11.0783
    }
}

VPN: A commercial VPN server in Gothenburg, Sweden. It has no reverse DNS name, so hostname is the IP itself.

GET https://api.vpnblocker.net/v2/json/185.213.154.68
{
    "status": "success",
    "package": "Professional",
    "remaining_requests": 987653,
    "ipaddress": "185.213.154.68",
    "host-ip": true,
    "categories": ["vpn"],
    "confidence": 90,
    "hostname": "185.213.154.68",
    "org": "31173 Services AB",
    "country": {
        "name": "Sweden",
        "code": "SE"
    },
    "subdivision": {
        "name": "Västra Götaland County",
        "code": "O"
    },
    "city": "Gothenburg",
    "postal": "415 02",
    "location": {
        "lat": 57.7065,
        "long": 11.967
    }
}

Tor exit: A current Tor exit. tor is about the IP, not its network, so host-ip stays false.

GET https://api.vpnblocker.net/v2/json/185.220.101.33
{
    "status": "success",
    "package": "Professional",
    "remaining_requests": 987652,
    "ipaddress": "185.220.101.33",
    "host-ip": false,
    "categories": ["tor"],
    "confidence": 98,
    "hostname": "tor-exit-33.for-privacy.net",
    "org": "Stiftung Erneuerbare Freiheit",
    "country": {
        "name": "Germany",
        "code": "DE"
    },
    "subdivision": {
        "name": "Brandenburg",
        "code": "BB"
    },
    "city": "Brandenburg an der Havel",
    "postal": "14621",
    "location": {
        "lat": 52.6171,
        "long": 13.1207
    }
}

Home ISP: A home connection in Canada. Nothing to flag: categories is empty and confidence is 80.

GET https://api.vpnblocker.net/v2/json/70.68.0.1
{
    "status": "success",
    "package": "Professional",
    "remaining_requests": 987651,
    "ipaddress": "70.68.0.1",
    "host-ip": false,
    "categories": [],
    "confidence": 80,
    "hostname": "70.68.0.1",
    "org": "Shaw Communications",
    "country": {
        "name": "Canada",
        "code": "CA"
    },
    "subdivision": {
        "name": "British Columbia",
        "code": "BC"
    },
    "city": "Maple Ridge",
    "postal": "V2X",
    "location": {
        "lat": 49.222,
        "long": -122.6181
    }
}
How it works

Three steps to cleaner traffic

  1. Get a key

    Create a free account and copy your API key from the dashboard. No charge, 10,000 lookups a month.

  2. Look up an IP

    Send your visitor’s IP address in one HTTPS request and get JSON, XML or HTML back.

  3. Decide

    Block, challenge or allow based on categories and confidence, as strictly as you need.

Use cases

Built for the places abuse shows up

Game servers

Keep banned players from coming straight back through a VPN, and stop alt accounts made from cloud servers.

Any plan

Sign-up and promo abuse

Spot sign-ups, referral and coupon claims from VPNs, proxies and data centers before they cost you.

Any plan

Payment fraud

Flag checkouts from anonymizing networks, and compare the IP’s country with the card’s billing country.

Professional and up

Surveys and giveaways

Keep each entry to one real person by turning away entries from VPNs, proxies and Tor.

Any plan

Streaming and licensing

Enforce regional rights with country and region data, and catch VPNs used to get around them.

Professional and up

APIs and scraping

Hosting addresses are where most bots run. Rate-limit or challenge them without bothering home users.

Any plan
Quickstart

A few lines in your language

Each example blocks hosting, VPN and proxy addresses and Tor exits, and lets users through if a lookup fails.

curl

curl -s -H "X-API-KEY: $VPNBLOCKER_KEY" https://api.vpnblocker.net/v2/json/185.220.101.1

PHP

<?php
function shouldBlock(string $ip): bool
{
    $ch = curl_init('https://api.vpnblocker.net/v2/json/' . rawurlencode($ip));
    curl_setopt_array($ch, [
        CURLOPT_HTTPHEADER => ['X-API-KEY: ' . getenv('VPNBLOCKER_KEY')],
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT => 3,
    ]);
    $body = curl_exec($ch);
    $status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
    curl_close($ch);
    if ($body === false || $status !== 200) {
        return false; // fail open: don't block users if the lookup fails
    }
    $r = json_decode($body, true);
    return $r['host-ip'] === true || in_array('tor', $r['categories'] ?? [], true);
}

JavaScript

async function shouldBlock(ip) {
  try {
    const res = await fetch(`https://api.vpnblocker.net/v2/json/${encodeURIComponent(ip)}`, {
      headers: { 'X-API-KEY': process.env.VPNBLOCKER_KEY },
      signal: AbortSignal.timeout(3000),
    });
    if (!res.ok) return false; // fail open: don't block users if the lookup fails
    const r = await res.json();
    return r['host-ip'] === true || (r.categories ?? []).includes('tor');
  } catch {
    return false;
  }
}

Python

import os
import requests

def should_block(ip: str) -> bool:
    try:
        res = requests.get(
            f"https://api.vpnblocker.net/v2/json/{ip}",
            headers={"X-API-KEY": os.environ["VPNBLOCKER_KEY"]},
            timeout=3,
        )
    except requests.RequestException:
        return False  # fail open: don't block users if the lookup fails
    if res.status_code != 200:
        return False
    r = res.json()
    return r["host-ip"] is True or "tor" in r.get("categories", [])

Step-by-step guides: PHP · Node.js · Python · game servers and Discord · API docs

Think we got an IP wrong?

Report it from the dashboard on any plan. Reports are free, don’t use up lookups, and we look into every one. When we fix a result, the fix applies to every customer straight away.

How reports work

Frequently asked questions

What does VPN Blocker detect?

VPN servers, proxy networks (including confirmed open proxies), Tor exit nodes, privacy relays such as Apple iCloud Private Relay, and hosting or data center addresses. Every answer says which of these an IP is (its categories) and comes with a confidence score showing how sure we are.

How accurate is it?

No IP list is perfect, so every answer comes with a confidence score instead of a bare yes or no. The higher the score, the surer we are, so you choose how strict to be. If we get an IP wrong, you can report it.

Is there a free plan?

Yes. The Free plan includes 10,000 lookups a month with categories, confidence and network owner. It needs a card on file when you sign up, but the card is never charged.

What formats does the API return?

JSON, XML or HTML, always over HTTPS. Send your API key in the URL or in an X-API-KEY header. See the API docs.

What happens if I go over my monthly limit?

Paid plans keep working up to 110% of their limit, so a busy month won’t cut you off by surprise. After that, and at 100% on the Free plan, the API returns HTTP 429 until usage resets on the 1st of the month. You get email alerts as you get close.

Can I cache results?

Yes, and it saves lookups. Network results rarely change, but Tor exits change every hour: if you block Tor, cache for about an hour, and never longer than a day.

What if you get an IP wrong?

Report it under Report an IP in the dashboard. Reports are free on every plan and don’t use up lookups. We review every report, and a fix applies to every customer straight away.

Start blocking VPNs today

Create a free account and make your first lookup in minutes. Upgrade only when you need more.