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.
- 20 calls a minute per IP
- Same engine as the IP Blacklist Checker tool
{
"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
ipstringrequiredAn 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.
queryobjectalwaysWhat was looked up, normalised (lower case, no trailing dot, IDNs as Punycode).ipstringalwaysThe address, written the usual way.
ipstringalwaysThe address checked.versionintegeralways4 or 6.one of
4,6verdictobjectalwaysThe verdict over the lists that answered.Show 9 fields
kindstringalwaysmajor,minor,incomplete,policy,cleanornone.one of
"major","minor","incomplete","policy","clean","none"listedCountintegeralwaysHow many scored lists list it.listedarray of stringsalwaysThe ids of the lists that list it, heaviest first.majorarray of stringsalwaysThose among them of weight 6 or more.policyarray of stringsalwaysPolicy lists with a fact about the address.unansweredarray of stringsalwaysScored lists that refused or didn't answer.scoreintegeralways100 minus the listed share of the answered lists' weight.riskstringalwayslow,mediumorhigh.one of
"low","medium","high"coverageobjectalwaysHow much of the lists' weight answered.Show 3 fields
answeredintegeralwaysScored lists that answered.askedintegeralwaysScored lists asked.sharenumberalwaysThe answered share of the asked weight, 0 to 1.
listsarray of objectsalwaysEvery list, in the checker's order.Show 15 fields
idstringalwaysStable list id, e.g.spamcop.namestringalwaysThe list's name.groupstringalwaysspam,attacks,backscatterorpolicy.one of
"spam","attacks","backscatter","policy"weightintegeralwaysHow much the list counts in the verdict.statestringalwayslisted;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). Onlylistedmeans listed;refusedandtimeoutare never clean.one of
"listed","clean","policy","positive","refused","timeout","unavailable"codestring or nullalwaysThe answer that decided: an A record like127.0.0.2, or an error (SERVFAIL).codesarray of stringsalwaysEvery A record returned.meaningstring or nullalwaysThe operator's meaning of the code.txtstring or nullalwaysThe list's TXT record for a listing (at most 300 characters).zonestring or nullalwaysThe DNS zone asked.querystring or nullalwaysThe name asked, asdigwould ask it.responseMsinteger or nullalwaysHow long the answer took, in milliseconds.reasonstring or nullalwaysWhy 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",nulldelistobjectalwaysHow to get off the list.Show 4 fields
urlstringalwaysThe delisting page.kindstringalwaysauto(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"timestringalwaysHow long delisting takes, as the operator says (a code such as24h-after,30min,7d,review).freebooleanalwaysWhether delisting is free.
websitestringalwaysThe list's own page.
notCheckedarray of objectsalwaysLists named but not asked, with a link to their own checker.Show 4 fields
idstringalwaysList id.namestringalwaysIts name.urlstringalwaysIts own lookup page for this address.reasonstringalwaysWhy:terms(its terms don't allow our use).
contextobjectalwaysWhat else the check found about the address.Show 8 fields
networkobject or nullalwaysThe announcing network (Team Cymru) and our reading of it, or null.Show 7 fields
asnintegeralwaysAS number.namestringalwaysThe network's name.prefixstring or nullalwaysThe announced prefix.countrystring or nullalwaysThe block's registered country.registrystring or nullalwaysThe block's registry.brandobject or nullalwaysThe brand people know.Show 1 fields
namestringalwaysThe brand.
kindstring or nullalwaysWhat 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
ptrobjectalwaysReverse DNS.Show 3 fields
namestring or nullalwaysThe PTR name, or null.fcrdnsstringalwaysmatch(the name points back to the address),mismatch,none(no PTR),unknown(no answer).one of
"match","mismatch","none","unknown"genericbooleanalwaysWhether the name looks automatic (a home or pool address).
torboolean or nullalwaysWhether 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 nullalwaysWhether it is a home, mobile or satellite range.bogonboolean or nullalwaysWhether it is in space no registry has allocated (Team Cymru's full bogons).reputationobject or nullalwaysMailspike's reputation zone.Show 2 fields
codestringalwaysThe code.levelstringalwaysbad,neutralorgood.one of
"bad","neutral","good"
mailobject or nullalwaysWhen the PTR name has a registrable domain: whether its SPF lets this address send, and whether it publishes DMARC.Show 4 fields
domainstringalwaysThe PTR name's registrable domain.spfstringalwaysThe SPF result for this address (RFC 7208).one of
"pass","fail","softfail","neutral","none","permerror","temperror"mechanismstring or nullalwaysThe mechanism that decided.dmarcboolean or nullalwaysWhether the domain publishes DMARC; null when unknown.
abuseipdbstringalwaysAbuseIPDB's page for the address (a link only: its API is never called).
issuesarray of objectsalwaysProblems found in the target's configuration, worst first. Empty when there are none.severitystringalwayserrorbreaks something,warningrisks it,infois worth knowing.one of
"error","warning","info"codestringalwaysStable machine-readable code.messagestringalwaysThe problem and what to do about it, in plain English.
checkMsintegeralwaysHow long the check itself took, in milliseconds (the original check's, for a kept answer).cachedAtstring or nullalwaysWhen a kept answer was checked (ISO 8601); null for a fresh check.
Errors
422target_not_allowedA private or reserved address (127.0.0.2, the test entry, is allowed).503unavailableNo 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{
"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{
"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.