/v1/lookup/{ip}
Secret key
Score one address
Everything known about an address, and a risk score from 0 to 100 with the reason codes that produced it.
Which fields come back depends on your plan. Every tier is a superset of the one below it, so upgrading never makes a field disappear. GET /v1/me lists exactly what yours includes.
A score of 0 with no reasons is a real answer, not a miss. Most of the address space is on no list at all, and that is worth knowing.
Private, loopback, link-local and reserved addresses are refused rather than scored. One arriving here almost always means you are reading your own load balancer's address instead of your visitor's, and a confident "clean" would let you ship that mistake.
Path
| Name | Type | Notes |
|---|---|---|
ip |
string | |
Responses
| Status | Code | Meaning |
|---|---|---|
200 |
not an error | The answer, filtered to your plan. |
401 |
invalid_key |
Send a secret key. Publishable keys cannot make lookups. |
402 |
quota_exhausted |
The allowance is used up, or the subscription is not active. |
422 |
invalid_address |
Not an address, or not a public one. |
429 |
rate_limited |
Over the per-second rate limit. Slow down and retry. |
503 |
unavailable |
Temporarily unavailable. Retry. |
Example response
{
"ip": "45.66.1.9",
"version": 4,
"score": 60,
"band": "medium",
"is_bogon": false,
"country": "SC",
"continent": "AF",
"flags": [
"tor_exit",
"hosting"
],
"asn": 64496,
"as_name": "Example Networks",
"as_domain": "example.net",
"network": "hosting",
"prefix": "45.66.0.0/16",
"reasons": [
{
"code": "TOR_EXIT",
"weight": 55,
"category": "anonymity",
"detail": "Traffic leaves the Tor network here. Whoever sent it is deliberately anonymous."
},
{
"code": "HOSTING_ASN",
"weight": 30,
"category": "anonymity",
"detail": "A datacentre, not a home or an office. People browse from homes."
}
],
"categories": {
"anonymity": {
"raw": 85,
"cap": 60,
"applied": 60
}
},
"sources": 2,
"data_age_seconds": 3421
}
| Field | Type | What it is |
|---|---|---|
ip |
string | |
version |
integer | 4 · 6 |
score |
integer | Higher is riskier. Built from the reason codes below, capped per category so three blocklists describing one botnet do not count three times. |
band |
string | The score bucketed, for when you want a label rather than a number. clean · low · medium · high |
is_bogon |
boolean | An address that should never appear on the public internet. |
country |
string or null | ISO 3166-1 alpha-2. |
continent |
string or null | |
flags |
string[] | What this address is. Tor exit, Tor relay, VPN and privacy relay are four different things and never collapse into one. tor_exit · tor_relay · vpn · proxy · hosting · cloud · privacy_relay · abuse · abuse_l1 · scanner · bogon · mobile · business · residential · education · government · anycast · geo_disagree |
asn |
integer or null | |
as_name |
string or null | |
as_domain |
string or null | |
network |
string or null | What kind of network it is, where that is known. |
prefix |
string or null | The range this answer covers. CIDR where it is exactly one prefix, start-end otherwise. |
reasons |
Reason[] | Why the score is what it is, biggest mover first. This is the part worth building a rule on. |
categories |
object | The arithmetic: each category's raw total, its cap, and what was actually applied. |
sources |
integer | How many independent sources described this range. |
data_age_seconds |
integer | How old the compiled data is. |