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 ainsi que l'ASN. 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 plus type de connexion) et l'objet
geo (pays, ville, coordonnées, fuseau horaire, ISP) sont livrés sur chaque
webhook. 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). Chacune est exposée 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": 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}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": "datacenter" }}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 détecté côté client via sa
configuration anti-fingerprinting (résistance canvas/WebGL, fuseau horaire UTC, taille d'écran arrondie) — voir
Smart Signals.
La géolocalisation au niveau de la ville et l'ASN sont résolus côté serveur à partir de l'IP de connexion
(MaxMind) et livrés sur l'objet geo du webhook.
| Champ | Type | Description |
|---|---|---|
geo.country | string | Code pays ISO 3166-1 alpha-2 |
geo.city | string | Nom de la ville |
geo.lat | number | Latitude approximative |
geo.lon | number | Longitude approximative |
geo.timezone | string | Identifiant de fuseau horaire IANA |
geo.isp | string | Nom du fournisseur d'accès Internet |
{ "geo": { "country": "CZ", "city": "Prague", "lat": 50.05, "lon": 14.4, "timezone": "Europe/Prague", "isp": "Comcast Cable" }}La correspondance avec des listes de blocage IP et le suivi de vélocité (activité cross-IP / cross-pays)
ne font pas partie du contrat public actuel. Ni le payload du webhook ni
le dashboard n'exposent de catégories de listes de blocage ou d'intervalles de vélocité. La surface du webhook
pour le risque réseau se limite aux indicateurs booléens network et au
type de connexion ; 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 }}