Referencia de eventos de callback
Configuración y verificación de la dirección de callback
Tras configurar la dirección de callback, EngageLab SMS envía automáticamente una solicitud HTTP POST a dicha dirección para verificar la disponibilidad de la interfaz. Tu servicio debe devolver un código de estado HTTP 200 en un plazo de 3 segundos; de lo contrario, el sistema considerará que la dirección no está disponible.
Nota:
Para garantizar la correcta recepción de los datos de callback, añade 119.8.170.74 y 114.119.180.30 a la lista blanca del firewall de tu servidor.
Ejemplo de solicitud
Suponiendo que tu dirección de callback sea https://example.engagelabSMS.callback.com, el sistema enviará la siguiente solicitud:
curl -X POST https://example.engagelabSMS.callback.com -d '{}'
Requisitos de la respuesta
Tu servicio solo necesita devolver un código de estado HTTP 200, sin necesidad de devolver ningún contenido. Por ejemplo:
HTTP/1.1 200 OK
Content-Length: 0
Nota:
La verificación de la dirección de callback solo evalúa el código de estado HTTP y no requiere devolver ningún contenido concreto en el mensaje. Asegúrate de que la interfaz de tu servicio pueda responder correctamente con un 200 en un plazo de 3 segundos.
Mecanismo de seguridad del callback
Para garantizar la seguridad de los datos de callback y la fiabilidad de su origen, EngageLab SMS admite varios métodos de verificación de seguridad.
Verificación de usuario y clave (opcional)
- Configuración opcional. Si estableces un nombre de usuario, también debes establecer una clave.
- Una vez configurado, EngageLab añade en la cabecera HTTP de cada solicitud de callback el campo
X-CALLBACK-ID, con el siguiente formato:
X-CALLBACK-ID: timestamp={timestamp};nonce={nonce};username={username};signature={signature}
- Donde:
timestamp: marca de tiempo del envío del callbacknonce: número aleatoriousername: el nombre de usuario que configurastesignature: información de la firma, calculada de la siguiente manera
Método de cálculo de la firma (ejemplo en Python)
import hashlib, hmac
def verify(username, secret, timestamp, nonce, signature):
return signature == hmac.new(
key=secret.encode(),
msg=f'{timestamp}{nonce}{username}'.encode(),
digestmod=hashlib.sha256
).hexdigest()
- El servidor puede usar el método anterior para verificar la legitimidad de la solicitud de callback.
Autenticación mediante Authorization (opcional)
- Si tu interfaz de callback requiere autenticación (como Basic Auth, Bearer Token, etc.), puedes indicar la información de Authorization durante la configuración.
- EngageLab incluirá automáticamente ese campo Authorization en la solicitud, lo que facilita que tu servicio verifique la identidad de la solicitud.
Descripción de los eventos de callback
Estado del mensaje
El estado del mensaje sirve para hacer seguimiento de los cambios de estado de cada mensaje a lo largo de su ciclo de vida. Permite conocer en tiempo real el avance de las distintas etapas del mensaje, como el envío, la entrega y la verificación, lo que facilita el análisis estadístico, el tratamiento de excepciones y la optimización de la experiencia de usuario.
| Identificador del evento | Descripción |
|---|---|
| plan | El mensaje está programado para enviarse y entra en la cola de envío |
| target_valid | El número de destino es válido |
| target_invalid | El número de destino no es válido |
| sent | El mensaje se envió correctamente |
| sent_failed | El envío del mensaje falló |
| delivered | El mensaje se entregó en el dispositivo del usuario |
| delivered_failed | El mensaje se envió, pero no pudo entregarse en el dispositivo del usuario |
Estructura de los datos de callback
Estructura externa
{
"total": 1,
"rows": [
{
// objeto ReportLifecycle
}
]
}
| Nombre del campo | Tipo | Descripción |
|---|---|---|
| total | int | Número de registros incluidos en este callback |
| rows | array | Array de datos de estado del ciclo de vida |
Objeto ReportLifecycle
| Nombre del campo | Tipo | Descripción |
|---|---|---|
| message_id | string | ID único del mensaje |
| to | string | Número del destinatario |
| server | string | Tipo de servicio (por ejemplo, SMS) |
| channel | string | Tipo de canal |
| itime | int64 | Marca de tiempo del callback (en segundos) |
| custom_args | object | Parámetros personalizados (se devuelven si se enviaron) |
| status | object | Objeto con los detalles del estado |
Objeto status
| Nombre del campo | Tipo | Descripción |
|---|---|---|
| message_status | string | Estado actual del mensaje (véase la tabla siguiente) |
| status_data | object | Objeto con los datos del estado |
| billing | object | Objeto con la información de facturación (se devuelve cuando hay facturación) |
| error_code | int | Código de error; 0 indica que no hay error |
| error_detail | object | Detalle del error (se devuelve cuando se produce un error) |
Objeto status_data
| Nombre del campo | Tipo | Descripción |
|---|---|---|
| msg_time | int64 | Marca de tiempo de creación del mensaje (en segundos) |
| message_id | string | ID del mensaje |
| current_send_channel | string | Nombre del canal de envío actual |
| template_key | string | Key de configuración de la plantilla |
| business_id | string | ID de negocio |
| plan_id | string | ID del plan |
Objeto billing (se devuelve cuando hay facturación)
| Nombre del campo | Tipo | Descripción |
|---|---|---|
| cost | float64 | Importe del coste |
| currency | string | Moneda, fija en "USD" |
Por lo general, solo los mensajes en la etapa sent incluyen información de facturación.
Objeto error_detail (se devuelve cuando se produce un error)
| Nombre del campo | Tipo | Descripción |
|---|---|---|
| message | string | Descripción del mensaje de error |
Ejemplo: mensaje enviado correctamente
{
"total": 1,
"rows": [
{
"message_id": "123456789",
"to": "+6598765432",
"server": "sms",
"channel": "sms",
"itime": 1701234567,
"custom_args": {
"order_id": "ORDER123",
"user_id": "USER456"
},
"status": {
"message_status": "sent",
"status_data": {
"msg_time": 1701234560,
"message_id": "123456789",
"current_send_channel": "CHANNEL_A",
"template_key": "verify_code",
"business_id": "1001",
"plan_id": "7198765432109876543"
},
"billing": {
"cost": 0.005,
"currency": "USD"
},
"error_code": 0
}
}
]
}
Ejemplo: fallo en el envío del mensaje
{
"total": 1,
"rows": [
{
"message_id": "123456790",
"to": "+6598765433",
"server": "sms",
"channel": "sms",
"itime": 1701234568,
"status": {
"message_status": "sent_fail",
"status_data": {
"msg_time": 1701234561,
"message_id": "123456790",
"current_send_channel": "CHANNEL_B",
"template_key": "verify_code",
"business_id": "1001",
"plan_id": "7198765432109876543"
},
"error_code": 4001,
"error_detail": {
"message": "Invalid phone number"
}
}
}
]
}
Notificación de mensajes
La notificación de mensajes se refiere a eventos de negocio o alertas a nivel de sistema. Sirve para avisar a la parte de negocio sobre información importante como el estado de funcionamiento del servicio, el saldo o la revisión de plantillas, lo que facilita el tratamiento oportuno y la advertencia de riesgos.
| Identificador del evento | Descripción |
|---|---|
| template_audit_result | Notificación del resultado de la revisión de una plantilla |
Respuesta de mensajes
La respuesta de mensajes se refiere principalmente a los eventos de callback de respuesta durante la interacción con el usuario o con sistemas externos.
| Identificador del evento | Descripción |
|---|---|
| uplink_message | Contenido del mensaje entrante (uplink) que el usuario responde, por ejemplo, mediante SMS |
Ejemplo
{
"total": 1,
"rows": [
{
"server": "SMS",
"itime": 1741083306,
"message_id": "0",
"business_id": "0",
"response": {
"event": "uplink_message",
"response_data": {
"message_sid": "SM1234567890",
"account_sid": "AC1234567890",
"from": "+1234567890",
"to": "+0987654321",
"body": "Hello, it's time to struggle!"
}
}
}
]
}
Eventos del sistema
Los eventos del sistema abarcan acciones relacionadas con la cuenta, las plantillas, las llamadas a la API, etc. Facilitan la monitorización, la auditoría y el tratamiento automatizado de operaciones clave como el inicio de sesión en la cuenta, los cambios de clave o las llamadas a la API.
| Identificador del evento | Descripción |
|---|---|
| account_login | Notificación de operaciones relacionadas con el inicio de sesión en la cuenta |
| key_manage | Notificación de operaciones relacionadas con el cambio y la gestión de claves |
| template_manage | Notificación de operaciones de creación, modificación, eliminación, etc., de plantillas |
| api_call | Notificación de operaciones relacionadas con las llamadas a la API |
Estructura de los datos de callback
Estructura externa
{
"total": 1,
"rows": [
{
// objeto de evento del sistema
}
]
}
| Campo | Tipo | Descripción |
|---|---|---|
| total | int64 | Número total de eventos incluidos en este callback |
| rows | array | Array de objetos de eventos del sistema |
Objeto de evento del sistema
| Campo | Tipo | Descripción |
|---|---|---|
| server | string | Fijo en "SMS" |
| itime | int64 | Marca de tiempo en que se produjo el evento (en segundos) |
| system_event | object | Contenido del evento del sistema |
Objeto system_event
| Campo | Tipo | Descripción |
|---|---|---|
| event | string | Tipo de evento |
| data | object | Datos del evento |
Objeto data
| Campo | Tipo | Descripción |
|---|---|---|
| business_id | string | ID de negocio |
| org_id | string | ID de la organización |
| operator | object | Información del operador |
Objeto operator
| Campo | Tipo | Descripción |
|---|---|---|
| string | Correo del operador (si lo hay) | |
| api_key | string | API Key (si la hay) |
| ip_address | string | IP de la operación |
Estructura de la solicitud
{
"total": 1,
"rows": [
{
"server": "SMS",
"itime": 1694012345,
"system_event": {
"event": "account_login",
"data": {
"business_id": "123",
"org_id": "org-abc",
"operator": {
"email": "foo@example.com",
"api_key": "api-xxxx",
"ip_address": "1.2.3.4"
},
"account_login": {
"action": "login_success"
}
}
}
}
]
}
Evento de inicio de sesión en la cuenta
| Campo | Tipo | Descripción |
|---|---|---|
| action | string | Inicio de sesión correcto/fallo de inicio de sesión/cierre de sesión |
| fail_reason | string | Motivo del fallo de inicio de sesión; solo se devuelve con login_failed |
Ejemplo
{
"event": "account_login",
"data": {
"business_id": "123",
"org_id": "org-abc",
"operator": {
"email": "foo@example.com",
"ip_address": "1.2.3.4"
},
"account_login": {
"action": "login_success"
}
}
}
Evento de gestión de plantillas
| Campo | Tipo | Descripción |
|---|---|---|
| action | string | Crear plantilla/actualizar plantilla/eliminar plantilla |
| template_id | string | ID de la plantilla |
| template_name | string | Nombre de la plantilla |
Ejemplo
{
"event": "template_manage",
"data": {
"business_id": "123",
"org_id": "org-abc",
"operator": {
"email": "foo@example.com",
"ip_address": "1.2.3.4"
},
"template_manage": {
"action": "update template",
"template_id": "tmpl-456",
"template_name": "Verification Code"
}
}
}
Evento de gestión de claves
| Campo | Tipo | Descripción |
|---|---|---|
| action | string | Crear clave/actualizar clave/eliminar clave/ver clave |
| api_key | string | API Key |
| description | string | Descripción (opcional) |
Ejemplo
{
"event": "key_manage",
"data": {
"business_id": "123",
"org_id": "org-abc",
"operator": {
"email": "foo@example.com",
"ip_address": "1.2.3.4"
},
"key_manage": {
"action": "create",
"api_key": "apikey-789",
"description": "Nueva clave"
}
}
}
Evento de llamada a la API
| Campo | Tipo | Descripción |
|---|---|---|
| api_path | string | Ruta de la interfaz |
| method | string | Método HTTP |
Ejemplo
{
"event": "api_call",
"data": {
"business_id": "123",
"org_id": "org-abc",
"operator": {
"api_key": "apikey-789",
"ip_address": "1.2.3.4"
},
"api_call": {
"api_path": "/api/v1/messages/send",
"method": "POST"
}
}
}










