Server API आपके बैकएंड को वह पहचान डेटा पढ़ने देता है जो TRACIO आपके वर्कस्पेस के लिए पहले ही एकत्र कर चुका है: किसी विज़िटर का इतिहास, अलग-अलग सेशन, और छोटी विंडो वाले वेलोसिटी काउंटर।
यह Webhooks की जगह नहीं लेता, बल्कि उनका पूरक है:
| Webhooks | Server API | |
|---|---|---|
| दिशा | TRACIO आपके एंडपॉइंट पर भेजता है | आपका बैकएंड मांग पर खींचता है |
| समय | जैसे ही हर पहचान होती है | कभी भी, आपकी अवधारण विंडो के भीतर |
| किसके लिए सर्वोत्तम | किसी इवेंट पर प्रतिक्रिया देने के लिए | निर्णय के दौरान डेटा देखने, बैकफ़िल और जाँच-पड़ताल के लिए |
दोनों सतहें Pro प्लान और उससे ऊपर उपलब्ध हैं।
https://api.tracio.ai/v1यह ब्राउज़र एंडपॉइंट (edge.tracio.ai) और डैशबोर्ड (app.tracio.ai) से अलग होस्ट है।
तीनों अलग-अलग हैं: ब्राउज़र आपकी पब्लिक कुंजी के साथ edge से बात करता है, और आपका
बैकएंड आपकी सीक्रेट कुंजी के साथ Server API से।
हर अनुरोध आपकी सीक्रेट कुंजी को bearer token के रूप में साथ ले जाता है:
curl -H "Authorization: Bearer tracio_sk_XXXX...XXXX" \ "https://api.tracio.ai/v1/visitors/X7fh2Hg9LkMn3pQr5tBvQw3xZa9mK2pL4nR8dT6y"Server API केवल सर्वर-टू-सर्वर है। CORS हेडर जान-बूझकर नहीं लौटाए जाते, इसलिए कोई ब्राउज़र इसे कॉल नहीं कर सकता — यही आपकी सीक्रेट कुंजी को क्लाइंट-साइड कोड से बाहर रखता है। सीक्रेट कुंजी को ब्राउज़र तक कभी न भेजें।
इसे डैशबोर्ड में API Keys के अंतर्गत बनाएं, secret प्रकार चुनकर।
tracio_sk_ और उसके बाद 43 वर्णों जैसी दिखती है, कुल 53। डैशबोर्ड इसे
इसके पहले कुछ वर्णों से सूचीबद्ध करता है, ताकि आप कुंजियों में फ़र्क कर सकें।रोटेशन एक नई कुंजी जारी करता है और पुरानी को 7 दिन तक काम करने देता है, ताकि आप उसे बिना डाउनटाइम रोल आउट कर सकें। नई कुंजी डिप्लॉय करें, पुष्टि करें कि ट्रैफ़िक उस पर चला गया है, और पुरानी को समाप्त होने दें। पब्लिक कुंजियाँ रोटेट नहीं की जा सकतीं — वे गुप्त नहीं हैं और डिज़ाइन के अनुसार आपके पेज सोर्स में दिखती हैं।
हर रूट GET है। Server API में कोई राइट ऑपरेशन नहीं है: यह डेटा पढ़ता है, और आपका
कॉन्फ़िगरेशन डैशबोर्ड में रहता है।
| मेथड | पथ | क्या लौटाता है |
|---|---|---|
GET | /v1/visitors/{visitorId} | एक विज़िटर का समेकित इतिहास, साथ में उसका नवीनतम सेशन |
GET | /v1/visitors/{visitorId}/sessions | उस विज़िटर के सेशनों की पेजिनेटेड सूची |
GET | /v1/visitors/{visitorId}/sessions/latest | केवल सबसे हालिया सेशन |
GET | /v1/visitors/{visitorId}/velocity | एक छोटी विंडो में गतिविधि काउंटर |
GET | /v1/sessions/{requestId} | अनुरोध पहचानकर्ता से एक सेशन |
GET | /.well-known/webhook-keys | webhook प्लेटफ़ॉर्म सिग्नेचर के लिए सार्वजनिक कुंजियाँ (कोई प्रमाणीकरण नहीं) |
अंत में स्लैश स्वीकार किया जाता है और अनदेखा कर दिया जाता है। अज्ञात पथ या गलत मेथड वही JSON त्रुटि एनवेलप लौटाता है जो बाकी सब कुछ लौटाता है, कभी HTML या सादा-टेक्स्ट पेज नहीं।
हर रीड एक समय विंडो से बंधा होता है, जिसे दो वैकल्पिक क्वेरी पैरामीटर नियंत्रित करते हैं:
| पैरामीटर | स्वीकार करता है |
|---|---|
from | YYYY-MM-DD या पूरा RFC 3339 टाइमस्टैम्प |
to | YYYY-MM-DD या पूरा RFC 3339 टाइमस्टैम्प |
to के रूप में केवल तारीख देने पर वह पूरा दिन शामिल होता है।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/v1/visitors/X7fh2Hg9LkMn3pQr5tBvQw3xZa9mK2pL4nR8dT6y"उत्तर समेकित इतिहास लाता है और नवीनतम सेशन को भी उसी में समाहित कर देता है, इसलिए सामान्य स्थिति में दो के बजाय एक ही अनुरोध चाहिए:
{ "visitorId": "X7fh2Hg9LkMn3pQr5tBvQw3xZa9mK2pL4nR8dT6y", "firstSeenAt": "2026-05-02T10:11:12Z", "lastSeenAt": "2026-07-25T08:00:00Z", "visits": 42, "incognitoVisits": 3, "uniqueIps": 5, "uniqueCountries": 2, "browsers": ["Chrome"], "os": ["macOS"], "devices": ["desktop"], "risk": { "maxRiskScore": 63, "avgBotScore": 12.5, "botSessions": 7, "lastDecision": "real" }, "network": { "vpnSeen": false, "proxySeen": false, "torSeen": false, "datacenterSeen": true, "lastIsp": "Deutsche Telekom" }, "lastSession": { "requestId": "9c1f6a2e-3b7d-4c58-a1e2-6f0d8b4a7c31", "visitorId": "X7fh2Hg9LkMn3pQr5tBvQw3xZa9mK2pL4nR8dT6y", "accountId": "user_8842", "timestamp": "2026-07-25T08:00:00Z", "tag": "checkout", "url": "https://shop.example.com/checkout", "ip": "203.0.113.42", "userAgent": "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", "geo": { "country": "DE", "city": "Berlin", "timezone": "Europe/Berlin", "isp": "Deutsche Telekom" }, "network": { "vpn": false, "proxy": false, "tor": false, "datacenter": false, "asn": 3320 }, "bot": { "result": "human", "score": 4.5, "antidetectScore": 2.1 }, "identification": { "confidence": 0.97, "incognito": false, "matchType": "exact", "matchConfidence": 0.99 }, "decision": { "action": "real", "riskScore": 12 } }, "meta": { "plan": "business", "retentionDays": 90, "from": "2026-04-26T00:00:00Z", "to": "2026-07-25T12:00:00Z" }}| फ़ील्ड | अर्थ |
|---|---|
visits, incognitoVisits | विंडो में कुल विज़िट, और उनमें से कितनी निजी विंडो में थीं |
uniqueIps, uniqueCountries | विंडो में दिखे अलग-अलग पते और देश |
browsers, os, devices | वे अलग-अलग परिवेश जिनमें यह विज़िटर दिखाई दिया है |
risk.maxRiskScore | विंडो में दर्ज सबसे ऊँचा जोखिम स्कोर, 0..100 |
risk.lastDecision | सबसे हालिया विज़िट के लिए दर्ज निर्णय |
risk.avgBotScore, risk.botSessions | बॉट-स्कोर का औसत और बॉट सेशनों की संख्या — Business और उससे ऊपर |
network.*Seen | क्या इस विज़िटर के लिए कभी VPN, प्रॉक्सी, Tor एग्ज़िट नोड या डेटासेंटर पता देखा गया |
network.lastIsp | सबसे हालिया ISP — Business और उससे ऊपर |
lastSession | सबसे हालिया विज़िट के लिए पूरा सेशन ऑब्जेक्ट |
meta | प्लान, दिनों में उसकी अवधारण, और वास्तव में लागू की गई विंडो |
अवधारण विंडो के भीतर बिना किसी डेटा वाला विज़िटर 404 not_found और संदेश
visitor not found in the retention window लौटाता है — यह आपके इंटीग्रेशन की त्रुटि
नहीं है, इसका अर्थ है कि विज़िटर नया है या समय के साथ बाहर हो चुका है।
सेशन दो वर्डिक्ट लाता है, और वे अलग-अलग प्रश्नों का उत्तर देते हैं — क्या क्लाइंट स्वचालित था, और जोखिम इंजन ने कुल मिलाकर क्या निष्कर्ष निकाला:
| फ़ील्ड | मान |
|---|---|
bot.result | human, bot, uncertain |
decision.action | real, fake, suspicious |
bot.score और decision.riskScore दोनों 0..100 पर चलते हैं। Business और उससे ऊपर
guidance इन्हें सीढ़ी allow → challenge → review → deny पर प्रति-परिदृश्य सलाह में
बदल देता है — हर पायदान का अर्थ जानने के लिए देखें
Guidance।
curl -H "Authorization: Bearer tracio_sk_XXXX...XXXX" \ "https://api.tracio.ai/v1/visitors/X7fh2Hg9LkMn3pQr5tBvQw3xZa9mK2pL4nR8dT6y/sessions?limit=100&minRiskScore=50"| पैरामीटर | डिफ़ॉल्ट | टिप्पणियाँ |
|---|---|---|
limit | 50 | 500 पर सीमित; बड़ा मान अस्वीकार नहीं, बल्कि क्लैंप किया जाता है |
from, to | प्लान की अवधारण | ऊपर बताई गई साझा समय विंडो |
cursor | — | पिछले पेज से मिला अपारदर्शी पेजिनेशन कर्सर |
botResult | — | केवल इस बॉट वर्डिक्ट वाले सेशन रखें |
minRiskScore | — | केवल इस जोखिम स्कोर पर या उससे ऊपर वाले सेशन रखें, 0..100 |
सेशन नवीनतम पहले के क्रम में लौटते हैं:
{ "items": [ { "requestId": "9c1f6a2e-3b7d-4c58-a1e2-6f0d8b4a7c31", "visitorId": "X7fh2Hg9LkMn3pQr5tBvQw3xZa9mK2pL4nR8dT6y", "timestamp": "2026-07-25T08:00:00Z" } ], "nextCursor": "MTcyMTg5NDQwMDAwMDphYmMxMjM", "hasMore": true, "meta": { "plan": "business", "retentionDays": 90, "from": "2026-04-26T00:00:00Z", "to": "2026-07-25T12:00:00Z" }}पेजिंग कर्सर-आधारित है। कोई page या offset पैरामीटर नहीं है: आपको जो nextCursor
मिला उसे cursor के रूप में वापस भेजें, और जब तक hasMore सही है तब तक चलते रहें।
async function allSessions(visitorId: string, secretKey: string) { const sessions = [] let cursor: string | undefined
do { const url = new URL(`https://api.tracio.ai/v1/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(`Server API: ${res.status}`)
const page = await res.json() sessions.push(...page.items) cursor = page.nextCursor } while (cursor)
return sessions}कर्सर को अपारदर्शी मानें — उसकी सामग्री एक कार्यान्वयन विवरण है और बदल सकती है। संपादित
किया गया कर्सर 400 invalid_request और संदेश malformed cursor के साथ अस्वीकार कर दिया
जाता है।
सबसे हालिया वाला:
curl -H "Authorization: Bearer tracio_sk_XXXX...XXXX" \ "https://api.tracio.ai/v1/visitors/X7fh2Hg9LkMn3pQr5tBvQw3xZa9mK2pL4nR8dT6y/sessions/latest"यह एक सादा सेशन ऑब्जेक्ट लौटाता है — न कोई ऐरे, और न ही किसी एनवेलप में लिपटा हुआ। विंडो
में बिना किसी सेशन वाला विज़िटर 404 not_found और
no sessions for this visitor in the retention window लौटाता है।
या requestId से, वह पहचानकर्ता जो webhook पेलोड में भी आता है:
curl -H "Authorization: Bearer tracio_sk_XXXX...XXXX" \ "https://api.tracio.ai/v1/sessions/9c1f6a2e-3b7d-4c58-a1e2-6f0d8b4a7c31?visitorId=X7fh2Hg9LkMn3pQr5tBvQw3xZa9mK2pL4nR8dT6y"यहाँ visitorId वैकल्पिक है, पर जब वह आपको पता हो तब उसे भेजना लुकअप को उल्लेखनीय रूप से
तेज़ बना देता है।
वेलोसिटी इस प्रश्न का उत्तर देती है कि "यह विज़िटर हाल में कितना कुछ कर रहा है" — यही क्रेडेंशियल स्टफ़िंग, कार्ड टेस्टिंग और थोक साइनअप का आकार है।
curl -H "Authorization: Bearer tracio_sk_XXXX...XXXX" \ "https://api.tracio.ai/v1/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, "uniqueIps": 9, "uniqueCountries": 3, "uniqueAccounts": 12, "botEvents": 4, "meta": { "plan": "business", "retentionDays": 90, "from": "2026-07-25T11:00:00Z", "to": "2026-07-25T12:00:00Z" }}uniqueAccounts उन अलग-अलग linkedId मानों की गिनती करता है जो आपने इस डिवाइस के लिए
भेजे — देखें अकाउंट लिंकिंग। botEvents Business और उससे ऊपर
है।
अनुपस्थित फ़ील्ड का अर्थ है "कोई डेटा नहीं", कभी शून्य नहीं। बिना मान वाले फ़ील्ड
0, "" या null के रूप में भेजे जाने के बजाय पूरी तरह हटा दिए जाते हैं: बिलकुल नए
विज़िटर के पास कोई matchConfidence नहीं होता, साफ़-सुथरी विज़िट के पास कोई
antidetectScore या suspectScore नहीं होता। एकमात्र जान-बूझकर रखा गया अपवाद है
bot.score, जो शून्य होने पर भी हमेशा मौजूद रहता है। फ़ील्ड सावधानी से पढ़ें।
पेलोड आपके प्लान पर निर्भर करता है। API पहुँच वाला हर प्लान बेस सेशन पाता है —
पहचानकर्ता, टाइमस्टैम्प, URL, IP, user agent, ब्राउज़र, OS, डिवाइस, geo, network, bot,
identification और decision। Pro इसमें identification.matchType,
identification.matchConfidence और bot.antidetectScore जोड़ता है। Business और
Enterprise geo.isp, network.asn, decision.suspectScore,
identification.driftScore, reasons, behavior, guidance, deviceInfo तथा
व्यक्ति-स्तर के फ़ील्ड (personId, reputation, linkedAccountsCount,
linkedVisitorsCount) जोड़ते हैं। Pro प्लान पर किसी Business फ़ील्ड की अनुपस्थिति कोई
त्रुटि नहीं है।
सिग्नल-स्तर की आंतरिक बातें कभी नहीं लौटाई जातीं, किसी भी प्लान पर: अलग-अलग सिग्नल के नाम, उनके वज़न, किसी वर्डिक्ट के पीछे की थ्रेशोल्ड, कच्चे सिग्नल मान और स्कोर का विश्लेषण हमारी ओर ही रहते हैं। जिस स्कोर की उसके इनपुट में रिवर्स इंजीनियरिंग हो सके, वह बचाव के रूप में उपयोगी नहीं रह जाता।
हर विफलता एक ही एनवेलप का उपयोग करती है:
{ "error": { "code": "unauthorized", "message": "missing Authorization: Bearer <secret key>", "requestId": "8f14e45fceea167a5a36dedd" }}यह requestId विज़िट पहचानकर्ता नहीं है। दो अलग-अलग मान एक ही नाम साझा करते हैं:
सेशन पेलोड के भीतर requestId विज़िट का 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 | प्रति सेकंड अनुरोध, या दैनिक कोटा, पार हो गया |
| 500 | internal | हमारी ओर कुछ विफल हुआ |
| 503 | unavailable | कोई आधार-स्टोर अस्थायी रूप से पहुँच से बाहर है |
जांचें एक निश्चित क्रम में चलती हैं — पहले कुंजी, फिर प्लान, फिर सीमाएँ — इसलिए गलत कुंजी वाला अनुरोध हमेशा पहले कुंजी की ही रिपोर्ट करता है, कभी कोटा की समस्या नहीं।
दो 401 स्थितियाँ जान-बूझकर अलग-अलग पढ़ी जाती हैं: missing Authorization: Bearer <secret key>
का अर्थ है कि हेडर आया ही नहीं, जबकि invalid or revoked API key का अर्थ है कि वह आया और
मेल नहीं खाया। 402 के साथ आता है Data API requires the Pro plan or higher।
हर प्रमाणित उत्तर आपकी वर्तमान स्थिति साथ लाता है:
| हेडर | अर्थ |
|---|---|
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 दिन |