GET/api/v2/blacklist

IP blacklist check API

Whether an IPv4 or IPv6 address is on 28 DNS blocklists (DNSBLs), with each list's answer, its delisting link and a verdict.

GEThttps://dnsrobot.netBase URL/api/v2Version/blacklistEndpoint?ip=Parameters
200 OKRecorded 2026-10-25. Send it to run the request live.
{
  "query": {
    "ip": "8.8.8.8"
  },
  "ip": "8.8.8.8",
  "version": 4,
  "verdict": {
    "kind": "clean",
    "listedCount": 0,
    "listed": [],
    "major": [],
    "policy": [],
    "unanswered": [
      "swinog"
    ],
    "score": 100,
    "risk": "low",
    "coverage": {
      "answered": 23,
      "asked": 24,
      "share": 0.984
    }
  },
  "lists": [
    {
      "id": "spamcop",
      "name": "SpamCop",
      "group": "spam",
      "weight": 8,
      "state": "clean",
      "code": null,
      "codes": [],
      "meaning": null,
      "txt": null,
      "zone": "bl.spamcop.net",
      "query": "8.8.8.8.bl.spamcop.net",
      "responseMs": 335,
      "reason": null,
      "delist": {
        "url": "https://www.spamcop.net/bl.shtml?8.8.8.8",
        "kind": "auto",
        "time": "24h-after",
        "free": true
      },
      "website": "https://www.spamcop.net/bl.shtml"
    },
    {
      "id": "mailspike",
      "name": "Mailspike",
      "group": "spam",
      "weight": 6,
      "state": "clean",
      "code": null,
      "codes": [],
      "meaning": null,
      "txt": null,
      "zone": "bl.mailspike.net",
      "query": "8.8.8.8.bl.mailspike.net",
      "responseMs": 408,
      "reason": null,
      "delist": {
        "url": "https://mailspike.io/ip_verify",
        "kind": "self",
        "time": "6-36h",
        "free": true
      },
      "website": "https://mailspike.io/ip_verify"
    },
    {
      "id": "psbl",
      "name": "PSBL",
      "group": "spam",
      "weight": 5,
      "state": "clean",
      "code": null,
      "codes": [],
      "meaning": null,
      "txt": null,
      "zone": "psbl.surriel.com",
      "query": "8.8.8.8.psbl.surriel.com",
      "responseMs": 351,
      "reason": null,
      "delist": {
        "url": "https://psbl.org/remove",
        "kind": "self",
        "time": "30min",
        "free": true
      },
      "website": "https://psbl.org/"
    },
    {
      "id": "uceprotect1",
      "name": "UCEPROTECT Level 1",
      "group": "spam",
      "weight": 4,
      "state": "clean",
      "code": null,
      "codes": [],
      "meaning": null,
      "txt": null,
      "zone": "dnsbl-1.uceprotect.net",
      "query": "8.8.8.8.dnsbl-1.uceprotect.net",
      "responseMs": 425,
      "reason": null,
      "delist": {
        "url": "https://www.uceprotect.net/en/rblcheck.php?ipr=8.8.8.8",
        "kind": "auto",
        "time": "7d",
        "free": true
      },
      "website": "https://www.uceprotect.net/en/"
    },
    {
      "id": "sem",
      "name": "Spam Eating Monkey",
      "group": "spam",
      "weight": 4,
      "state": "clean",
      "code": null,
      "codes": [],
      "meaning": null,
      "txt": null,
      "zone": "bl.spameatingmonkey.net",
      "query": "8.8.8.8.bl.spameatingmonkey.net",
      "responseMs": 312,
      "reason": null,
      "delist": {
        "url": "https://spameatingmonkey.com/remove",
        "kind": "form",
        "time": "24h-review",
        "free": true
      },
      "website": "https://spameatingmonkey.com/services"
    },
    {
      "id": "gbudb",
      "name": "GBUdb Truncate",
      "group": "spam",
      "weight": 3,
      "state": "clean",
      "code": null,
      "codes": [],
      "meaning": null,
      "txt": null,
      "zone": "truncate.gbudb.net",
      "query": "8.8.8.8.truncate.gbudb.net",
      "responseMs": 336,
      "reason": null,
      "delist": {
        "url": "http://www.gbudb.com/truncate/how-ips-are-removed.jsp",
        "kind": "auto",
        "time": "1-2d",
        "free": true
      },
      "website": "http://www.gbudb.com/truncate/"
    },
    {
      "id": "hostkarma",
      "name": "Hostkarma",
      "group": "spam",
      "weight": 3,
      "state": "clean",
      "code": null,
      "codes": [],
      "meaning": null,
      "txt": null,
      "zone": "hostkarma.junkemailfilter.com",
      "query": "8.8.8.8.hostkarma.junkemailfilter.com",
      "responseMs": 299,
      "reason": null,
      "delist": {
        "url": "http://ipadmin.junkemailfilter.com/remove.php?ip=8.8.8.8",
        "kind": "form",
        "time": "review",
        "free": true
      },
      "website": "http://wiki.junkemailfilter.com/index.php/Spam_DNS_Lists"
    },
    {
      "id": "interserver",
      "name": "InterServer RBL",
      "group": "spam",
      "weight": 2,
      "state": "clean",
      "code": null,
      "codes": [],
      "meaning": null,
      "txt": null,
      "zone": "rbl.interserver.net",
      "query": "8.8.8.8.rbl.interserver.net",
      "responseMs": 336,
      "reason": null,
      "delist": {
        "url": "https://sigs.interserver.net/ip?ip=8.8.8.8",
        "kind": "auto",
        "time": "5d",
        "free": true
      },
      "website": "https://sigs.interserver.net/usage.php"
    },
    {
      "id": "s5h",
      "name": "s5h.net",
      "group": "spam",
      "weight": 2,
      "state": "clean",
      "code": null,
      "codes": [],
      "meaning": null,
      "txt": null,
      "zone": "all.s5h.net",
      "query": "8.8.8.8.all.s5h.net",
      "responseMs": 134,
      "reason": null,
      "delist": {
        "url": "http://www.usenix.org.uk/content/rblremove",
        "kind": "visit",
        "time": "instant-visit",
        "free": true
      },
      "website": "https://s5h.net/rbl"
    },
    {
      "id": "nordspam",
      "name": "NordSpam",
      "group": "spam",
      "weight": 2,
      "state": "clean",
      "code": null,
      "codes": [],
      "meaning": null,
      "txt": null,
      "zone": "bl.nordspam.com",
      "query": "8.8.8.8.bl.nordspam.com",
      "responseMs": 415,
      "reason": null,
      "delist": {
        "url": "https://www.nordspam.com/delist/",
        "kind": "email",
        "time": "1-48h",
        "free": true
      },
      "website": "https://www.nordspam.com/"
    },
    {
      "id": "spfbl",
      "name": "SPFBL",
      "group": "spam",
      "weight": 2,
      "state": "clean",
      "code": null,
      "codes": [],
      "meaning": null,
      "txt": null,
      "zone": "dnsbl.spfbl.net",
      "query": "8.8.8.8.dnsbl.spfbl.net",
      "responseMs": 448,
      "reason": null,
      "delist": {
        "url": "https://spfbl.net/en/delist/",
        "kind": "form",
        "time": "rules",
        "free": true
      },
      "website": "https://spfbl.net/en/dnsbl/"
    },
    {
      "id": "zapbl",
      "name": "ZapBL",
      "group": "spam",
      "weight": 2,
      "state": "clean",
      "code": null,
      "codes": [],
      "meaning": null,
      "txt": null,
      "zone": "dnsbl.zapbl.net",
      "query": "8.8.8.8.dnsbl.zapbl.net",
      "responseMs": 405,
      "reason": null,
      "delist": {
        "url": "https://zapbl.net/lookup",
        "kind": "self",
        "time": "lookup",
        "free": true
      },
      "website": "https://zapbl.net/"
    },
    {
      "id": "zerospam",
      "name": "0spam",
      "group": "spam",
      "weight": 2,
      "state": "clean",
      "code": null,
      "codes": [],
      "meaning": null,
      "txt": null,
      "zone": "bl.0spam.org",
      "query": "8.8.8.8.bl.0spam.org",
      "responseMs": 429,
      "reason": null,
      "delist": {
        "url": "https://0spam.org/",
        "kind": "account",
        "time": "3h",
        "free": true
      },
      "website": "https://0spam.org/"
    },
    {
      "id": "jippg",
      "name": "JIPPG RBL",
      "group": "spam",
      "weight": 1,
      "state": "clean",
      "code": null,
      "codes": [],
      "meaning": null,
      "txt": null,
      "zone": "mail-abuse.blacklist.jippg.org",
      "query": "8.8.8.8.mail-abuse.blacklist.jippg.org",
      "responseMs": 208,
      "reason": null,
      "delist": {
        "url": "http://check.jippg.org/",
        "kind": "review",
        "time": "unknown",
        "free": true
      },
      "website": "http://blacklist.jippg.org/"
    },
    {
      "id": "nosolicitado",
      "name": "NoSolicitado",
      "group": "spam",
      "weight": 1,
      "state": "clean",
      "code": null,
      "codes": [],
      "meaning": null,
      "txt": null,
      "zone": "bl.nosolicitado.org",
      "query": "8.8.8.8.bl.nosolicitado.org",
      "responseMs": 318,
      "reason": null,
      "delist": {
        "url": "https://www.nosolicitado.org/",
        "kind": "review",
        "time": "review",
        "free": true
      },
      "website": "https://www.nosolicitado.org/"
    },
    {
      "id": "kempt",
      "name": "KEMPT",
      "group": "spam",
      "weight": 1,
      "state": "clean",
      "code": null,
      "codes": [],
      "meaning": null,
      "txt": null,
      "zone": "dnsbl.kempt.net",
      "query": "8.8.8.8.dnsbl.kempt.net",
      "responseMs": 266,
      "reason": null,
      "delist": {
        "url": "http://www.kempt.net/spam-policy.html",
        "kind": "auto",
        "time": "1d",
        "free": true
      },
      "website": "http://www.kempt.net/dnsbl/"
    },
    {
      "id": "anonmails",
      "name": "anonmails.de",
      "group": "spam",
      "weight": 1,
      "state": "clean",
      "code": null,
      "codes": [],
      "meaning": null,
      "txt": null,
      "zone": "spam.dnsbl.anonmails.de",
      "query": "8.8.8.8.spam.dnsbl.anonmails.de",
      "responseMs": 383,
      "reason": null,
      "delist": {
        "url": "https://anonmails.de/dnsbl.php?ip=8.8.8.8",
        "kind": "form",
        "time": "review",
        "free": true
      },
      "website": "https://anonmails.de/de/blacklist"
    },
    {
      "id": "swinog",
      "name": "SwiNOG DNSRBL",
      "group": "spam",
      "weight": 1,
      "state": "refused",
      "code": null,
      "codes": [],
      "meaning": null,
      "txt": null,
      "zone": "dnsrbl.swinog.ch",
      "query": "8.8.8.8.dnsrbl.swinog.ch",
      "responseMs": 441,
      "reason": "canary_failed",
      "delist": {
        "url": "https://antispam.imp.ch/",
        "kind": "form",
        "time": "48h-review",
        "free": true
      },
      "website": "https://antispam.imp.ch/"
    },
    {
      "id": "abusero",
      "name": "abuse.ro RBL",
      "group": "spam",
      "weight": 1,
      "state": "clean",
      "code": null,
      "codes": [],
      "meaning": null,
      "txt": null,
      "zone": "rbl.abuse.ro",
      "query": "8.8.8.8.rbl.abuse.ro",
      "responseMs": 441,
      "reason": null,
      "delist": {
        "url": "https://rbl.abuse.ro",
        "kind": "form",
        "time": "review",
        "free": true
      },
      "website": "https://abuse.ro/"
    },
    {
      "id": "blocklistde",
      "name": "blocklist.de",
      "group": "attacks",
      "weight": 5,
      "state": "clean",
      "code": null,
      "codes": [],
      "meaning": null,
      "txt": null,
      "zone": "bl.blocklist.de",
      "query": "8.8.8.8.bl.blocklist.de",
      "responseMs": 425,
      "reason": null,
      "delist": {
        "url": "https://www.blocklist.de/en/delist.html?ip=8.8.8.8",
        "kind": "form",
        "time": "48h",
        "free": true
      },
      "website": "https://www.blocklist.de/en/rbldns.html"
    },
    {
      "id": "dronebl",
      "name": "DroneBL",
      "group": "attacks",
      "weight": 5,
      "state": "clean",
      "code": null,
      "codes": [],
      "meaning": null,
      "txt": null,
      "zone": "dnsbl.dronebl.org",
      "query": "8.8.8.8.dnsbl.dronebl.org",
      "responseMs": 325,
      "reason": null,
      "delist": {
        "url": "https://dronebl.org/lookup?ip=8.8.8.8",
        "kind": "review",
        "time": "review",
        "free": true
      },
      "website": "https://dronebl.org/"
    },
    {
      "id": "blockedservers",
      "name": "Blocked Servers",
      "group": "attacks",
      "weight": 1,
      "state": "clean",
      "code": null,
      "codes": [],
      "meaning": null,
      "txt": null,
      "zone": "rbl.blockedservers.com",
      "query": "8.8.8.8.rbl.blockedservers.com",
      "responseMs": 384,
      "reason": null,
      "delist": {
        "url": "https://www.blockedservers.com/blocked/ipv4/8.8.8.8/",
        "kind": "none",
        "time": "unknown",
        "free": true
      },
      "website": "https://www.blockedservers.com/"
    },
    {
      "id": "backscatterer",
      "name": "Backscatterer",
      "group": "backscatter",
      "weight": 1,
      "state": "clean",
      "code": null,
      "codes": [],
      "meaning": null,
      "txt": null,
      "zone": "ips.backscatterer.org",
      "query": "8.8.8.8.ips.backscatterer.org",
      "responseMs": 303,
      "reason": null,
      "delist": {
        "url": "https://www.backscatterer.org/?ip=8.8.8.8",
        "kind": "auto",
        "time": "4w",
        "free": true
      },
      "website": "https://www.backscatterer.org/"
    },
    {
      "id": "sem-backscatter",
      "name": "SEM Backscatter",
      "group": "backscatter",
      "weight": 1,
      "state": "clean",
      "code": null,
      "codes": [],
      "meaning": null,
      "txt": null,
      "zone": "backscatter.spameatingmonkey.net",
      "query": "8.8.8.8.backscatter.spameatingmonkey.net",
      "responseMs": 335,
      "reason": null,
      "delist": {
        "url": "https://spameatingmonkey.com/remove",
        "kind": "form",
        "time": "24h-review",
        "free": true
      },
      "website": "https://spameatingmonkey.com/services"
    },
    {
      "id": "uceprotect2",
      "name": "UCEPROTECT Level 2",
      "group": "policy",
      "weight": 0,
      "state": "clean",
      "code": null,
      "codes": [],
      "meaning": null,
      "txt": null,
      "zone": "dnsbl-2.uceprotect.net",
      "query": "8.8.8.8.dnsbl-2.uceprotect.net",
      "responseMs": 430,
      "reason": null,
      "delist": {
        "url": "https://www.uceprotect.net/en/index.php?m=7&s=7",
        "kind": "provider",
        "time": "neighbours",
        "free": true
      },
      "website": "https://www.uceprotect.net/en/index.php?m=3&s=4"
    },
    {
      "id": "uceprotect3",
      "name": "UCEPROTECT Level 3",
      "group": "policy",
      "weight": 0,
      "state": "clean",
      "code": null,
      "codes": [],
      "meaning": null,
      "txt": null,
      "zone": "dnsbl-3.uceprotect.net",
      "query": "8.8.8.8.dnsbl-3.uceprotect.net",
      "responseMs": 435,
      "reason": null,
      "delist": {
        "url": "https://www.uceprotect.net/en/index.php?m=7&s=8",
        "kind": "provider",
        "time": "provider",
        "free": true
      },
      "website": "https://www.uceprotect.net/en/index.php?m=3&s=5"
    },
    {
      "id": "abusero-pbl",
      "name": "abuse.ro PBL",
      "group": "policy",
      "weight": 0,
      "state": "clean",
      "code": null,
      "codes": [],
      "meaning": null,
      "txt": null,
      "zone": "pbl.abuse.ro",
      "query": "8.8.8.8.pbl.abuse.ro",
      "responseMs": 825,
      "reason": null,
      "delist": {
        "url": "https://rbl.abuse.ro",
        "kind": "form",
        "time": "review",
        "free": true
      },
      "website": "https://abuse.ro/"
    },
    {
      "id": "tor",
      "name": "Tor exits (dan.me.uk)",
      "group": "policy",
      "weight": 0,
      "state": "clean",
      "code": null,
      "codes": [],
      "meaning": null,
      "txt": null,
      "zone": "torexit.dan.me.uk",
      "query": "8.8.8.8.torexit.dan.me.uk",
      "responseMs": 817,
      "reason": null,
      "delist": {
        "url": "https://www.dan.me.uk/dnsbl",
        "kind": "none",
        "time": "1h",
        "free": true
      },
      "website": "https://www.dan.me.uk/dnsbl"
    }
  ],
  "notChecked": [
    {
      "id": "spamhaus",
      "name": "Spamhaus",
      "url": "https://check.spamhaus.org/query/ip/8.8.8.8",
      "reason": "terms"
    }
  ],
  "context": {
    "network": {
      "asn": 15169,
      "name": "Google",
      "prefix": "8.8.8.0/24",
      "country": "US",
      "registry": "arin",
      "brand": {
        "name": "Google"
      },
      "kind": "hosting"
    },
    "ptr": {
      "name": "dns.google",
      "fcrdns": "match",
      "generic": false
    },
    "tor": false,
    "residential": false,
    "bogon": false,
    "reputation": null,
    "mail": {
      "domain": "dns.google",
      "spf": "fail",
      "mechanism": "-all",
      "dmarc": true
    },
    "abuseipdb": "https://www.abuseipdb.com/check/8.8.8.8"
  },
  "issues": [
    {
      "severity": "info",
      "code": "spf_not_authorized",
      "message": "dns.google, the reverse DNS name's domain, doesn't authorise this address in its SPF record (fail)."
    }
  ],
  "checkMs": 2781,
  "cachedAt": null,
  "tookMs": 2782,
  "incomplete": true,
  "warnings": [
    {
      "code": "list_refused",
      "message": "1 list refused our resolver (SwiNOG DNSRBL): not counted as clean."
    }
  ]
}

