Dina data, där du fattar beslutet
Varje identifiering kan nå dina system på två sätt: pushad till din server i samma stund den sker, eller hämtad av dig i exakt den sekund du beslutar. Båda kanalerna bär samma siffror — den delen är låst av ett test, inte av ett löfte.
Push eller pull
Webhooks pushar händelser till dig när de sker. Data API:t låter dig fråga i det ögonblick du behöver ett svar. De flesta team kör båda: webhooks för att registrera och reagera, Data API:t för att kontrollera i flödet.
Webhooks — push, i realtid
Vi POST:ar en signerad JSON-händelse till din endpoint i samma stund något inträffar: en besökare identifieras, en kontokapning flaggas, ett botangrepp startar. Inget att polla, inget att schemalägga.
Bäst för: att registrera varje besök, reagera på angrepp och mata ditt warehouse eller SIEM.
p50-leveranslatens 44–140 ms, från händelse till din endpoint.
Data API — pull, på begäran
Ett privat server-till-server-API. Din backend autentiserar med en hemlig nyckel och läser exakt vad vi vet om en besökare i den sekund den beslutar — typiskt inuti en inloggnings- eller kassahanterare.
Bäst för: en kontroll i flödet innan du drar ett kort, godkänner en registrering eller låser upp ett konto.
Tillgängligt från Pro-planen.
Fyra händelsetyper, ett kuvert
Varje leverans kommer i samma kuvert, med händelsetypen i kroppen och i huvudet X-Tracio-Event-Type — så att en enda hanterare kan dirigera alla fyra.
Besökare identifierad
Kärnhändelsen: ett besök har poängsatts. Den bär besökar-ID, webbläsare och operativsystem, geo och nätverk, botverdiktet och riskbeslutet. Den levereras i faser — en primär händelse vid sidladdning, sedan en sen fas eller korrigeringsfas när långsammare underlag ändrar verdiktet. Faser korrelerar du via requestId.
identificationKontokapning
Detektorn för kontokapning slog på ett besök: enheten bakom ett känt konto ser inte längre ut som den enhet som äger kontot. Den kommer som en egen händelse, med kontokontexten bifogad, i stället för att gömma sig inuti en identifieringskropp.
account_takeoverBotangrepp
En våg av automatiserad trafik mot din workspace. Den här har inget besök bakom sig — den är en varning på workspace-nivå, så besöksblocken saknas helt enkelt i kroppen i stället för att komma som tomma skal med nollställda poäng.
attack_detectedÄndrat anseende
En profil har bytt anseendeband. Samma kuvert som angreppsvarningen — en händelse på profilnivå utan bifogat besök, som bär det nya bandet och det föregående.
reputation_changedEn leverans, nedkortad
Det här är baskroppen. Pro lägger till besöksfrekvens; Business lägger till orsakskoder till verdiktet, beteendesignaler, guidance och webbläsaröverskridande enhetsdata till exakt samma form — nya block tillkommer, befintliga sökvägar flyttar sig aldrig.
{ "version": 2, "event": "identification", "eventId": "req_8f21c4:primary", "requestId": "req_8f21c4", "phase": "primary", "visitorId": "3f9a1b2c4d5e6f70", "timestamp": "2026-07-30T12:00:00Z", "geo": { "country": "DE", "city": "Berlin", "timezone": "Europe/Berlin" }, "network": { "vpn": true, "proxy": false, "tor": false, "datacenter": false }, "bot": { "result": "human", "score": 12 }, "identification": { "confidence": 0.97, "incognito": false }, "decision": { "action": "suspicious", "riskScore": 65.9 }}Varje anrop bär två signaturer
X-Tracio-Signature är en HMAC-SHA256 över signaturens tidsstämpel sammanfogad med den råa anropskroppen, nycklad med din webhook-hemlighet — den bevisar att avsändaren känner till hemligheten ni båda har. X-Tracio-Signature-Ed25519 är plattformssignaturen: den verifierar du med en publik nyckel som hämtas från en well-known-endpoint, så det finns ingenting hemligt att lagra på din sida. Tidsstämpeln ingår i det signerade innehållet, och det är just det som gör en gammal inspelning värdelös att spela upp igen.
Verifiera mot de råa anropsbytena — omserialiserad JSON ändrar bytena och då stämmer inte signaturen. Omförsök bär samma X-Tracio-Event-Id, så deduplicera på den.
Huvuden vid varje leverans
X-Tracio-Signature: t=1753444800,v1=5257a869e7ecebed...X-Tracio-Signature-Ed25519: t=1753444800,kid=k1,v1=0Zx0M0n8...X-Tracio-Event-Type: identificationX-Tracio-Event-Id: req_8f21c4:primaryX-Tracio-Delivery-Attempt: 1X-Tracio-Payload-Version: 2Byggt för att inte tappa händelser
Leveransen körs på en egen flotta, och sanningskällan är kön — inte minnet i en process. Det är det som gör at-least-once verkligt: dör en leveransnod mitt i flykten ligger händelsen kvar i kön och en annan nod plockar upp den.
Omförsök som passar riktiga avbrott
5 s, 30 s, 2 min, 10 min, 30 min, 2 h, 6 h. De första omförsöken landar inom en minut, så en kort omstart av din tjänst kostar dig ingenting. Varje paus väljs slumpmässigt mellan hälften av det angivna värdet och hela värdet, så att omförsök inte kommer tillbaka som en enda salva efter ett avbrott.
Automatisk avstängning som inte slår fel
En webhook stängs av först när felen både når tröskeln och har pågått i minst 15 sammanhängande minuter — en skur av köade leveranser under en omstart dödar alltså inte integrationen. En 410 Gone stänger av omedelbart. Dashboarden visar orsaken, svarskoden och en knapp för att slå på den igen.
Rotation av hemligheter utan glapp
Efter en rotation är båda hemligheterna giltiga i 24 timmar och huvudet bär båda signaturerna, så en träff på endera räcker. Du uppdaterar din konfiguration inom fönstret i stället för att kappas med en omställning; ”Återkalla nu” kortar fönstret när du behöver bli av med den direkt.
En leveranslogg som går att läsa
Varje försök — svarskod, varaktighet, feltext — syns per webhook i dashboarden, bredvid en teståtgärd som skickar en signerad exempelpayload till din endpoint så att du kan bekräfta din verifiering innan du går skarpt.
Fråga i det ögonblick du beslutar
Ett privat server-till-server-API på api.tracio.ai. Din backend autentiserar med en hemlig nyckel och läser sina egna data. Det skickar avsiktligt inga CORS-huvuden: en hemlig nyckel ger åtkomst till allt i din workspace och får aldrig nå en webbläsare. Tillgängligt från Pro-planen.
| Metod | Sökväg | Returnerar |
|---|---|---|
| GET | /v1/visitors/{visitorId} | Besökarsammanfattning: först och senast sedd, antal besök, unika IP-adresser och länder, webbläsare och enheter, riskhistorik — plus besökarens senaste session. |
| GET | /v1/visitors/{visitorId}/sessions | Sessionslista med markörpaginering och filter på datumintervall, botresultat och lägsta riskpoäng. |
| GET | /v1/visitors/{visitorId}/sessions/latest | Den senaste sessionen som ett enda objekt, utan listkuvert. |
| GET | /v1/sessions/{requestId} | En bestämd session. Skicka med visitorId så går uppslaget via besökarindexet i stället för genom hela din historik. |
| GET | /v1/visitors/{visitorId}/velocity | Aktivitet över ett fönster — 1 h, 24 h eller 7 d: hur många besök, från hur många IP-adresser, ur hur många länder, under hur många konton. |
Kontrollera en besökare i kassan
Det typiska anropet: inuti din betalningshanterare, innan du auktoriserar kortet. Ett anrop, ett svar, och meta-blocket rapporterar det fönster du faktiskt fick — ber du om sex månader och din plan sparar 30 dagar returneras 30 dagar, och det står där.
Anrop
# Inside your checkout handler, before you authorize the cardcurl -s -H "Authorization: Bearer $TRACIO_SECRET_KEY" \ "https://api.tracio.ai/v1/visitors/3f9a1b2c/velocity?window=24h"Svar
{ "window": "24h", "events": 128, "uniqueIps": 4, "uniqueCountries": 2, "uniqueAccounts": 1, "meta": { "plan": "business", "retentionDays": 30 }}Samma siffror överallt
Ett besök som får 65,9 i din dashboard får 65,9 i Data API:t och 65,9 i webhook-kroppen. Två oberoende renderingar skulle kunna glida isär — skalor är det klassiska fallet, där en kanal ger dig 0,93 när den andra säger 93 — så ett paritetstest bygger ett enda besök, renderar det genom båda kanalerna och jämför de publika fälten på rå JSON. Överensstämmelsen är framtvingad, inte påstådd.
Råd, inte bara siffror
Poängen berättar vad vi såg. Guidance berättar vad du bör göra åt det, för de fyra beslut som faktiskt kostar pengar — beräknat av versionerade regler, med resonemanget bifogat.
Ta emot betalningen?
Väger risk, bedrägerianseende och botverdiktet innan du auktoriserar ett kort.
Acceptera registreringen?
Fångar slit-och-släng-kontot innan det finns — flerkontohantering och anseende väger tyngst här.
Släppa in dem?
Skärps automatiskt när detektorn för kontokapning har slagit på besöket.
Räkna konverteringen?
Skiljer en äkta värvning från en självvärvning eller en belönad bot.
Ett ordförråd på fyra ord
Varje scenario får ett av fyra svar, och med det grunden svaret gavs på — de avgörande axlarna ur ett fast ordförråd: bot, risk, bedrägerianseende, beteende, flerkontohantering, kontokapning, nätverk, affiliatemönster. Du vet alltid vilken axel som flyttade rådet, utan att någonsin se signalnamn, vikter eller trösklar.
En beräkning, tre kanaler
Samma guidance-block följer med i webhooken, svarar i Data API:t och renderas på besökarkortet i dashboarden — en regeluppsättning, ett resultat, ingen avstämning på din sida. Läs rådet för ditt scenario snarare än overall: overall är helt enkelt det strängaste av de fyra, en sammanfattning för dashboards och inget betalningsbeslut. Regelversionen följer med i payloaden, så ett byte av regler är något du märker och inte något du gissar dig till av råd som förskjutits.
"guidance": { "version": 1, "overall": "review", "payment": "review", "registration": "challenge", "login": "allow", "affiliate": "allow", "basis": ["risk", "fraud_reputation"]}Fem SDK:er i frontend, två kanaler i backend
Webbläsarsidan levereras som fem SDK:er — vanilla JavaScript, React, Vue 3, Angular och Svelte 5. Det finns inga SDK:er för serversidan, och det är avsiktligt: din backend integrerar över vanlig HTTP genom signerade webhooks och Data API:t. Signaturverifiering är ett dussin rader mot en referensvektor som vi publicerar, och det finns ingenting extra att hålla uppdaterat i ditt beroendeträd på servern.
Vanliga frågor
Koppla ihop det på en eftermiddag
Skapa en webhook i dashboarden, rikta den mot din endpoint och tryck på Testa. Verifiera signaturen mot vår referensvektor, så ligger den svåra biten bakom dig.