IPOK

Developer API

Free, no auth, CORS-enabled. Just GET the endpoints — JSON in, JSON out.

Endpoints

GET/api/ip?ip={ip}

Full IP check: geo, ASN, purity/risk, native IP, use-case scores, AI availability

GET/api/bgp?asn={asn}&ip={ip}

BGP routing: announced prefix, upstream/downstream ASNs (via RIPEstat)

GET/api/reverse-ip?ip={ip}

Reverse IP: domains hosted on the same IP

GET/api/batch?q={ips|cidr}

Batch lookup: location, type and risk for multiple IPs / an IPv4 CIDR at once

GET/api/cidr?q={cidr}

Block reputation: scan a whole CIDR (≤/16) against the offline DB — VPN/Tor/abuse ratio + verdict (no extra requests)

GET/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)
![IP risk](https://ipok.io/api/badge?ip=1.1.1.1)

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

200OK
400Bad request: invalid/private IP, missing ip/asn, etc.
502Upstream 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.