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.
https://ipinfobox.com/api/v1Look 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_providerWhether the address is on the public VPN server list, and the provider name (null if unknown)
torWhether it is on the Tor Project exit node list
hosting, hosting_providerWhether it is in an official cloud IP range or a hosting company network, and the company name
cloud_regionThe 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 requestRemaining 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_ipNot a valid IP address.
401 invalid_api_keyThe key is missing or wrong.
402 no_subscriptionYour plan has ended. Pay again and you can use it right away.
429 rate_limited / daily_limitToo many requests, or today's usage is used up.