Webhooks

El sistema de Coremetrix puede notificar a tu backend cuando ocurran ciertos eventos, utilizando webhooks. Puedes suscribirte a eventos en tiempo real a través de los webhooks de Coremetrix. Los webhooks pueden gestionarse a través de la API de Subscriptions.

Esta API se puede utilizar para suscribirse a varios eventos del ciclo de vida del cuestionario.

Cómo funciona:

webhook

Eventos admitidos

Actualmente admitimos suscripciones a los siguientes eventos:

event_namedescription
quiz_consentDesencadenado cuando un usuario ha aceptado el procesamiento de datos personales relacionados con él o ella.
quiz_consent_withdrawalDesencadenado cuando un usuario ha retirado su consentimiento para el procesamiento de datos personales relacionados con él o ella.
landing_loadSe activa cuando un usuario carga la landing page de un cuestionario (si se configura una landing page)
quiz_loadDesencadenado cuando un usuario carga la primera página del cuestionario.
quiz_startDesencadenado cuando un usuario ha comenzado el cuestionario (se ha enviado la primera pregunta del cuestionario).
quiz_completeDesencadenado cuando un usuario ha completado el cuestionario (se ha enviado la última pregunta del cuestionario).
attempt_scoredDesencadenado cuando se ha calificado (o marcado) un intento.
attempt_profiledDesencadenado cuando se ha perfilado (o marcado) un intento.

Note: La lista completa de eventos a los que puedes suscribirte se puede encontrar llamando al/subscriptions/events endpoint:

gethttps://api.coremetrix.com/subscriptions/events?apikey={YOUR_API_KEY}

Carga del webhook

Cuando creas una suscripción a través de la API de Suscripciones, debes proporcionar una URL. Cuando ocurra cualquiera de los eventos descritos anteriormente, Coremetrix enviará los datos correspondientes mediante POST a la URL proporcionada. Tu API debe ser capaz de consumir la siguiente carga:

quiz_consent

{
  • "event": "quiz_consent",
  • "consentTime": "2020-01-31T13:14:35.208Z",
  • "lastUpdated": "2020-01-31T13:14:35.208Z",
  • "slug": "sandbox",
  • "puid": "a_puid",
  • "quizId": "481ac0fe-ac33-402a-9367-2aaa7a98b49d",
  • "consent": true
}

Note: el lastUpdated y consentTime están en formato ISO8601

quiz_consent_withdrawal

{
  • "event": "quiz_consent_withdrawal",
  • "withdrawalTime": "2020-01-31T13:25:02.786Z",
  • "lastUpdated": "2020-01-31T13:25:02.786Z",
  • "slug": "sandbox",
  • "puid": "a_puid",
  • "quizId": "481ac0fe-ac33-402a-9367-2aaa7a98b49d",
  • "consent": false
}

Note: el lastUpdated y consentTime están en formato ISO8601

landing_load

{
  • "attemptId": "0012ba6f-f8a2-493a-b32d-7cda370af477",
  • "event": "landing_load",
  • "puid": "test-70b8f195-8d75-4177-b094-4e0ac7472e",
  • "quizId": "511c77c5-f6a3-48fd-a136-93f18d47116a",
  • "timestamp": 1727174639100
}

Note: el puid es opcional y el timestamp está en milisegundos del Epoch

quiz_load

{
  • "event": "quiz_load",
  • "attemptId": "4d1c90d4-f1fe-4303-ad83-535d99a61cf5",
  • "quizId": "481ac0fe-ac33-402a-9367-2aaa7a98b49d",
  • "puid": "a_puid",
  • "timestamp": 1562161162000
}

Note: el puid es opcional y el timestamp está en milisegundos del Epoch

quiz_start

{
  • "event": "quiz_start",
  • "attemptId": "4d1c90d4-f1fe-4303-ad83-535d99a61cf5",
  • "quizId": "481ac0fe-ac33-402a-9367-2aaa7a98b49d",
  • "puid": "a_puid",
  • "timestamp": 1562161162000
}

Note: el puid es opcional y el timestamp está en milisegundos del Epoch

quiz_complete

{
  • "event": "quiz_complete",
  • "attemptId": "4d1c90d4-f1fe-4303-ad83-535d99a61cf5",
  • "quizId": "481ac0fe-ac33-402a-9367-2aaa7a98b49d",
  • "puid": "a_puid",
  • "timestamp": 1562161162000
}

