TRACIO は、すべての訪問者のIPアドレスをサーバー側で分析します。VPN、プロキシ、 Tor出口ノード、データセンター起点をフラグ付けし、都市レベルのジオロケーションを 解決します。すべての分析はクライアント側の依存関係なしにサーバー側で実行されます。
IP インテリジェンスは Webhookペイロード を通じてあなたのアプリケーションに届きます。
network オブジェクト(VPN/プロキシ/Tor/データセンターのブール値、接続タイプ、および
Pro以上では proxyDetected)と
geo オブジェクト(国、市、座標、タイムゾーン)は、すべての
Webhookで配信されます。ISP、ASN、realIp オブジェクトはBusiness以上で追加されます。
ペイロード全体の形状と署名検証については Webhooks を参照してください。
VPN、プロキシ、Tor、データセンターの分類は、商用のIPインテリジェンスデータベース
(VPN/プロキシ/Torタイプは IP2Location、ジオロケーションとASNは MaxMind)を用いて
接続元IPから解決されます。これら4つのフラグはそれぞれ Webhookの network オブジェクト上に
単一のブール値として表れます — 公開ペイロードにはメソッドごとの内訳や信頼度スコアはありません。
| フラグ | フィールド | 意味 |
|---|---|---|
| VPN | network.vpn | IPが既知のVPNプロバイダーに属する |
| プロキシ | network.proxy | IPがデータセンターまたはレジデンシャルプロキシである |
| Tor | network.tor | IPが既知のTor出口ノードである |
| データセンター | network.datacenter | IPがクラウド/ホスティングプロバイダーに属する |
{ "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}データセンタープロキシとレジデンシャルプロキシはいずれも network.proxy として
表れます。データセンター起点の場合はさらに network.datacenter として報告されます。
分類は IP2Location プロキシデータベースに由来し、主要なクラウド/ホスティングプロバイダー
(AWS、Google Cloud、Azure、Oracle Cloud、Alibaba Cloud、DigitalOcean、Hetzner、OVH、
Linode/Akamai、Vultr など)をカバーします。
{ "network": { "vpn": false, "proxy": true, "tor": false, "datacenter": true, "connectionType": "DCH" }}network.proxy は、接続元となったアドレスを分類します。これとは別のチェックが、訪問の
ページトラフィックとその生のネットワーク経路を突き合わせます。両者が異なるネットワークを
経由して出ていく場合、ブラウザとあなたのサイトの間にプロキシまたはVPNが介在しており、
その訪問は network.proxyDetected: true として報告されます。同一プロバイダーの2つの
アドレス(キャリアNAT、同じVPNの別の出口)は該当しません。
Business以上では、プロキシまたはVPNの背後で観測された公開アドレスが、接続元のアドレスと
並べて、その国とISPとともに network.realIp として配信されます。そのようなアドレスが
観測されなかった場合には存在しないため、ガード付きで読み取ってください
(network.realIp?.country)。country と isp は、解決できなかった場合には存在しません。
{ "network": { "proxy": false, "proxyDetected": true, "realIp": { "address": "203.0.113.7", "country": "NL", "isp": "KPN" } }}Webhooks では、どちらのフィールドも同じ名前で毎回の訪問ごとに届きます。
Data API の訪問者サマリーでは、両者は集計されて
network.proxyDetectedSeen(これまでにプロキシが手前にあったかどうか)および
network.lastRealIp(直近のアドレス、単なる文字列)として提供されます。
接続元IPでのTor出口ノードの一致は network.tor として表れます。これとは別に、
Tor Browser 自体は、ネットワーク経路とは無関係に、そのアンチフィンガープリンティング
構成によってクライアント側で識別されます —
Smart Signals を参照してください。
都市レベルのジオロケーションは、接続元IP(MaxMind)からサーバー側で解決され、
Webhookの geo オブジェクトで配信されます。
| フィールド | 型 | 説明 | プラン |
|---|---|---|---|
geo.country | string | ISO 3166-1 alpha-2 国コード | すべて |
geo.city | string | 市名 | すべて |
geo.lat | number | おおよその緯度 | すべて |
geo.lon | number | おおよその経度 | すべて |
geo.timezone | string | IANA タイムゾーン識別子 | すべて |
{ "geo": { "country": "CZ", "city": "Prague", "lat": 50.05, "lon": 14.4, "timezone": "Europe/Prague" }}BusinessおよびEnterpriseプランでは、通信事業者も識別されます。Webhookペイロードでは、
両方のフィールドが network オブジェクトに含まれます。
{ "network": { "vpn": false, "proxy": false, "tor": false, "datacenter": false, "isp": "Comcast Cable", "asn": 7922 }}Data API からセッションを読み取る場合は、振り分けが少し異なります。
isp は geo に、asn は network に置かれます。データは同じで表面が2つあるだけなので、
利用している表面がフィールドを置く場所から読み取ってください。
Pro以上では、Webhookに velocity ブロックが含まれます。訪問者が最近どの程度移動して
いるかを示すものです。
| フィールド | 型 | 説明 |
|---|---|---|
velocity.events5m | number | 直近5分間のこの訪問者のイベント数 |
velocity.uniqueIps | number | この訪問者で観測された異なるIPの数 |
velocity.uniqueLocations | number | この訪問者で観測された異なる地点の数 |
このブロックは、イベント時点で訪問者カウンターが利用可能な場合(通常は primary フェーズ)
に含まれます。ブロックがないことは「データなし」を意味し、ゼロを意味しません —
ブロックがないことを「異常な活動がない」と解釈しないでください。
IPブロックリストの照合は、公開契約の一部ではありません。Webhookペイロードも
ダッシュボードも、ブロックリストのカテゴリを公開しません。ネットワークリスクに関する
Webhookの表面は、ブール値の network フラグ、proxyDetected、Business以上での realIp
オブジェクト、接続タイプ、および上記のベロシティカウンターです。リスク判断には、
それらを decision および bot フィールド
(Smart Signals を参照)と併せて使用してください。
これは Webhookペイロードの network オブジェクトを直接読み取ります。ペイロード全体と
署名検証については 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 }}