Data API (bu sayfada daha önce Server API adıyla belgelenmişti), arka ucunuzun TRACIO'nun workspace'iniz için hâlihazırda topladığı kimlik tespiti verilerini okumasını sağlar: bir ziyaretçinin geçmişi, tekil oturumlar ve kısa pencereli velocity sayaçları. Birkaç rota da yazar — hesap kayıtları, özel alanlar ve liste girdileri — böylece arka ucunuz TRACIO'nun bildiklerini zenginleştirebilir.
Webhooks sayfasının yerini almaz, onu tamamlar:
| Webhooks | Data API | |
|---|---|---|
| Yön | TRACIO uç noktanıza iter | Arka ucunuz talep üzerine çeker |
| Zamanlama | Her kimlik tespiti gerçekleştiğinde | Her zaman, saklama pencereniz boyunca |
| En uygun | Bir olaya tepki vermek için | Karar anında veri aramak, geri dolum ve soruşturmalar için |
Her iki yüzey de Pro planı ve üzerinde kullanılabilir.
https://api.tracio.ai/v2Bu, tarayıcı uç noktasından (edge.tracio.ai) ve panelden (app.tracio.ai) farklı bir
sunucudur. Üçü de ayrıdır: tarayıcı genel anahtarınızla edge ile, arka ucunuz ise
gizli anahtarınızla Data API ile konuşur.
/v1 rotaları kaldırıldı. /v2 kullanın: rotalar aynıdır ve her JSON anahtarı ile
sorgu parametresi snake_case biçimindedir (visitor_id, risk_score,
min_risk_score). Kendi fields ve labels sözlüklerinizin içindeki anahtarlar sizin
verinizdir ve özgün yazımlarını korur. JavaScript SDK'sı camelCase arayüzünü korur.
Her istek gizli anahtarınızı bir bearer token olarak taşır:
curl -H "Authorization: Bearer tracio_sk_XXXX...XXXX" \ "https://api.tracio.ai/v2/visitors/X7fh2Hg9LkMn3pQr5tBvQw3xZa9mK2pL4nR8dT6y"Data API yalnızca sunucudan sunucuya kullanılır. CORS başlıkları bilinçli olarak döndürülmez; bu yüzden bir tarayıcı onu çağıramaz — gizli anahtarınızı istemci tarafı koddan uzak tutan da budur. Gizli anahtarı asla tarayıcıya göndermeyin.
Panelde API Keys altında, secret türünü seçerek oluşturun.
tracio_sk_ ve ardından 43 karakter, toplam 53 karakter biçimindedir.
Panel, anahtarları birbirinden ayırabilmeniz için onu ilk birkaç karakteriyle listeler.404'tür.Rotasyon yeni bir anahtar üretir ve eskisini 7 gün boyunca çalışır durumda tutar; böylece kesinti yaşamadan geçiş yapabilirsiniz. Yeni anahtarı yayına alın, trafiğin ona geçtiğini doğrulayın ve eskisinin süresinin dolmasını bekleyin. Genel anahtarlar rotasyona sokulamaz — bunlar gizli değildir ve tasarım gereği sayfanızın kaynağında görünürler.
| Yöntem | Yol | Ne döndürür |
|---|---|---|
GET | /v2/visitors/{visitor_id} | Tek bir ziyaretçinin toplu geçmişi, artı en son oturumu |
GET | /v2/visitors/{visitor_id}/sessions | O ziyaretçinin oturumlarının sayfalanmış listesi |
GET | /v2/visitors/{visitor_id}/sessions/latest | Yalnızca en yeni oturum |
GET | /v2/visitors/{visitor_id}/velocity | Kısa bir pencere üzerindeki etkinlik sayaçları |
GET | /v2/sessions/{request_id} | İstek tanımlayıcısına göre tek bir oturum |
POST | /v2/accounts/metadata | Hesap kimliklerinize görünen adlar ve e-postalar ekler |
POST | /v2/events/fields | Sayfa yüklendikten sonra bir ziyarete özel alanlar ekler |
POST | /v2/events/fields/delete | Bir ziyaretten özel alanları siler — ziyaretin kendisine dokunulmaz |
GET | /v2/lists | Workspace listeleriniz: kimlik, ad, tür (eylem), mod, girdi sayısı |
POST | /v2/lists/{list_id}/entries | Bir listeye isteğe bağlı TTL ile bir değer ekler |
POST | /v2/lists/{list_id}/entries/delete | Bir listeden bir değeri kaldırır |
GET | /.well-known/webhook-keys | Webhook platform imzası için genel anahtarlar (kimlik doğrulaması yok) |
Aynı anahtar ve sunucu, karar API'lerini de sunar; hepsi snake_case biçimindedir:
| Yöntem | Yol | Amaç |
|---|---|---|
POST | /v2/transactions | Bir iş olayı için senkron APPROVE / REVIEW / DECLINE kararı — Business ve üzeri; bir affiliate dönüşümü (affiliate_id ile account_register veya deposit) hariç, API erişimi olan her planda kullanılabilir |
GET | /v2/transactions/{transaction_id} | Bir kararı etiketi ve geçerli durumuyla yeniden okur — Business ve üzeri; bir affiliate'e atfedilen işlem hariç |
PUT, DELETE | /v2/transaction-labels | En fazla 50 işlemin sonuç etiketini ayarlar veya kaldırır — Business ve üzeri |
GET | /v2/transaction-labels/value-set | Kabul edilen etiket değerleri ve kutupları — Business ve üzeri |
POST | /v2/logins/assess | Bir girişi değerlendirir: nedenleriyle allow / challenge / review / deny |
POST, GET | /v2/accounts/{user_id}/trusted-devices | Step-up'ınızdan sonra bir ziyaretin cihazını bir hesap için güvenilir yapar ya da hesabın güvenilir cihazlarını listeler |
DELETE | /v2/accounts/{user_id}/trusted-devices/{device_ref} | Bir cihazın güvenini iptal eder |
GET | /v2/affiliates/{affiliate_id} | Bir affiliate'in 90 günlük kalite raporu, hold / review önerisiyle |
POST, GET | /v2/self-exclusions | Bir hesapta kendini dışlama ayarlar veya uzatır ya da bunları listeler |
DELETE | /v2/self-exclusions/{user_id} | Bir kendini dışlamayı erken kaldırır |
Sonuçları size webhook olayları olarak da ulaşır:
transaction_state_changed, login_risk, trusted_device_enrolled,
trusted_device_revoked ve affiliate_threshold_crossed.
Sondaki eğik çizgi kabul edilir ve yok sayılır. Bilinmeyen bir yol ya da yanlış bir yöntem, her şeyde olduğu gibi aynı JSON hata zarfını döndürür; asla bir HTML veya düz metin sayfası değil.
Her okuma, iki isteğe bağlı sorgu parametresiyle denetlenen bir zaman penceresiyle sınırlıdır:
| Parametre | Kabul ettiği |
|---|---|
from | YYYY-MM-DD veya tam bir RFC 3339 zaman damgası |
to | YYYY-MM-DD veya tam bir RFC 3339 zaman damgası |
to olarak verilen yalın bir tarih o günün tamamını kapsar.400 invalid_request ve
time must be YYYY-MM-DD or RFC3339 mesajıyla reddedilir.meta içinde bildirilir;
bu yüzden isteğinizin harfi harfine karşılandığını varsaymak yerine meta.from ve
meta.to alanlarını kontrol edin.curl -H "Authorization: Bearer tracio_sk_XXXX...XXXX" \ "https://api.tracio.ai/v2/visitors/X7fh2Hg9LkMn3pQr5tBvQw3xZa9mK2pL4nR8dT6y"Yanıt toplu geçmişi taşır ve en son oturumu gömer; böylece yaygın durum iki değil tek bir istek gerektirir:
{ "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" }}| Alan | Anlamı |
|---|---|
visits, incognito_visits | Penceredeki toplam ziyaret ve bunların kaçının gizli pencerede olduğu |
unique_ips, unique_countries | Pencerede görülen farklı adresler ve ülkeler |
browsers, os, devices | Bu ziyaretçinin göründüğü farklı ortamlar |
risk.max_risk_score | Pencerede kaydedilen en yüksek risk skoru, 0..100 |
risk.last_decision | En son ziyaret için kaydedilen karar |
risk.avg_bot_score, risk.bot_sessions | Bot skoru ortalaması ve bot oturumlarının sayısı — Business ve üzeri |
network.*_seen | Bu ziyaretçi için hiç VPN, proxy, Tor çıkış düğümü veya veri merkezi adresi görülüp görülmediği |
network.proxy_detected_seen | Penceredeki en az bir ziyaretin, tarayıcının önündeki bir proxy ya da VPN üzerinden çıkıp çıkmadığı — Cihaz bilgileri bölümündeki network.proxy_detected alanına bakın |
network.last_isp | En son ISP — Business ve üzeri |
network.last_real_ip | Bir proxy ya da VPN'in arkasında gözlenen en son adres (address, country, isp) — Business ve üzeri; hiçbir ziyaret böyle bir adres getirmediğinde bulunmaz |
last_session | En son ziyarete ait tam oturum nesnesi |
meta | Plan, gün cinsinden saklama süresi ve fiilen uygulanan pencere |
Saklama penceresi içinde verisi bulunmayan bir ziyaretçi,
visitor not found in the retention window mesajıyla 404 not_found döndürür — bu
entegrasyonunuzdaki bir hata değildir; ziyaretçinin yeni olduğu ya da verisinin süresinin
dolduğu anlamına gelir.
Oturum iki karar taşır ve bunlar farklı sorulara yanıt verir — istemcinin otomatikleşmiş olup olmadığı ve risk motorunun genel olarak neye vardığı:
| Alan | Değerler |
|---|---|
bot.result | human, bot, uncertain |
bot.type | bot.result değeri bot olduğunda bulunur: ya belirli bir araç (playwright, puppeteer, selenium, jsdom, claude_computer_use…), ya doğrulanmış bir yapay zekâ ajanı (ai_agent:<vendor>) ya da araç adlandırılamadığında bir aile — automation, headless, antidetect, extension, privacy_browser, impersonation, other |
decision.action | real, fake, suspicious |
bot.score ve decision.risk_score değerlerinin ikisi de 0..100 aralığındadır.
Business ve üzerinde guidance, bunları
allow → challenge → review → deny merdiveni üzerinde senaryo başına önerilere çevirir —
her basamağın ne anlama geldiği için
Guidance bölümüne bakın. Değerler ve
ölçekler aynı ziyaretin v3 webhook gövdesiyle eşleşir ve guidance aynı kurallarla
hesaplanır.
curl -H "Authorization: Bearer tracio_sk_XXXX...XXXX" \ "https://api.tracio.ai/v2/visitors/X7fh2Hg9LkMn3pQr5tBvQw3xZa9mK2pL4nR8dT6y/sessions?limit=100&min_risk_score=50"| Parametre | Varsayılan | Notlar |
|---|---|---|
limit | 50 | 500 ile sınırlıdır; daha büyük bir değer reddedilmez, kırpılır |
from, to | Plan saklaması | Yukarıda anlatılan ortak zaman penceresi |
cursor | — | Önceki sayfadan gelen opak sayfalama imleci |
bot_result | — | Yalnızca bu bot kararına sahip oturumları tut |
min_risk_score | — | Yalnızca bu risk skoru ve üzerindeki oturumları tut, 0..100 |
Oturumlar en yeniden başlayarak döner:
{ "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" }}Sayfalama imleç tabanlıdır. page veya offset parametresi yoktur: aldığınız
next_cursor değerini cursor olarak geri gönderin ve has_more true olduğu sürece
devam edin. Son sayfa next_cursor alanını hiç içermeyebilir; bu yüzden o alanı zorunlu
yapmayın.
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}İmleci opak kabul edin — içeriği bir uygulama ayrıntısıdır ve değişebilir. Düzenlenmiş
bir imleç, 400 invalid_request ve malformed cursor mesajıyla reddedilir.
User-Agent'tan alınan tarayıcı ve işletim sisteminin yanında bir oturum, ziyaretçinin tarayıcısının makine hakkında bildirdiklerini de taşır; bizim tarafımızda temizlenmiş olarak. Ziyaret böyle veri taşımadığında her alan bulunmaz, bu yüzden her birini isteğe bağlı sayın.
| Alan | Anlamı |
|---|---|
gpu | Tarayıcının bildirdiği (WebGL) ekran kartı modeli, okunabilir bir ada normalleştirilir — Intel Iris Xe Graphics, Apple M1 Pro, Qualcomm Adreno 830; Software renderer gerçek bir GPU olmadığı anlamına gelir (sanal makine ya da headless ortam); Safari Apple GPU bildirir |
network.proxy_detected | Ziyaretin HTTP trafiği ile ham ağ yolları farklı ağlardan çıkıyor — tarayıcının önünde bir proxy ya da VPN var; aynı sağlayıcının iki adresi (operatör NAT'ı, aynı VPN'in ikinci çıkışı) sayılmaz; adresler karşılaştırılamadığında (iCloud Private Relay, IPv6 yanında IPv4) yükseltilmez |
network.real_ip.address, .country, .isp | Ham ağ yolunda gözlenen genel adres, yani proxy veya VPN'in arkasındaki adres, ülkesi ve ISP'siyle birlikte — Business ve üzeri; böyle bir adres gözlenmediğinde bulunmaz (country ve isp, çözümlenemediklerinde bulunmaz) |
device_info.device_id, .cross_browser, .confidence, .linked_browsers | Bir cihaz kimliği çözümlendiğinde bulunur: fiziksel cihazın üzerindeki tarayıcılar boyunca değişmeyen kimliği, bu ziyaretin öncekinden farklı bir tarayıcıdan gelip gelmediği, bu eşleşmenin güveni ve cihazı kaç farklı ziyaretçinin (tarayıcının) paylaştığı — birden fazlası, birkaç tarayıcı kimliği altındaki tek bir makine demektir — Business ve üzeri |
os_environment | Bir Linux makinesinde ölçülen masaüstü ortamı (Mint 22+, Ubuntu 25.04+, Ubuntu, GNOME, KDE) — Business ve üzeri; belirlenemediğinde bulunmaz |
spoofing | Ziyaretin ileri sürdüğü ile bağımsız denetimlerin ölçtüğü (claimed, real, os, gpu, screen, network, browser arasından spoofed_axes; ürün adlarıyla anonymous_browser) — Business ve üzeri; yalnızca bir sahtecilik saptandığında bulunur |
screen.width, .height, .color_depth, .pixel_ratio | Tarayıcının bildirdiği ekran çözünürlüğü, renk derinliği ve device pixel ratio — Business ve üzeri |
locale.languages, locale.timezone | Tarayıcının kendi tercih ettiği diller ve saat dilimi — IP adresinden türetilen geo.timezone'un aksine; ikisi arasındaki uyuşmazlık, sahte konumun sık görülen bir işaretidir — Business ve üzeri |
client_hints.architecture, .bitness, .model, .device_name, .platform_version | User-Agent Client Hints: işlemci mimarisi ve bit genişliği, cihaz model kodu (Android, örn. SM-A556B) ve Google Play cihaz listesinden gelen pazarlama adı (device_name, örn. Samsung Galaxy A55 5G) ile tam platform sürümü; yalnızca Chromium tabanlı tarayıcılar — Business ve üzeri |
environment.virtual_machine, environment.hypervisor | Yalnızca ekran kartı kendisini sanal olarak tanıttığında bulunur; hypervisor kapalı bir sözlüktür (vmware, virtualbox, parallels, qemu, hyperv, bochs, intel-gvt, vgpu). Bloğun bulunmaması, böyle bir kanıt olmadığı anlamına gelir — Business ve üzeri |
extensions, ziyaret sırasında saptanan tarayıcı uzantılarını listeler — Pro ve üzeri.
Her girdi bir nesnedir:
| Alan | Anlamı |
|---|---|
slug | Uzantının değişmeyen makine tanımlayıcısı; webhook'un ilettiği değerin aynısı |
name | İnsan tarafından okunabilir ad |
category | Kaba sınıf — adblock, privacy, automation, wallet, vpn, devtools, other ve benzeri |
risky | Otomasyon, sahtecilik ya da kimlik bilgisi hırsızlığıyla ilişkili uzantılar için true |
store_url | Biliniyorsa uzantının mağaza sayfasına bağlantı |
Bir bulgu, ancak güven denetimlerimizden geçtikten sonra bildirilir — her yoklamaya "kurulu" yanıtını veren bir ortam ya da on iki addan uzun bir küme, güvenilmez sayılarak elenir. Bu yüzden boş ya da eksik bir liste "kurulu uzantı yok" değil, "doğrulayabildiğimiz bir şey yok" demektir. Bunu bir envanter olarak değil, bir kanıt olarak okuyun.
fields, entegrasyonunuzun ziyarete eklediği özel anahtar-değer çiftlerini içerir — bir sipariş referansı, bir plan adı, bir ödemenin sonucu. Anahtarlar ve değerler her zaman dizedir: eklediğiniz bir sayı ya da boolean değer metin biçiminde döner. Oturumun geri kalanı gibi, API erişimi olan her planda (Pro ve üzeri) kullanılabilir ve ziyaretin hiç alanı yoksa yer almaz.
fields ziyaret anında kopyalanmaz, her istekte canlı olarak okunur. Ziyaretten sonra
eklenen alanlar (Ziyaretten sonra alan ekleme
bölümüne bakın) da burada görünür; bu yüzden aynı ziyaret için fields, webhook'un
ilettiğinden fazlasını içerebilir.
Özel alanlara ad, e-posta adresi veya telefon numarası gibi kişisel veriler koymayın — bunların yerine kendi sistemlerinizin çözümleyebileceği bir referans ekleyin ve hesabın kim olduğunu bir hesap kaydı olarak gönderin (aşağıda).
account, ziyaretin arkasındaki hesap için sizin kaydınızdır — o account_id için
POST /v2/accounts/metadata üzerinden en son gönderdiğiniz:
{ "account": { "id": "user-42", "email": "ann@example.com", "display_name": "Ann Lee" }}| Alan | Açıklama |
|---|---|
id | Hesap kimliğiniz — account_id ile aynı değer |
email | Hesap için gönderdiğiniz e-posta adresi; boşsa bulunmaz |
display_name | Hesap için gönderdiğiniz görünen ad; boşsa bulunmaz |
Kayıt her istekte canlı olarak okunur; bu yüzden bir ad değişikliği eski ziyaretlerde de görünür: blok, hesabı ziyaret anındaki hâliyle değil, şimdiki hâliyle tanımlar. API erişimi olan her planda (Pro ve üzeri) kullanılabilir. Kayıtla birlikte gönderdiğiniz etiketler döndürülmez.
Ziyaretin bağlı bir hesabı olmadığında, onun için bir kayıt bulunmadığında (ya da boş değerler göndererek kaydı temizlediğinizde) ve — nadiren — kayıt okunamadığında blok bulunmaz: oturum, isteği başarısız kılmak yerine yine de eksiksiz döndürülür; bu yüzden eksik bir bloğu "bu hesabın e-postası yok" olarak değil, "bilinmiyor" olarak değerlendirin. Webhook'lar bu bloğu taşımaz.
En yenisi:
curl -H "Authorization: Bearer tracio_sk_XXXX...XXXX" \ "https://api.tracio.ai/v2/visitors/X7fh2Hg9LkMn3pQr5tBvQw3xZa9mK2pL4nR8dT6y/sessions/latest"Bu, çıplak bir oturum nesnesi döndürür — bir dizi değil ve bir zarfa sarılmış da değil.
Pencerede hiç oturumu olmayan bir ziyaretçi,
no sessions for this visitor in the retention window ile 404 not_found döndürür.
Ya da webhook payload'ında da görünen tanımlayıcı olan request_id ile:
curl -H "Authorization: Bearer tracio_sk_XXXX...XXXX" \ "https://api.tracio.ai/v2/sessions/9c1f6a2e-3b7d-4c58-a1e2-6f0d8b4a7c31?visitor_id=X7fh2Hg9LkMn3pQr5tBvQw3xZa9mK2pL4nR8dT6y"visitor_id burada isteğe bağlıdır, ancak biliyorken göndermek aramayı belirgin biçimde
hızlandırır.
identification.drift_score — hesap ele geçirme kararının dayandığı düzleştirilmiş
davranış skoru, Business ve üzeri — yalnızca bu tek oturum okumasıyla döndürülür.
Davranış sapması ziyaret sırasında, ilk kimlik tespitinden sonra ölçülür; bu yüzden liste
ve en son oturum rotaları onu içermez. Davranışı hiç değerlendirilmemiş bir ziyaretin
drift_score değeri yoktur. Aynı değer size account_takeover webhook'u üzerinden de
ulaşır.
Bir ziyaret webhook ile birden fazla kez teslim edilebilir: önce primary, ardından daha
yavaş sinyaller ve davranışsal kanıtlar geldikçe late veya correction — ve sonraki
bir faz önceki kararı tersine çevirebilir. Data API primary kaydından yanıt verir.
Sonraki fazlar ona geri birleştirilmez; bu yüzden düzeltilmiş bir ziyaret için son webhook
daha yeni yanıttır. Ziyaretten dakikalar sonra harekete geçiyorsanız, buradaki taze bir
okuma yerine en son aldığınız fazı tercih edin.
Bir şey ters yönde işler: hesap ele geçirme dedektörü bir ziyaret için tetiklendikten
sonra buradaki guidance bunu yansıtır, oysa aynı ziyaretin identification webhook
gövdeleri bu ekseni taşımaz — o, ayrı account_takeover teslimatıyla gelir.
Velocity, "bu ziyaretçi son zamanlarda ne kadar iş yaptı" sorusuna yanıt verir — credential stuffing, kart deneme ve toplu kayıtların biçimi budur.
curl -H "Authorization: Bearer tracio_sk_XXXX...XXXX" \ "https://api.tracio.ai/v2/visitors/X7fh2Hg9LkMn3pQr5tBvQw3xZa9mK2pL4nR8dT6y/velocity?window=1h"window, 1h, 24h veya 7d değerlerini kabul eder ve varsayılanı 24h'dir. Başka
herhangi bir değer, 400 invalid_request ve window must be one of: 1h, 24h, 7d ile
reddedilir.
{ "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, bu cihaz için gönderdiğiniz farklı linkedId değerlerini sayar —
bkz. Hesap eşleme. bot_events Business ve üzerindedir; Pro'da
anahtar bulunmaz.
TRACIO hesaplarınızı yalnızca sitenizin linkedId olarak geçirdiği kimlikle tanır —
usr_8412 gibi opak bir dize. İnsan tarafından okunabilir etiketleri bir kez gönderin;
o hesabı gösteren her panel ekranı ham kimlik yerine adı veya e-postayı gösterir ve
oturum nesnesi bunları account bloğunda döndürür. Buradaki hiçbir
şey tespiti veya skorlamayı etkilemez; bu bir görüntüleme katmanıdır.
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 değil. Buraya
gönderilen bir e-posta veya ad yalnızca workspace'inizin hesap kaydında yaşar: ziyaret
başına saklanmaz, sayfaya yazılmaz ve tek bir gönderim o hesabın her ziyaretini
günceller.400 invalid_request ile reddedilir ve tek bir hatalı
girdi tüm kümeyi reddeder — hata onun konumunu belirtir. Tek bir kümede yinelenen
hesap kimlikleri sorun değildir: sonuncusu kazanır.Sınırlar: istek başına 1000 hesap, 1 MiB gövde, account_id ≤ 256 karakter,
email ≤ 320, display_name ≤ 256, anahtarları ≤ 64 ve değerleri ≤ 256 karakter olan
en fazla 16 etiket.
Tarayıcı yalnızca sayfanın oluşturma anında bildiğini gönderebilir — bir sipariş kimliği, asla bir ödeme kontrolünün sonucunu ya da daha sonra netleşen başka bir şeyi değil. Bu rota o boşluğu doldurur: ziyareti zaten taşıdığı bir alanla bulun ve ona sunucu tarafında daha fazla alan ekleyin.
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, ziyareti request_id ile değil, zaten sahip olduğu bir alanla bulur;
anahtarınızın workspace'i ve ortamı içinde.404 not_found döndürür —
alanı sonuç netleştikten kısa süre sonra yazın.updated farklı ziyaretleri sayar. Yalnızca match'iniz birden fazla ziyarete
denk geldiğinde 1'in üzerine çıkar — tek bir siparişe veya sepete özgü olmayan bir
anahtar/değer çifti. 100'den fazla olaya denk gelen bir match, keyfî bir alt kümeye
uygulanmak yerine 400 invalid_request ile reddedilir.server etiketiyle görünür ve tarayıcının aynı
anahtarla yazdığı bir değere göre önceliklidir.200 değil, 404 not_found'dur.Sınırlar tarayıcı kanalıyla aynıdır: çağrı başına 50 alan, anahtarlar ≤ 40 bayt, değerler
≤ 500 bayt — karakter değil, bayt — anahtar karakter kümesi A-Za-z0-9_.:-, 1 MiB
gövde.
Özel alanları siler — asla ziyaretin kendisini değil. Bir ziyarete artık bağlı kalmasına ihtiyaç duymadığınız değerler, örneğin bir sipariş tutarı için kullanın. Zaten gönderilmiş webhook'lar ve zaten alınmış dışa aktarımlar değişmez.
# 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 ve match birbirini dışlar — ikisini birden göndermek ya da hiçbirini
göndermemek 400 invalid_request olur. match, ekleme ile aynı 24 saatlik pencereyi
ve aynı 100 olay tavanını kullanır.deleted, ziyaretten kaldırılan alanları (request_id ile) ya da alanın
kaldırıldığı ziyaretleri (match ile) sayar.404 not_found döndürür.Operatörlerinizin panelde yönettiği listelerin aynısı, kendi arka ofisinizden
erişilebilir. Bir listenin türü, eşleşen bir ziyaretteki eylemidir — block,
manual_review, challenge, allow — ve modu eylemin uygulanıp uygulanmayacağına
karar verir: observe yalnızca eşleşmeleri sayar, enforce onu guidance'a uygular
(list ekseni). Listeler ve modları panelde oluşturulur; Data API listeleri okur ve
girdi ekleyip kaldırır.
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"}Bir girdiyi aynı gövdeyle POST /v2/lists/{list_id}/entries/delete adresinde kaldırın;
yanıt { "removed": true, "propagation": "immediate" } olur.
value_type, değerin neyle eşleştirildiğidir: linked_id, visitor_id,
device_id, ip, cidr veya country. Türüne göre ayrıştırılamayan bir değer
400 invalid_request olur.linked_id →
visitor_id → device_id → ip → cidr → country — ve onun içinde en katı eylem
kazanır.ttl_minutes isteğe bağlıdır. Atlanırsa listenin varsayılan TTL'i uygulanır;
hiçbiri yoksa girdinin süresi asla dolmaz (expires_at null olur). Bir girdiyi
yeniden eklemek onu yeniler.propagation değişikliğin ne zaman canlı olduğunu söyler: immediate ya da
ttl — yaklaşık beş dakika içinde.removed: false ile 200 olur; 404 bilinmeyen
bir liste için ayrılmıştır.Eksik bir alan "veri yok" demektir, asla sıfır değil. Değeri olmayan alanlar 0,
"" ya da null olarak gönderilmek yerine tamamen çıkarılır: yepyeni bir ziyaretçinin
match_confidence değeri, temiz bir ziyaretin de antidetect_score veya
suspect_score değeri yoktur. Bilinçli tek istisna, sıfır olduğunda bile her zaman
bulunan bot.score'dur. Alanları savunmacı biçimde okuyun.
Payload planınıza bağlıdır. API erişimi Pro'dan başlar ve Pro temel oturumu alır —
tanımlayıcılar, zaman damgası, URL, IP, user agent, tarayıcı, işletim sistemi, cihaz,
coğrafi konum, ağ, bot, kimlik tespiti ve karar — ve bunlarla birlikte
identification.match_type, identification.match_confidence, bot.score,
bot.type, bot.antidetect_score, gpu, network.proxy_detected, extensions,
fields ve account alanlarını. Business ve Enterprise ise 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 ve environment
alanlarını ekler. Kişi düzeyindeki alanlar (person_id, reputation,
linked_accounts_count, linked_visitors_count) Business ve Enterprise'a ayrılmıştır
ve kişi katmanı etkinleştirildiğinde görünecektir — bugün gözlem modunda çalışıyor ve bu
alanlar iletilmiyor. Pro planında bir Business alanının bulunmaması hata değildir.
Sinyal düzeyindeki iç ayrıntılar hiçbir planda döndürülmez: tekil sinyal adları, ağırlıkları, bir kararın ardındaki eşikler, ham sinyal değerleri ve skor dökümleri bizde kalır. Tersine mühendislikle girdilerine dönüştürülebilen bir skor, savunma olarak işlevini yitirir.
Her başarısızlık tek bir zarf kullanır:
{ "error": { "code": "unauthorized", "message": "missing Authorization: Bearer <secret key>", "request_id": "8f14e45fceea167a5a36dedd" }}Bu request_id, ziyaret tanımlayıcısı değildir. İki farklı değer aynı adı paylaşır:
bir oturum payload'ının içinde request_id, webhook'un ilettiğiyle aynı olan ziyaretin
UUID'sidir; bir hata zarfının içinde ise her HTTP çağrısı için üretilen 24 karakterlik
bir izleme tanımlayıcısıdır. İzleme tanımlayıcısı ayrıca başarılı olsun olmasın her
yanıtta X-Request-Id başlığında geri döner. Destek ekibiyle iletişime geçtiğinizde onu
da ekleyin — tam olarak sizin çağrınızı böyle buluyoruz.
| HTTP | code | Anlamı |
|---|---|---|
| 400 | invalid_request | Bir parametre eksik veya bozuk |
| 401 | unauthorized | Anahtar yok, geçersiz, iptal edilmiş veya süresi dolmuş |
| 402 | upgrade_required | Planınız API erişimi içermiyor |
| 404 | not_found | Saklama penceresi içinde eşleşen bir şey yok ya da başka bir ortama ait |
| 405 | method_not_allowed | Rota var, ancak o yöntem için değil |
| 429 | rate_limited | Saniyedeki istek sayısı veya günlük kota aşıldı |
| 500 | internal | Bizim tarafımızda bir şey başarısız oldu |
| 503 | unavailable | Bir veri deposuna geçici olarak erişilemiyor |
Kontroller sabit bir sırayla yapılır — önce anahtar, sonra plan, sonra limitler — bu
yüzden hatalı anahtarla gelen bir istek her zaman önce anahtarı bildirir, asla bir kota
sorununu değil. Başka bir workspace'in verisi, var olmayan veriden ayırt edilemez:
403 değil, 404 verir.
İki 401 durumu bilinçli olarak farklı okunur:
missing Authorization: Bearer <secret key> başlığın hiç gelmediği anlamına gelirken
invalid or revoked API key başlığın geldiği ama eşleşmediği anlamına gelir. 402 ise
Data API requires the Pro plan or higher mesajını taşır.
429 ve 503'ü artan bir beklemeyle yeniden deneyin; diğer 4xx yanıtlarını yeniden
denemek anlamsızdır — isteğin kendisinin düzeltilmesi gerektiği anlamına gelirler.
Anahtarın tanındığı yanıtlar mevcut durumunuzu taşır (401 ve 402 yanıtları taşımaz;
günlük kotası olmayan Enterprise de kota başlıkları almaz):
| Başlık | Anlamı |
|---|---|
X-RateLimit-Limit | Günlük kotanız; saniyelik limit nedeniyle reddedilen bir istekte saniyelik limit |
X-RateLimit-Remaining | Bugün kalan çağrılar |
X-RateLimit-Reset | Sıfırlamanın Unix zamanı — UTC gece yarısı |
Retry-After | Beklenecek saniye, yalnızca 429 ile gönderilir — buna göre hareket edin: iki limit için de doğrudur |
| Plan | Saniyedeki istek | Günlük istek | Geçmiş derinliği |
|---|---|---|---|
| Free | API erişimi yok | — | 7 gün |
| Pro | 10 | 10.000 | 30 gün |
| Business | 50 | 100.000 | 90 gün |
| Enterprise | 200 | Ölçümsüz | 365 gün |