IP Blocklist API

Check any IP address against 160+ continuously updated threat intelligence feeds.

No signup No API key 2.1B+ addresses covered Updated daily

Quick start

One request, no registration. Paste this into your terminal:

curl -X POST https://ipguardian.net/api/check \
  -H "Content-Type: application/json" \
  -d '"8.8.8.8"'
Try it in the browser →

Endpoint

POST https://ipguardian.net/api/check
Content-Type: application/json

Only POST is accepted. A GET request returns 405.

Request formats

Three shapes are accepted, so you can use whichever fits your client:

// A single address as a string
"8.8.8.8"

// An array of addresses (up to 100)
["8.8.8.8", "1.1.1.1", "192.0.2.77"]

// An object
{"ip": "8.8.8.8"}
{"ips": ["8.8.8.8", "1.1.1.1"]}

Both IPv4 and IPv6 are supported.

Response format

A single address returns one result object; several addresses return an array.

{
  "success": true,
  "timestamp": "2026-08-31T14:00:33.585Z",
  "count": 1,
  "results": {
    "ip": "192.0.2.77",
    "found": true,
    "sources": [
      {
        "type": "subnet",
        "subnet": "192.0.2.0/24",
        "filename": "cidr_report_bogons.netset",
        "category": "unroutable",
        "maintainer": "CIDR Report"
      }
    ]
  }
}

Fields

FieldMeaning
foundtrue if the address appears in at least one list
sourcesEvery list the address was found in
typedirect — exact match; subnet — the address falls inside a listed range
subnetThe matching CIDR range (subnet matches only)
filenameName of the source list
categoryanonymizers, abuse, attacks, spam, malware, reputation, organizations, unroutable
maintainerWho publishes the list

An address absent from every list returns "found": false with an empty sources array.

Limits

LimitValue
Addresses per request100
Requests per minute100 per client IP
Maximum request body1 MB

Batch your requests. Checking 100 addresses in one call is far cheaper than 100 separate calls — for both sides — and keeps you well inside the rate limit.

Error codes

CodeMeaning
200Success
400Malformed JSON, invalid IP address, empty list, or more than 100 addresses
405Method other than POST
413Request body over 1 MB
429Rate limit exceeded — retry after a minute
503Service temporarily unavailable

Code examples

cURL

curl -X POST https://ipguardian.net/api/check \
  -H "Content-Type: application/json" \
  -d '["8.8.8.8", "1.1.1.1"]'

Python

import requests

response = requests.post(
    "https://ipguardian.net/api/check",
    json=["8.8.8.8", "1.1.1.1"],
    timeout=10,
)
for result in response.json()["results"]:
    status = "BLOCKED" if result["found"] else "clean"
    print(result["ip"], status)

Node.js

const response = await fetch("https://ipguardian.net/api/check", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify(["8.8.8.8", "1.1.1.1"]),
});

const { results } = await response.json();
for (const r of results) {
  console.log(r.ip, r.found ? "BLOCKED" : "clean");
}

PHP

$ch = curl_init("https://ipguardian.net/api/check");
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ["Content-Type: application/json"],
    CURLOPT_POSTFIELDS     => json_encode(["8.8.8.8", "1.1.1.1"]),
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);

foreach ($data["results"] as $r) {
    echo $r["ip"], $r["found"] ? " BLOCKED" : " clean", PHP_EOL;
}

Go

body, _ := json.Marshal([]string{"8.8.8.8", "1.1.1.1"})

resp, err := http.Post(
    "https://ipguardian.net/api/check",
    "application/json",
    bytes.NewReader(body),
)
if err != nil {
    log.Fatal(err)
}
defer resp.Body.Close()

Checking a log file

Extract unique addresses from an nginx access log and check them in batches of 100:

awk '{print $1}' access.log | sort -u | head -100 \
  | jq -R . | jq -s . \
  | curl -X POST https://ipguardian.net/api/check \
      -H "Content-Type: application/json" --data-binary @- \
  | jq '.results[] | select(.found) | {ip, source: .sources[0].filename}'

Where the data comes from

The database aggregates 160+ curated public blocklists, rebuilt from source every day. Contributors include FireHOL, Spamhaus, Emerging Threats, DShield, TorProject, StopForumSpam, Project Honey Pot and others.

CategoryWhat it covers
anonymizersTor exit nodes, open SOCKS and SSL proxies, anonymising networks
abuseAddresses reported for abuse: forum spam, comment spam, form abuse
attacksSources of brute force, scanning and exploitation attempts
spamKnown email and comment spam sources
malwareCommand-and-control servers and malware distribution hosts
reputationGeneral low-reputation address ranges
unroutableBogons and reserved ranges that should never appear on the internet

Live figures are on the statistics page.

Frequently asked questions

Do I need an API key?

No. There is no registration and no key. Send a request and you get an answer.

Is it really free?

Yes, within the limits above.

How often is the data updated?

Every source list is re-fetched and rebuilt once a day.

Does a match mean the address is malicious?

Not necessarily. It means the address appears in at least one public list, and the category tells you why. An address listed under anonymizers is running a proxy or Tor node — that is not the same as one listed under attacks. Weigh the category and the number of matching sources before you block anything.

Can I check IPv6?

Yes. Both IPv4 and IPv6 addresses are accepted.

Are the addresses I check stored?

No. The addresses submitted for checking are not written to logs — only the number of addresses per request is recorded. See the privacy policy.