How it works

Asks every account-free blocklist IP Blacklist Checker uses (28 today: SpamCop, Mailspike, PSBL, UCEPROTECT, blocklist.de, DroneBL, Backscatterer and more, listed in lists) through Google Public DNS, with Cloudflare's DNS where Google is slow or fails. Each list's return code is read with the operator's own meaning, and its test entry (RFC 5782) is the canary: a list that refuses our resolver or doesn't answer is refused or timeout, never clean, and doesn't count toward the verdict.

The verdict: major (on a heavily weighted list), minor, incomplete (nothing listed, but too many lists didn't answer), policy (only policy facts, such as a home range), clean, none (no list answered). context adds the network, reverse DNS (forward-confirmed or not), Tor, unallocated space, Mailspike's reputation and the PTR domain's SPF. Spamhaus is in notChecked with a link: its terms don't allow our use.

127.0.0.2 (every list's test entry) is allowed and comes back listed everywhere. Other private and reserved addresses are a 422.

Answers kept: 10 minutes, 1 minute when a list refused or didn't answer (`public, max-age` is the time left).

Query parameters

  • ipstringrequired
    An IPv4 or IPv6 address.

Response fields

200 with this JSON object, plus tookMs, and incomplete with warnings when a source failed. Fields marked optional appear only when they apply.

  • queryobjectalways
    What was looked up, normalised (lower case, no trailing dot, IDNs as Punycode).
    • ipstringalways
      The address, written the usual way.
  • ipstringalways
    The address checked.
  • versionintegeralways
    4 or 6.

    one of 4, 6

  • verdictobjectalways
    The verdict over the lists that answered.
    Show 9 fields
    • kindstringalways
      major, minor, incomplete, policy, clean or none.

      one of "major", "minor", "incomplete", "policy", "clean", "none"

    • listedCountintegeralways
      How many scored lists list it.
    • listedarray of stringsalways
      The ids of the lists that list it, heaviest first.
    • majorarray of stringsalways
      Those among them of weight 6 or more.
    • policyarray of stringsalways
      Policy lists with a fact about the address.
    • unansweredarray of stringsalways
      Scored lists that refused or didn't answer.
    • scoreintegeralways
      100 minus the listed share of the answered lists' weight.
    • riskstringalways
      low, medium or high.

      one of "low", "medium", "high"

    • coverageobjectalways
      How much of the lists' weight answered.
      Show 3 fields
      • answeredintegeralways
        Scored lists that answered.
      • askedintegeralways
        Scored lists asked.
      • sharenumberalways
        The answered share of the asked weight, 0 to 1.
  • listsarray of objectsalways
    Every list, in the checker's order.
    Show 15 fields
    • idstringalways
      Stable list id, e.g. spamcop.
    • namestringalways
      The list's name.
    • groupstringalways
      spam, attacks, backscatter or policy.

      one of "spam", "attacks", "backscatter", "policy"

    • weightintegeralways
      How much the list counts in the verdict.
    • statestringalways
      listed; clean (answered: not listed); policy (a policy list's fact about the address, e.g. a home range); positive (a whitelist's good mark); refused (the list refused our resolver: its RFC 5782 test entry failed, or it sent an error code); timeout (no answer in time); unavailable (no zone for this address family, or the list answers everything). Only listed means listed; refused and timeout are never clean.

      one of "listed", "clean", "policy", "positive", "refused", "timeout", "unavailable"

    • codestring or nullalways
      The answer that decided: an A record like 127.0.0.2, or an error (SERVFAIL).
    • codesarray of stringsalways
      Every A record returned.
    • meaningstring or nullalways
      The operator's meaning of the code.
    • txtstring or nullalways
      The list's TXT record for a listing (at most 300 characters).
    • zonestring or nullalways
      The DNS zone asked.
    • querystring or nullalways
      The name asked, as dig would ask it.
    • responseMsinteger or nullalways
      How long the answer took, in milliseconds.
    • reasonstring or nullalways
      Why a list isn't read normally: no_ipv6, wildcard (it lists clean controls), canary_failed, error_code, rcode, outside_127.

      one of "no_ipv6", "wildcard", "canary_failed", "error_code", "rcode", "outside_127", null

    • delistobjectalways
      How to get off the list.
      Show 4 fields
      • urlstringalways
        The delisting page.
      • kindstringalways
        auto (expires by itself), self (a self-service form), form, email, account, visit, review, provider (your provider must ask), none.

        one of "auto", "self", "form", "email", "account", "visit", "review", "provider", "none"

      • timestringalways
        How long delisting takes, as the operator says (a code such as 24h-after, 30min, 7d, review).
      • freebooleanalways
        Whether delisting is free.
    • websitestringalways
      The list's own page.
  • notCheckedarray of objectsalways
    Lists named but not asked, with a link to their own checker.
    Show 4 fields
    • idstringalways
      List id.
    • namestringalways
      Its name.
    • urlstringalways
      Its own lookup page for this address.
    • reasonstringalways
      Why: terms (its terms don't allow our use).
  • contextobjectalways
    What else the check found about the address.
    Show 8 fields
    • networkobject or nullalways
      The announcing network (Team Cymru) and our reading of it, or null.
      Show 7 fields
      • asnintegeralways
        AS number.
      • namestringalways
        The network's name.
      • prefixstring or nullalways
        The announced prefix.
      • countrystring or nullalways
        The block's registered country.
      • registrystring or nullalways
        The block's registry.
      • brandobject or nullalways
        The brand people know.
        Show 1 fields
        • namestringalways
          The brand.
      • kindstring or nullalways
        What kind of network it is: isp (home broadband), mobile, relay (Apple iCloud Private Relay, Cloudflare WARP), hosting (cloud, hosting, VPN exits, CDNs), satellite, other. From APNIC's user counts, a hand-checked brand table and name rules.

        one of "isp", "mobile", "relay", "hosting", "satellite", "other", null

    • ptrobjectalways
      Reverse DNS.
      Show 3 fields
      • namestring or nullalways
        The PTR name, or null.
      • fcrdnsstringalways
        match (the name points back to the address), mismatch, none (no PTR), unknown (no answer).

        one of "match", "mismatch", "none", "unknown"

      • genericbooleanalways
        Whether the name looks automatic (a home or pool address).
    • torboolean or nullalways
      Whether the address is a Tor exit right now (the Tor Project's own list, kept 30 minutes); null for IPv6 (the list has none) or when the list couldn't be read.
    • residentialboolean or nullalways
      Whether it is a home, mobile or satellite range.
    • bogonboolean or nullalways
      Whether it is in space no registry has allocated (Team Cymru's full bogons).
    • reputationobject or nullalways
      Mailspike's reputation zone.
      Show 2 fields
      • codestringalways
        The code.
      • levelstringalways
        bad, neutral or good.

        one of "bad", "neutral", "good"

    • mailobject or nullalways
      When the PTR name has a registrable domain: whether its SPF lets this address send, and whether it publishes DMARC.
      Show 4 fields
      • domainstringalways
        The PTR name's registrable domain.
      • spfstringalways
        The SPF result for this address (RFC 7208).

        one of "pass", "fail", "softfail", "neutral", "none", "permerror", "temperror"

      • mechanismstring or nullalways
        The mechanism that decided.
      • dmarcboolean or nullalways
        Whether the domain publishes DMARC; null when unknown.
    • abuseipdbstringalways
      AbuseIPDB's page for the address (a link only: its API is never called).
  • issuesarray of objectsalways
    Problems found in the target's configuration, worst first. Empty when there are none.
    • severitystringalways
      error breaks something, warning risks it, info is worth knowing.

      one of "error", "warning", "info"

    • codestringalways
      Stable machine-readable code.
    • messagestringalways
      The problem and what to do about it, in plain English.
  • checkMsintegeralways
    How long the check itself took, in milliseconds (the original check's, for a kept answer).
  • cachedAtstring or nullalways
    When a kept answer was checked (ISO 8601); null for a fresh check.

Errors

  • 422 target_not_allowed A private or reserved address (127.0.0.2, the test entry, is allowed).
  • 503 unavailable No list answered at all.

Plus the errors every endpoint can return: 400 for a missing or unreadable parameter, 429 past the limit, 503 when every source failed.

Code samples

curl "https://dnsrobot.net/api/v2/blacklist?ip=8.8.8.8"
const params = new URLSearchParams({ ip: "8.8.8.8" });
const res = await fetch(`https://dnsrobot.net/api/v2/blacklist?${params}`);
const data = await res.json();
if (!res.ok) throw new Error(data.error.message);
console.log(data.verdict);
import requests

r = requests.get(
    "https://dnsrobot.net/api/v2/blacklist",
    params={"ip": "8.8.8.8"},
    timeout=30,
)
data = r.json()
if not r.ok:
    raise RuntimeError(data["error"]["message"])
print(data["verdict"])
package main

import (
	"encoding/json"
	"fmt"
	"net/http"
	"net/url"
)

func main() {
	q := url.Values{"ip": {"8.8.8.8"}}
	res, err := http.Get("https://dnsrobot.net/api/v2/blacklist?" + q.Encode())
	if err != nil {
		panic(err)
	}
	defer res.Body.Close()
	var data map[string]any
	if err := json.NewDecoder(res.Body).Decode(&data); err != nil {
		panic(err)
	}
	if res.StatusCode != http.StatusOK {
		panic(data["error"])
	}
	fmt.Println(data["verdict"])
}
<?php
$query = http_build_query(["ip" => "8.8.8.8"]);
$context = stream_context_create(["http" => ["ignore_errors" => true, "timeout" => 30]]);
$data = json_decode(file_get_contents("https://dnsrobot.net/api/v2/blacklist?" . $query, false, $context), true);
if (isset($data["error"])) {
    throw new RuntimeException($data["error"]["message"]);
}
print_r($data["verdict"]);
require "net/http"
require "json"

uri = URI("https://dnsrobot.net/api/v2/blacklist")
uri.query = URI.encode_www_form(ip: "8.8.8.8")
data = JSON.parse(Net::HTTP.get(uri))
raise data["error"]["message"] if data["error"]
puts data["verdict"]
// Cargo.toml: reqwest = { version = "0.13", features = ["blocking", "json"] }, serde_json = "1"
fn main() -> Result<(), Box<dyn std::error::Error>> {
    let res = reqwest::blocking::get("https://dnsrobot.net/api/v2/blacklist?ip=8.8.8.8")?;
    let ok = res.status().is_success();
    let data: serde_json::Value = res.json()?;
    if !ok {
        return Err(data["error"]["message"].to_string().into());
    }
    println!("{}", data["verdict"]);
    Ok(())
}
using System.Text.Json;

using var http = new HttpClient();
var res = await http.GetAsync("https://dnsrobot.net/api/v2/blacklist?ip=8.8.8.8");
var data = JsonDocument.Parse(await res.Content.ReadAsStringAsync()).RootElement;
if (!res.IsSuccessStatusCode)
    throw new Exception(data.GetProperty("error").GetProperty("message").GetString());
Console.WriteLine(data.GetProperty("verdict"));

Google Public DNS

GET /api/v2/blacklist?ip=8.8.8.8
200 OKRecorded 2026-10-25
{
  "query": {
    "ip": "8.8.8.8"
  },
  "ip": "8.8.8.8",
  "version": 4,
  "verdict": {
    "kind": "clean",
    "listedCount": 0,
    "listed": [],
    "major": [],
    "policy": [],
    "unanswered": [
      "swinog"
    ],
    "score": 100,
    "risk": "low",
    "coverage": {
      "answered": 23,
      "asked": 24,
      "share": 0.984
    }
  },
  "lists": [
    {
      "id": "spamcop",
      "name": "SpamCop",
      "group": "spam",
      "weight": 8,
      "state": "clean",
      "code": null,
      "codes": [],
      "meaning": null,
      "txt": null,
      "zone": "bl.spamcop.net",
      "query": "8.8.8.8.bl.spamcop.net",
      "responseMs": 335,
      "reason": null,
      "delist": {
        "url": "https://www.spamcop.net/bl.shtml?8.8.8.8",
        "kind": "auto",
        "time": "24h-after",
        "free": true
      },
      "website": "https://www.spamcop.net/bl.shtml"
    },
    {
      "id": "mailspike",
      "name": "Mailspike",
      "group": "spam",
      "weight": 6,
      "state": "clean",
      "code": null,
      "codes": [],
      "meaning": null,
      "txt": null,
      "zone": "bl.mailspike.net",
      "query": "8.8.8.8.bl.mailspike.net",
      "responseMs": 408,
      "reason": null,
      "delist": {
        "url": "https://mailspike.io/ip_verify",
        "kind": "self",
        "time": "6-36h",
        "free": true
      },
      "website": "https://mailspike.io/ip_verify"
    },
    {
      "id": "psbl",
      "name": "PSBL",
      "group": "spam",
      "weight": 5,
      "state": "clean",
      "code": null,
      "codes": [],
      "meaning": null,
      "txt": null,
      "zone": "psbl.surriel.com",
      "query": "8.8.8.8.psbl.surriel.com",
      "responseMs": 351,
      "reason": null,
      "delist": {
        "url": "https://psbl.org/remove",
        "kind": "self",
        "time": "30min",
        "free": true
      },
      "website": "https://psbl.org/"
    },
    // … 25 more items
  ],
  "notChecked": [
    {
      "id": "spamhaus",
      "name": "Spamhaus",
      "url": "https://check.spamhaus.org/query/ip/8.8.8.8",
      "reason": "terms"
    }
  ],
  "context": {
    "network": {
      "asn": 15169,
      "name": "Google",
      "prefix": "8.8.8.0/24",
      "country": "US",
      "registry": "arin",
      "brand": {
        "name": "Google"
      },
      "kind": "hosting"
    },
    "ptr": {
      "name": "dns.google",
      "fcrdns": "match",
      "generic": false
    },
    "tor": false,
    "residential": false,
    "bogon": false,
    "reputation": null,
    "mail": {
      "domain": "dns.google",
      "spf": "fail",
      "mechanism": "-all",
      "dmarc": true
    },
    "abuseipdb": "https://www.abuseipdb.com/check/8.8.8.8"
  },
  "issues": [
    {
      "severity": "info",
      "code": "spf_not_authorized",
      "message": "dns.google, the reverse DNS name's domain, doesn't authorise this address in its SPF record (fai…"
    }
  ],
  "checkMs": 2781,
  "cachedAt": null,
  "tookMs": 2782,
  "incomplete": true,
  "warnings": [
    {
      "code": "list_refused",
      "message": "1 list refused our resolver (SwiNOG DNSRBL): not counted as clean."
    }
  ]
}

Shortened for the page: long lists show their first items.

The test entry every list lists

GET /api/v2/blacklist?ip=127.0.0.2
200 OKRecorded 2026-10-25
{
  "query": {
    "ip": "127.0.0.2"
  },
  "ip": "127.0.0.2",
  "version": 4,
  "verdict": {
    "kind": "major",
    "listedCount": 23,
    "listed": [
      "spamcop",
      "mailspike",
      "psbl",
      // … 20 more items
    ],
    "major": [
      "spamcop",
      "mailspike"
    ],
    "policy": [
      "uceprotect2",
      "uceprotect3",
      "abusero-pbl",
      // … 1 more item
    ],
    "unanswered": [
      "swinog"
    ],
    "score": 0,
    "risk": "high",
    "coverage": {
      "answered": 23,
      "asked": 24,
      "share": 0.984
    }
  },
  "lists": [
    {
      "id": "spamcop",
      "name": "SpamCop",
      "group": "spam",
      "weight": 8,
      "state": "listed",
      "code": "127.0.0.2",
      "codes": [
        "127.0.0.2"
      ],
      "meaning": "Sent mail that SpamCop users reported as spam in the last 24 hours",
      "txt": "Blocked - see https://www.spamcop.net/bl.shtml?127.0.0.2",
      "zone": "bl.spamcop.net",
      "query": "2.0.0.127.bl.spamcop.net",
      "responseMs": 66,
      "reason": null,
      "delist": {
        "url": "https://www.spamcop.net/bl.shtml?127.0.0.2",
        "kind": "auto",
        "time": "24h-after",
        "free": true
      },
      "website": "https://www.spamcop.net/bl.shtml"
    },
    {
      "id": "mailspike",
      "name": "Mailspike",
      "group": "spam",
      "weight": 6,
      "state": "listed",
      "code": "127.0.0.2",
      "codes": [
        "127.0.0.2",
        "127.0.0.10",
        "127.0.0.11",
        // … 2 more items
      ],
      "meaning": "Seen sending in a distributed spam wave (a botnet)",
      "txt": "1792915201|Sinkhole 1792915552 1792915507",
      "zone": "bl.mailspike.net",
      "query": "2.0.0.127.bl.mailspike.net",
      "responseMs": 308,
      "reason": null,
      "delist": {
        "url": "https://mailspike.io/ip_verify",
        "kind": "self",
        "time": "6-36h",
        "free": true
      },
      "website": "https://mailspike.io/ip_verify"
    },
    {
      "id": "psbl",
      "name": "PSBL",
      "group": "spam",
      "weight": 5,
      "state": "listed",
      "code": "127.0.0.2",
      "codes": [
        "127.0.0.2"
      ],
      "meaning": "Sent mail to PSBL's spam traps and isn't a known mail server",
      "txt": "Listed in PSBL, see http://psbl.org/listing?ip=127.0.0.2",
      "zone": "psbl.surriel.com",
      "query": "2.0.0.127.psbl.surriel.com",
      "responseMs": 75,
      "reason": null,
      "delist": {
        "url": "https://psbl.org/remove",
        "kind": "self",
        "time": "30min",
        "free": true
      },
      "website": "https://psbl.org/"
    },
    // … 25 more items
  ],
  "notChecked": [
    {
      "id": "spamhaus",
      "name": "Spamhaus",
      "url": "https://check.spamhaus.org/query/ip/127.0.0.2",
      "reason": "terms"
    }
  ],
  "context": {
    "network": null,
    "ptr": {
      "name": null,
      "fcrdns": "none",
      "generic": false
    },
    "tor": true,
    "residential": true,
    "bogon": true,
    "reputation": {
      "code": "127.0.0.2",
      "level": "neutral"
    },
    "mail": null,
    "abuseipdb": "https://www.abuseipdb.com/check/127.0.0.2"
  },
  "issues": [
    {
      "severity": "error",
      "code": "listed_major",
      "message": "Listed on 23 blocklists: SpamCop, Mailspike, PSBL, blocklist.de, DroneBL, UCEPROTECT Level 1, Sp…"
    },
    {
      "severity": "warning",
      "code": "bogon",
      "message": "The address is in space no registry has allocated (Team Cymru's full bogons): traffic from it is…"
    },
    {
      "severity": "warning",
      "code": "no_reverse_dns",
      "message": "The address has no reverse DNS (PTR) name: most mail servers refuse or penalise mail from such a…"
    },
    // … 2 more items
  ],
  "checkMs": 1662,
  "cachedAt": null,
  "tookMs": 1663,
  "incomplete": true,
  "warnings": [
    {
      "code": "list_refused",
      "message": "1 list refused our resolver (SwiNOG DNSRBL): not counted as clean."
    }
  ]
}

Shortened for the page: long lists show their first items.