TRACIO analizează adresa IP a fiecărui vizitator pe partea de server. Marchează VPN-uri, proxy-uri, noduri de ieșire Tor și origini de tip datacenter și rezolvă geolocalizarea la nivel de oraș. Întreaga analiză rulează pe partea de server, fără dependențe pe partea de client.
IP intelligence ajunge în aplicația ta prin payload-ul webhook: obiectul network
(valorile booleene VPN/proxy/Tor/datacenter, tipul de conexiune și, începând cu Pro,
proxy_detected) și obiectul geo (țară, oraș, coordonate, fus orar) sunt livrate cu fiecare
webhook. ISP-ul, ASN-ul și obiectul real_ip se adaugă începând cu Business. Consultă
Webhooks pentru structura completă a payload-ului și verificarea semnăturii.
Clasificarea VPN, proxy, Tor și datacenter este rezolvată pe baza IP-ului de conectare
folosind baze de date comerciale de IP intelligence (IP2Location pentru tipul VPN/proxy/Tor,
MaxMind pentru geolocalizare și ASN). Fiecare dintre aceste patru flag-uri este expus ca o singură valoare booleană în
obiectul network al webhook-ului — nu există o defalcare pe metode sau un scor de încredere în
payload-ul public.
| Flag | Câmp | Semnificație |
|---|---|---|
| VPN | network.vpn | IP-ul aparține unui furnizor VPN cunoscut |
| Proxy | network.proxy | IP-ul este un proxy datacenter sau residential |
| Tor | network.tor | IP-ul este un nod de ieșire Tor cunoscut |
| Datacenter | network.datacenter | IP-ul aparține unui furnizor cloud/hosting |
{ "network": { "vpn": true, "proxy": true, "tor": false, "datacenter": false, "connection_type": "VPN" }}// `payload` is the webhook delivery body (/docs/webhooks)if (payload.network.vpn) { // visitor is connecting through a VPN}Proxy-urile de tip datacenter și residential apar ambele ca network.proxy; originea de tip datacenter
este raportată suplimentar ca network.datacenter. Clasificarea provine din
baza de date de proxy IP2Location, care acoperă principalii furnizori cloud/hosting (AWS,
Google Cloud, Azure, Oracle Cloud, Alibaba Cloud, DigitalOcean, Hetzner, OVH,
Linode/Akamai, Vultr și alții).
{ "network": { "vpn": false, "proxy": true, "tor": false, "datacenter": true, "connection_type": "DCH" }}network.proxy clasifică adresa de la care a sosit conexiunea. O verificare separată compară
traficul de pagini al unei vizite cu traseul său de rețea brut: când cele două ies prin rețele
diferite, între browser și site-ul tău se află un proxy sau un VPN, iar vizita este raportată
cu network.proxy_detected: true. Două adrese ale aceluiași furnizor — NAT-ul operatorului, o a
doua ieșire a aceluiași VPN — nu contează.
Începând cu Business, adresa publică observată în spatele proxy-ului sau al VPN-ului este
livrată alături de adresa de la care a sosit conexiunea, împreună cu țara și ISP-ul ei, ca
network.real_ip. Lipsește când nu a fost observată nicio astfel de adresă, așa că citește-o cu
o protecție (network.real_ip?.country); country și isp lipsesc atunci când nu au putut fi
rezolvate.
{ "network": { "proxy": false, "proxy_detected": true, "real_ip": { "address": "203.0.113.7", "country": "NL", "isp": "KPN" } }}În Webhooks, ambele câmpuri sosesc sub aceleași nume la fiecare vizită.
Rezumatul vizitatorului din Data API le agregă drept
network.proxy_detected_seen (dacă a existat vreodată un proxy în față) și
network.last_real_ip (cea mai recentă adresă, împreună cu țara și ISP-ul ei).
O potrivire cu un nod de ieșire Tor pe IP-ul de conectare apare ca network.tor. Separat,
browserul Tor în sine este recunoscut pe partea de client după configurația sa anti-fingerprinting,
independent de traseul de rețea — consultă
Smart Signals.
Geolocalizarea la nivel de oraș este rezolvată pe partea de server din IP-ul de conectare
(MaxMind) și livrată în obiectul geo al webhook-ului.
| Câmp | Tip | Descriere | Plan |
|---|---|---|---|
geo.country | string | Cod de țară ISO 3166-1 alpha-2 | Toate |
geo.city | string | Numele orașului | Toate |
geo.lat | number | Latitudine aproximativă | Toate |
geo.lon | number | Longitudine aproximativă | Toate |
geo.timezone | string | Identificator de fus orar IANA | Toate |
{ "geo": { "country": "CZ", "city": "Prague", "lat": 50.05, "lon": 14.4, "timezone": "Europe/Prague" }}Pe planurile Business și Enterprise este identificat și operatorul. În payload-ul
webhook, ambele câmpuri se află pe obiectul network, iar ISP-ul este repetat ca
geo.isp:
{ "network": { "vpn": false, "proxy": false, "tor": false, "datacenter": false, "isp": "Comcast Cable", "asn": 7922 }}La citirea unei sesiuni prin Data API împărțirea este ușor
diferită: isp se află doar pe geo, iar asn pe network. Aceleași date, două suprafețe
— citește câmpul de acolo de unde îl pune suprafața pe care o folosești.
Începând cu Pro, webhook-ul transportă un bloc velocity — cât de mult s-a deplasat
vizitatorul în ultima vreme:
| Câmp | Tip | Descriere |
|---|---|---|
velocity.events5m | number | Evenimente de la acest vizitator în ultimele 5 minute |
velocity.unique_ips | number | IP-uri distincte observate pentru acest vizitator |
velocity.unique_locations | number | Locații distincte observate pentru acest vizitator |
Blocul este prezent atunci când contoarele vizitatorului sunt disponibile în momentul
evenimentului (de regulă faza primary). Lipsa blocului înseamnă „fără date”, nu zerouri —
nu trata absența lui ca pe „nicio activitate neobișnuită”.
Potrivirea cu liste de blocare IP nu face parte din contractul public: nici payload-ul
webhook, nici dashboard-ul nu expun categorii de liste de blocare. Suprafața webhook pentru
riscul de rețea este alcătuită din flag-urile booleene network, proxy_detected, obiectul
real_ip începând cu Business, tipul de conexiune și contoarele velocity de mai sus;
folosește-le împreună cu câmpurile decision și bot (consultă
Smart Signals) pentru deciziile de risc.
Aceasta citește direct obiectul network din payload-ul webhook. Consultă
Webhooks pentru payload-ul complet și verificarea semnăturii.
// `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 }}