Developer API
Free, no auth, CORS-enabled. Just GET the endpoints — JSON in, JSON out.
Endpoints
/api/ip?ip={ip}Full IP check: geo, ASN, purity/risk, native IP, use-case scores, AI availability
/api/bgp?asn={asn}&ip={ip}BGP routing: announced prefix, upstream/downstream ASNs (via RIPEstat)
/api/reverse-ip?ip={ip}Reverse IP: domains hosted on the same IP
/api/batch?q={ips|cidr}Batch lookup: location, type and risk for multiple IPs / an IPv4 CIDR at once
/api/cidr?q={cidr}Block reputation: scan a whole CIDR (≤/16) against the offline DB — VPN/Tor/abuse ratio + verdict (no extra requests)
/api/badge?ip={ip}SVG risk badge, band-colored — embeddable in READMEs / forums (?label= custom left text, ?lang=zh|en)
Example
# Full IP check: geo, ASN, purity/risk, native IP, use-case scores, AI availability
curl "https://ipok.io/api/ip?ip=1.1.1.1"
# BGP routing: announced prefix, upstream/downstream ASNs (via RIPEstat)
curl "https://ipok.io/api/bgp?asn=AS13335&ip=1.1.1.1"
# Reverse IP: domains hosted on the same IP
curl "https://ipok.io/api/reverse-ip?ip=1.1.1.1"
# Batch lookup: location, type and risk for multiple IPs / an IPv4 CIDR at once
curl "https://ipok.io/api/batch?q=1.1.1.1,8.8.8.8"
# Block reputation: scan a whole CIDR (≤/16) against the offline DB — VPN/Tor/abuse ratio + verdict (no extra requests)
curl "https://ipok.io/api/cidr?q=146.70.50.0/24"
# SVG risk badge, band-colored — embeddable in READMEs / forums (?label= custom left text, ?lang=zh|en)
Key response fields
{
"geo": { "ip", "version", "country", "city", "asn", "asName", "isp", "lat", "lon" },
"ipType": "residential | hosting | mobile | business | unknown",
"usageType": "isp | dual_isp | business | hosting | mobile | education | government | unknown",
"risk": 0,
"riskBreakdown": { // how the score was computed (see /methodology)
"contributors": [{ "source", "risk", "weight" }],
"weightedAvg": 0,
"floors": [{ "key": "tor", "floor": 90 }],
"final": 0
},
"signals": ["proxy", "hosting", ...],
"blocklist": { "listed": ["SpamCop"], "checked": 5 }, // DNSBL hits, IPv4 only
"anonAsn?": { "asn", "name", "type" }, // known VPN/proxy provider ASN
"nativeType": "native | broadcast | unknown",
"sharedUsers": { "range": "1-5", "quality": "good | ok | poor | unknown" },
"scenarios": [{ "key": "tiktok", "stars": 3, "verdict": "try" }],
"services": [{ "key": "chatgpt", "status": "available" }],
"media": [{ "key": "netflix", "status": "available" }], // region reference, not a live unlock test
"sources": [{ "source": "ip-api", "risk": 10, "flags": {} }],
"intel?": { "asn", "company", "datacenter", "abuse" }, // ipapi.is enrichment
"asnHistory?": [{ "asn", "firstSeen", "lastSeen" }],
"rdap?": { "registry", "country", "registered", "org" } // "?" = optional, omitted when unavailable
}Status / errors
| 200 | OK |
| 400 | Bad request: invalid/private IP, missing ip/asn, etc. |
| 502 | Upstream data source unavailable or timed out |
Rate limits & caching
No hard per-key rate limit; effectively bounded by upstream free-tier quotas (some endpoints are edge-cached). Add your own cache for high-volume or commercial use. Errors are { "error": "..." }.
Please use responsibly; add your own cache for high-volume or commercial use.