message.received
Llega cada vez que un contacto te envía un mensaje (texto, media, ubicación, etc).
mediaId y mediaKey se completan cuando termina la descarga interna desde Meta. Resolvé mediaId a una URL firmada con GET /media/:id. Ver Media.
Audios: la transcripción llega después
Los audios entrantes se transcriben automáticamente, pero el trabajo corre después de que el mensaje se guarda. Por eso el webhookmessage.received de un audio te llega con transcription: null y transcriptionStatus: "pending".
Para obtener el texto, volvé a leer el mensaje unos segundos más tarde:
transcriptionStatus termina en:
Si preferís el audio en sí, bajalo con
mediaId desde GET /media/:id.
message.status_changed
Llega cuando cambia el estado de un mensaje saliente que vos enviaste.
queued → sent → delivered → read o failed.
clientRef se devuelve verbatim si lo enviaste al crear el mensaje (en POST /messages o POST /messages/batch). Es la forma recomendada de reconciliar envíos masivos contra tus propios IDs sin guardar un mapping: matcheás data.clientRef y aplicás data.newStatus. Si no enviaste clientRef, llega como null.
Cuando un mensaje rebota (newStatus: "failed"), el motivo viene en data.errorCode (código de Meta, ej. 131049, 131026) y data.errorMessage.
conversation.created
Llega cuando se crea una conversación nueva (primer mensaje de un contacto).
contact.created
Llega cuando se crea un contacto nuevo (vía API o porque escribió por primera vez).
Idempotencia y orden
- Un mismo evento puede entregarse más de una vez (por ejemplo si tu URL responde 200 pero la conexión se corta antes de que Waspy lo registre). Deduplicá por
data.id+event. - Para
message.receivedyconversation.created,contact.createdse entrega primero (cuando aplica). - No garantizamos orden estricto entre suscripciones distintas.