Events API
Integre o cside Device Intelligence na sua aplicação. Colete sinais do navegador, gere tokens de sessão e recupere inteligência detalhada de visitantes a partir do seu backend.
Este guia orienta você na integração completa da Events API de cside Device Intelligence: carregando o script do cliente, gerando um token de sessão, enviando-o para o seu backend e interpretando o payload de resposta.
Fluxo de integração
Adicione o script à sua página
Se a sua app é construída com um bundler, instale o pacote npm e chame initDeviceIntelligence({ teamID }) o mais cedo que a sua app permitir. Caso contrário, inclua o bootstrap de navegador fail-open no topo do <head>, antes dos outros scripts, e substitua o valor de script.src pela URL do seu time no painel do cside. O bootstrap carrega client.js de forma assíncrona, enfileira chamadas antecipadas e as rejeita quando o cside falha ou expira, mantendo a página funcionando.
Envie a telemetria e receba um token de sessão
Depois que o script for carregado, a função global sendClientTelemetry ficará disponível (o pacote npm retorna a mesma função a partir de initDeviceIntelligence). Carregar o script não cria um fingerprint de sessão sozinho. Chame sendClientTelemetry(externalIds?) para enviar telemetria para https://edge.csidefd.com/client e receber um token de sessão. Passe um objeto externalIds opcional se quiser anexar os seus próprios identificadores.
const result = await sendClientTelemetry({
email: "user@example.com",
userId: "1234567890",
});
// Ou chame sem argumentos
// const result = await sendClientTelemetry();
if (result.errors) {
console.error(result.errors);
throw new Error("A solicitação de telemetria falhou.");
}
const token = result.token;Parâmetros
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
externalIds | Record<string, string> | Não | Identificadores opcionais que você quer anexar ao fingerprint, como userId, orderId, paymentCardId ou email. |
Para receber o sinal de e-mail descartável (fingerprint_enrichment.throwaway_email_detected em /token/v2/verify), passe o endereço de e-mail neste objeto usando a chave email. As regras de conta e o Identity graph usam userId como chave (o Identity graph também aceita teamId ou customerId), e a regra de teste de cartões usa paymentCardId; consulte Recuperar datapoints para o formato.
Valor de retorno
A função retorna um objeto JSON (já analisado, então você não precisa chamar .json() nele):
{
"token": "eyJhbGciOiJIUzI1NiIs..."
}O campo token contém o token de sessão de fingerprint. Se a coleta de telemetria encontrar problemas, o objeto também inclui um array opcional errors que você pode registrar; com o pacote npm, sendClientTelemetry nunca é rejeitado e, em vez disso, é resolvido com { token: null, errors }. Extraia result.token e envie apenas essa string do token de sessão para o seu backend.
Recupere dados de fingerprint a partir do seu backend
Gere uma chave de API de Device Intelligence apenas para backend no dashboard do cside, armazene-a como segredo do servidor e use-a para trocar o token de sessão com o cside. A chave de API é exibida apenas uma vez e não deve ser exposta em código de navegador.
if (!token) {
throw new Error("O token de sessão de fingerprint não foi retornado.");
}
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();Corpo da requisição
Envie JSON no formato { "token": "<token de sessão>" }, em que o valor é result.token da etapa anterior. Apenas os endpoints /token/v2/* aceitam JSON; os endpoints /token/v1/* aceitam o token de sessão bruto como corpo text/plain.
Opções de lookup do token
Use o endpoint autenticado para trocas server-to-server em produção. Os endpoints públicos continuam disponíveis quando uma integração precisa especificamente do fluxo de lookup não autenticado.
| Endpoint | Autenticação | Corpo da requisição | Use quando |
|---|---|---|---|
/token/v2/verify | Chave de API | JSON { "token" } | Você precisar de recuperação backend autenticada com uma chave de API de Device Intelligence. |
/token/v2/device/entries | Chave de API | JSON { "token", "limit", "offset" } | Você precisar de avaliações concluídas para o mesmo ID de dispositivo de um token de sessão. |
/token/v1/client | Nenhuma | Token bruto, text/plain | Você precisar do payload público de resposta de fingerprinting. |
/token/v1/clientId | Nenhuma | Token bruto, text/plain | Você precisar apenas do fingerprint ID estável do fluxo público de lookup. |
Todos os endpoints retornam 202 Accepted com { "status": "pending" } enquanto a avaliação ainda está em processamento, e depois 200 OK quando ela termina. /token/v2/device/entries aceita { "token": "...", "limit": 100, "offset": 0 } e retorna { "device_id": "...", "entries": [...], "next_offset": 100, "has_more": true }, em que cada entrada usa o formato de resposta de /token/v2/verify. limit é opcional, o padrão é 500 e o limite máximo é 500. /token/v1/clientId retorna JSON { "status": "completed", "device_id": "..." }. Se não existir fingerprint ID para o token de sessão, ele retorna 404.
Erros e limites de requisições
As respostas de erro trazem um corpo JSON { "error": "<mensagem>", "code": <status HTTP> }:
| Status | Significado |
|---|---|
400 | Corpo malformado ou um token de sessão que não pode ser decodificado. |
401 | Chave de API ausente ou inválida, token expirado ou token emitido para um time diferente do da chave de API. |
404 | Não existe avaliação para o token (token not found) ou, em /token/v1/clientId, não existe fingerprint ID (fingerprint id not found). |
429 | Limite de requisições excedido. A resposta traz um header retry-after: 60. O limite padrão é de 1.000 requisições por minuto por time. |
Uma avaliação concluída que falhou não é um erro HTTP: ela retorna 200 OK com "status": "failed" e um campo error_message. Verifique status antes de ler os campos de enriquecimento.
Exemplo de requisição no backend
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();Interprete a resposta do backend
Seu backend retorna uma resposta JSON contendo o resultado da identificação e sinais associados. Consulte a referência completa de resposta abaixo.
Resposta de /token/v2/verify
O endpoint autenticado retorna um payload JSON plano. Cada entrada de /token/v2/device/entries usa o mesmo formato.
| Campo | Tipo | Descrição |
|---|---|---|
status | string | pending, completed ou failed. Os campos de enriquecimento só estão presentes quando completed. |
error_message | string | Por que a avaliação falhou. Presente apenas quando status é failed. |
created_at | number | Timestamp Unix (milissegundos) de quando a avaliação foi criada. |
updated_at | number | Timestamp Unix (milissegundos) da última atualização. |
fingerprint | object | O fingerprint completo do dispositivo: sinais de navegador, hardware, renderização, ambiente e automação, mais os external_ids que você anexou. Mesmos campos do objeto fingerprint da exportação S3. |
network_client_metrics | object | Características TCP e TLS da conexão. |
geo_data | object | Geolocalização em nível de cidade do IP do visitante. |
ip_enrichment | object | Dados de ASN, geo e privacidade (hosting, proxy, relay, tor, vpn, sinais de datacenter) do IP do visitante. |
vpn_evaluation | object | is_vpn, vpn_probability, vpn_confidence, reasons, features e context. |
bot | object | O veredito de bot: is_bot, bot_probability, bot_confidence, bot_agent_id, reasons, pontuações e limiares por modelo e session_event_count. Consulte Detecção de agentes de IA. |
fingerprint_enrichment | object | Sinais derivados do fingerprint. throwaway_email_detected é true quando o ID externo email usa um domínio descartável. |
rule_evaluations | object | Resultados legados de regras (rules, policy_version). Vazio em avaliações criadas depois de 2026-08-27; mantido na resposta para que registros mais antigos ainda possam ser decodificados. |
rule_evaluations_v2 | object | Resultados do motor de regras: um array values em que cada item envolve uma evaluation com rule_slug, rule_version, outcome, evaluated_as (live ou shadow), transition e evaluated_at. |
Os objetos aninhados correspondem à estrutura do registro da exportação S3, onde cada campo é documentado em detalhe.
rule_evaluations_v2
A tabela acima resume esse campo. Ele carrega o resultado de cada regra que rodou para o domínio, aninhado três níveis abaixo em rule_evaluations_v2.values[].evaluation, e os valores são inteiros em vez de strings, então vale a pena detalhá-los. Ele não faz parte do payload de /token/v1/client documentado abaixo.
| Campo | Tipo | Descrição |
|---|---|---|
rule_slug | string | O identificador da regra, por exemplo "account_shared_detected". |
outcome | number | O resultado da avaliação. Veja a tabela abaixo. |
evaluated_as | number | O estado de ciclo de vida da regra no momento da avaliação. Veja a tabela abaixo. |
transition | number | Se o resultado mudou nesta avaliação, independentemente de qual seja o resultado. 2 significa inalterado desde a última avaliação, 3 significa que mudou nesta. Combinado com outcome: 1, um 3 significa que a regra acabou de passar a corresponder; combinado com outcome: 2, significa que a regra acabou de parar de corresponder. 1 nunca é produzido. |
key.key_hash | string | Um hash do valor em que a regra se baseou. É uma string JSON, não um número, então sobrevive a JSON.parse sem perda de precisão. Não carrega o id da conta em si. |
event_time, evaluated_at | object | { seconds, nanos }, diferente de created_at e updated_at no nível superior da resposta, que são timestamps em milissegundos. |
outcome e evaluated_as são inteiros brutos, não strings:
outcome | Significado | Quando você vai observar |
|---|---|---|
0 | Não especificado | Não é produzido |
1 | Verdadeiro | Continuamente, em toda avaliação enquanto a condição se mantém |
2 | Falso | Continuamente, em toda avaliação enquanto ela não se mantém. Este é o estado estável para uma regra saudável que não corresponde, não uma transição rara |
3 | Ausente (estrutural) | Continuamente, em toda avaliação em que a regra não consegue ler o campo de que precisa, como uma chave de id externo errada. Persistente, não uma ocorrência pontual |
4 | Pendente (transitório) | Quando uma medição exigida existe mas ainda não esquentou. Diferente de um status de nível superior igual a pending: pedir o mesmo token novamente não resolve isso, mas uma avaliação posterior da mesma entidade pode retornar 1 ou 2 |
evaluated_as | Significado |
|---|---|
1 | Rascunho |
2 | Shadow (um experimento; pode aparecer a qualquer momento) |
3 | Ativo |
4 | Arquivado |
Toda regra avaliada e publicada relata uma entrada em cada evento, em qualquer resultado. rule_evaluations_v2 é um registro do que foi avaliado, não um fluxo de notificações, então outcome: 2 (falso) e outcome: 3 (ausente) não são suprimidos: eles viajam no array de forma tão confiável quanto outcome: 1. transition é o que diz se aquele resultado mudou desde a avaliação anterior.
Uma entrada ausente para um determinado rule_slug significa que a regra não foi avaliada de forma alguma: ela não está ativada para o domínio, é uma regra apenas de medição que não publica, ou a avaliação não rodou para aquele evento. Não significa “avaliada como falsa” - esse caso é outcome: 2, presente no array como qualquer outro. Veja Detectar compartilhamento de conta para um exemplo completo que lê esse campo do início ao fim.
Referência de resposta de /token/v1/client
Esta referência se aplica ao endpoint público /token/v1/client. É uma visão mais antiga e mais plana da mesma avaliação. Muitos dos seus campos são placeholders fixos mantidos por compatibilidade retroativa; o aviso abaixo lista esses campos. Para integrações novas, prefira /token/v2/verify.
Estes campos estão presentes em toda resposta, mas nunca são calculados:
identification.confidenceesupplementary_id_high_recall.confidencesão sempre{ "score": 0.0, "version": "unknown" }identification.visitor_foundé semprefalse;first_seen_atelast_seen_atsão iguais aotimestampdo eventoproximityé sempre{ "id": "unknown", "precision_radius": 0, "confidence": 0.0 }client_referreré sempre"unknown"ip_blocklist.email_spameip_blocklist.attack_sourcesão semprefalse(apenastor_nodeé preenchido)raw_device_attributes.mathé sempre"unknown"
Não construa lógica de detecção ou de fraude sobre eles.
Explicações das regras
Regras publicadas com resultado verdadeiro podem incluir rule_evaluations_v2.values[].evaluation.explanation.nodes. Cada nó visitado pode descrever seu node_id, outcome, valor tipado observed, subject e compared_to. As explicações são opcionais; resultados falsos, pendentes ou ausentes não as incluem. A ausência de explicação não altera o resultado registrado.
Trate subject e compared_to como texto para exibição, não como um formato a interpretar. Use node_id, valores tipados de observed e outcome no código. Leia esses campos de rule_evaluations_v2, não do objeto legado rule_evaluations. Consulte a API de eventos para os valores dos resultados e a diferença em relação ao formato legado.
Campos de nível superior
| Campo | Tipo | Descrição |
|---|---|---|
linked_id | string | O ID da sessão do navegador ou o ID do evento quando nenhum ID de sessão foi capturado. Não é um identificador fornecido por você; os seus externalIds aparecem em tags como external_id:<chave>. |
tags | object | Um mapa de diagnóstico do cside, não metadados do cliente: domain_id, team_id, request_id, session_id, fingerprint_match, network_match, flags de suporte à detecção como incognito_support e os seus externalIds como entradas external_id:<chave>. |
timestamp | number | Timestamp Unix (milissegundos) do evento. |
event_id | string | Identificador único para este evento de fingerprinting. |
url | string | A URL da página onde o fingerprint foi coletado. |
ip_address | string | O endereço IP do visitante. |
user_agent | string | A string User-Agent bruta do navegador do visitante. |
client_referrer | string | Sempre "unknown". |
status | string | completed ou failed. |
error_message | string | Presente quando status é failed. |
domain_id, team_id, session_id, request_id | string | Metadados da avaliação copiados do registro interno. |
created_at | string | Hora da avaliação como string RFC 3339 (diferente de /token/v2/verify, que usa milissegundos). |
A resposta também traz os objetos network_client_metrics, vpn_evaluation, proxy_details, tampering_details, tampering_anomaly_score, velocity e sdk. As contagens de velocity são derivadas apenas do evento atual (a janela events.24_hours é o único valor histórico); sdk informa platform: "js" com version: "unknown". Eles aparecem no exemplo completo, mas não fazem parte do contrato estável.
browser_details
Detalhes sobre o navegador e sistema operacional do visitante.
| Campo | Tipo | Descrição |
|---|---|---|
browser_name | string | Nome do navegador (ex.: "Chrome"). |
browser_major_version | string | Número da versão principal. |
browser_full_version | string | String da versão completa. |
os | string | Nome do sistema operacional. |
os_version | string | Versão do sistema operacional. |
device | string | Tipo de dispositivo (ex.: "Other", "Mobile"). |
identification
O resultado principal de identificação do visitante.
| Campo | Tipo | Descrição |
|---|---|---|
visitor_id | string | O ID estável do dispositivo deste visitante. É o único campo calculado do objeto. |
confidence.score | number | Sempre 0.0. |
confidence.version | string | Sempre "unknown". |
visitor_found | boolean | Sempre false. |
first_seen_at | number | Sempre igual a timestamp. |
last_seen_at | number | Sempre igual a timestamp. |
supplementary_id_high_recall
Um identificador secundário derivado dos seus externalIds (preferindo userId, depois accountId) para que uma conta possa ser vinculada entre dispositivos. Recorre ao ID do dispositivo quando nenhum ID externo foi anexado.
| Campo | Tipo | Descrição |
|---|---|---|
visitor_id | string | Hash do ID externo escolhido ou o ID do dispositivo quando nenhum foi anexado. |
visitor_found | boolean | true quando um ID externo foi anexado, caso contrário false. |
confidence.score | number | Sempre 0.0. |
confidence.version | string | Sempre "unknown". |
first_seen_at | number | Sempre igual a timestamp. |
last_seen_at | number | Sempre igual a timestamp. |
proximity
Não preenchido. Sempre { "id": "unknown", "precision_radius": 0, "confidence": 0.0 }. Use geo_data e ip_enrichment em /token/v2/verify para localização.
ip_info
Informações do endereço IP do visitante.
| Campo | Tipo | Descrição |
|---|---|---|
v4.address | string | Endereço IPv4. |
v6.address | string | Endereço IPv6. |
ip_blocklist
Se o IP do visitante aparece em listas de bloqueio conhecidas.
| Campo | Tipo | Descrição |
|---|---|---|
email_spam | boolean | Não preenchido; sempre false. |
attack_source | boolean | Não preenchido; sempre false. |
tor_node | boolean | IP é um nó de saída Tor. |
Sinais de fraude e ambiente
Sinais indicando atributos suspeitos ou notáveis do visitante.
root_apps, emulator, jailbroken, frida, mitm_attack, replayed, high_activity_device, cloned_app, privacy_settings e location_spoofing estão presentes na resposta mas nunca são definidos. Retornam sempre false (factory_reset_timestamp é sempre 0).
Não construa lógica de detecção ou de fraude sobre eles. Cada um está marcado na tabela abaixo.
| Campo | Tipo | Descrição |
|---|---|---|
bot | string | Uma string simples derivada apenas do User-Agent: "detected" quando ele contém bot, crawler, spider ou headless; "unknown" quando nenhum User-Agent foi capturado; caso contrário "not_detected". Não é o modelo de bot. Use bot.is_bot em /token/v2/verify para o veredito real. Consulte Detecção de agentes de IA. |
root_apps | boolean | Dispositivo tem aplicativos root/superusuário instalados. Não preenchido atualmente; sempre false. |
emulator | boolean | Dispositivo é um emulador. Não preenchido atualmente; sempre false. |
proxy | boolean | Visitante está usando um proxy, relay ou IP de datacenter. |
proxy_confidence | string | "low", "medium" ou "high" quando proxy é true; "unknown" caso contrário. |
vpn | boolean | Visitante está usando uma VPN. |
vpn_confidence | string | "low", "medium" ou "high" quando o modelo de VPN foi executado; "unknown" caso contrário. |
vpn_origin_timezone | string | Fuso horário IANA informado pelo navegador. |
vpn_origin_country | string | País inferido a partir do enriquecimento de IP ou "unknown". |
vpn_methods | object | Sinais no nível de método relacionados ao uso de VPN e ao tráfego anonimizado. Consulte a subseção abaixo. |
incognito | boolean | Navegador está no modo anônimo/privado. |
tampering | boolean | Atributos do navegador foram adulterados. |
jailbroken | boolean | Dispositivo está com jailbreak. Não preenchido atualmente; sempre false. |
frida | boolean | Kit de instrumentação Frida detectado. Não preenchido atualmente; sempre false. |
virtual_machine | boolean | Visitante está executando em uma máquina virtual. |
developer_tools | boolean | Ferramentas de desenvolvedor do navegador estão abertas. |
mitm_attack | boolean | Ataque man-in-the-middle detectado. Não preenchido atualmente; sempre false. |
replayed | boolean | A requisição é uma repetição de uma requisição anterior. Não preenchido atualmente; sempre false. |
high_activity_device | boolean | Número incomumente alto de identificações deste dispositivo. Não preenchido atualmente; sempre false. |
O sinal de e-mail descartável não faz parte desta resposta. Leia fingerprint_enrichment.throwaway_email_detected em /token/v2/verify em vez disso.
vpn_methods
vpn_methods contém sinais no nível de método relacionados ao uso de VPN e ao tráfego anonimizado. Use o campo de nível superior vpn como veredito geral. O valor de um método pode ser true quando vpn é false, por exemplo, quando o cside detecta tráfego de proxy ou relay que o modelo de VPN não classifica como VPN.
| Campo | Tipo | Descrição |
|---|---|---|
timezone_mismatch | boolean | O fuso horário do navegador não corresponde à geolocalização do IP. |
public_vpn | boolean | O IP corresponde a um sinal conhecido de VPN pública ou de data center. |
auxiliary_mobile | boolean | Reservado para detecção específica de dispositivos móveis. Atualmente é false para eventos do navegador. |
os_mismatch | boolean | O sistema operacional informado pelo navegador não corresponde à assinatura de rede. |
relay | boolean | O cside detectou um relay que anonimiza o tráfego, um proxy ou tráfego semelhante ao de um relay. |
Alguns pipelines de dados adicionam prefixos e achatam os campos aninhados. Nesses conjuntos de dados, vpn_methods.relay pode aparecer como cside_fingerprint_vpn_methods_relay.
raw_device_attributes
Componentes de fingerprint de baixo nível do navegador.
| Campo | Tipo | Descrição |
|---|---|---|
math | string | Não preenchido; sempre "unknown". |
vendor | string | String do fornecedor de GPU/gráficos. |
Exemplo completo de resposta
Uma resposta concluída de /token/v1/client. Os objetos aninhados que não fazem parte do contrato estável (network_client_metrics, vpn_evaluation, velocity) estão abreviados.
{
"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!