Events API
Integre cside Device Intelligence en su aplicación. Recopile señales del navegador, genere tokens de sesión y obtenga inteligencia detallada sobre los visitantes desde su backend.
Esta guía le explica cómo integrar la Events API de cside Device Intelligence de principio a fin: cargar el script del cliente, generar un token de sesión, enviarlo a su backend e interpretar la respuesta.
Flujo de integración
Agregue el script a su página
Si su app usa un bundler, instale el paquete npm y llame a initDeviceIntelligence({ teamID }) tan pronto como su app lo permita. De lo contrario, incluya el bootstrap del navegador tolerante a fallos en la parte superior del <head>, antes de otros scripts, y reemplace su valor script.src por la URL de su equipo del panel de cside. El bootstrap carga client.js de forma asíncrona, pone en cola las llamadas tempranas y las rechaza si cside falla o agota el tiempo, para que la página siga funcionando.
Envíe la telemetría y reciba un token de sesión
Una vez que el script se haya cargado, la función global sendClientTelemetry estará disponible (el paquete npm devuelve la misma función desde initDeviceIntelligence). Cargar el script no crea un fingerprint de sesión por sí solo. Llame a sendClientTelemetry(externalIds?) para enviar telemetría a https://edge.csidefd.com/client y recibir un token de sesión. Pase un objeto externalIds opcional si quiere adjuntar sus propios identificadores.
const result = await sendClientTelemetry({
email: "user@example.com",
userId: "1234567890",
});
// O llamarla sin argumentos
// const result = await sendClientTelemetry();
if (result.errors) {
console.error(result.errors);
throw new Error("La solicitud de telemetría falló.");
}
const token = result.token;Parámetros
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
externalIds | Record<string, string> | No | Identificadores opcionales que quiere adjuntar al fingerprint, como userId, orderId, paymentCardId o email. |
Para recibir la señal de correo electrónico desechable (fingerprint_enrichment.throwaway_email_detected en /token/v2/verify), pase la dirección de correo electrónico en este objeto usando la clave email. Las reglas de cuenta y el Identity graph se basan en userId (el Identity graph también acepta teamId o customerId), y la regla de prueba de tarjetas se basa en paymentCardId; consulte Recuperar datapoints para ver el formato.
Valor de retorno
La función devuelve un objeto JSON (ya analizado, por lo que no necesita llamar a .json() sobre él):
{
"token": "eyJhbGciOiJIUzI1NiIs..."
}El campo token contiene el token de sesión de fingerprint. Si la recopilación de telemetría encuentra problemas, el objeto también incluye un array opcional errors que puede registrar; con el paquete npm, sendClientTelemetry nunca se rechaza y se resuelve con { token: null, errors } en su lugar. Extraiga result.token y envíe solo esa cadena del token de sesión a su backend.
Recupere datos de fingerprint desde su backend
Genere una clave API de Device Intelligence solo para backend en el dashboard de cside, guárdela como secreto del servidor y úsela para intercambiar el token de sesión con cside. La clave API se muestra solo una vez y no debe exponerse en código de navegador.
if (!token) {
throw new Error("No se devolvió un token de sesión de fingerprint.");
}
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();Cuerpo de la solicitud
Envíe JSON con la forma { "token": "<token de sesión>" }, donde el valor es result.token del paso anterior. Solo los endpoints /token/v2/* aceptan JSON; los endpoints /token/v1/* aceptan el token de sesión sin procesar como body text/plain.
Opciones de lookup del token
Use el endpoint autenticado para intercambios server-to-server de producción. Los endpoints públicos siguen disponibles cuando una integración necesita específicamente el flujo de lookup no autenticado.
| Endpoint | Autenticación | Body de la solicitud | Úselo cuando |
|---|---|---|---|
/token/v2/verify | Clave API | JSON { "token" } | Necesite recuperación backend autenticada con una clave API de Device Intelligence. |
/token/v2/device/entries | Clave API | JSON { "token", "limit", "offset" } | Necesite evaluaciones completadas para el mismo ID de dispositivo que un token de sesión. |
/token/v1/client | Ninguna | Token sin procesar, text/plain | Necesite el payload público de respuesta de fingerprinting. |
/token/v1/clientId | Ninguna | Token sin procesar, text/plain | Solo necesite el fingerprint ID estable del flujo público de lookup. |
Todos los endpoints devuelven 202 Accepted con { "status": "pending" } mientras la evaluación sigue en proceso, y luego 200 OK cuando ha terminado. /token/v2/device/entries acepta { "token": "...", "limit": 100, "offset": 0 } y devuelve { "device_id": "...", "entries": [...], "next_offset": 100, "has_more": true }, donde cada entrada usa la forma de respuesta de /token/v2/verify. limit es opcional, su valor predeterminado es 500 y el máximo permitido es 500. /token/v1/clientId devuelve JSON { "status": "completed", "device_id": "..." }. Si no existe un fingerprint ID para el token de sesión, devuelve 404.
Errores y límites de solicitudes
Las respuestas de error llevan un body JSON { "error": "<message>", "code": <HTTP status> }:
| Estado | Significado |
|---|---|
400 | Body mal formado o un token de sesión que no se puede decodificar. |
401 | Clave API ausente o inválida, un token expirado o un token emitido para un equipo distinto al de la clave API. |
404 | No existe ninguna evaluación para el token (token not found) o, en /token/v1/clientId, ningún fingerprint ID (fingerprint id not found). |
429 | Límite de solicitudes superado. La respuesta lleva un header retry-after: 60. El límite predeterminado es de 1.000 solicitudes por minuto por equipo. |
Una evaluación completada que falló no es un error HTTP: devuelve 200 OK con "status": "failed" y un campo error_message. Compruebe status antes de leer los campos de enriquecimiento.
Ejemplo de solicitud 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 la respuesta del backend
Su backend devuelve una respuesta JSON que contiene el resultado de identificación y las señales asociadas. Consulte la referencia completa de la respuesta a continuación.
Respuesta de /token/v2/verify
El endpoint autenticado devuelve un payload JSON plano. Cada entrada de /token/v2/device/entries usa la misma forma.
| Campo | Tipo | Descripción |
|---|---|---|
status | string | pending, completed o failed. Los campos de enriquecimiento solo están presentes cuando es completed. |
error_message | string | Por qué falló la evaluación. Solo está presente cuando status es failed. |
created_at | number | Marca de tiempo Unix (milisegundos) de creación de la evaluación. |
updated_at | number | Marca de tiempo Unix (milisegundos) de la última actualización. |
fingerprint | object | El fingerprint completo del dispositivo: señales de navegador, hardware, renderizado, entorno y automatización, más los external_ids que adjuntó. Mismos campos que el objeto fingerprint de la exportación S3. |
network_client_metrics | object | Características TCP y TLS de la conexión. |
geo_data | object | Geolocalización a nivel de ciudad de la IP del visitante. |
ip_enrichment | object | Datos de ASN, geolocalización y privacidad (hosting, proxy, relay, tor, vpn, señales de centro de datos) de la IP del visitante. |
vpn_evaluation | object | is_vpn, vpn_probability, vpn_confidence, reasons, features y context. |
bot | object | El veredicto de bot: is_bot, bot_probability, bot_confidence, bot_agent_id, reasons, puntuaciones y umbrales por modelo, y session_event_count. Consulte Detección de agentes de IA. |
fingerprint_enrichment | object | Señales derivadas del fingerprint. throwaway_email_detected es true cuando el ID externo email usa un dominio desechable. |
rule_evaluations | object | Resultados de reglas legado (rules, policy_version). Vacío en las evaluaciones creadas después del 2026-08-27; se mantiene en la respuesta para que los registros antiguos sigan decodificándose. |
rule_evaluations_v2 | object | Resultados del motor de reglas: un array values donde cada elemento envuelve una evaluation con rule_slug, rule_version, outcome, evaluated_as (live o shadow), transition y evaluated_at. |
Los objetos anidados coinciden con la estructura del registro de la exportación S3, donde cada campo está documentado en detalle.
rule_evaluations_v2
La tabla anterior resume este campo. Lleva el resultado de cada regla que se ejecutó para el dominio, anidado tres niveles adentro en rule_evaluations_v2.values[].evaluation, y los valores son enteros en lugar de cadenas, así que vale la pena detallarlos. No forma parte del payload de /token/v1/client documentado más abajo.
| Campo | Tipo | Descripción |
|---|---|---|
rule_slug | string | El identificador de la regla, por ejemplo "account_shared_detected". |
outcome | number | El resultado de la evaluación. Vea la tabla siguiente. |
evaluated_as | number | El estado del ciclo de vida de la regla en el momento de la evaluación. Vea la tabla siguiente. |
transition | number | Si el resultado cambió en esta evaluación, independientemente de cuál sea el resultado. 2 significa sin cambios desde la última evaluación, 3 significa que cambió en esta. Combinado con outcome: 1, un 3 significa que la regla acaba de empezar a coincidir; combinado con outcome: 2, significa que acaba de dejar de coincidir. 1 nunca se produce. |
key.key_hash | string | Un hash del valor sobre el que indexó la regla. Es una cadena JSON, no un número, así que sobrevive a JSON.parse sin pérdida de precisión. No lleva el id de cuenta en sí. |
event_time, evaluated_at | object | { seconds, nanos }, a diferencia de created_at y updated_at a nivel superior de la respuesta, que son timestamps en milisegundos. |
outcome y evaluated_as son enteros sin procesar, no cadenas:
outcome | Significado | Cuándo lo observará |
|---|---|---|
0 | Sin especificar | No se produce |
1 | True | De forma continua, en cada evaluación mientras se cumpla la condición |
2 | False | De forma continua, en cada evaluación mientras no se cumpla. Es el estado estable para una regla sana que no coincide, no una transición rara |
3 | Ausente (estructural) | De forma continua, en cada evaluación donde la regla no puede leer el campo que necesita, como una clave de id externo incorrecta. Persistente, no un pico aislado |
4 | Pendiente (transitorio) | Cuando una medición requerida existe pero aún no está caliente. Distinto de un status de nivel superior igual a pending: volver a solicitar el mismo token no lo resolverá, pero una evaluación posterior de la misma entidad puede devolver 1 o 2 |
evaluated_as | Significado |
|---|---|
1 | Draft |
2 | Shadow (un experimento; puede aparecer en cualquier momento) |
3 | Active |
4 | Archived |
Cada regla evaluada y publicada reporta una entrada en cada evento, con cualquier resultado. rule_evaluations_v2 es un registro de lo que se evaluó, no un flujo de notificaciones, así que outcome: 2 (false) y outcome: 3 (ausente) no se suprimen: viajan en el array con la misma fiabilidad que outcome: 1. transition es lo que le indica si ese resultado cambió desde la evaluación anterior.
Una entrada ausente para un rule_slug dado significa que la regla no se evaluó en absoluto: no está activada para el dominio, es una regla de solo medición que no publica, o la evaluación no se ejecutó para ese evento. No significa “evaluó a false”: ese caso es outcome: 2, presente en el array como cualquier otro. Consulte Detectar el uso compartido de cuentas para un ejemplo trabajado que lee este campo de principio a fin.
Referencia de la respuesta de /token/v1/client
Esta referencia se aplica al endpoint público /token/v1/client. Es una vista más antigua y más plana de la misma evaluación. Muchos de sus campos son placeholders fijos que se mantuvieron por compatibilidad hacia atrás; el callout siguiente los enumera. Para integraciones nuevas, prefiera /token/v2/verify.
Estos campos están presentes en cada respuesta pero nunca se calculan:
identification.confidenceysupplementary_id_high_recall.confidenceson siempre{ "score": 0.0, "version": "unknown" }identification.visitor_foundes siemprefalse;first_seen_atylast_seen_atson iguales altimestampdel eventoproximityes siempre{ "id": "unknown", "precision_radius": 0, "confidence": 0.0 }client_referreres siempre"unknown"ip_blocklist.email_spameip_blocklist.attack_sourceson siemprefalse(solo se completator_node)raw_device_attributes.mathes siempre"unknown"
No construya lógica de detección o fraude sobre ellos.
Explicaciones de reglas
Las reglas publicadas que se evalúan como verdaderas pueden incluir rule_evaluations_v2.values[].evaluation.explanation.nodes. Cada nodo visitado puede describir su node_id, outcome, valor tipado observed, subject y compared_to. Las explicaciones son opcionales; los resultados falsos, pendientes o sin datos no las incluyen. La ausencia de explicación no cambia el resultado registrado.
Trata subject y compared_to como texto para mostrar, no como un formato que analizar. Usa node_id, los valores tipados de observed y outcome en tu código. Lee estos campos de rule_evaluations_v2, no del objeto heredado rule_evaluations. Consulta la API de eventos para ver los valores y la diferencia con los resultados heredados.
Campos de nivel superior
| Campo | Tipo | Descripción |
|---|---|---|
linked_id | string | El ID de sesión del navegador, o el ID del evento cuando no se capturó ningún ID de sesión. No es un identificador que usted haya proporcionado; sus externalIds aparecen en tags como external_id:<key>. |
tags | object | Un mapa de diagnóstico de cside, no metadatos del cliente: domain_id, team_id, request_id, session_id, fingerprint_match, network_match, flags de soporte de detección como incognito_support, y sus externalIds como entradas external_id:<key>. |
timestamp | number | Marca de tiempo Unix (milisegundos) del evento. |
event_id | string | Identificador único para este evento de fingerprinting. |
url | string | La URL de la página donde se recopiló el fingerprint. |
ip_address | string | La dirección IP del visitante. |
user_agent | string | La cadena User-Agent sin procesar del navegador del visitante. |
client_referrer | string | Siempre "unknown". |
status | string | completed o failed. |
error_message | string | Presente cuando status es failed. |
domain_id, team_id, session_id, request_id | string | Metadatos de la evaluación copiados del registro interno. |
created_at | string | Hora de la evaluación como cadena RFC 3339 (a diferencia de /token/v2/verify, que usa milisegundos). |
La respuesta también incluye los objetos network_client_metrics, vpn_evaluation, proxy_details, tampering_details, tampering_anomaly_score, velocity y sdk. Los recuentos de velocity se derivan únicamente del evento actual (su ventana events.24_hours es el único valor histórico); sdk indica platform: "js" con version: "unknown". Se muestran en el ejemplo completo, pero no forman parte del contrato estable.
browser_details
Detalles sobre el navegador y el sistema operativo del visitante.
| Campo | Tipo | Descripción |
|---|---|---|
browser_name | string | Nombre del navegador (por ejemplo, "Chrome"). |
browser_major_version | string | Número de versión principal. |
browser_full_version | string | Cadena de versión completa. |
os | string | Nombre del sistema operativo. |
os_version | string | Versión del sistema operativo. |
device | string | Tipo de dispositivo (por ejemplo, "Other", "Mobile"). |
identification
El resultado de identificación principal del visitante.
| Campo | Tipo | Descripción |
|---|---|---|
visitor_id | string | El ID de dispositivo estable de este visitante. Es el único campo calculado del objeto. |
confidence.score | number | Siempre 0.0. |
confidence.version | string | Siempre "unknown". |
visitor_found | boolean | Siempre false. |
first_seen_at | number | Siempre igual a timestamp. |
last_seen_at | number | Siempre igual a timestamp. |
supplementary_id_high_recall
Un identificador secundario derivado de sus externalIds (con preferencia por userId y después accountId) para que una cuenta pueda vincularse entre dispositivos. Recurre al ID de dispositivo cuando no se adjuntó ningún ID externo.
| Campo | Tipo | Descripción |
|---|---|---|
visitor_id | string | Hash del ID externo elegido, o el ID de dispositivo cuando no se adjuntó ninguno. |
visitor_found | boolean | true cuando se adjuntó un ID externo; de lo contrario, false. |
confidence.score | number | Siempre 0.0. |
confidence.version | string | Siempre "unknown". |
first_seen_at | number | Siempre igual a timestamp. |
last_seen_at | number | Siempre igual a timestamp. |
proximity
No se completa. Siempre { "id": "unknown", "precision_radius": 0, "confidence": 0.0 }. Use geo_data e ip_enrichment en /token/v2/verify para la ubicación.
ip_info
Información de la dirección IP del visitante.
| Campo | Tipo | Descripción |
|---|---|---|
v4.address | string | Dirección IPv4. |
v6.address | string | Dirección IPv6. |
ip_blocklist
Si la IP del visitante aparece en listas de bloqueo conocidas.
| Campo | Tipo | Descripción |
|---|---|---|
email_spam | boolean | No se completa; siempre false. |
attack_source | boolean | No se completa; siempre false. |
tor_node | boolean | La IP es un nodo de salida de Tor. |
Señales de fraude y entorno
Señales que indican atributos sospechosos o notables del visitante.
root_apps, emulator, jailbroken, frida, mitm_attack, replayed, high_activity_device, cloned_app, privacy_settings y location_spoofing están presentes en la respuesta pero nunca se establecen. Siempre devuelven false (factory_reset_timestamp es siempre 0).
No construyas lógica de detección o fraude sobre ellos. Cada uno está marcado en la tabla.
| Campo | Tipo | Descripción |
|---|---|---|
bot | string | Una cadena simple derivada únicamente del User-Agent: "detected" cuando contiene bot, crawler, spider o headless; "unknown" cuando no se capturó ningún User-Agent; de lo contrario, "not_detected". No es el modelo de bot. Use bot.is_bot en /token/v2/verify para el veredicto real. Consulte Detección de agentes de IA. |
root_apps | boolean | El dispositivo tiene aplicaciones root/superusuario instaladas. No se completa actualmente; siempre false. |
emulator | boolean | El dispositivo es un emulador. No se completa actualmente; siempre false. |
proxy | boolean | El visitante está usando un proxy, un relay o una IP de centro de datos. |
proxy_confidence | string | "low", "medium" o "high" cuando proxy es true; "unknown" en caso contrario. |
vpn | boolean | El visitante está usando una VPN. |
vpn_confidence | string | "low", "medium" o "high" cuando se ejecutó el modelo de VPN; "unknown" en caso contrario. |
vpn_origin_timezone | string | Zona horaria IANA indicada por el navegador. |
vpn_origin_country | string | País inferido a partir del enriquecimiento de IP o "unknown". |
vpn_methods | object | Señales a nivel de método relacionadas con el uso de VPN y el tráfico anonimizado. Consulte la subsección a continuación. |
incognito | boolean | El navegador está en modo incógnito/privado. |
tampering | boolean | Los atributos del navegador han sido manipulados. |
jailbroken | boolean | El dispositivo tiene jailbreak. No se completa actualmente; siempre false. |
frida | boolean | Se detectó el toolkit de instrumentación Frida. No se completa actualmente; siempre false. |
virtual_machine | boolean | El visitante está ejecutando en una máquina virtual. |
developer_tools | boolean | Las herramientas de desarrollo del navegador están abiertas. |
mitm_attack | boolean | Se detectó un ataque man-in-the-middle. No se completa actualmente; siempre false. |
replayed | boolean | La solicitud es una repetición de una solicitud anterior. No se completa actualmente; siempre false. |
high_activity_device | boolean | Número inusualmente alto de identificaciones desde este dispositivo. No se completa actualmente; siempre false. |
La señal de correo electrónico desechable no forma parte de esta respuesta. Lea fingerprint_enrichment.throwaway_email_detected desde /token/v2/verify en su lugar.
vpn_methods
vpn_methods contiene señales a nivel de método relacionadas con el uso de VPN y el tráfico anonimizado. Use el campo de nivel superior vpn como veredicto general. El valor de un método puede ser true cuando vpn es false, por ejemplo, cuando cside detecta tráfico de proxy o relay que el modelo de VPN no clasifica como VPN.
| Campo | Tipo | Descripción |
|---|---|---|
timezone_mismatch | boolean | La zona horaria del navegador no coincide con la geolocalización de la IP. |
public_vpn | boolean | La IP coincide con una señal conocida de VPN pública o de centro de datos. |
auxiliary_mobile | boolean | Reservado para la detección específica de dispositivos móviles. Actualmente es false en los eventos del navegador. |
os_mismatch | boolean | El sistema operativo indicado por el navegador no coincide con la firma de red. |
relay | boolean | cside detectó un relay que anonimiza el tráfico, un proxy o tráfico similar al de un relay. |
Algunos pipelines de datos añaden prefijos y aplanan los campos anidados. En esos conjuntos de datos, vpn_methods.relay puede aparecer como cside_fingerprint_vpn_methods_relay.
raw_device_attributes
Componentes de bajo nivel del fingerprint del navegador.
| Campo | Tipo | Descripción |
|---|---|---|
math | string | No se completa; siempre "unknown". |
vendor | string | Cadena del proveedor de GPU/gráficos. |
Ejemplo completo de respuesta
Una respuesta completada de /token/v1/client. Los objetos anidados que no forman parte del contrato estable (network_client_metrics, vpn_evaluation, velocity) están 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!