Data API (เดิมมีเอกสารในหน้านี้ในชื่อ Server API) ให้แบ็กเอนด์ของคุณอ่านข้อมูลการระบุตัวตนที่ TRACIO เก็บไว้ให้ workspace ของคุณแล้ว ได้แก่ ประวัติของผู้เข้าชมรายหนึ่ง เซสชันแต่ละครั้ง และตัวนับ velocity ในช่วงเวลาสั้น ๆ มีบางเส้นทางที่เขียนข้อมูลได้ด้วย — เรคคอร์ดบัญชี ฟิลด์ที่กำหนดเอง และรายการในลิสต์ — เพื่อให้แบ็กเอนด์ของคุณเสริมข้อมูลที่ TRACIO รู้ได้
มันเสริม Webhooks มากกว่าจะมาแทนที่
| Webhooks | Data API | |
|---|---|---|
| ทิศทาง | TRACIO ส่งไปยังปลายทางของคุณ | แบ็กเอนด์ของคุณดึงเมื่อต้องการ |
| จังหวะเวลา | ทันทีที่การระบุตัวตนแต่ละครั้งเกิดขึ้น | เมื่อใดก็ได้ ภายในช่วงเวลาเก็บรักษาของคุณ |
| เหมาะกับ | การตอบสนองต่อเหตุการณ์ | การค้นข้อมูลระหว่างตัดสินใจ การเติมข้อมูลย้อนหลัง และการสืบสวน |
ทั้งสองพื้นผิวใช้ได้ตั้งแต่แพ็กเกจ Pro ขึ้นไป
https://api.tracio.ai/v2นี่คือโฮสต์คนละตัวกับปลายทางฝั่งเบราว์เซอร์ (edge.tracio.ai) และคนละตัวกับแดชบอร์ด
(app.tracio.ai) ทั้งสามแยกจากกัน เบราว์เซอร์คุยกับ edge ด้วยคีย์ public ของคุณ ส่วน
แบ็กเอนด์ของคุณคุยกับ Data API ด้วยคีย์ secret ของคุณ
เส้นทาง /v1 ถูกนำออกแล้ว ให้ใช้ /v2 แทน เส้นทางเหมือนเดิม และทุกคีย์ JSON และพารามิเตอร์ query อยู่ในรูป snake_case (visitor_id, risk_score, min_risk_score) คีย์ภายในพจนานุกรม fields และ labels ของคุณเองถือเป็นข้อมูลของคุณและคงการสะกดเดิมไว้ ส่วน JavaScript SDK ยังคงอินเทอร์เฟซแบบ camelCase
ทุกคำขอต้องพา secret key ของคุณไปด้วยในรูปแบบ bearer token
curl -H "Authorization: Bearer tracio_sk_XXXX...XXXX" \ "https://api.tracio.ai/v2/visitors/X7fh2Hg9LkMn3pQr5tBvQw3xZa9mK2pL4nR8dT6y"Data API ใช้ได้เฉพาะแบบเซิร์ฟเวอร์ถึงเซิร์ฟเวอร์ ระบบจงใจไม่คืนเฮดเดอร์ CORS เบราว์เซอร์จึงเรียกมันไม่ได้ — นั่นคือสิ่งที่กัน secret key ของคุณออกจากโค้ดฝั่งไคลเอนต์ อย่าส่ง secret key ไปยังเบราว์เซอร์เด็ดขาด
สร้างได้ในแดชบอร์ดที่ API Keys โดยเลือกชนิด secret
tracio_sk_ ตามด้วยอักขระอีก 43 ตัว รวมทั้งหมด 53 ตัว
แดชบอร์ดจะแสดงรายการด้วยอักขระไม่กี่ตัวแรก คุณจึงแยกแยะคีย์ออกจากกันได้404 เหมือนกับข้อมูลที่ไม่มีอยู่จริงทุกประการการหมุนเวียนจะออกคีย์ใหม่และให้คีย์เดิมใช้ได้ต่ออีก 7 วัน คุณจึงทยอยนำคีย์ใหม่ออกใช้ ได้โดยไม่มีช่วงหยุดทำงาน ให้ดีพลอยคีย์ใหม่ ยืนยันว่าทราฟฟิกย้ายไปแล้ว แล้วปล่อยให้คีย์เดิม หมดอายุไป ส่วน public key หมุนเวียนไม่ได้ — มันไม่ใช่ความลับและถูกออกแบบให้มองเห็นได้ใน ซอร์สของหน้าเว็บคุณอยู่แล้ว
| เมธอด | เส้นทาง | คืนค่าอะไร |
|---|---|---|
GET | /v2/visitors/{visitor_id} | ประวัติรวมของผู้เข้าชมหนึ่งราย พร้อมเซสชันล่าสุดของเขา |
GET | /v2/visitors/{visitor_id}/sessions | รายการเซสชันของผู้เข้าชมรายนั้นแบบแบ่งหน้า |
GET | /v2/visitors/{visitor_id}/sessions/latest | เซสชันล่าสุดเพียงรายการเดียว |
GET | /v2/visitors/{visitor_id}/velocity | ตัวนับกิจกรรมในช่วงเวลาสั้น ๆ |
GET | /v2/sessions/{request_id} | เซสชันหนึ่งรายการตามตัวระบุคำขอ |
POST | /v2/accounts/metadata | แนบชื่อที่แสดงและอีเมลเข้ากับ ID บัญชีของคุณ |
POST | /v2/events/fields | แนบฟิลด์ที่กำหนดเองเข้ากับการเข้าชมหลังจากหน้าเว็บโหลดแล้ว |
POST | /v2/events/fields/delete | ลบฟิลด์ที่กำหนดเองออกจากการเข้าชม — ตัวการเข้าชมเองไม่ถูกแตะต้อง |
GET | /v2/lists | ลิสต์ของ workspace คุณ: 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 ขึ้นไป ยกเว้น conversion ของพันธมิตร (account_register หรือ deposit ที่มี affiliate_id) ซึ่งใช้ได้ในทุกแพ็กเกจที่เข้าถึง 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 | ตั้งหรือขยายการกันตัวเอง (self-exclusion) ให้บัญชี หรือแสดงรายการ |
DELETE | /v2/self-exclusions/{user_id} | ยกเลิกการกันตัวเองก่อนกำหนด |
ผลลัพธ์ของ API เหล่านี้ยังมาถึงคุณในรูป เหตุการณ์ webhook ด้วย:
transaction_state_changed, login_risk, trusted_device_enrolled,
trusted_device_revoked และ affiliate_threshold_crossed
เครื่องหมายทับปิดท้ายเป็นที่ยอมรับและถูกละไว้ เส้นทางที่ไม่รู้จักหรือเมธอดที่ผิดจะคืนซอง ข้อผิดพลาด JSON แบบเดียวกับทุกกรณี ไม่เคยคืนเป็นหน้า HTML หรือข้อความล้วน
การอ่านทุกครั้งถูกจำกัดด้วยช่วงเวลา ซึ่งควบคุมด้วยพารามิเตอร์ query สองตัวที่ไม่บังคับ
| พารามิเตอร์ | รับค่า |
|---|---|
from | YYYY-MM-DD หรือ timestamp RFC 3339 เต็ม |
to | YYYY-MM-DD หรือ timestamp RFC 3339 เต็ม |
to จะรวมทั้งวันนั้นเข้ามาด้วย400 invalid_request พร้อมข้อความ
time must be YYYY-MM-DD or RFC3339meta เสมอ ให้ตรวจ meta.from และ
meta.to แทนที่จะสันนิษฐานว่าคำขอของคุณถูกใช้ตามตัวอักษรcurl -H "Authorization: Bearer tracio_sk_XXXX...XXXX" \ "https://api.tracio.ai/v2/visitors/X7fh2Hg9LkMn3pQr5tBvQw3xZa9mK2pL4nR8dT6y"การตอบกลับพาประวัติรวมมาให้และฝังเซสชันล่าสุดมาด้วย กรณีทั่วไปจึงใช้คำขอเดียวแทนที่จะ ต้องใช้สองคำขอ
{ "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 | มีการเข้าชมอย่างน้อยหนึ่งครั้งในช่วงเวลานั้นที่ออกผ่านพร็อกซีหรือ VPN ซึ่งอยู่หน้าเบราว์เซอร์หรือไม่ — ดู network.proxy_detected ในหัวข้อ ข้อเท็จจริงของอุปกรณ์ |
network.last_isp | ISP ล่าสุด — Business ขึ้นไป |
network.last_real_ip | ที่อยู่ล่าสุดที่สังเกตได้หลังพร็อกซีหรือ VPN (address, country, isp) — Business ขึ้นไป จะไม่มีเมื่อไม่มีการเข้าชมที่นำที่อยู่เช่นนั้นมา |
last_session | อ็อบเจ็กต์เซสชันเต็มรูปแบบของการเข้าชมล่าสุด |
meta | แพ็กเกจ ระยะเวลาเก็บรักษาเป็นวัน และช่วงเวลาที่ใช้จริง |
ผู้เข้าชมที่ไม่มีข้อมูลอยู่ในช่วงเวลาเก็บรักษาจะคืน 404 not_found พร้อมข้อความ
visitor not found in the retention window — นั่นไม่ใช่ข้อผิดพลาดในการผสานรวมของคุณ
แต่หมายความว่าผู้เข้าชมรายนั้นเป็นรายใหม่หรือข้อมูลหมดอายุไปแล้ว
เซสชันพาคำตัดสินมาสองชุด และทั้งสองตอบคำถามคนละข้อ — ไคลเอนต์เป็นระบบอัตโนมัติหรือไม่ และเครื่องประเมินความเสี่ยงสรุปโดยรวมว่าอย่างไร
| ฟิลด์ | ค่า |
|---|---|
bot.result | human, bot, uncertain |
bot.type | มีเมื่อ bot.result เป็น bot โดยเป็นได้ทั้งเครื่องมือเฉพาะราย (playwright, puppeteer, selenium, jsdom, claude_computer_use ฯลฯ), AI agent ที่ผ่านการยืนยันแล้ว (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
ค่าและสเกลตรงกับเนื้อหา webhook v3 ของการเข้าชมเดียวกัน และ 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 ยังเป็นจริง
หน้าสุดท้ายอาจไม่มี 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 เซสชันยังบรรจุสิ่งที่เบราว์เซอร์ของผู้เข้าชมรายงานเกี่ยวกับตัวเครื่อง โดยผ่านการชำระข้อมูลฝั่งเราแล้ว ทุกฟิลด์จะไม่มีเมื่อการเข้าชมไม่ได้นำข้อมูลเช่นนั้นมา จึงควรถือว่าแต่ละฟิลด์เป็นทางเลือก
| ฟิลด์ | ความหมาย |
|---|---|
gpu | รุ่นของการ์ดแสดงผลตามที่เบราว์เซอร์รายงาน (WebGL) ผ่านการทำให้เป็นชื่อที่อ่านได้ เช่น Intel Iris Xe Graphics, Apple M1 Pro, Qualcomm Adreno 830; ค่า Software renderer หมายถึงไม่มี GPU จริง (เครื่องเสมือนหรือสภาพแวดล้อมแบบ headless); Safari รายงานเป็น Apple GPU |
network.proxy_detected | ทราฟฟิก HTTP ของการเข้าชมกับเส้นทางเครือข่ายดิบของมันออกผ่านคนละเครือข่ายกัน นั่นคือมีพร็อกซีหรือ VPN อยู่หน้าเบราว์เซอร์ ที่อยู่สองรายการของผู้ให้บริการเดียวกัน (NAT ของผู้ให้บริการเครือข่าย หรือทางออกที่สองของ VPN เดียวกัน) ไม่นับ และจะไม่ถูกตั้งเมื่อเปรียบเทียบที่อยู่กันไม่ได้ (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 ที่คงที่ของอุปกรณ์จริงซึ่งครอบคลุมเบราว์เซอร์บนเครื่องนั้น การเข้าชมครั้งนี้มาจากเบราว์เซอร์อื่นต่างจากเดิมหรือไม่ ความเชื่อมั่นของการจับคู่นั้น และมีผู้เข้าชม (เบราว์เซอร์) ต่างกันกี่รายที่ใช้อุปกรณ์เดียวกัน ค่าที่มากกว่าหนึ่งหมายถึงเครื่องเดียวที่ปรากฏภายใต้ตัวตนของเบราว์เซอร์หลายตัว สำหรับ Business ขึ้นไป |
os_environment | สภาพแวดล้อมเดสก์ท็อปที่วัดได้บนเครื่อง Linux (Mint 22+, Ubuntu 25.04+, Ubuntu, GNOME, KDE) สำหรับ Business ขึ้นไป จะไม่มีเมื่อระบุไม่ได้ |
spoofing | สิ่งที่การเข้าชมอ้าง เทียบกับสิ่งที่การตรวจสอบอิสระวัดได้ (claimed, real, spoofed_axes จาก os, gpu, screen, network, browser; และ anonymous_browser พร้อมชื่อผลิตภัณฑ์) สำหรับ Business ขึ้นไป จะมีเฉพาะเมื่อตรวจพบการปลอมแปลง |
screen.width, .height, .color_depth, .pixel_ratio | ความละเอียดหน้าจอ ความลึกสี และ device pixel ratio ตามที่เบราว์เซอร์รายงาน สำหรับ Business ขึ้นไป |
locale.languages, locale.timezone | ภาษาที่เบราว์เซอร์เองต้องการและเขตเวลาของมัน ต่างจาก geo.timezone ที่อนุมานจากที่อยู่ IP ความไม่ตรงกันของสองค่านี้เป็นสัญญาณที่พบบ่อยของตำแหน่งที่ถูกปลอม สำหรับ Business ขึ้นไป |
client_hints.architecture, .bitness, .model, .device_name, .platform_version | User-Agent Client Hints คือสถาปัตยกรรมและบิตเนสของซีพียู รหัสรุ่นอุปกรณ์ (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 ไม่ได้พาบล็อกนี้มาด้วย
รายการล่าสุด
curl -H "Authorization: Bearer tracio_sk_XXXX...XXXX" \ "https://api.tracio.ai/v2/visitors/X7fh2Hg9LkMn3pQr5tBvQw3xZa9mK2pL4nR8dT6y/sessions/latest"คำขอนี้คืนอ็อบเจ็กต์เซสชันเปล่า ๆ ไม่ใช่อาร์เรย์ และไม่ได้ห่อไว้ในซองอื่น ผู้เข้าชมที่ไม่มี
เซสชันในช่วงเวลานั้นจะคืน 404 not_found พร้อม
no sessions for this visitor in the retention window
หรือค้นด้วย request_id ซึ่งเป็นตัวระบุที่ปรากฏในเพย์โหลดของ webhook ด้วย
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 ค่าเดียวกันนี้มาถึงคุณผ่าน webhook account_takeover ด้วย
การเข้าชมหนึ่งครั้งอาจถูกส่งผ่าน webhook มากกว่าหนึ่งครั้ง: primary ก่อน แล้วตามด้วย late หรือ correction เมื่อสัญญาณที่ช้ากว่าและหลักฐานเชิงพฤติกรรมมาถึง — และเฟสที่มาทีหลังอาจกลับคำตัดสินก่อนหน้าได้ Data API ตอบจากเรคคอร์ด primary เฟสที่มาทีหลังจะไม่ถูกรวมกลับเข้าไป ดังนั้นสำหรับการเข้าชมที่ถูกแก้ไข webhook ฉบับสุดท้ายคือคำตอบที่ใหม่กว่า หากคุณดำเนินการหลังการเข้าชมไปแล้วหลายนาที ให้ยึดเฟสที่คุณได้รับล่าสุดมากกว่าการอ่านใหม่จากที่นี่
มีสิ่งหนึ่งที่ทำงานในทางกลับกัน: เมื่อตัวตรวจจับการยึดบัญชีทำงานสำหรับการเข้าชมหนึ่งแล้ว guidance ที่นี่จะสะท้อนผลนั้น ขณะที่เนื้อหา webhook identification ของการเข้าชมเดียวกันไม่ได้พาแกนนั้นมาด้วย — มันมากับการส่ง account_takeover โดยเฉพาะ
Velocity ตอบคำถามว่า "ช่วงหลังนี้ผู้เข้าชมรายนี้ทำอะไรไปมากแค่ไหน" ซึ่งเป็นรูปแบบของการ ยิงชุดข้อมูลรับรอง การทดสอบบัตร และการสมัครสมาชิกจำนวนมาก
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 รู้จักบัญชีของคุณผ่าน ID ที่เว็บไซต์ของคุณส่งเป็น linkedId เท่านั้น — สตริงทึบอย่าง 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 อีเมลหรือชื่อที่ส่งมาที่นี่จะอยู่เฉพาะในเรคคอร์ดบัญชีของ workspace คุณ: ไม่ถูกเก็บต่อการเข้าชม ไม่ถูกเขียนลงในหน้าเว็บ และการส่งครั้งเดียวจะอัปเดตทุกการเข้าชมของบัญชีนั้น400 invalid_request และรายการที่ผิดเพียงรายการเดียวจะทำให้ทั้งแบตช์ถูกปฏิเสธ — ข้อผิดพลาดจะระบุตำแหน่งของมัน ID บัญชีซ้ำกันในแบตช์เดียวไม่เป็นปัญหา: รายการสุดท้ายชนะขีดจำกัด: 1000 บัญชีต่อคำขอ, เนื้อหา 1 MiB, account_id ≤ 256 อักขระ, email ≤ 320, display_name ≤ 256, ป้ายกำกับไม่เกิน 16 รายการ โดยคีย์ ≤ 64 และค่า ≤ 256 อักขระ
เบราว์เซอร์ส่งได้เฉพาะสิ่งที่หน้าเว็บรู้ตอนเรนเดอร์ — รหัสคำสั่งซื้อได้ แต่ไม่มีทางส่งผลการตรวจสอบการชำระเงินหรือสิ่งอื่นที่ได้ข้อสรุปภายหลัง เส้นทางนี้เติมช่องว่างนั้น: ค้นหาการเข้าชมด้วยฟิลด์ที่มันมีอยู่แล้ว แล้วแนบฟิลด์เพิ่มให้มันจากฝั่งเซิร์ฟเวอร์
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 ภายใน workspace และสภาพแวดล้อมของคีย์คุณ404 not_found — ให้เขียนฟิลด์ไม่นานหลังจากผลลัพธ์ได้ข้อสรุปupdated นับจำนวนการเข้าชมที่ต่างกัน จะเกิน 1 ก็ต่อเมื่อ match ของคุณตรงกับการเข้าชมมากกว่าหนึ่งครั้ง — คู่คีย์/ค่าที่ไม่ได้เป็นเอกลักษณ์ของคำสั่งซื้อหรือตะกร้าเดียว match ที่ตรงกับเหตุการณ์มากกว่า 100 รายการจะถูกปฏิเสธด้วย 400 invalid_request แทนที่จะถูกนำไปใช้กับชุดย่อยตามอำเภอใจserver และมีลำดับความสำคัญเหนือค่าที่มีคีย์เดียวกันซึ่งเบราว์เซอร์เขียนไว้404 not_found ไม่ใช่ 200 ที่ว่างเปล่าขีดจำกัดตรงกับช่องทางเบราว์เซอร์: 50 ฟิลด์ต่อการเรียก, คีย์ ≤ 40 ไบต์, ค่า ≤ 500 ไบต์ — ไบต์ ไม่ใช่อักขระ — ชุดอักขระของคีย์คือ A-Za-z0-9_.:-, เนื้อหา 1 MiB
ลบฟิลด์ที่กำหนดเอง — ไม่ลบตัวการเข้าชมเองเด็ดขาด ใช้กับค่าที่คุณไม่จำเป็นต้องแนบไว้กับการเข้าชมอีกต่อไป เช่น ยอดรวมของคำสั่งซื้อ Webhook ที่ส่งไปแล้วและการส่งออกที่ทำไปแล้วจะไม่เปลี่ยนแปลง
# by request_id — clears every field on this one visitcurl -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"}'
# by match — clears "order_ref" from every visit currently holding "A-1029"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 }]# ban an account for 30 dayscurl -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_requestlinked_id → visitor_id → device_id → ip → cidr → country — และภายในชนิดนั้น การกระทำที่เข้มงวดที่สุดชนะttl_minutes ไม่บังคับ หากละไว้ จะใช้ TTL เริ่มต้นของลิสต์ หากไม่มี รายการจะไม่มีวันหมดอายุ (expires_at เป็น null) การเพิ่มรายการซ้ำจะต่ออายุให้propagation บอกว่าการเปลี่ยนแปลงมีผลเมื่อไร: immediate หรือ ttl — ภายในประมาณห้านาที200 พร้อม removed: false ส่วน 404 สงวนไว้สำหรับลิสต์ที่ไม่รู้จักฟิลด์ที่หายไปหมายถึง "ไม่มีข้อมูล" ไม่ใช่ศูนย์ ฟิลด์ที่ไม่มีค่าจะถูกตัดออกทั้งหมด
แทนที่จะส่งมาเป็น 0, "" หรือ null ผู้เข้าชมที่เพิ่งมาใหม่เอี่ยมย่อมไม่มี
match_confidence การเข้าชมที่สะอาดย่อมไม่มี antidetect_score หรือ suspect_score
ข้อยกเว้นเดียวที่จงใจไว้คือ bot.score ซึ่งมีอยู่เสมอแม้ค่าจะเป็นศูนย์ ให้อ่านฟิลด์อย่าง
ระมัดระวัง
เพย์โหลดขึ้นอยู่กับแพ็กเกจของคุณ การเข้าถึง API เริ่มที่ Pro และ Pro ได้เซสชันพื้นฐาน คือ ตัวระบุ timestamp URL IP user agent เบราว์เซอร์ OS อุปกรณ์ geo network bot identification และ decision — พร้อมด้วย 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 และจะปรากฏเมื่อเปิดใช้เลเยอร์บุคคลแล้ว — ปัจจุบันเลเยอร์นี้ทำงานในโหมดสังเกตการณ์ และฟิลด์เหล่านี้ยังไม่ถูกส่งออกมา การที่ฟิลด์ของ Business ไม่ปรากฏบนแพ็กเกจ Pro ไม่ใช่ข้อผิดพลาด
รายละเอียดภายในระดับสัญญาณจะไม่ถูกคืนกลับมาเลย ไม่ว่าจะแพ็กเกจใด ทั้งชื่อสัญญาณแต่ละ ตัว น้ำหนักของมัน เกณฑ์ที่อยู่เบื้องหลังคำตัดสิน ค่าดิบของสัญญาณ และการแจกแจงคะแนน ล้วน อยู่ฝั่งเราเท่านั้น คะแนนที่ถูกย้อนรอยกลับไปเป็นข้อมูลนำเข้าได้ ย่อมหมดประโยชน์ในฐานะ เครื่องป้องกัน
ความล้มเหลวทุกกรณีใช้ซองเดียวกัน
{ "error": { "code": "unauthorized", "message": "missing Authorization: Bearer <secret key>", "request_id": "8f14e45fceea167a5a36dedd" }}request_id ตัวนี้ไม่ใช่ตัวระบุการเข้าชม มีสองค่าที่ต่างกันแต่ใช้ชื่อเดียวกัน ภายใน
เพย์โหลดของเซสชัน request_id คือ UUID ของการเข้าชม ค่าเดียวกับที่ webhook ส่งมา ส่วน
ภายในซองข้อผิดพลาด มันคือตัวระบุการติดตามความยาว 24 อักขระที่สร้างขึ้นต่อหนึ่งการเรียก
HTTP ตัวระบุการติดตามนี้ยังกลับมาในเฮดเดอร์ X-Request-Id ของทุกการตอบกลับ ไม่ว่าจะสำเร็จ
หรือไม่ก็ตาม ให้แนบค่านี้มาด้วยเมื่อติดต่อฝ่ายสนับสนุน — เราใช้มันหาการเรียกของคุณได้ตรงตัว
| HTTP | code | ความหมาย |
|---|---|---|
| 400 | invalid_request | พารามิเตอร์ขาดหายหรือรูปแบบไม่ถูกต้อง |
| 401 | unauthorized | คีย์ไม่มี ไม่ถูกต้อง ถูกเพิกถอน หรือหมดอายุ |
| 402 | upgrade_required | แพ็กเกจของคุณไม่รวมสิทธิ์เข้าถึง API |
| 404 | not_found | ไม่มีอะไรตรงกันภายในช่วงเวลาเก็บรักษา หรือเป็นของสภาพแวดล้อมอื่น |
| 405 | method_not_allowed | เส้นทางมีอยู่จริง แต่ไม่รองรับเมธอดนั้น |
| 429 | rate_limited | เกินจำนวนคำขอต่อวินาที หรือเกินโควตารายวัน |
| 500 | internal | มีบางอย่างล้มเหลวฝั่งเรา |
| 503 | unavailable | ที่เก็บข้อมูลเบื้องหลังเข้าถึงไม่ได้ชั่วคราว |
การตรวจสอบทำงานตามลำดับที่ตายตัว — คีย์ก่อน แล้วแพ็กเกจ แล้วจึงขีดจำกัด คำขอที่ใช้คีย์ผิด
จึงรายงานเรื่องคีย์ก่อนเสมอ ไม่เคยรายงานเป็นปัญหาโควตา ข้อมูลจาก workspace อื่นแยกไม่ออกจากข้อมูลที่ไม่มีอยู่จริง: จะได้ 404 ไม่ใช่ 403
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 ไม่มี และ Enterprise ซึ่งไม่มีโควตารายวันจะไม่ได้เฮดเดอร์โควตา)
| เฮดเดอร์ | ความหมาย |
|---|---|
X-RateLimit-Limit | โควตารายวันของคุณ เมื่อถูกปฏิเสธเพราะขีดจำกัดต่อวินาที จะเป็นขีดจำกัดต่อวินาที |
X-RateLimit-Remaining | จำนวนการเรียกที่เหลือของวันนี้ |
X-RateLimit-Reset | เวลา Unix ที่จะรีเซ็ต — เที่ยงคืน UTC |
Retry-After | จำนวนวินาทีที่ต้องรอ ส่งมาเฉพาะกับ 429 — ให้ยึดตามค่านี้: มันถูกต้องสำหรับขีดจำกัดทั้งสองแบบ |
| แพ็กเกจ | คำขอต่อวินาที | คำขอต่อวัน | ความลึกของประวัติ |
|---|---|---|---|
| Free | ไม่มีสิทธิ์เข้าถึง API | — | 7 วัน |
| Pro | 10 | 10,000 | 30 วัน |
| Business | 50 | 100,000 | 90 วัน |
| Enterprise | 200 | ไม่มีการนับโควตา | 365 วัน |