IP check
Find out where an IP address is, who owns its network, and whether it's a datacenter, VPN network, privacy relay or Tor exit.
POST /v1/ip/check · 1 credit
Request
| Field | Type | Required | Description |
|---|---|---|---|
ip |
string | yes | An IPv4 or IPv6 address. |
curl https://veqen-app.com/v1/ip/check \
-H "Authorization: Bearer $VEQEN_API_KEY" \
-H "Content-Type: application/json" \
-d '{"ip": "185.220.101.1"}'
r = requests.post(
"https://veqen-app.com/v1/ip/check",
headers={"Authorization": f"Bearer {VEQEN_API_KEY}"},
json={"ip": visitor_ip},
timeout=10,
)
const r = await fetch("https://veqen-app.com/v1/ip/check", {
method: "POST",
headers: { Authorization: `Bearer ${VEQEN_API_KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({ ip: visitorIp }),
});
GET /v1/ip/check?ip=... works too. Leave out ip on the GET form to check the address the request came from.
Which IP to send
Send the visitor's IP as your server sees it, never a value the browser reports.
- No proxy in front of your app: use the connection's remote address.
- Behind a load balancer or CDN: use the left-most address in
X-Forwarded-Forthat your own proxy added. Cloudflare also gives youCF-Connecting-IP.
Response
{
"ip": "185.220.101.1",
"valid": true,
"version": 4,
"type": "public",
"location": {
"country_code": "DE",
"country": "Germany",
"in_eu": true,
"region": "Hamburg",
"city": "Hamburg (Hamburg-Nord)",
"continent": "EU",
"latitude": 53.5735,
"longitude": 10.0548
},
"network": {
"asn": 60729,
"organization": "Stiftung Erneuerbare Freiheit",
"kind": "isp",
"kind_label": "Internet service provider",
"known_network": null
},
"flags": { "hosting": false, "vpn_likely": false, "relay": false, "tor": true },
"risk": {
"score": 85,
"level": "high",
"verdict": "refuse",
"reasons": [
{ "code": "tor_exit_node", "impact": 85, "message": "This address is a Tor exit node." }
]
}
}
Fields
| Field | What it tells you |
|---|---|
type |
public for normal internet addresses. private, loopback and others mean you're sending an internal address, probably your own proxy's. |
location |
Country, region and city. Country is reliable; city is a best guess. |
network.asn / organization |
Who owns the network the address belongs to. |
network.kind |
isp (home, business or mobile provider), cloud, hosting, vpn_hosting (hosting popular with commercial VPNs), cdn (CDN or privacy relay) or unknown. |
flags.hosting |
The address is a server, not a person's connection. |
flags.vpn_likely |
The network is mostly used by VPN services. |
flags.relay |
Traffic comes through a CDN or privacy relay such as Cloudflare WARP. Low risk on its own. |
flags.tor |
The address is a current Tor exit node (list refreshed hourly). |
Frequently asked questions
Should I block datacenter IPs?
Not outright. Real people use VPNs. Treat it as one signal: a datacenter IP plus a throwaway email is a bot pattern; a datacenter IP with a company email is usually a person on a VPN. The signup check weighs these together for you.
Where does the location data come from?
From DB-IP's free Lite databases (licensed CC BY 4.0), refreshed monthly. Tor exits come from the Tor Project and refresh hourly.