TRACIO analyse l'adresse IP de chaque visiteur côté serveur. Il signale les VPN, les proxys, les nœuds de sortie Tor et les origines datacenter, et résout la géolocalisation au niveau de la ville. Toute l'analyse s'exécute côté serveur, sans aucune dépendance côté client.
L'IP intelligence parvient à votre application via le payload du webhook : l'objet
network (booléens VPN/proxy/Tor/datacenter, type de connexion et, à partir de Pro,
proxyDetected) et l'objet geo (pays, ville, coordonnées, fuseau horaire) sont livrés sur
chaque webhook. L'ISP, l'ASN et l'objet realIp sont ajoutés à partir de Business. Consultez
Webhooks pour la structure complète du payload et la vérification de
signature.
La classification VPN, proxy, Tor et datacenter est résolue à partir de l'IP de connexion
au moyen de bases de données commerciales d'intelligence IP (IP2Location pour le type VPN/proxy/Tor,
MaxMind pour la géolocalisation et l'ASN). Chacun de ces quatre indicateurs est exposé sous forme d'un booléen unique sur
l'objet network du webhook — il n'existe ni ventilation par méthode ni score de confiance dans
le payload public.
| Indicateur | Champ | Signification |
|---|---|---|
| VPN | network.vpn | L'IP appartient à un fournisseur VPN connu |
| Proxy | network.proxy | L'IP est un proxy datacenter ou résidentiel |
| Tor | network.tor | L'IP est un nœud de sortie Tor connu |
| Datacenter | network.datacenter | L'IP appartient à un fournisseur cloud/hébergement |
{ "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}Les proxys datacenter et résidentiels apparaissent tous deux sous network.proxy ; l'origine
datacenter est en outre signalée via network.datacenter. La classification provient de
la base de données proxy IP2Location, qui couvre les principaux fournisseurs cloud/hébergement (AWS,
Google Cloud, Azure, Oracle Cloud, Alibaba Cloud, DigitalOcean, Hetzner, OVH,
Linode/Akamai, Vultr, et d'autres).
{ "network": { "vpn": false, "proxy": true, "tor": false, "datacenter": true, "connectionType": "DCH" }}network.proxy classe l'adresse depuis laquelle la connexion est arrivée. Une vérification
distincte compare le trafic de pages d'une visite avec son chemin réseau brut : lorsque les
deux sortent par des réseaux différents, un proxy ou un VPN se trouve entre le navigateur et
votre site, et la visite est signalée avec network.proxyDetected: true. Deux adresses du
même fournisseur — NAT d'opérateur, une seconde sortie du même VPN — ne comptent pas.
À partir de Business, l'adresse publique observée derrière le proxy ou le VPN est livrée à
côté de l'adresse depuis laquelle la connexion est arrivée, avec son pays et son ISP, sous la
forme network.realIp. Elle est absente lorsqu'aucune adresse de ce type n'a été observée :
lisez-la donc avec une protection (network.realIp?.country) ; country et isp sont
absents lorsqu'ils n'ont pas pu être résolus.
{ "network": { "proxy": false, "proxyDetected": true, "realIp": { "address": "203.0.113.7", "country": "NL", "isp": "KPN" } }}Dans les Webhooks, les deux champs arrivent sous les mêmes noms à chaque
visite. Le résumé du visiteur de la Data API les agrège sous la forme
network.proxyDetectedSeen (si un proxy s'est un jour trouvé devant) et
network.lastRealIp (l'adresse la plus récente, sous forme de simple chaîne).
Une correspondance avec un nœud de sortie Tor sur l'IP de connexion apparaît via network.tor. Séparément,
le navigateur Tor lui-même est reconnu côté client à sa
configuration anti-fingerprinting, indépendamment du chemin réseau — voir
Smart Signals.
La géolocalisation au niveau de la ville est résolue côté serveur à partir de l'IP de connexion
(MaxMind) et livrée sur l'objet geo du webhook.
| Champ | Type | Description | Offre |
|---|---|---|---|
geo.country | string | Code pays ISO 3166-1 alpha-2 | Toutes |
geo.city | string | Nom de la ville | Toutes |
geo.lat | number | Latitude approximative | Toutes |
geo.lon | number | Longitude approximative | Toutes |
geo.timezone | string | Identifiant de fuseau horaire IANA | Toutes |
{ "geo": { "country": "CZ", "city": "Prague", "lat": 50.05, "lon": 14.4, "timezone": "Europe/Prague" }}Sur les offres Business et Enterprise, l'opérateur est également identifié. Dans le payload
du webhook, les deux champs se trouvent sur l'objet network :
{ "network": { "vpn": false, "proxy": false, "tor": false, "datacenter": false, "isp": "Comcast Cable", "asn": 7922 }}Lors de la lecture d'une session via la Data API, la répartition est
légèrement différente : isp se trouve sur geo et asn sur network. Mêmes données, deux
surfaces — lisez le champ là où le place la surface que vous utilisez.
À partir de Pro, le webhook transporte un bloc velocity — dans quelle mesure le visiteur
s'est déplacé récemment :
| Champ | Type | Description |
|---|---|---|
velocity.events5m | number | Événements de ce visiteur au cours des 5 dernières minutes |
velocity.uniqueIps | number | IP distinctes observées pour ce visiteur |
velocity.uniqueLocations | number | Localisations distinctes observées pour ce visiteur |
Le bloc est présent lorsque les compteurs du visiteur sont disponibles au moment de
l'événement (normalement la phase primary). Un bloc absent signifie « aucune donnée », et
non des zéros — ne traitez pas son absence comme « aucune activité inhabituelle ».
La correspondance avec des listes de blocage IP ne fait pas partie du contrat public : ni
le payload du webhook ni le dashboard n'exposent de catégories de listes de blocage. La
surface du webhook pour le risque réseau se compose des indicateurs booléens network, de
proxyDetected, de l'objet realIp à partir de Business, du type de connexion et des
compteurs de vélocité ci-dessus ; utilisez-les conjointement avec les champs decision et
bot (voir Smart Signals) pour les décisions de risque.
Ceci lit directement l'objet network du payload du webhook. Consultez
Webhooks pour le payload complet et la vérification de signature.
// `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 }}