Prerequisites
- A Java 17+ project with
io.ip-api:ipapiadded - A free ip-api.io API key
Read suspiciousFactors() on any lookup
No dedicated call needed — the accessors ride along with a normal lookup.
IpApiClient client = IpApiClient.builder()
.apiKey(System.getenv("IP_API_IO_KEY"))
.build();
IpInfo info = client.lookup("185.220.101.1");
var f = info.suspiciousFactors();
System.out.println(f.isVpn()); // VPN service
System.out.println(f.isProxy()); // open / anonymizing proxy
System.out.println(f.isTorNode()); // Tor node
System.out.println(f.isDatacenter()); // hosting / datacenter IP (often a bot)
System.out.println(f.isSpam()); // known spam source
System.out.println(f.isCrawler()); // known crawler / bot
System.out.println(f.isThreat()); // listed on a threat feed
if (f.isVpn() || f.isProxy() || f.isTorNode()) {
// require step-up verification (CAPTCHA, 2FA)
} Confirm a Tor exit node with torCheck
A dedicated check against the live Tor node list, with a count of matching nodes.
var tor = client.torCheck("185.220.101.1");
System.out.println(tor.isTor()); // true
System.out.println(tor.torNodeCount()); // number of matching Tor nodes riskScore(ip).