Data API(以前は本ページでServer APIとして記載されていたもの)は、TRACIOがお客様のワークスペースについてすでに収集した識別データを、バックエンドから読み取るためのものです: 訪問者の履歴、個々のセッション、そして短いウィンドウのベロシティカウンターです。いくつかのルートは書き込みも行います — アカウントのレコード、カスタムフィールド、リストのエントリ — これにより、お客様のバックエンドはTRACIOが把握している情報を補強できます。
これはWebhooksを置き換えるものではなく、補完するものです:
| Webhooks | Data API | |
|---|---|---|
| 方向 | TRACIOがお客様のエンドポイントへプッシュ | お客様のバックエンドが必要に応じてプル |
| タイミング | 識別が発生するたび | 保持期間の範囲内でいつでも |
| 向いている用途 | イベントへの反応 | 判断中のデータ参照、バックフィル、調査 |
どちらのしくみもProプラン以上でご利用いただけます。
https://api.tracio.ai/v2これはブラウザ用エンドポイント(edge.tracio.ai)とも、ダッシュボード
(app.tracio.ai)とも別のホストです。3つはそれぞれ独立しています: ブラウザは
公開鍵でエッジと通信し、お客様のバックエンドはシークレットキーでData API
と通信します。
/v1 のルートは廃止されました。/v2 をご利用ください: ルートは同じで、JSONのすべてのキーとクエリパラメーターは snake_case です(visitor_id、risk_score、min_risk_score)。お客様ご自身の fields と labels の辞書の中のキーはお客様のデータであり、元の綴りのまま保たれます。JavaScript SDKはcamelCaseのインターフェースを維持します。
すべてのリクエストは、シークレットキーをbearerトークンとして運びます:
curl -H "Authorization: Bearer tracio_sk_XXXX...XXXX" \ "https://api.tracio.ai/v2/visitors/X7fh2Hg9LkMn3pQr5tBvQw3xZa9mK2pL4nR8dT6y"Data APIはサーバー間通信専用です。 CORSヘッダーは意図的に返されないため、 ブラウザから呼び出すことはできません — これがシークレットキーをクライアント側の コードから遠ざけています。シークレットキーをブラウザへ配布しないでください。
ダッシュボードのAPI Keysで、secretタイプを選んで作成します。
tracio_sk_ に43文字が続く形で、合計53文字です。ダッシュボードは
先頭の数文字で一覧表示するため、キーを見分けられます。404 で、存在しないデータの場合とまったく同じです。ローテーションを行うと新しいキーが発行され、古いキーは7日間動作し続けるため、 ダウンタイムなしで切り替えられます。新しいキーをデプロイし、トラフィックが移ったことを 確認して、古いキーを失効させてください。公開鍵はローテーションできません — 秘密では なく、設計上ページのソースに見えるものだからです。
| メソッド | パス | 返すもの |
|---|---|---|
GET | /v2/visitors/{visitor_id} | 1人の訪問者の集計履歴と、その最新セッション |
GET | /v2/visitors/{visitor_id}/sessions | その訪問者のセッションのページ分割された一覧 |
GET | /v2/visitors/{visitor_id}/sessions/latest | 直近のセッション1件 |
GET | /v2/visitors/{visitor_id}/velocity | 短いウィンドウのアクティビティカウンター |
GET | /v2/sessions/{request_id} | リクエスト識別子による1件のセッション |
POST | /v2/accounts/metadata | お客様のアカウントIDに表示名とメールアドレスを付加する |
POST | /v2/events/fields | ページ読み込み後の訪問にカスタムフィールドを付加する |
POST | /v2/events/fields/delete | 訪問からカスタムフィールドを消去する — 訪問そのものには触れない |
GET | /v2/lists | ワークスペースのリスト: id、名前、タイプ(アクション)、モード、エントリ数 |
POST | /v2/lists/{list_id}/entries | リストに値を追加する。TTLの指定も可能 |
POST | /v2/lists/{list_id}/entries/delete | リストから値を削除する |
GET | /.well-known/webhook-keys | Webhookのプラットフォーム署名用の公開鍵(認証不要) |
同じキーとホストで判定APIも提供されており、いずれも snake_case です:
| メソッド | パス | 用途 |
|---|---|---|
POST | /v2/transactions | ビジネスイベントに対する同期的な APPROVE / REVIEW / DECLINE の判定 — Business以上。ただしアフィリエイトのコンバージョン(affiliate_id 付きの account_register または deposit)は、APIアクセスを含むすべてのプランで利用可能 |
GET | /v2/transactions/{transaction_id} | ラベルと実効状態を含めて判定を再取得する — Business以上。ただしアフィリエイトに帰属するトランザクションを除く |
PUT, DELETE | /v2/transaction-labels | 最大50件のトランザクションの結果ラベルを設定または削除する — Business以上 |
GET | /v2/transaction-labels/value-set | 受け付けるラベル値とその極性 — Business以上 |
POST | /v2/logins/assess | ログインを評価する: 理由付きの allow / challenge / review / deny |
POST, GET | /v2/accounts/{user_id}/trusted-devices | お客様の追加認証(step-up)の後に、訪問のデバイスをアカウントの信頼済みデバイスにする、またはアカウントの信頼済みデバイスを一覧する |
DELETE | /v2/accounts/{user_id}/trusted-devices/{device_ref} | デバイスの信頼を取り消す |
GET | /v2/affiliates/{affiliate_id} | 90日間のアフィリエイトの品質レポートと、hold / review の推奨 |
POST, GET | /v2/self-exclusions | アカウントに自己排除を設定または延長する、またはその一覧を取得する |
DELETE | /v2/self-exclusions/{user_id} | 自己排除を期限前に解除する |
これらの結果はWebhookイベントとしても届きます:
transaction_state_changed、login_risk、trusted_device_enrolled、
trusted_device_revoked、affiliate_threshold_crossed。
末尾のスラッシュは受け入れられ、無視されます。未知のパスや誤ったメソッドは、他と同じ JSONのエラーエンベロープを返します — HTMLやプレーンテキストのページが返ることは 決してありません。
すべての読み取りは時間ウィンドウで区切られ、2つの省略可能なクエリパラメーターで 制御します:
| パラメーター | 受け付ける形式 |
|---|---|
from | YYYY-MM-DD またはRFC 3339の完全なタイムスタンプ |
to | YYYY-MM-DD またはRFC 3339の完全なタイムスタンプ |
to に日付だけを指定した場合、その日1日が丸ごと含まれます。400 invalid_request と time must be YYYY-MM-DD or RFC3339 という
メッセージで拒否されます。meta で返されるため、リクエストが
そのまま通ったと決めつけず、meta.from と meta.to を確認してください。curl -H "Authorization: Bearer tracio_sk_XXXX...XXXX" \ "https://api.tracio.ai/v2/visitors/X7fh2Hg9LkMn3pQr5tBvQw3xZa9mK2pL4nR8dT6y"レスポンスは集計履歴を運び、最新セッションを埋め込んでいるため、一般的なケースでは 2回ではなく1回のリクエストで済みます:
{ "visitor_id": "X7fh2Hg9LkMn3pQr5tBvQw3xZa9mK2pL4nR8dT6y", "first_seen_at": "2026-05-02T10:11:12Z", "last_seen_at": "2026-07-25T08:00:00Z", "visits": 42, "incognito_visits": 3, "unique_ips": 5, "unique_countries": 2, "browsers": ["Chrome"], "os": ["macOS"], "devices": ["desktop"], "risk": { "max_risk_score": 63, "avg_bot_score": 12.5, "bot_sessions": 7, "last_decision": "real" }, "network": { "vpn_seen": false, "proxy_seen": false, "tor_seen": false, "datacenter_seen": true, "proxy_detected_seen": true, "last_isp": "Deutsche Telekom", "last_real_ip": { "address": "203.0.113.7", "country": "NL", "isp": "KPN" } }, "last_session": { "request_id": "9c1f6a2e-3b7d-4c58-a1e2-6f0d8b4a7c31", "visitor_id": "X7fh2Hg9LkMn3pQr5tBvQw3xZa9mK2pL4nR8dT6y", "account_id": "user_8842", "account": { "id": "user_8842", "email": "ann@example.com", "display_name": "Ann Lee" }, "timestamp": "2026-07-25T08:00:00Z", "tag": "checkout", "fields": { "order_ref": "A-1029" }, "url": "https://shop.example.com/checkout", "ip": "203.0.113.42", "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36", "browser": { "name": "Chrome", "version": "126.0" }, "os": { "name": "macOS", "version": "14.5" }, "device": "desktop", "gpu": "Apple M2", "geo": { "country": "DE", "city": "Berlin", "timezone": "Europe/Berlin", "isp": "Deutsche Telekom" }, "network": { "vpn": false, "proxy": false, "tor": false, "datacenter": false, "connection_type": "residential", "proxy_detected": true, "real_ip": { "address": "203.0.113.7", "country": "NL", "isp": "KPN" }, "asn": 3320 }, "screen": { "width": 2560, "height": 1600, "color_depth": 30, "pixel_ratio": 2 }, "locale": { "languages": ["en-US", "de"], "timezone": "Europe/Berlin" }, "client_hints": { "architecture": "arm", "bitness": "64", "platform_version": "14.5.0" }, "extensions": [ { "slug": "ublock-origin", "name": "uBlock Origin", "category": "adblock", "risky": false, "store_url": "https://chromewebstore.google.com/detail/cjpalhdlnbpafiamejdnhcphjbkeiagm" } ], "bot": { "result": "human", "score": 4.5, "antidetect_score": 2.1 }, "identification": { "confidence": 0.97, "incognito": false, "match_type": "exact", "match_confidence": 0.99 }, "device_info": { "device_id": "d_4f9c2e", "cross_browser": true, "confidence": 0.88, "linked_browsers": 2 }, "decision": { "action": "real", "risk_score": 12, "suspect_score": 3 } }, "meta": { "plan": "business", "retention_days": 90, "from": "2026-04-26T00:00:00Z", "to": "2026-07-25T12:00:00Z" }}| フィールド | 意味 |
|---|---|
visits, incognito_visits | ウィンドウ内の総訪問数と、そのうちプライベートウィンドウでの訪問数 |
unique_ips, unique_countries | ウィンドウ内で観測された異なるアドレスと国の数 |
browsers, os, devices | この訪問者が現れた異なる環境 |
risk.max_risk_score | ウィンドウ内で記録された最大のリスクスコア、0..100 |
risk.last_decision | 直近の訪問について記録された判定 |
risk.avg_bot_score, risk.bot_sessions | ボットスコアの平均とボットセッションの数 — Business以上 |
network.*_seen | この訪問者についてVPN、プロキシ、Tor出口ノード、データセンターのアドレスが観測されたことがあるか |
network.proxy_detected_seen | ウィンドウ内の少なくとも1回の訪問が、ブラウザの前にあるプロキシまたはVPNを経由して出ていったかどうか — デバイスの事実の network.proxy_detected を参照 |
network.last_isp | 直近のISP — Business以上 |
network.last_real_ip | プロキシまたはVPNの背後で観測された直近のアドレス(address、country、isp) — Business以上。それをもたらした訪問がない場合は存在しない |
last_session | 直近の訪問の完全なセッションオブジェクト |
meta | プラン、その保持日数、そして実際に適用されたウィンドウ |
保持期間内にデータがない訪問者には、visitor not found in the retention window という
メッセージとともに 404 not_found が返ります — これは統合側の誤りではなく、その
訪問者が新規であるか、保持期間を過ぎたことを意味します。
セッションは2つの判定を運び、それぞれ別の問いに答えます — クライアントが自動化されて いたかどうかと、リスクエンジンが全体として下した結論です:
| フィールド | 取りうる値 |
|---|---|
bot.result | human、bot、uncertain |
bot.type | bot.result が bot のときに存在する: 具体的なツール(playwright、puppeteer、selenium、jsdom、claude_computer_use など)、検証済みのAIエージェント(ai_agent:<vendor>)、またはツールが特定できない場合はその系統 — automation、headless、antidetect、extension、privacy_browser、impersonation、other |
decision.action | real、fake、suspicious |
bot.score と decision.risk_score はどちらも 0..100 のスケールです。Business以上
では、guidance がそれらを allow → challenge → review → deny というラダー上の
シナリオごとの推奨に変換します — 各段の意味については
Guidanceを参照してください。
値とスケールは同じ訪問のv3 Webhook本文と一致し、guidance も同じルールで算出されます。
curl -H "Authorization: Bearer tracio_sk_XXXX...XXXX" \ "https://api.tracio.ai/v2/visitors/X7fh2Hg9LkMn3pQr5tBvQw3xZa9mK2pL4nR8dT6y/sessions?limit=100&min_risk_score=50"| パラメーター | 既定値 | 備考 |
|---|---|---|
limit | 50 | 上限は 500。それより大きい値は拒否されず切り詰められます |
from, to | プランの保持期間 | 上で説明した共通の時間ウィンドウ |
cursor | — | 前のページから受け取った不透明なページネーションカーソル |
bot_result | — | このボット判定を持つセッションだけを残します |
min_risk_score | — | このリスクスコア以上のセッションだけを残します、0..100 |
セッションは新しいものから順に返されます:
{ "items": [ { "request_id": "9c1f6a2e-3b7d-4c58-a1e2-6f0d8b4a7c31", "visitor_id": "X7fh2Hg9LkMn3pQr5tBvQw3xZa9mK2pL4nR8dT6y", "timestamp": "2026-07-25T08:00:00Z" } ], "next_cursor": "MTcyMTg5NDQwMDAwMDphYmMxMjM", "has_more": true, "meta": { "plan": "business", "retention_days": 90, "from": "2026-04-26T00:00:00Z", "to": "2026-07-25T12:00:00Z" }}ページ送りはカーソル方式です。page や offset のパラメーターはありません: 受け取った
next_cursor を cursor として渡し、has_more が true である間は続けてください。
最後のページには next_cursor がまったく含まれないことがあるため、このフィールドを必須にしないでください。
async function allSessions(visitorId: string, secretKey: string) { const sessions = [] let cursor: string | undefined
do { const url = new URL(`https://api.tracio.ai/v2/visitors/${visitorId}/sessions`) url.searchParams.set("limit", "500") if (cursor) url.searchParams.set("cursor", cursor)
const res = await fetch(url, { headers: { Authorization: `Bearer ${secretKey}` } }) if (!res.ok) throw new Error(`Data API: ${res.status}`)
const page = await res.json() sessions.push(...page.items) cursor = page.has_more ? page.next_cursor : undefined } while (cursor)
return sessions}カーソルは不透明なものとして扱ってください — その中身は実装の詳細であり、変更される
可能性があります。編集されたカーソルは 400 invalid_request と malformed cursor
というメッセージで拒否されます。
User-Agentから取得したブラウザとOSに加えて、セッションは訪問者のブラウザがマシン について報告する内容を、当社側でサニタイズしたうえで保持します。訪問がそうした データを運ばなかった場合、いずれのフィールドも存在しないため、すべて任意として扱って ください。
| フィールド | 意味 |
|---|---|
gpu | ブラウザが報告するビデオアダプターのモデル(WebGL)。読みやすい名前に正規化される——Intel Iris Xe Graphics、Apple M1 Pro、Qualcomm Adreno 830。Software renderer は実GPUがないこと(仮想マシンまたはheadless環境)を意味する。Safariは Apple GPU と報告する |
network.proxy_detected | その訪問のHTTPトラフィックと生のネットワーク経路が別々のネットワークから出ている——ブラウザの前にプロキシまたはVPNがある。同一プロバイダーの2つのアドレス(キャリアNAT、同じVPNの2つ目の出口)は該当しない。アドレスを比較できない場合(iCloud Private Relay、IPv4とIPv6の併存)は立たない |
network.real_ip.address, .country, .isp | 生のネットワーク経路上で観測された公開アドレス。つまりプロキシまたはVPNの背後にあるアドレスで、その国とISPを伴う——Business以上。そのようなアドレスが観測されなかった場合は存在しない(country と isp は解決できなかった場合に存在しない) |
device_info.device_id, .cross_browser, .confidence, .linked_browsers | デバイスの同一性が特定できた場合に存在する: そのマシン上の複数のブラウザをまたぐ物理デバイスの安定したID、この訪問が以前とは別のブラウザから来たかどうか、その一致の確度、そしていくつの異なる訪問者(ブラウザ)がそのデバイスを共有しているか——1を超える場合、1台のマシンが複数のブラウザ識別のもとで使われていることを意味する——Business以上 |
os_environment | Linuxマシン上で実測されたデスクトップ環境(Mint 22+、Ubuntu 25.04+、Ubuntu、GNOME、KDE)——Business以上。判定できない場合は存在しない |
spoofing | その訪問が主張した内容と、独立した検査が実測した内容の対比(claimed、real、os・gpu・screen・network・browser のうちの spoofed_axes、製品名を伴う anonymous_browser)——Business以上。詐称が検出されたときにのみ存在する |
screen.width, .height, .color_depth, .pixel_ratio | ブラウザが報告する画面解像度、色深度、device pixel ratio——Business以上 |
locale.languages, locale.timezone | ブラウザ自身が優先する言語とタイムゾーン。IPアドレスから導かれる geo.timezone とは異なり、両者の食い違いは位置の詐称によく見られる兆候である——Business以上 |
client_hints.architecture, .bitness, .model, .device_name, .platform_version | User-Agent Client Hints: CPUのアーキテクチャとビット数、デバイスのモデルコード(Android、例: SM-A556B)と Google Play デバイスリストのマーケティング名(device_name、例: Samsung Galaxy A55 5G)、正確なプラットフォームバージョン。Chromium系ブラウザのみ——Business以上 |
environment.virtual_machine, environment.hypervisor | ビデオアダプターが自身を仮想であると名乗った場合にのみ存在する。hypervisor は閉じた辞書(vmware、virtualbox、parallels、qemu、hyperv、bochs、intel-gvt、vgpu)。ブロックがなければ、そのような証拠はないという意味である——Business以上 |
extensions は、その訪問中に検出されたブラウザ拡張機能を列挙します — Pro以上です。
エントリはそれぞれオブジェクトです:
| フィールド | 意味 |
|---|---|
slug | 拡張機能の安定した機械可読の識別子。Webhookが配信するものと同じ値 |
name | 人が読める名称 |
category | 大まかな分類 — adblock、privacy、automation、wallet、vpn、devtools、other など |
risky | 自動化、詐称、認証情報の窃取に関連する拡張機能では true |
store_url | 拡張機能のストア掲載ページへのリンク(判明している場合) |
検出結果は、当社の信頼性チェックを通過したうえでのみ報告されます — すべての探索に「インストール済み」と答える環境や、12件を超える名前のまとまりは、信頼できないものとして破棄されます。したがって、空のリストやリストの欠如は「インストールされている拡張機能はない」ではなく、「確認できたものがない」を意味します。これは在庫目録ではなく、証拠として読んでください。
fields には、お使いのインテグレーションが訪問に付加したカスタムのキーと値のペア(注文の参照番号、プラン名、決済の結果など)が入ります。キーと値は常に文字列で、付加した数値や真偽値はテキスト形式で返されます。セッションのほかの部分と同様に、API を利用できるすべてのプラン(Pro以上)でご利用いただけます。訪問にフィールドがない場合、この項目は含まれません。
fields は訪問時にコピーされるのではなく、すべてのリクエストでその時点の内容が読み取られます。訪問の後で付加されたフィールド(訪問後にフィールドを付加するを参照)もここに表示されるため、同じ訪問でも fields にはWebhookが配信した内容より多くの項目が含まれることがあります。
氏名、メールアドレス、電話番号などの個人データはカスタムフィールドに入れないでください。代わりに、お客様ご自身のシステムで照合できる参照を付加し、そのアカウントが誰であるかはアカウントのレコード(下記)として送信してください。
account は、訪問の背後にあるアカウントについてのお客様のレコードです — その account_id について POST /v2/accounts/metadata で最後に送信した内容です:
{ "account": { "id": "user-42", "email": "ann@example.com", "display_name": "Ann Lee" }}| フィールド | 説明 |
|---|---|
id | お客様のアカウントID — account_id と同じ値 |
email | そのアカウントについて送信したメールアドレス。空の場合は存在しない |
display_name | そのアカウントについて送信した表示名。空の場合は存在しない |
レコードはすべてのリクエストでその時点の内容が読み取られるため、名前の変更は過去の訪問にも反映されます: このブロックは訪問時点ではなく、現在のアカウントの姿を表します。APIアクセスを含むすべてのプラン(Pro以上)でご利用いただけます。レコードとともに送信したラベルは返されません。
訪問に紐付いたアカウントがない場合、そのアカウントのレコードがない場合(または空の値を送信して消去した場合)、そしてまれにレコードを読み取れなかった場合、このブロックは存在しません: その場合もリクエストを失敗させずにセッションを完全な形で返すため、ブロックがないことは「このアカウントにはメールアドレスがない」ではなく「不明」として扱ってください。Webhookはこのブロックを運びません。
直近の1件:
curl -H "Authorization: Bearer tracio_sk_XXXX...XXXX" \ "https://api.tracio.ai/v2/visitors/X7fh2Hg9LkMn3pQr5tBvQw3xZa9mK2pL4nR8dT6y/sessions/latest"これはセッションオブジェクトをそのまま返します — 配列でもなく、エンベロープに包まれても
いません。ウィンドウ内にセッションがない訪問者には、
no sessions for this visitor in the retention window とともに 404 not_found が
返ります。
あるいは、Webhookのペイロードにも現れる識別子である request_id で取得します:
curl -H "Authorization: Bearer tracio_sk_XXXX...XXXX" \ "https://api.tracio.ai/v2/sessions/9c1f6a2e-3b7d-4c58-a1e2-6f0d8b4a7c31?visitor_id=X7fh2Hg9LkMn3pQr5tBvQw3xZa9mK2pL4nR8dT6y"ここでの visitor_id は省略可能ですが、分かっている場合に渡すと検索が大幅に速く
なります。
identification.drift_score — アカウント乗っ取りの判定の根拠となった平滑化済みの行動スコアで、Business以上 — は、この単一セッションの読み取りでのみ返されます。行動のドリフトは最初の識別の後、訪問の最中に測定されるため、一覧と最新セッションのルートには含まれません。行動が一度も判定されなかった訪問には drift_score がありません。同じ値は account_takeover Webhookでも届きます。
1回の訪問がWebhookで複数回配信されることがあります: まず primary、続いて遅いシグナルや行動の証拠が届くにつれて late または correction — そして後のフェーズが先の判定を覆すことがあります。Data APIは primary のレコードから回答します。 後のフェーズはそこにマージされないため、訂正された訪問については最後のWebhookのほうが新しい回答です。訪問から数分後に対処する場合は、ここで新たに読み取るよりも、最後に受け取ったフェーズを優先してください。
逆向きに働くものが1つあります: ある訪問でアカウント乗っ取りの検知器が発火すると、ここでの guidance はそれを反映しますが、同じ訪問の identification Webhookの本文はその軸を運びません — それは専用の account_takeover の配信に乗ります。
ベロシティは「この訪問者が最近どれだけ活動しているか」に答えます — クレデンシャル スタッフィング、カードテスティング、大量アカウント作成に共通する形です。
curl -H "Authorization: Bearer tracio_sk_XXXX...XXXX" \ "https://api.tracio.ai/v2/visitors/X7fh2Hg9LkMn3pQr5tBvQw3xZa9mK2pL4nR8dT6y/velocity?window=1h"window は 1h、24h、7d を受け付け、既定値は 24h です。それ以外の値は
400 invalid_request と window must be one of: 1h, 24h, 7d で拒否されます。
{ "window": "1h", "events": 37, "unique_ips": 9, "unique_countries": 3, "unique_accounts": 12, "bot_events": 4, "meta": { "plan": "business", "retention_days": 90, "from": "2026-07-25T11:00:00Z", "to": "2026-07-25T12:00:00Z" }}unique_accounts は、このデバイスについて送信された異なる linkedId の値を数えます —
アカウント連携を参照してください。bot_events はBusiness以上
で、Proではこのキーは存在しません。
TRACIOがお客様のアカウントを知るのは、サイトが linkedId として渡すIDを通じてだけです — usr_8412 のような不透明な文字列です。人が読めるラベルを一度送信すれば、そのアカウントを表示するダッシュボードの画面はすべて、生のIDの代わりに名前やメールアドレスを表示し、セッションオブジェクトもそれらを account ブロックで返します。ここで送る内容は検知やスコアリングには影響しません。これは表示のためのレイヤーです。
curl -s -X POST "https://api.tracio.ai/v2/accounts/metadata" \ -H "Authorization: Bearer tracio_sk_XXXX...XXXX" \ -H "Content-Type: application/json" \ -d '{"accounts":[ {"account_id":"usr_8412","email":"ann@example.com","display_name":"Ann Lee","labels":{"tier":"vip"}}, {"account_id":"usr_9130","display_name":"Bob Ray"} ]}'{ "updated": 2 }fields ではありません。 ここで送信したメールアドレスや名前は、お客様のワークスペースのアカウントのレコードにのみ保存されます: 訪問単位では保存されず、ページにも書き込まれず、1回の送信でそのアカウントのすべての訪問が更新されます。400 invalid_request で拒否され、不正なエントリが1件あるとバッチ全体が拒否されます — エラーはその位置を示します。1つのバッチ内でアカウントIDが重複していても問題ありません: 最後のものが優先されます。上限: 1リクエストあたり1000アカウント、本文1 MiB、account_id ≤ 256文字、email ≤ 320、display_name ≤ 256、ラベルは最大16個でキー ≤ 64、値 ≤ 256文字。
ブラウザが送信できるのは、レンダリング時点でページが知っている内容だけです — 注文IDは送れても、決済チェックの結果や後から確定するものは送れません。このルートはその隙間を埋めます: 訪問がすでに持っているフィールドで訪問を見つけ、サーバー側からフィールドを追加で付加します。
curl -s -X POST "https://api.tracio.ai/v2/events/fields" \ -H "Authorization: Bearer tracio_sk_XXXX...XXXX" \ -H "Content-Type: application/json" \ -d '{"match":{"key":"order_ref","value":"A-1029"},"fields":{"amount":"120.00"}}'{ "updated": 1 }match は、訪問がすでに持っているフィールドで訪問を見つけます。request_id ではありません。範囲はキーのワークスペースと環境の中です。404 not_found が返ります — 結果が確定したら早めにフィールドを書き込んでください。updated は異なる訪問の数を数えます。 1を超えるのは、match が複数の訪問に一致した場合だけです — 1つの注文やカートに固有ではないキーと値のペアです。100件を超えるイベントに一致する match は、任意の一部に適用されるのではなく、400 invalid_request で拒否されます。server のタグ付きで表示され、ブラウザが書き込んだ同じキーの値より優先されます。404 not_found です。空の 200 ではありません。上限はブラウザのチャネルと同じです: 1回の呼び出しで50フィールド、キー ≤ 40バイト、値 ≤ 500バイト — 文字数ではなくバイト数 — キーの文字セットは A-Za-z0-9_.:-、本文1 MiB。
カスタムフィールドを消去します — 訪問そのものは決して消去しません。注文の合計額のように、もう訪問に付加しておく必要のない値に使ってください。すでに送信されたWebhookや、すでに取得されたエクスポートは変更されません。
# request_id で指定 — この1回の訪問のすべてのフィールドを消去curl -s -X POST "https://api.tracio.ai/v2/events/fields/delete" \ -H "Authorization: Bearer tracio_sk_XXXX...XXXX" \ -H "Content-Type: application/json" \ -d '{"request_id":"9c1f6a2e-3b7d-4c58-a1e2-6f0d8b4a7c31"}'
# match で指定 — 現在 "A-1029" を持つすべての訪問から "order_ref" を消去curl -s -X POST "https://api.tracio.ai/v2/events/fields/delete" \ -H "Authorization: Bearer tracio_sk_XXXX...XXXX" \ -H "Content-Type: application/json" \ -d '{"match":{"key":"order_ref","value":"A-1029"}}'{ "deleted": 1 }request_id と match は排他的です — 両方を送る、またはどちらも送らないと 400 invalid_request になります。match は付加と同じ24時間のウィンドウと、同じ100イベントの上限を使います。deleted は、訪問から削除されたフィールドの数(request_id の場合)、またはフィールドが削除された訪問の数(match の場合)を数えます。404 not_found が返ります。オペレーターがダッシュボードで管理しているのと同じリストに、お客様ご自身のバックオフィスからアクセスできます。リストのタイプは、一致した訪問に対するアクションです — block、manual_review、challenge、allow — そしてモードがアクションを適用するかどうかを決めます: observe は一致を数えるだけで、enforce はアクションを guidance(list 軸)に適用します。リストとそのモードはダッシュボードで作成します。Data APIはリストを読み取り、エントリを追加・削除します。
curl -s "https://api.tracio.ai/v2/lists" \ -H "Authorization: Bearer tracio_sk_XXXX...XXXX"[ { "id": "7f3a9d2e-4c1b-4e8f-9a6d-1b2c3d4e5f60", "name": "Chargeback accounts", "type": "block", "mode": "enforce", "entries_count": 128 }]# アカウントを30日間禁止するcurl -s -X POST "https://api.tracio.ai/v2/lists/7f3a9d2e-4c1b-4e8f-9a6d-1b2c3d4e5f60/entries" \ -H "Authorization: Bearer tracio_sk_XXXX...XXXX" \ -H "Content-Type: application/json" \ -d '{"value":"usr_8412","value_type":"linked_id","ttl_minutes":43200}'{ "id": "02b4c8d1-6e7f-4a90-b1c2-d3e4f5a6b7c8", "value": "usr_8412", "value_type": "linked_id", "expires_at": "2026-10-19T12:00:00Z", "propagation": "immediate"}エントリを削除するには、同じ本文で POST /v2/lists/{list_id}/entries/delete を呼び出します。応答は { "removed": true, "propagation": "immediate" } です。
value_type は、値を何と照合するかを表します: linked_id、visitor_id、device_id、ip、cidr、country。そのタイプとして解析できない値は 400 invalid_request です。linked_id → visitor_id → device_id → ip → cidr → country — そしてその中で最も厳しいアクションが優先されます。ttl_minutes は省略可能です。 省略した場合はリストの既定のTTLが適用され、それもなければエントリは失効しません(expires_at は null)。エントリを再追加すると更新されます。propagation は、変更がいつ有効になるかを示します: immediate、または ttl — 約5分以内です。200 で removed: false です。404 は未知のリストのために予約されています。フィールドがないことは「データなし」を意味し、ゼロを意味することはありません。
値のないフィールドは 0、""、null として送られるのではなく、完全に省略されます:
まったく新しい訪問者には match_confidence がなく、問題のない訪問には
antidetect_score も suspect_score もありません。意図的な唯一の例外は bot.score で、
これはゼロのときでも常に存在します。フィールドは防御的に読み取ってください。
ペイロードはご利用のプランによって変わります。 APIアクセスはProから利用でき、Proでは基本のセッションが得られます — 識別子、タイムスタンプ、URL、IP、user agent、ブラウザ、OS、デバイス、位置情報、ネットワーク、ボット、識別、判定 — それに加えて identification.match_type、identification.match_confidence、bot.score、bot.type、bot.antidetect_score、gpu、network.proxy_detected、extensions、fields、account です。BusinessとEnterpriseでは geo.isp、network.asn、network.real_ip、decision.suspect_score、identification.drift_score、reasons、behavior、guidance、device_info、spoofing、os_environment、screen、locale、client_hints、environment が加わります。人単位のフィールド(person_id、reputation、linked_accounts_count、linked_visitors_count)はBusinessとEnterprise向けに予約されており、人レイヤーが有効化されれば現れます — 現在は観測モードで稼働しており、これらのフィールドは配信されません。ProプランでBusinessのフィールドがないことはエラーではありません。
シグナルレベルの内部情報は、どのプランでも返されません: 個々のシグナル名、その 重み、判定の背後にあるしきい値、生のシグナル値、スコアの内訳は当社側にとどまります。 入力に逆算できてしまうスコアは、防御としての有用性を失います。
すべての失敗は1つのエンベロープを使います:
{ "error": { "code": "unauthorized", "message": "missing Authorization: Bearer <secret key>", "request_id": "8f14e45fceea167a5a36dedd" }}この request_id は訪問識別子ではありません。同じ名前を2つの異なる値が共有して
います: セッションのペイロード内では request_id は訪問のUUIDで、Webhookが配信するのと
同じものです。エラーエンベロープ内では、HTTP呼び出しごとに発行される24文字のトレース
識別子です。トレース識別子は、成功・失敗を問わずすべてのレスポンスの X-Request-Id
ヘッダーでも返されます。サポートへ問い合わせる際には添えてください — それによって
当社はお客様の呼び出しを正確に特定できます。
| HTTP | code | 意味 |
|---|---|---|
| 400 | invalid_request | パラメーターが欠けているか、形式が不正です |
| 401 | unauthorized | キーがない、無効、失効済み、または期限切れです |
| 402 | upgrade_required | ご利用のプランにAPIアクセスが含まれていません |
| 404 | not_found | 保持期間内に一致するものがないか、別の環境に属しています |
| 405 | method_not_allowed | ルートは存在しますが、そのメソッドには対応していません |
| 429 | rate_limited | 秒あたりのリクエスト数、または1日あたりのクォータを超過しました |
| 500 | internal | 当社側で何かが失敗しました |
| 503 | unavailable | バックエンドのストアに一時的に到達できません |
チェックは決まった順序で実行されます — キー、次にプラン、そして上限 — そのため、不正な
キーを持つリクエストは常にまずキーの問題を報告し、クォータの問題を報告することは
ありません。別のワークスペースのデータは、存在しないデータと区別がつきません: 403 ではなく 404 になります。
2つの 401 は意図的に異なる文面になっています: missing Authorization: Bearer <secret key>
はヘッダーがそもそも届かなかったことを、invalid or revoked API key は届いたが一致
しなかったことを意味します。402 は Data API requires the Pro plan or higher を
運びます。
429 と 503 は間隔を徐々に広げながら再試行してください。それ以外の 4xx を再試行しても意味がありません — リクエストそのものを修正する必要があることを意味します。
キーが認識されたレスポンスは、現在の状況を運びます(401 と 402 のレスポンスは運ばず、1日あたりのクォータがないEnterpriseにはクォータのヘッダーは付きません):
| ヘッダー | 意味 |
|---|---|
X-RateLimit-Limit | 1日あたりのクォータ。秒あたりの制限で拒否された場合は、秒あたりの上限 |
X-RateLimit-Remaining | 本日の残り呼び出し回数 |
X-RateLimit-Reset | リセットのUnix時刻 — UTCの深夜0時 |
Retry-After | 待機する秒数。429 のときのみ送られます — これに従ってください: どちらの制限についても正確です |
| プラン | 秒あたりのリクエスト数 | 1日あたりのリクエスト数 | 履歴の深さ |
|---|---|---|---|
| Free | APIアクセスなし | — | 7日 |
| Pro | 10 | 10,000 | 30日 |
| Business | 50 | 100,000 | 90日 |
| Enterprise | 200 | 無制限 | 365日 |