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 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, Verbindungstyp und, ab Pro, proxyDetected) und das
geo-Objekt (Land, Stadt, Koordinaten, Zeitzone) werden mit jedem Webhook geliefert. ISP, ASN
und das realIp-Objekt kommen ab Business hinzu. 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). Jedes dieser vier Flags 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": true, "tor": false, "datacenter": false, "connectionType": "VPN" }}// `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": "DCH" }}network.proxy klassifiziert die Adresse, von der die Verbindung kam. Eine separate
Prüfung vergleicht den Seiten-Traffic eines Besuchs mit seinem rohen Netzwerkpfad: gehen
beide über unterschiedliche Netze nach außen, sitzt ein Proxy oder VPN zwischen dem Browser
und Ihrer Website, und der Besuch wird mit network.proxyDetected: true gemeldet. Zwei
Adressen desselben Anbieters – Carrier-NAT, ein zweiter Ausgang desselben VPN – zählen nicht.
Ab Business wird die hinter dem Proxy oder VPN beobachtete öffentliche Adresse neben der
Adresse geliefert, von der die Verbindung kam – mit Land und ISP, als network.realIp. Sie
fehlt, wenn keine solche Adresse beobachtet wurde; lesen Sie sie deshalb abgesichert
(network.realIp?.country). country und isp fehlen, wenn sie nicht aufgelöst werden
konnten.
{ "network": { "proxy": false, "proxyDetected": true, "realIp": { "address": "203.0.113.7", "country": "NL", "isp": "KPN" } }}In Webhooks kommen beide Felder bei jedem Besuch unter denselben Namen an.
Die Besucherzusammenfassung der Data API aggregiert sie als
network.proxyDetectedSeen (ob jemals ein Proxy davor saß) und network.lastRealIp (die
zuletzt beobachtete Adresse, als einfacher String).
Eine Übereinstimmung mit einem Tor-Exit-Node auf der verbindenden IP erscheint als network.tor. Getrennt davon
wird der Tor-Browser selbst clientseitig an seiner Anti-Fingerprinting-Konfiguration
erkannt – unabhängig vom Netzwerkpfad – siehe
Smart Signals.
Die Geolokalisierung auf Stadtebene wird serverseitig aus der verbindenden IP aufgelöst
(MaxMind) und im geo-Objekt des Webhooks geliefert.
| Feld | Typ | Beschreibung | Tarif |
|---|---|---|---|
geo.country | string | ISO 3166-1 alpha-2 Ländercode | Alle |
geo.city | string | Stadtname | Alle |
geo.lat | number | Ungefährer Breitengrad | Alle |
geo.lon | number | Ungefährer Längengrad | Alle |
geo.timezone | string | IANA-Zeitzonenbezeichner | Alle |
{ "geo": { "country": "CZ", "city": "Prague", "lat": 50.05, "lon": 14.4, "timezone": "Europe/Prague" }}In den Tarifen Business und Enterprise wird zusätzlich der Anbieter identifiziert. Im
Webhook-Payload liegen beide Felder im network-Objekt:
{ "network": { "vpn": false, "proxy": false, "tor": false, "datacenter": false, "isp": "Comcast Cable", "asn": 7922 }}Beim Lesen einer Session über die Data API ist die Aufteilung leicht
anders: isp liegt in geo und asn in network. Dieselben Daten, zwei Oberflächen – lesen
Sie das Feld dort, wo die von Ihnen genutzte Oberfläche es ablegt.
Ab Pro führt der Webhook einen velocity-Block mit – wie stark sich der Besucher zuletzt
bewegt hat:
| Feld | Typ | Beschreibung |
|---|---|---|
velocity.events5m | number | Events dieses Besuchers in den letzten 5 Minuten |
velocity.uniqueIps | number | Verschiedene IPs, die für diesen Besucher zu sehen waren |
velocity.uniqueLocations | number | Verschiedene Standorte, die für diesen Besucher zu sehen waren |
Der Block ist vorhanden, wenn die Besucherzähler zum Zeitpunkt des Events verfügbar sind
(in der Regel die primary-Phase). Ein fehlender Block bedeutet „keine Daten“, nicht Null –
werten Sie sein Fehlen nicht als „keine ungewöhnliche Aktivität“.
Der Abgleich mit IP-Blocklisten ist nicht Teil des öffentlichen Vertrags: Weder der
Webhook-Payload noch das Dashboard geben Blocklisten-Kategorien preis. Die Webhook-Oberfläche
für Netzwerkrisiken besteht aus den booleschen network-Flags, proxyDetected, dem
realIp-Objekt ab Business, dem Verbindungstyp und den oben genannten Velocity-Zählern –
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 }}