IP Detection
IP lookup API
The full verdict for one IP, range or hostname in a single call.
Look up an IP
Parameters
- targetstringRequired
IPv4, IPv6, CIDR range or hostname.
Response fields
- target.kindstring
ipv4, ipv6, cidr or hostname.
- target.ipstring
Address that was checked. For a hostname, the address it resolved to.
- reserved.reservedboolean
True for private, reserved and documentation ranges.
- verdict.classificationstring
residential_clean, mobile, hosting, datacenter, vpn, residential_proxy, tor, relay or unknown.
- verdict.anonymizedboolean
True when the network hides the person behind it. Hosting counts, except known infrastructure.
- verdict.confidencenumber
Confidence from 0 to 1.
- verdict.methodstring
Which signal decided the verdict.
- verdict.evidencestring[]
Optional. What the class rests on, such as vpn_server_list, relay_range or known_infra.
- purityobject | null
Score breakdown: score, grade, verdict and deductions. Starter and above; null on Free.
- purity.scoreinteger
Cleanliness score from 0 to 100. Starter and above; null on Free.
- purity.gradestring
S+, S, A, B or C. Starter and above; null on Free.
- purity.verdictstring
clean, suspect or dirty. Starter and above; null on Free.
- purity.deductionsarray
Points taken off the score, each with a reason. Starter and above; null on Free.
- networkClassstring
residential_clean, mobile, hosting, datacenter, vpn, residential_proxy, tor, relay or unknown.
- isVpnboolean
True only for vpn, residential_proxy and tor, never for hosting or relay.
- isProxyboolean
True for proxies, including residential proxies.
- isTorboolean
True for Tor exit nodes.
- providerstring | null
Network owner, when known. Starter and above; null on Free.
- vpnProviderstring | null
VPN service on a vpn address (NordVPN, Mullvad...), when known. Starter and above; null on Free.
- riskScoreinteger
Risk from 0 to 100.
- geoobject
Same shape as the geolocation response.
- asnobject
Same shape as the ASN lookup response.
- whoisobject
WHOIS record, for hostname targets.
- degradedstring[]
Parts of the lookup that failed and were left out.
- atstring
When the lookup ran.
- lockedstring[]
Dotted paths of the fields sent as null on this plan. Absent on Starter and above.
- planRequiredstring
Plan that includes the locked fields. Absent on Starter and above.
curl -X POST https://ipscanner.io/v1/ip/lookup \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"target":"8.8.8.8"}'{
"target": {
"raw": "8.8.8.8",
"kind": "ipv4",
"ip": "8.8.8.8"
},
"reserved": {
"reserved": false
},
"verdict": {
"classification": "hosting",
"anonymized": false,
"confidence": 0.9,
"method": "org:hosting",
"evidence": [
"known_infra",
"datacenter_range"
]
},
"purity": {
"score": 86,
"grade": "S",
"verdict": "clean",
"deductions": [
{
"factor": "network_origin",
"points": 14,
"detail": "hosting at high confidence"
}
]
},
"networkClass": "hosting",
"isVpn": false,
"isProxy": false,
"isTor": false,
"provider": "GOOGLE",
"vpnProvider": null,
"riskScore": 25,
"geo": {
"ip": "8.8.8.8",
"country": "United States",
"countryCode": "US",
"city": "",
"region": "",
"postalCode": "",
"latitude": 37.751,
"longitude": -97.822,
"timezone": "America/Chicago",
"accuracyRadius": 1000
},
"asn": {
"ip": "8.8.8.8",
"asn": "AS15169",
"name": "GOOGLE",
"type": "unknown",
"country": "US"
},
"at": "2026-10-06T17:55:29.44292148Z"
}Try it without a key
Parameters
- ipstringpathRequired
IPv4 or IPv6 address.
Response fields
- target.kindstring
ipv4, ipv6, cidr or hostname.
- target.ipstring
Address that was checked. For a hostname, the address it resolved to.
- reserved.reservedboolean
True for private, reserved and documentation ranges.
- verdict.classificationstring
residential_clean, mobile, hosting, datacenter, vpn, residential_proxy, tor, relay or unknown.
- verdict.anonymizedboolean
True when the network hides the person behind it. Hosting counts, except known infrastructure.
- verdict.confidencenumber
Confidence from 0 to 1.
- verdict.methodstring
Which signal decided the verdict.
- verdict.evidencestring[]
Optional. What the class rests on, such as vpn_server_list, relay_range or known_infra.
- purityobject | null
Score breakdown: score, grade, verdict and deductions. Starter and above; null on Free.
- purity.scoreinteger
Cleanliness score from 0 to 100. Starter and above; null on Free.
- purity.gradestring
S+, S, A, B or C. Starter and above; null on Free.
- purity.verdictstring
clean, suspect or dirty. Starter and above; null on Free.
- purity.deductionsarray
Points taken off the score, each with a reason. Starter and above; null on Free.
- networkClassstring
residential_clean, mobile, hosting, datacenter, vpn, residential_proxy, tor, relay or unknown.
- isVpnboolean
True only for vpn, residential_proxy and tor, never for hosting or relay.
- isProxyboolean
True for proxies, including residential proxies.
- isTorboolean
True for Tor exit nodes.
- providerstring | null
Network owner, when known. Starter and above; null on Free.
- vpnProviderstring | null
VPN service on a vpn address (NordVPN, Mullvad...), when known. Starter and above; null on Free.
- riskScoreinteger
Risk from 0 to 100.
- geoobject
Same shape as the geolocation response.
- asnobject
Same shape as the ASN lookup response.
- whoisobject
WHOIS record, for hostname targets.
- degradedstring[]
Parts of the lookup that failed and were left out.
- atstring
When the lookup ran.
- lockedstring[]
Dotted paths of the fields sent as null on this plan. Absent on Starter and above.
- planRequiredstring
Plan that includes the locked fields. Absent on Starter and above.
curl https://ipscanner.io/v1/demo/185.220.101.1{
"target": {
"raw": "185.220.101.1",
"kind": "ipv4",
"ip": "185.220.101.1"
},
"reserved": {
"reserved": false
},
"verdict": {
"classification": "tor",
"anonymized": true,
"confidence": 0.95,
"method": "tor_set",
"evidence": [
"tor_exit_list"
]
},
"networkClass": "tor",
"isVpn": true,
"isProxy": true,
"isTor": true,
"riskScore": 100,
"asn": {
"ip": "185.220.101.1",
"asn": "AS60729",
"name": "Stiftung Erneuerbare Freiheit",
"type": "unknown",
"country": "DE"
},
"at": "2026-10-08T21:55:08.590700162Z",
"purity": null,
"provider": null,
"vpnProvider": null,
"geo": {
"ip": "185.220.101.1",
"country": "Germany",
"countryCode": "DE",
"city": "Brandenburg",
"region": "Brandenburg",
"timezone": "Europe/Berlin",
"latitude": null,
"longitude": null,
"postalCode": null,
"accuracyRadius": null
},
"locked": [
"purity",
"provider",
"vpnProvider",
"geo.latitude",
"geo.longitude",
"geo.postalCode",
"geo.accuracyRadius"
],
"planRequired": "Starter"
}Your own IP
Response fields
- ipv4string
Your IPv4 address, when you connected over IPv4.
- ipv6string
Your IPv6 address, when you connected over IPv6.
- countrystring
Country name.
- countryCodestring
Two-letter ISO country code.
- citystring
City name.
- regionstring
Region or state.
- latitudenumber
Latitude.
- longitudenumber
Longitude.
- timezonestring
IANA timezone.
- asnstring
Autonomous system number, such as AS15169.
- asnNamestring
Name of the organisation that runs the network.
- asnTypestring
hosting, isp, vpn, education, government, mobile or unknown.
curl https://ipscanner.io/v1/myip{
"ipv4": "203.0.113.42",
"country": "Canada",
"countryCode": "CA",
"city": "Montreal",
"region": "Quebec",
"postalCode": "H1K",
"latitude": 45.6085,
"longitude": -73.5493,
"timezone": "America/Toronto",
"accuracyRadius": 5,
"asn": "AS5769",
"asnName": "VIDEOTRON",
"asnType": "isp",
"asnCountry": "CA"
}