Webhooks
Recibe eventos de mensajes y sesiones en tu sistema, con firma HMAC.
Registra una URL tuya y te enviaremos un POST con cada evento que te interese.
Administrar webhooks
GET /webhooks # listar
POST /webhooks # crear
PUT /webhooks/{id} # actualizar (url, events, active)
DELETE /webhooks/{id} # eliminar
POST /webhooks
{
"url": "https://tu-sistema.com/webhooks/wsperu",
"events": ["message.status", "message.received", "session.disconnected"]
}
Al crear, la respuesta incluye un secret — guárdalo para verificar la firma.
Eventos
| Evento | Cuándo se dispara |
|---|---|
message.sent |
El mensaje salió hacia WhatsApp |
message.status |
Cambió el estado de entrega (delivered, read) |
message.failed |
El envío falló tras los reintentos |
message.received |
Tu línea recibió un mensaje entrante |
session.connected |
La línea se conectó |
session.disconnected |
La línea se desconectó |
session.qr |
Se generó un QR nuevo (útil para re-vincular) |
Ejemplo de payload
{
"event": "message.received",
"sessionId": "665f...",
"data": {
"from": "51987654321@s.whatsapp.net",
"messageId": "3EB0...",
"timestamp": 1755011111,
"type": "conversation",
"text": "Hola, quisiera información sobre mi pedido"
}
}
text trae el cuerpo del mensaje (o el caption si es imagen/video/documento); es null para media sin caption — los archivos entrantes no se descargan.
Verificar la firma (HMAC-SHA256)
Cada request incluye el header x-webhook-signature: el HMAC-SHA256 del body usando tu secret.
const crypto = require('crypto');
function esValido(body, firma, secret) {
const esperada = crypto.createHmac('sha256', secret)
.update(JSON.stringify(body))
.digest('hex');
return crypto.timingSafeEqual(Buffer.from(firma), Buffer.from(esperada));
}
Reintentos
Si tu endpoint no responde 2xx, reintentamos hasta 3 veces con backoff exponencial. Responde rápido (encola internamente si tu procesamiento es lento) — el timeout es de 10 segundos.