TRACIO analyseert het IP-adres van elke bezoeker aan de serverkant. Het markeert VPN's, proxy's, Tor-exitnodes en datacenterherkomsten en herleidt de geolocatie op stadsniveau en de ASN. De volledige analyse draait aan de serverkant, zonder afhankelijkheden aan de clientkant.
IP Intelligence bereikt uw applicatie via de webhook-payload: het
network-object (VPN-/proxy-/Tor-/datacenter-booleans plus verbindingstype) en het
geo-object (land, stad, coördinaten, tijdzone, ISP) worden bij elke
webhook geleverd. Zie Webhooks voor de volledige payloadstructuur en de
handtekeningverificatie.
De classificatie van VPN, proxy, Tor en datacenter wordt herleid uit het verbindende IP-adres
met behulp van commerciële IP-intelligence-databases (IP2Location voor het VPN-/proxy-/Tor-type,
MaxMind voor geolocatie en ASN). Elk wordt weergegeven als één enkele boolean in het
network-object van de webhook — in de openbare payload is er geen uitsplitsing per methode
en geen betrouwbaarheidsscore.
| Flag | Veld | Betekenis |
|---|---|---|
| VPN | network.vpn | IP behoort tot een bekende VPN-provider |
| Proxy | network.proxy | IP is een datacenter- of residentiële proxy |
| Tor | network.tor | IP is een bekende Tor-exitnode |
| Datacenter | network.datacenter | IP behoort tot een cloud-/hostingprovider |
{ "network": { "vpn": true, "proxy": false, "tor": false, "datacenter": false, "connectionType": "residential" }}// `payload` is the webhook delivery body (/docs/webhooks)if (payload.network.vpn) { // visitor is connecting through a VPN}Datacenter- en residentiële proxy's verschijnen beide als network.proxy; de datacenterherkomst
wordt daarnaast gemeld als network.datacenter. De classificatie komt uit
de IP2Location-proxydatabase, die de grote cloud-/hostingproviders dekt (AWS,
Google Cloud, Azure, Oracle Cloud, Alibaba Cloud, DigitalOcean, Hetzner, OVH,
Linode/Akamai, Vultr en andere).
{ "network": { "vpn": false, "proxy": true, "tor": false, "datacenter": true, "connectionType": "datacenter" }}Een overeenkomst met een Tor-exitnode op het verbindende IP-adres verschijnt als network.tor. Los daarvan
wordt de Tor-browser zelf aan de clientkant gedetecteerd via zijn anti-fingerprinting-configuratie
(canvas-/WebGL-weerstand, UTC-tijdzone, afgeronde schermgrootte) — zie
Smart Signals.
Geolocatie op stadsniveau en de ASN worden aan de serverkant herleid uit het verbindende IP-adres
(MaxMind) en geleverd in het geo-object van de webhook.
| Veld | Type | Beschrijving |
|---|---|---|
geo.country | string | ISO 3166-1 alpha-2 landcode |
geo.city | string | Naam van de stad |
geo.lat | number | Geschatte breedtegraad |
geo.lon | number | Geschatte lengtegraad |
geo.timezone | string | IANA-tijdzone-identifier |
geo.isp | string | Naam van de internetprovider |
{ "geo": { "country": "CZ", "city": "Prague", "lat": 50.05, "lon": 14.4, "timezone": "Europe/Prague", "isp": "Comcast Cable" }}Het matchen tegen IP-blokkeerlijsten en velocity-tracking (IP-overschrijdende / landoverschrijdende activiteit)
maken geen deel uit van het huidige openbare contract. Noch de webhook-payload noch
het dashboard stelt blokkeerlijstcategorieën of velocity-intervallen beschikbaar. Het webhook-
oppervlak voor netwerkrisico's beperkt zich tot de booleaanse network-flags en het
verbindingstype; gebruik deze samen met de velden decision en bot (zie
Smart Signals) voor risicobeslissingen.
Dit leest het network-object van de webhook-payload rechtstreeks. Zie
Webhooks voor de volledige payload en de handtekeningverificatie.
// `payload` is the webhook delivery body (/docs/webhooks)function assessIPRisk(payload: WebhookPayload) { const { vpn, proxy, tor, datacenter } = payload.network
const risks: string[] = [] let riskLevel = "low"
if (tor) { risks.push("Tor exit node") riskLevel = "critical" }
if (vpn) { risks.push("VPN detected") riskLevel = riskLevel === "low" ? "medium" : riskLevel }
if (proxy) { risks.push("Proxy detected") riskLevel = riskLevel === "low" ? "medium" : riskLevel }
if (datacenter) { risks.push("Datacenter IP") riskLevel = riskLevel === "low" ? "medium" : riskLevel }
return { riskLevel, risks }}