Признаки ASN/BGP, публичные cloud-диапазоны, VPN
Один эндпоинт, JSON-ответ. Без авторизации, 60 req/min
# проверка конкретного IP curl "https://api.geoipboss.net/api/v1/ip/8.8.8.8/full" # по доменному имени curl "https://api.geoipboss.net/api/v1/ip/example.com/full" # случайный публичный IP — удобно для тестов curl "https://api.geoipboss.net/api/v1/ip/random/full"
import httpx r = httpx.get("https://api.geoipboss.net/api/v1/ip/8.8.8.8/full") data = r.json()["data"] if data["threat"] and data["threat"].get("is_tor"): print("TOR exit node") elif data["threat"] and data["threat"].get("is_datacenter"): print("Datacenter:", data["threat"]["cloud_provider"]) else: print("Clean:", data["isp"]["isp"])
package main import ( "encoding/json" "fmt" "net/http" ) func main() { resp, _ := http.Get("https://api.geoipboss.net/api/v1/ip/8.8.8.8/full") defer resp.Body.Close() var out struct { Success bool `json:"success"` Data map[string]interface{} `json:"data"` } json.NewDecoder(resp.Body).Decode(&out) fmt.Printf("%+v\n", out.Data["threat"]) }
const r = await fetch('https://api.geoipboss.net/api/v1/ip/8.8.8.8/full'); const { data } = await r.json(); if (data.threat?.is_vpn) { console.warn('VPN exit:', data.threat.proxy_type, data.isp?.org); } // также поддерживается домен const byDomain = await fetch('https://api.geoipboss.net/api/v1/ip/example.com/full');
{
"success": true,
"data": {
"ip_address": "185.220.101.1",
"country": {
"ccode": "de", "country": "ФРГ",
"location": "Бранденбург, Бранденбург",
"latitude": 52.6171, "longitude": 13.1207,
"isproxy": true, "issatellite": false
},
"isp": {
"isp": "Stiftung Erneuerbare Freiheit",
"org": "Stiftung Erneuerbare Freiheit",
"ismobile": false
},
"threat": {
"is_proxy": true, "is_vpn": true, "is_tor": true,
"is_datacenter": false,
"proxy_type": "TOR", "usage_type": "anonymous",
"confidence_weight": 1.0,
"asn": 60729, "org": "Stiftung Erneuerbare Freiheit"
}
}
}