Events API
Integreer cside Device Intelligence in uw applicatie. Verzamel browsersignalen, genereer sessietokens en haal gedetailleerde bezoekersinformatie op via uw backend.
Deze handleiding begeleidt u bij het integreren van de cside Device Intelligence Events API van begin tot eind: het laden van het clientscript, het genereren van een sessietoken, het verzenden naar uw backend en het interpreteren van de respons.
Integratieflow
Voeg het script toe aan uw pagina
Als uw app met een bundler wordt gebouwd, installeer dan het npm-pakket en roep initDeviceIntelligence({ teamID }) zo vroeg aan als uw app toelaat. Neem anders de fail-open browser-bootstrap bovenaan de <head> op, vóór andere scripts, en vervang de waarde van script.src door de team-URL uit het cside-dashboard. De bootstrap laadt client.js asynchroon, zet vroege aanroepen in een wachtrij en wijst ze af als cside niet beschikbaar is of een time-out krijgt, zodat uw pagina blijft werken.
Verzend telemetry en ontvang een sessietoken
Zodra het script is geladen, wordt de globale functie sendClientTelemetry beschikbaar (het npm-pakket geeft dezelfde functie terug uit initDeviceIntelligence). Het laden van het script maakt niet zelf een sessiefingerprint. Roep sendClientTelemetry(externalIds?) aan om telemetry naar https://edge.csidefd.com/client te verzenden en een sessietoken te ontvangen. Geef optioneel een externalIds-object mee als u eigen identifiers wilt koppelen.
const result = await sendClientTelemetry({
email: "user@example.com",
userId: "1234567890",
});
// Of roep de functie zonder argumenten aan
// const result = await sendClientTelemetry();
if (result.errors) {
console.error(result.errors);
throw new Error("Telemetry-aanvraag is mislukt.");
}
const token = result.token;Parameters
| Parameter | Type | Vereist | Beschrijving |
|---|---|---|---|
externalIds | Record<string, string> | Nee | Optionele identifiers die u aan de fingerprint wilt koppelen, zoals userId, orderId, paymentCardId of email. |
Geef het e-mailadres in dit object mee met de sleutel email om het wegwerp-e-mailsignaal (fingerprint_enrichment.throwaway_email_detected op /token/v2/verify) te ontvangen. De accountregels en de Identity graph gebruiken userId als sleutel (de Identity graph accepteert ook teamId of customerId), en de card-testing-regel gebruikt paymentCardId; zie Datapoints ophalen voor het formaat.
Retourwaarde
De functie retourneert een JSON-object (al geparseerd, dus u hoeft er geen .json() op aan te roepen):
{
"token": "eyJhbGciOiJIUzI1NiIs..."
}Het veld token bevat het fingerprint-sessietoken. Als het verzamelen van telemetry op problemen stuit, bevat het object ook een optionele errors-array die u kunt loggen; met het npm-pakket wordt sendClientTelemetry nooit afgewezen, maar opgelost met { token: null, errors }. Haal result.token eruit en stuur alleen die sessietokenstring naar uw backend.
Haal fingerprintdata op vanuit uw backend
Genereer een backend-only Device Intelligence API-sleutel in het cside-dashboard, sla deze op als server-side secret en gebruik deze om het sessietoken met cside uit te wisselen. De API-sleutel wordt maar één keer getoond en mag niet in browsercode worden blootgesteld.
if (!token) {
throw new Error("Fingerprint-sessietoken is niet geretourneerd.");
}
const response = await fetch("https://api.cside.com/token/v2/verify", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.CSIDE_FINGERPRINT_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ token }),
});
const data = await response.json();Verzoekbody
Stuur JSON in de vorm { "token": "<sessietoken>" }, waarbij de waarde result.token uit de vorige stap is. Alleen de /token/v2/*-endpoints accepteren JSON; de /token/v1/*-endpoints accepteren het ruwe sessietoken als text/plain-body.
Token lookup-opties
Gebruik het geauthenticeerde endpoint voor server-to-serveruitwisselingen in productie. De publieke endpoints blijven beschikbaar wanneer een integratie specifiek de niet-geauthenticeerde lookupflow nodig heeft.
| Endpoint | Auth | Requestbody | Gebruik wanneer |
|---|---|---|---|
/token/v2/verify | API-sleutel | JSON { "token" } | U geauthenticeerde backendopvraging met een Device Intelligence API-sleutel nodig hebt. |
/token/v2/device/entries | API-sleutel | JSON { "token", "limit", "offset" } | U voltooide evaluaties nodig hebt voor dezelfde device-ID als een sessietoken. |
/token/v1/client | Geen | Ruw token, text/plain | U de publieke fingerprinting response payload nodig hebt. |
/token/v1/clientId | Geen | Ruw token, text/plain | U alleen de stabiele fingerprint-ID uit de publieke lookupflow nodig hebt. |
Elk endpoint retourneert 202 Accepted met { "status": "pending" } zolang de evaluatie nog wordt verwerkt, daarna 200 OK zodra die klaar is. /token/v2/device/entries accepteert { "token": "...", "limit": 100, "offset": 0 } en retourneert { "device_id": "...", "entries": [...], "next_offset": 100, "has_more": true }, waarbij elke entry dezelfde responsevorm gebruikt als /token/v2/verify. limit is optioneel, is standaard 500 en heeft een maximum van 500. /token/v1/clientId retourneert JSON { "status": "completed", "device_id": "..." }. Als er geen fingerprint-ID voor het sessietoken bestaat, retourneert het 404.
Fouten en rate limits
Foutresponses bevatten een JSON-body { "error": "<bericht>", "code": <HTTP-status> }:
| Status | Betekenis |
|---|---|
400 | Ongeldige body, of een sessietoken dat niet kan worden gedecodeerd. |
401 | Ontbrekende of ongeldige API-sleutel, een verlopen token, of een token dat voor een ander team is uitgegeven dan de API-sleutel. |
404 | Er bestaat geen evaluatie voor het token (token not found), of, op /token/v1/clientId, geen fingerprint-ID (fingerprint id not found). |
429 | Rate limit overschreden. De response bevat een retry-after: 60-header. De standaardlimiet is 1.000 requests per minuut per team. |
Een voltooide evaluatie die is mislukt, is geen HTTP-fout: die retourneert 200 OK met "status": "failed" en een error_message-veld. Controleer status voordat u verrijkingsvelden leest.
Voorbeeld van een backendrequest
const csideResponse = await fetch("https://api.cside.com/token/v2/verify", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.CSIDE_FINGERPRINT_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ token }),
});
const data = await csideResponse.json();Interpreteer de backendrespons
Uw backend retourneert een JSON-respons met het identificatieresultaat en bijbehorende signalen. Zie de volledige responsreferentie hieronder.
/token/v2/verify-response
Het geauthenticeerde endpoint retourneert een vlakke JSON-payload. Elke entry in /token/v2/device/entries gebruikt dezelfde vorm.
| Veld | Type | Beschrijving |
|---|---|---|
status | string | pending, completed of failed. Verrijkingsvelden zijn alleen aanwezig bij completed. |
error_message | string | Waarom de evaluatie is mislukt. Alleen aanwezig wanneer status failed is. |
created_at | number | Unix-tijdstempel (milliseconden) waarop de evaluatie is aangemaakt. |
updated_at | number | Unix-tijdstempel (milliseconden) van de laatste update. |
fingerprint | object | De volledige apparaatfingerprint: browser-, hardware-, rendering-, omgevings- en automatiseringssignalen, plus de external_ids die u hebt gekoppeld. Dezelfde velden als het fingerprint-object van de S3-export. |
network_client_metrics | object | TCP- en TLS-kenmerken van de verbinding. |
geo_data | object | Geolocatie op stadsniveau voor het bezoeker-IP. |
ip_enrichment | object | ASN-, geo- en privacygegevens (hosting, proxy, relay, tor, vpn, datacentersignalen) voor het bezoeker-IP. |
vpn_evaluation | object | is_vpn, vpn_probability, vpn_confidence, reasons, features en context. |
bot | object | Het botoordeel: is_bot, bot_probability, bot_confidence, bot_agent_id, reasons, scores en drempelwaarden per model, en session_event_count. Zie AI-agentdetectie. |
fingerprint_enrichment | object | Signalen afgeleid van de fingerprint. throwaway_email_detected is true wanneer de externe ID email een wegwerpdomein gebruikt. |
rule_evaluations | object | Verouderde regeluitkomsten (rules, policy_version). Leeg op evaluaties die na 2026-08-27 zijn aangemaakt; blijft in de response staan zodat oudere records nog decoderen. |
rule_evaluations_v2 | object | Uitkomsten van de rule engine: een values-array waarin elk item één evaluation bevat met rule_slug, rule_version, outcome, evaluated_as (live of shadow), transition en evaluated_at. |
De geneste objecten komen overeen met de recordstructuur van de S3-export, waar elk veld in detail is gedocumenteerd.
rule_evaluations_v2
De tabel hierboven vat dit veld samen. Het bevat de uitkomst van elke regel die voor het domein is gedraaid, drie niveaus diep genest onder rule_evaluations_v2.values[].evaluation, en de waarden zijn integers in plaats van strings, dus die zijn het waard om uit te schrijven. Het maakt geen deel uit van de /token/v1/client-payload die hieronder is gedocumenteerd.
| Veld | Type | Beschrijving |
|---|---|---|
rule_slug | string | De identifier van de regel, bijvoorbeeld "account_shared_detected". |
outcome | number | Het evaluatieresultaat. Zie de tabel hieronder. |
evaluated_as | number | De levenscyclusstatus van de regel op het moment van evaluatie. Zie de tabel hieronder. |
transition | number | Of de uitkomst bij deze evaluatie is veranderd, los van wat de uitkomst is. 2 betekent ongewijzigd sinds de vorige evaluatie, 3 betekent dat deze bij deze evaluatie is veranderd. Gecombineerd met outcome: 1 betekent een 3 dat de regel net begon te matchen; gecombineerd met outcome: 2 betekent het dat de regel net stopte met matchen. 1 wordt nooit geproduceerd. |
key.key_hash | string | Een hash van de waarde waarop de regel keyde. Dit is een JSON-string, geen getal, zodat deze JSON.parse doorstaat zonder precisieverlies. Het bevat niet de account-id zelf. |
event_time, evaluated_at | object | { seconds, nanos }, anders dan de created_at en updated_at op het hoogste niveau van de response, die milliseconde-tijdstempels zijn. |
outcome en evaluated_as zijn onbewerkte integers, geen strings:
outcome | Betekenis | Wanneer u dit ziet |
|---|---|---|
0 | Niet gespecificeerd | Wordt niet geproduceerd |
1 | True | Continu, bij elke evaluatie zolang de voorwaarde geldt |
2 | False | Continu, bij elke evaluatie zolang dat niet zo is. Dit is de stabiele toestand voor een gezonde, niet-matchende regel, geen zeldzame overgang |
3 | Ontbrekend (structureel) | Continu, bij elke evaluatie waarbij de regel het veld dat hij nodig heeft niet kan lezen, zoals een verkeerde external-id-key. Aanhoudend, geen eenmalige uitschieter |
4 | Pending (tijdelijk) | Wanneer een vereiste meting wel bestaat maar nog niet is opgewarmd. Anders dan een status op het hoogste niveau van pending: hetzelfde token opnieuw opvragen lost dit niet op, maar een latere evaluatie van dezelfde entiteit kan 1 of 2 teruggeven |
evaluated_as | Betekenis |
|---|---|
1 | Draft |
2 | Shadow (een experiment; kan op elk moment verschijnen) |
3 | Active |
4 | Archived |
Elke geëvalueerde, gepubliceerde regel rapporteert bij elk event een entry, met welke uitkomst dan ook. rule_evaluations_v2 is een registratie van wat is geëvalueerd, geen notificatiestream, dus outcome: 2 (false) en outcome: 3 (ontbrekend) worden niet onderdrukt: ze rijden net zo betrouwbaar mee in de array als outcome: 1. transition vertelt u of die uitkomst is veranderd sinds de vorige evaluatie.
Een afwezige entry voor een gegeven rule_slug betekent dat de regel helemaal niet is geëvalueerd: hij is niet geactiveerd voor het domein, het is een meet-only regel die niet publiceert, of er liep geen evaluatie voor dat event. Het betekent niet “geëvalueerd als false”, dat geval is outcome: 2, net als al het andere aanwezig in de array. Zie Accountdeling detecteren voor een uitgewerkt voorbeeld dat dit veld end-to-end uitleest.
/token/v1/client-responsreferentie
Deze referentie geldt voor het publieke /token/v1/client-endpoint. Het is een oudere, vlakkere weergave van dezelfde evaluatie. Veel van de velden zijn vaste placeholders die voor achterwaartse compatibiliteit zijn behouden; de callout hieronder somt ze op. Gebruik voor nieuwe integraties bij voorkeur /token/v2/verify.
Deze velden zitten in elke response, maar worden nooit berekend:
identification.confidenceensupplementary_id_high_recall.confidencezijn altijd{ "score": 0.0, "version": "unknown" }identification.visitor_foundis altijdfalse;first_seen_atenlast_seen_atzijn gelijk aan detimestampvan het evenementproximityis altijd{ "id": "unknown", "precision_radius": 0, "confidence": 0.0 }client_referreris altijd"unknown"ip_blocklist.email_spamenip_blocklist.attack_sourcezijn altijdfalse(alleentor_nodewordt gevuld)raw_device_attributes.mathis altijd"unknown"
Bouw hier geen detectie- of fraudelogica op.
Uitleg bij regels
Gepubliceerde regels met een waar resultaat kunnen rule_evaluations_v2.values[].evaluation.explanation.nodes bevatten. Elke bezochte node kan node_id, outcome, de getypeerde waarde observed, subject en compared_to beschrijven. Uitleg is optioneel; onware, wachtende en ontbrekende resultaten bevatten deze niet. Ontbrekende uitleg verandert het vastgelegde resultaat niet.
Behandel subject en compared_to als weergavetekst, niet als een formaat om te ontleden. Gebruik node_id, getypeerde observed-waarden en outcome in uw code. Lees deze velden uit rule_evaluations_v2, niet uit het oude object rule_evaluations. Zie de Events API voor resultaatwaarden en het verschil met het oude formaat.
Velden op het hoogste niveau
| Veld | Type | Beschrijving |
|---|---|---|
linked_id | string | De browsersessie-ID, of de event-ID wanneer er geen sessie-ID is vastgelegd. Het is geen identifier die u hebt meegegeven; uw externalIds staan onder tags als external_id:<key>. |
tags | object | Een diagnostische map van cside, geen klantmetadata: domain_id, team_id, request_id, session_id, fingerprint_match, network_match, ondersteuningsvlaggen voor detecties zoals incognito_support, en uw externalIds als external_id:<key>-vermeldingen. |
timestamp | number | Unix-tijdstempel (milliseconden) van het evenement. |
event_id | string | Unieke identificatie voor dit fingerprinting-evenement. |
url | string | De pagina-URL waar de fingerprint is verzameld. |
ip_address | string | Het IP-adres van de bezoeker. |
user_agent | string | De onbewerkte User-Agent-string van de browser van de bezoeker. |
client_referrer | string | Altijd "unknown". |
status | string | completed of failed. |
error_message | string | Aanwezig wanneer status failed is. |
domain_id, team_id, session_id, request_id | string | Evaluatiemetadata gekopieerd uit het interne record. |
created_at | string | Evaluatietijd als RFC 3339-string (anders dan /token/v2/verify, dat milliseconden gebruikt). |
De response bevat ook de objecten network_client_metrics, vpn_evaluation, proxy_details, tampering_details, tampering_anomaly_score, velocity en sdk. De tellingen in velocity zijn alleen afgeleid van het huidige evenement (het venster events.24_hours is de enige historische waarde); sdk rapporteert platform: "js" met version: "unknown". Ze staan in het volledige voorbeeld, maar maken geen deel uit van het stabiele contract.
browser_details
Details over de browser en het besturingssysteem van de bezoeker.
| Veld | Type | Beschrijving |
|---|---|---|
browser_name | string | Browsernaam (bijv. "Chrome"). |
browser_major_version | string | Hoofdversienummer. |
browser_full_version | string | Volledige versiereeks. |
os | string | Naam van het besturingssysteem. |
os_version | string | Versie van het besturingssysteem. |
device | string | Apparaattype (bijv. "Other", "Mobile"). |
identification
Het primaire identificatieresultaat van de bezoeker.
| Veld | Type | Beschrijving |
|---|---|---|
visitor_id | string | De stabiele device-ID voor deze bezoeker. Dit is het enige berekende veld in het object. |
confidence.score | number | Altijd 0.0. |
confidence.version | string | Altijd "unknown". |
visitor_found | boolean | Altijd false. |
first_seen_at | number | Altijd gelijk aan timestamp. |
last_seen_at | number | Altijd gelijk aan timestamp. |
supplementary_id_high_recall
Een secundaire identifier afgeleid van uw externalIds (met voorkeur voor userId, daarna accountId), zodat één account over meerdere apparaten kan worden gekoppeld. Valt terug op de device-ID wanneer er geen externe ID is gekoppeld.
| Veld | Type | Beschrijving |
|---|---|---|
visitor_id | string | Hash van de gekozen externe ID, of de device-ID wanneer er geen is gekoppeld. |
visitor_found | boolean | true wanneer een externe ID is gekoppeld, anders false. |
confidence.score | number | Altijd 0.0. |
confidence.version | string | Altijd "unknown". |
first_seen_at | number | Altijd gelijk aan timestamp. |
last_seen_at | number | Altijd gelijk aan timestamp. |
proximity
Wordt niet gevuld. Altijd { "id": "unknown", "precision_radius": 0, "confidence": 0.0 }. Gebruik geo_data en ip_enrichment op /token/v2/verify voor locatie.
ip_info
IP-adresinformatie van de bezoeker.
| Veld | Type | Beschrijving |
|---|---|---|
v4.address | string | IPv4-adres. |
v6.address | string | IPv6-adres. |
ip_blocklist
Of het IP-adres van de bezoeker op bekende blokkeerlijsten staat.
| Veld | Type | Beschrijving |
|---|---|---|
email_spam | boolean | Wordt niet gevuld; altijd false. |
attack_source | boolean | Wordt niet gevuld; altijd false. |
tor_node | boolean | IP is een Tor-exitnode. |
Fraude- en omgevingssignalen
Signalen die verdachte of opvallende bezoekerskenmerken aangeven.
root_apps, emulator, jailbroken, frida, mitm_attack, replayed, high_activity_device, cloned_app, privacy_settings en location_spoofing zitten in het antwoord maar worden nooit gezet. Ze geven altijd false terug (factory_reset_timestamp is altijd 0).
Bouw hier geen detectie- of fraudelogica op. Elk is gemarkeerd in de tabel hieronder.
| Veld | Type | Beschrijving |
|---|---|---|
bot | string | Een platte string die alleen van de User-Agent is afgeleid: "detected" wanneer die bot, crawler, spider of headless bevat; "unknown" wanneer er geen User-Agent is vastgelegd; anders "not_detected". Dit is niet het botmodel. Gebruik bot.is_bot op /token/v2/verify voor het echte oordeel. Zie AI-agentdetectie. |
root_apps | boolean | Apparaat heeft root-/supergebruikersapps geïnstalleerd. Wordt momenteel niet gevuld; altijd false. |
emulator | boolean | Apparaat is een emulator. Wordt momenteel niet gevuld; altijd false. |
proxy | boolean | Bezoeker gebruikt een proxy, relay of datacenter-IP. |
proxy_confidence | string | "low", "medium" of "high" wanneer proxy true is; anders "unknown". |
vpn | boolean | Bezoeker gebruikt een VPN. |
vpn_confidence | string | "low", "medium" of "high" wanneer het VPN-model is uitgevoerd; anders "unknown". |
vpn_origin_timezone | string | IANA-tijdzone die door de browser is gerapporteerd. |
vpn_origin_country | string | Land dat via IP-verrijking is afgeleid, of "unknown" als het niet kan worden bepaald. |
vpn_methods | object | Signalen per detectiemethode voor VPN- en geanonimiseerd verkeer. Zie de subsectie hieronder. |
incognito | boolean | Browser is in incognito-/privémodus. |
tampering | boolean | Browserkenmerken zijn gemanipuleerd. |
jailbroken | boolean | Apparaat is gejailbreakt. Wordt momenteel niet gevuld; altijd false. |
frida | boolean | Frida-instrumentatietoolkit gedetecteerd. Wordt momenteel niet gevuld; altijd false. |
virtual_machine | boolean | Bezoeker draait in een virtuele machine. |
developer_tools | boolean | Browser-ontwikkelaarstools zijn geopend. |
mitm_attack | boolean | Man-in-the-middle-aanval gedetecteerd. Wordt momenteel niet gevuld; altijd false. |
replayed | boolean | Het verzoek is een herhaling van een eerder verzoek. Wordt momenteel niet gevuld; altijd false. |
high_activity_device | boolean | Ongebruikelijk hoog aantal identificaties van dit apparaat. Wordt momenteel niet gevuld; altijd false. |
Het wegwerp-e-mailsignaal maakt geen deel uit van deze response. Lees in plaats daarvan fingerprint_enrichment.throwaway_email_detected uit /token/v2/verify.
vpn_methods
vpn_methods bevat signalen per detectiemethode die verband houden met VPN- en geanonimiseerd verkeer. Gebruik het veld vpn op hoofdniveau als eindoordeel. Een methode kan true zijn terwijl vpn false is, bijvoorbeeld bij proxy- of relayverkeer dat niet als VPN is geclassificeerd.
| Veld | Type | Beschrijving |
|---|---|---|
timezone_mismatch | boolean | De door de browser gerapporteerde tijdzone komt niet overeen met de geografische IP-locatie. |
public_vpn | boolean | Het IP-adres wijst op een bekende openbare VPN-provider of een datacenter. |
auxiliary_mobile | boolean | Gereserveerd voor mobiele detectie en momenteel false voor browsergebeurtenissen. |
os_mismatch | boolean | Het door de browser gerapporteerde besturingssysteem komt niet overeen met de netwerksignatuur. |
relay | boolean | Er is anonimiserend relayverkeer, proxyverkeer of vergelijkbaar verkeer gedetecteerd. |
Sommige datapipelines voegen voorvoegsels toe en vlakken geneste velden af. In die datasets kan vpn_methods.relay verschijnen als cside_fingerprint_vpn_methods_relay.
raw_device_attributes
Laag-niveau browserfingerprint-componenten.
| Veld | Type | Beschrijving |
|---|---|---|
math | string | Wordt niet gevuld; altijd "unknown". |
vendor | string | GPU-/grafische leveranciersreeks. |
Volledig responsvoorbeeld
Een voltooide /token/v1/client-response. Geneste objecten die geen deel uitmaken van het stabiele contract (network_client_metrics, vpn_evaluation, velocity) zijn verkort.
{
"linked_id": "b3f1c9e2-4d7a-4b0e-9f1a-2c8d7e6f5a41",
"tags": {
"domain_id": "7371466449724252160",
"team_id": "7196353823991660544",
"request_id": "01J9ZK3Q8W",
"session_id": "b3f1c9e2-4d7a-4b0e-9f1a-2c8d7e6f5a41",
"fingerprint_match": "7371466449724252160",
"external_id:userId": "1234567890",
"incognito_support": "supported",
"developer_tools_support": "supported",
"virtual_machine_support": "heuristic",
"tor_support": "ipinfo_privacy",
"visit_summary_source": "recent_fingerprint.available"
},
"timestamp": 1708102555327,
"event_id": "289076244130249728",
"url": "http://www.example.com/login",
"ip_address": "61.127.217.15",
"user_agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) ...",
"client_referrer": "unknown",
"browser_details": {
"browser_name": "Chrome",
"browser_major_version": "74",
"browser_full_version": "74.0.3729",
"os": "Windows",
"os_version": "7",
"device": "Other"
},
"identification": {
"visitor_id": "Ibk1527CUFmcnjLwIs4A9",
"confidence": { "score": 0.0, "version": "unknown" },
"visitor_found": false,
"first_seen_at": 1708102555327,
"last_seen_at": 1708102555327
},
"supplementary_id_high_recall": {
"visitor_id": "3HNey93AkBW6CRbxV6xP",
"visitor_found": true,
"confidence": { "score": 0.0, "version": "unknown" },
"first_seen_at": 1708102555327,
"last_seen_at": 1708102555327
},
"proximity": {
"id": "unknown",
"precision_radius": 0,
"confidence": 0.0
},
"bot": "not_detected",
"root_apps": false,
"emulator": false,
"ip_info": {
"v4": { "address": "94.142.239.124" },
"v6": { "address": "2001:db8:3333:4444:5555:6666:7777:8888" }
},
"ip_blocklist": {
"email_spam": false,
"attack_source": false,
"tor_node": false
},
"proxy": true,
"proxy_confidence": "low",
"proxy_details": {
"proxy_type": "datacenter",
"last_seen_at": 1708102555327,
"provider": "Example Hosting"
},
"vpn": false,
"vpn_confidence": "high",
"vpn_origin_timezone": "Europe/Amsterdam",
"vpn_origin_country": "NL",
"vpn_methods": {
"timezone_mismatch": false,
"public_vpn": true,
"auxiliary_mobile": false,
"os_mismatch": false,
"relay": true
},
"vpn_evaluation": { "is_vpn": false, "vpn_probability": 0.04, "vpn_confidence": 0.91 },
"incognito": false,
"tampering": false,
"tampering_anomaly_score": 0.0,
"tampering_anti_detect_browser": false,
"tampering_details": { "anomaly_score": 0.0, "anti_detect_browser": false },
"cloned_app": false,
"factory_reset_timestamp": 0,
"jailbroken": false,
"frida": false,
"privacy_settings": false,
"virtual_machine": false,
"location_spoofing": false,
"velocity": {
"distinct_ip": { "5_minutes": 1, "1_hour": 1, "24_hours": 1 },
"distinct_country": { "5_minutes": 0, "1_hour": 0, "24_hours": 0 },
"events": { "5_minutes": 1, "1_hour": 1, "24_hours": 3 },
"ip_events": { "5_minutes": 1, "1_hour": 1, "24_hours": 1 },
"distinct_ip_by_linked_id": { "5_minutes": 1, "1_hour": 1, "24_hours": 1 },
"distinct_visitor_id_by_linked_id": { "5_minutes": 1, "1_hour": 1, "24_hours": 1 }
},
"developer_tools": false,
"mitm_attack": false,
"sdk": { "platform": "js", "version": "unknown", "integrations": [] },
"replayed": false,
"high_activity_device": false,
"raw_device_attributes": {
"math": "unknown",
"vendor": "Google Inc."
},
"network_client_metrics": { "client_ip": "61.127.217.15", "tls_ja4": "t13d1516h2_8daaf6152771_b186095e22b6" },
"status": "completed",
"domain_id": "7371466449724252160",
"team_id": "7196353823991660544",
"session_id": "b3f1c9e2-4d7a-4b0e-9f1a-2c8d7e6f5a41",
"request_id": "01J9ZK3Q8W",
"created_at": "2024-02-16T17:35:55.327Z"
} Thanks for your feedback!