TRACIO analysiert die IP-Adresse jedes Besuchers serverseitig. Es kennzeichnet VPNs, Proxys, Tor-Exit-Nodes und Datacenter-Herkünfte und löst die Geolokalisierung auf Stadtebene sowie die ASN auf. Die gesamte Analyse läuft serverseitig, ohne clientseitige Abhängigkeiten.
IP Intelligence erreicht Ihre Anwendung über den Webhook-Payload: das
network-Objekt (VPN-/Proxy-/Tor-/Datacenter-Booleans plus Verbindungstyp) und das
geo-Objekt (Land, Stadt, Koordinaten, Zeitzone, ISP) werden mit jedem
Webhook geliefert. Die vollständige Payload-Struktur und die Signaturprüfung finden Sie unter Webhooks.
Die Klassifizierung von VPN, Proxy, Tor und Datacenter wird anhand der verbindenden IP
aus kommerziellen IP-Intelligence-Datenbanken aufgelöst (IP2Location für den VPN-/Proxy-/Tor-Typ,
MaxMind für Geolokalisierung und ASN). Jede wird als einzelner Boolean im
network-Objekt des Webhooks ausgegeben – im öffentlichen Payload gibt es keine
Aufschlüsselung nach Methode und keinen Konfidenzwert.
| Flag | Feld | Bedeutung |
|---|---|---|
| VPN | network.vpn | IP gehört zu einem bekannten VPN-Anbieter |
| Proxy | network.proxy | IP ist ein Datacenter- oder Residential Proxy |
| Tor | network.tor | IP ist ein bekannter Tor-Exit-Node |
| Datacenter | network.datacenter | IP gehört zu einem Cloud-/Hosting-Anbieter |
{ "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- und Residential Proxys erscheinen beide als network.proxy; die Datacenter-Herkunft
wird zusätzlich als network.datacenter gemeldet. Die Klassifizierung stammt aus
der IP2Location-Proxy-Datenbank, die die großen Cloud-/Hosting-Anbieter abdeckt (AWS,
Google Cloud, Azure, Oracle Cloud, Alibaba Cloud, DigitalOcean, Hetzner, OVH,
Linode/Akamai, Vultr und weitere).
{ "network": { "vpn": false, "proxy": true, "tor": false, "datacenter": true, "connectionType": "datacenter" }}Eine Übereinstimmung mit einem Tor-Exit-Node auf der verbindenden IP erscheint als network.tor. Getrennt davon
wird der Tor-Browser selbst clientseitig über seine Anti-Fingerprinting-Konfiguration
erkannt (Canvas-/WebGL-Widerstand, UTC-Zeitzone, gerundete Bildschirmgröße) – siehe
Smart Signals.
Die Geolokalisierung auf Stadtebene und die ASN werden serverseitig aus der verbindenden IP aufgelöst
(MaxMind) und im geo-Objekt des Webhooks geliefert.
| Feld | Typ | Beschreibung |
|---|---|---|
geo.country | string | ISO 3166-1 alpha-2 Ländercode |
geo.city | string | Stadtname |
geo.lat | number | Ungefährer Breitengrad |
geo.lon | number | Ungefährer Längengrad |
geo.timezone | string | IANA-Zeitzonenbezeichner |
geo.isp | string | Name des Internetdienstanbieters |
{ "geo": { "country": "CZ", "city": "Prague", "lat": 50.05, "lon": 14.4, "timezone": "Europe/Prague", "isp": "Comcast Cable" }}Der Abgleich mit IP-Blocklisten und das Velocity-Tracking (IP-übergreifende / länderübergreifende Aktivität)
sind nicht Teil des aktuellen öffentlichen Vertrags. Weder der Webhook-Payload noch
das Dashboard geben Blocklisten-Kategorien oder Velocity-Intervalle preis. Die Webhook-
Oberfläche für Netzwerkrisiken beschränkt sich auf die booleschen network-Flags und den
Verbindungstyp; nutzen Sie diese zusammen mit den Feldern decision und bot (siehe
Smart Signals) für Risikoentscheidungen.
Dies liest das network-Objekt des Webhook-Payloads direkt. Den vollständigen Payload und die Signaturprüfung finden Sie unter
Webhooks.
// `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 }}