TRACIO analizza l'indirizzo IP di ogni visitatore lato server. Segnala VPN, proxy, nodi di uscita Tor e origini datacenter, e risolve la geolocalizzazione a livello di città. Tutta l'analisi viene eseguita lato server senza dipendenze lato client.
L'IP intelligence raggiunge la propria applicazione attraverso il payload del webhook:
l'oggetto network (booleani VPN/proxy/Tor/datacenter, il tipo di connessione e, da Pro in
su, proxyDetected) e l'oggetto geo (paese, città, coordinate, fuso orario) sono consegnati
su ogni webhook. ISP, ASN e l'oggetto realIp sono aggiunti da Business in su. Vedi
Webhooks per la struttura completa del payload e la verifica della firma.
La classificazione di VPN, proxy, Tor e datacenter è risolta a partire dall'IP di connessione
usando database commerciali di IP intelligence (IP2Location per il tipo VPN/proxy/Tor,
MaxMind per la geolocalizzazione e l'ASN). Ciascuno di questi quattro flag è esposto come un singolo booleano sull'oggetto
network del webhook — non esiste un dettaglio per metodo o un punteggio di confidenza nel
payload pubblico.
| Flag | Campo | Significato |
|---|---|---|
| VPN | network.vpn | L'IP appartiene a un provider VPN noto |
| Proxy | network.proxy | L'IP è un proxy datacenter o residenziale |
| Tor | network.tor | L'IP è un nodo di uscita Tor noto |
| Datacenter | network.datacenter | L'IP appartiene a un provider cloud/hosting |
{ "network": { "vpn": true, "proxy": true, "tor": false, "datacenter": false, "connectionType": "VPN" }}// `payload` è il corpo di consegna del webhook (/docs/webhooks)if (payload.network.vpn) { // il visitatore si connette tramite una VPN}I proxy datacenter e residenziali sono entrambi esposti come network.proxy; l'origine datacenter
è inoltre riportata come network.datacenter. La classificazione proviene dal
database proxy di IP2Location, che copre i principali provider cloud/hosting (AWS,
Google Cloud, Azure, Oracle Cloud, Alibaba Cloud, DigitalOcean, Hetzner, OVH,
Linode/Akamai, Vultr e altri).
{ "network": { "vpn": false, "proxy": true, "tor": false, "datacenter": true, "connectionType": "DCH" }}network.proxy classifica l'indirizzo da cui è arrivata la connessione. Un controllo separato
confronta il traffico di pagina di una visita con il suo percorso di rete grezzo: quando i due
escono attraverso reti diverse, tra il browser e il suo sito si trova un proxy o una VPN, e la
visita viene segnalata con network.proxyDetected: true. Due indirizzi dello stesso provider —
NAT dell'operatore, una seconda uscita della stessa VPN — non contano.
Sui piani Business e superiori l'indirizzo pubblico osservato dietro il proxy o la VPN viene
consegnato accanto all'indirizzo da cui è arrivata la connessione, con il relativo paese e
ISP, come network.realIp. È assente quando non è stato osservato alcun indirizzo di questo
tipo, quindi lo legga con una protezione (network.realIp?.country); country e isp sono
assenti quando non è stato possibile risolverli.
{ "network": { "proxy": false, "proxyDetected": true, "realIp": { "address": "203.0.113.7", "country": "NL", "isp": "KPN" } }}Nei Webhooks entrambi i campi arrivano con gli stessi nomi a ogni visita.
Il riepilogo del visitatore della Data API li aggrega come
network.proxyDetectedSeen (se un proxy si è mai trovato davanti) e network.lastRealIp
(l'indirizzo più recente, come semplice stringa).
Una corrispondenza con un nodo di uscita Tor sull'IP di connessione è esposta come network.tor. Separatamente,
il Tor Browser stesso viene riconosciuto lato client dalla sua configurazione anti-fingerprinting,
indipendentemente dal percorso di rete — vedi
Smart Signals.
La geolocalizzazione a livello di città è risolta lato server a partire dall'IP di connessione
(MaxMind) e consegnata sull'oggetto geo del webhook.
| Campo | Tipo | Descrizione | Piano |
|---|---|---|---|
geo.country | string | Codice paese ISO 3166-1 alpha-2 | Tutti |
geo.city | string | Nome della città | Tutti |
geo.lat | number | Latitudine approssimativa | Tutti |
geo.lon | number | Longitudine approssimativa | Tutti |
geo.timezone | string | Identificatore di fuso orario IANA | Tutti |
{ "geo": { "country": "CZ", "city": "Prague", "lat": 50.05, "lon": 14.4, "timezone": "Europe/Prague" }}Sui piani Business ed Enterprise viene identificato anche l'operatore. Nel payload del
webhook entrambi i campi si trovano sull'oggetto network:
{ "network": { "vpn": false, "proxy": false, "tor": false, "datacenter": false, "isp": "Comcast Cable", "asn": 7922 }}Leggendo una sessione dalla Data API la suddivisione è leggermente
diversa: isp si trova su geo e asn su network. Stessi dati su due superfici: leggi il
campo da dove lo colloca la superficie che stai usando.
Da Pro in su il webhook trasporta un blocco velocity: quanto il visitatore si è spostato
di recente:
| Campo | Tipo | Descrizione |
|---|---|---|
velocity.events5m | number | Eventi di questo visitatore negli ultimi 5 minuti |
velocity.uniqueIps | number | IP distinti osservati per questo visitatore |
velocity.uniqueLocations | number | Località distinte osservate per questo visitatore |
Il blocco è presente quando i contatori del visitatore sono disponibili al momento
dell'evento (normalmente la fase primary). Un blocco mancante significa «nessun dato», non
zeri: non interpreti la sua assenza come «nessuna attività insolita».
La corrispondenza con blocklist IP non fa parte del contratto pubblico: né il payload del
webhook né la dashboard espongono categorie di blocklist. La superficie del webhook per il
rischio di rete è costituita dai flag booleani network, da proxyDetected, dall'oggetto
realIp da Business, dal tipo di connessione e dai contatori di velocity sopra riportati; li
usi insieme ai campi decision e bot (vedi Smart Signals) per le
decisioni di rischio.
Questo legge direttamente l'oggetto network del payload del webhook. Vedi
Webhooks per il payload completo e la verifica della firma.
// `payload` è il corpo di consegna del webhook (/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 }}