Note: el puid es opcional y el timestamp está en milisegundos del Epoch

attempt_scored

{
  • "event": "attempt_scored",
  • "attemptId": "4d1c90d4-f1fe-4303-ad83-535d99a61cf5",
  • "quizId": "481ac0fe-ac33-402a-9367-2aaa7a98b49d",
  • "puid": "a_puid",
  • "age": "age",
  • "gender": "gender",
  • "maritalStatus": "maritalStatus",
  • "occupation": "occupation",
  • "accommodation": "accommodation",
  • "education": "education",
  • "scores": [
    • {
      • "value": 203.04200292294007,
      • "model": "generic_model"
      }
    ],
  • "flags": [ ],
  • "status": "COMPLETED_SCORED"
}
Note:

- el puid es opcional

- la age, gender, maritalStatus, occupation,
accommodation y education también son opcionales ya que algunos cuestionarios pueden no tener preguntas demográficas

El estado del intento puede ser uno de los siguientes:

statusdescription
COMPLETED_SCOREDEl cuestionario ha sido completado, se esperan perfiles presentes.
COMPLETED_PARTIALLY_SCOREDEl cuestionario ha sido completado, se esperan perfiles y marcas presentes.
COMPLETED_NOT_SCOREDNo se puede calificar el cuestionario, razones posibles: el cuestionario se respondió demasiado rápido (no se generará un perfil y en su lugar se presentará una marca de CLIC RÁPIDO), no se han configurado / habilitado modelos de perfil.
attempt_profiled - Example with profiles

{
  • "event": "attempt_profiled",
  • "attemptId": "4d1c90d4-f1fe-4303-ad83-535d99a61cf5",
  • "quizId": "481ac0fe-ac33-402a-9367-2aaa7a98b49d",
  • "puid": "a_puid",
  • "age": "age",
  • "gender": "gender",
  • "maritalStatus": "maritalStatus",
  • "occupation": "occupation",
  • "accommodation": "accommodation",
  • "education": "education",
  • "profiles": {
    • "basic_profile": {
      • "value": "HIGH",
      • "scale": [
        • "LOW",
        • "MEDIUM",
        • "HIGH"
        ]
      }
    },
  • "profileFlags": { },
  • "status": "COMPLETED_SCORED"
}
attempt_profiled - Example with flags

{
  • "event": "attempt_profiled",
  • "attemptId": "4d1c90d4-f1fe-4303-ad83-535d99a61cf5",
  • "quizId": "481ac0fe-ac33-402a-9367-2aaa7a98b49d",
  • "puid": "a_puid",
  • "age": "age",
  • "gender": "gender",
  • "maritalStatus": "maritalStatus",
  • "occupation": "occupation",
  • "accommodation": "accommodation",
  • "education": "education",
  • "profiles": { },
  • "profileFlags": {
    • "basic_profile": {
      • "flag": [
        • "FAST_CLICK"
        ]
      }
    },
  • "status": "COMPLETED_NOT_SCORED"
}
Note:

- el puid es opcional

- la age, gender, maritalStatus, occupation,
accommodation y education también son opcionales ya que algunos cuestionarios pueden no tener preguntas demográficas

El estado del intento puede ser uno de los siguientes:

statusdescription
COMPLETED_SCOREDEl cuestionario ha sido completado, se esperan perfiles presentes.
COMPLETED_PARTIALLY_SCOREDEl cuestionario ha sido completado, se esperan perfiles y marcas presentes.
COMPLETED_NOT_SCOREDNo se puede calificar el cuestionario, razones posibles: el cuestionario se respondió demasiado rápido (no se generará un perfil y en su lugar se presentará una marca de CLIC RÁPIDO), no se han configurado / habilitado modelos de perfil.

Seguridad

Cifrado de datos durante la transmisión

Coremetrix emplea cifrado para toda la transmisión de datos. La API de Suscripciones solo aceptará el protocolo https. Esto es para proteger la comunicación entre el sistema de Coremetrix y tu backend. Debes activar TLS en tu servidor y configurar la URL de suscripción para que use https.

Autenticación básica HTTP

Coremetrix admite la autenticación básica HTTP para permitir que tu backend asegure la URL del suscriptor. Esto asegurará que solo Coremetrix pueda enviar datos a tu servidor.

La API de Suscripciones te permitirá crear una URL de suscriptor con el siguiente formato: https://username:password@my_server.com/my_secure_path

