IPinfoBox

API docs

Look up IPs with the API key of an account that has an active plan. Put the key in the X-API-Key header or add ?key= to the address. The 3 month plan allows up to 5,000 lookups a day; the 6 and 12 month plans have no daily limit. Daily usage resets every day at 00:00 UTC. Every plan allows up to 20 lookups a second.

Base URLhttps://ipinfobox.com/api/v1

Look up one IP

curl -H "X-API-Key: YOUR_KEY" https://ipinfobox.com/api/v1/8.8.8.8

{
  "ip": "8.8.8.8", "version": 4, "type": "public",
  "country": { "code": "US", "name": "United States", "name_en": "United States" },
  "region": "California", "city": "Mountain View", "continent": "NA",
  "location": { "lat": 37.422, "lon": -122.085 },
  "asn": { "number": 15169, "org": "Google LLC" },
  "privacy": { "vpn": false, "vpn_provider": null, "tor": false,
               "hosting": true, "hosting_provider": "Google", "cloud_region": null }
}

IPv6 works the same way. For private and special IPs, type is private or reserved and the location values are null.

Visitor checks (privacy)

vpn, vpn_provider

Whether the address is on the public VPN server list, and the provider name (null if unknown)

tor

Whether it is on the Tor Project exit node list

hosting, hosting_provider

Whether it is in an official cloud IP range or a hosting company network, and the company name

cloud_region

The region, when it is in a cloud range (for example us-east-1)

The lists are refreshed daily. VPNs not on the list and residential proxies come back as false. For private and special IPs, privacy is null. How the checks work

Using it on visitor IPs

// Node.js (Express): ask for extra verification when a sign-up comes from a VPN, Tor or a data center
app.post("/signup", async (req, res) => {
  const ip = req.headers["cf-connecting-ip"] ?? req.ip; // behind Cloudflare: CF-Connecting-IP
  const r = await fetch(`https://ipinfobox.com/api/v1/${ip}`, { headers: { "X-API-Key": process.env.IPINFOBOX_KEY } });
  const info = await r.json();
  if (info.privacy && (info.privacy.vpn || info.privacy.tor || info.privacy.hosting)) {
    return res.status(403).json({ error: "extra verification required" });
  }
  // continue sign-up
});
# Python
import requests
info = requests.get(f"https://ipinfobox.com/api/v1/{ip}", headers={"X-API-Key": KEY}, timeout=3).json()
risky = bool(info.get("privacy")) and (info["privacy"]["vpn"] or info["privacy"]["tor"] or info["privacy"]["hosting"])

Look up your own IP

GET /api/v1/me        the IP and details of the address that sent the request

Remaining usage

GET /api/v1/usage     {"plan_ends_at":"2026-11-11T...","used_today":12,"daily_limit":5000}  (null on plans without a daily limit)

Errors

400 invalid_ip

Not a valid IP address.

401 invalid_api_key

The key is missing or wrong.

402 no_subscription

Your plan has ended. Pay again and you can use it right away.

429 rate_limited / daily_limit

Too many requests, or today's usage is used up.