Documentación / Completo
Los 9 tipos de evento con su payload
8 tipos suscribibles + webhook.test (no suscribible). Un endpoint con lista de events explícita recibe SOLO esos tipos; lista vacía/omitida = todos (los nuevos entran solos). El data de cada uno:
| Tipo | Suscribible | Descripción |
|---|---|---|
message.received | ✓ | Un cliente te escribió. data.message = objeto de mensaje de WhatsApp (texto/imagen/audio/…); data.contacts[] identifica al remitente. |
message.echo | ✓ | 🌟 Diferencial de Coexistence: un mensaje que el DUEÑO envió DESDE EL TELÉFONO, con su contenido. origin='device' (no consume el plan). from = tu número de negocio. |
message.status | ✓ | Acuse de un mensaje que enviaste por /v1. origin (api|device) distingue tu envío del envío hecho a mano desde el teléfono. Un acuse 'device' NO tiene mensaje tuyo detrás — es esperado. |
connection.created | ✓ | Se conectó un número nuevo (panel u onboarding hospedado). Tu externalId viaja en el sobre → provisioná al cliente final en tu sistema. |
connection.status_changed | ✓ | Cambió el estado de una conexión (ej. status='disconnected'). Alertá o pausá los envíos a ese número. |
connection.usage_threshold_reached | ✓ | El límite de UN número (su monthlyMessageLimit) llegó a 70/90/100%. Se emite UNA vez por (número, período, umbral). El comercial: avisale a ese cliente final o subile el tope. |
usage.threshold_reached | ✓ | El plan de la CUENTA (suma de todos los números) llegó a un umbral. connection viene en null, sequence 0. Decidí upgrade o corte. |
history.synced | ✓ | (Coexistence) resumen del backfill de conversaciones al conectar. shared:false = el dueño no compartió su historial. ⚠ Los mensajes históricos NO se reenvían uno por uno. |
webhook.test | — | El evento del botón 'Probar' del panel. NO es suscribible: se entrega SIEMPRE a ese endpoint (aunque tenga lista de eventos explícita) para validar conectividad + firma. connection=null, data.test=true. Nunca lo trates como tráfico real. |
message.received — data
{
"message": {
"id": "wamid.HBgL…",
"from": "5493511234567",
"type": "text",
"text": {
"body": "hola"
}
},
"contacts": [
{
"wa_id": "5493511234567",
"profile": {
"name": "Ana"
}
}
]
}message.echo — data
{
"origin": "device",
"message": {
"id": "wamid.HBgL…",
"from": "5493516516690",
"to": "5493511234567",
"type": "text",
"timestamp": "1754531482",
"text": {
"body": "te confirmo el turno para mañana 10hs"
}
}
}message.status — data
{
"messageId": "wamid.HBgL…",
"status": "read",
"origin": "device",
"recipient": "5493511234567",
"timestamp": "2026-08-06T00:31:25.000Z"
}connection.created — data
{
"status": "connected"
}connection.status_changed — data
{
"status": "disconnected",
"previousStatus": "connected"
}connection.usage_threshold_reached — data
{
"scope": "connection",
"threshold": 90,
"used": 900,
"limit": 1000,
"period": "2026-08",
"connection": {
"id": "conn_4eede070e5a84d1590bdce2ea1d837bc",
"label": "Farmacia López",
"externalId": "farmacia-lopez"
}
}usage.threshold_reached — data
{
"scope": "account",
"threshold": 90,
"used": 22610,
"limit": 25000,
"period": "2026-08"
}history.synced — data
{
"conversations": 34,
"messages": 512,
"shared": true,
"phase": 0
}webhook.test — data
{
"type": "test",
"test": true,
"message": "WAIA Connect test event — your endpoint is reachable and verifying signatures. This is NOT real traffic."
}