Note: username and password should not contain any : or @ symbols.

OAuth 2.0

OAuth 2.0 es un estándar abierto para la autorización en internet. Coremetrix admite la autorización OAuth 2.0 para permitir que nuestro backend tenga acceso limitado a tu punto final de webhook.

OAuth 2.0 requiere un token de autenticación, que es emitido por un servidor de autorización.

Para otorgar acceso a Coremetrix para enviar datos a tu punto final de webhook, primero debes configurar tus suscripciones usando la API de Suscripciones.

auth20_config

Para cada suscripción, también debes proporcionar la siguiente configuración:

FieldRequiredDescription
Token URLYes

La URL del punto final de la API para solicitar un token de acceso (solo se permite https).

Nota: De acuerdo con RFC 6749, la URL del token debe aceptar un tipo de contenido de x-www-form-urlencoded.

Client idYesEl ID del cliente de la aplicación web.
Client secretYesEl secreto del cliente de la aplicación web.
ScopeNoAlcance de permisos a solicitar.
AudienceNoEl público objetivo es el destinatario previsto del token. El URI del público objetivo DEBE ser un URI absoluto según lo definido en la Sección 4.3 de [RFC3986].
Grant typeNoTipo de concesión.

Note: Estos parámetros se agregarán utilizando el formato application/x-www-form-urlencoded con una codificación de caracteres UTF-8 en el cuerpo de la entidad de la solicitud HTTP.

Puedes encontrar detalles completos aquí.

Note:

Estos parámetros se agregarán utilizando el formato application/x-www-form-urlencoded con una codificación de caracteres UTF-8 en el cuerpo de la entidad de la solicitud HTTP.

Puedes encontrar detalles completos aquí.

Cómo funciona:

auth20_client_credentials_flow

Flujo de credenciales del cliente

OAuth 2.0 especifica múltiples flujos para obtener y validar tokens. Coremetrix admite el Flujo de Credenciales del Cliente, donde la comunicación es estrictamente de servidor a servidor. No se emite un Token de Actualización en este flujo, ya que el cliente puede recuperar un nuevo Token de Acceso usando sus credenciales de todos modos.

Cuando ocurre un evento, si OAuth 2.0 está configurado:

  1. Para obtener un Token de Acceso, Coremetrix llamará a tu servidor OAuth pasando la credencial (previamente registrada a través de la API de Suscripciones). El token de acceso se utilizará al enviar datos al webhook.

Tokens Web JSON

Los Tokens Web JSON te permiten verificar que los datos enviados a tu servidor no han sido manipulados y que realmente provienen de Coremetrix.

Cómo funciona:

jwt
  1. Coremetrix incluirá todos los datos de eventos en la carga útil del token JWT.
  2. Para evitar ataques de repetición, , Coremetrix incluirá un nonce (jti reclamo), el tiempo de creación (iat reclamo) y un tiempo de expiración (exp reclamo) como parte de la carga útil del JWT. El tiempo de expiración está configurado actualmente en 60 segundos.
  3. Coremetrix firma el token JWT utilizando HS512 y tu clave de API secreta en el formato “{apiKey}+{apiKey}”.
  4. Coremetrix enviará este token en un encabezado llamado X-Coremetrix-Signature al enviar datos a tu servidor.

Validación del JWT:

Deberás validar el JWT para verificar su autenticidad. Puedes hacer esto verificando su firma digital y sus reclamos. Hay varias bibliotecas disponibles para ayudarte en esto. Por ejemplo, puedes usar la biblioteca jjwt para Java.

Reintentos y retroceso exponencial

Coremetrix volverá a intentar enviar los eventos en caso de error. Además de los reintentos, Coremetrix implementa el algoritmo de retroceso exponencial para lograr un mejor control del flujo. En caso de error devuelto por tu servidor al intentar entregar los eventos, el sistema de Coremetrix volverá a intentarlo después de un período de tiempo. El tiempo de espera aumentará incrementalmente entre las solicitudes de reintentos consecutivos después de cada falla. Esto dará a tu servicio suficiente tiempo para recuperarse

retries

Coremetrix volverá a intentar enviar mensajes a tu sistema durante aproximadamente 1 hora. Si tu servicio está inactivo durante más de una hora, te recomendamos que utilices la API de informes de Coremetrix para obtener la información faltante.

BACK