Sign inGet Started

Eventos de reacción de WhatsApp

Una reacción con emoji anota un mensaje existente en lugar de crear uno nuevo, por lo que nunca aparece como un mensaje independiente ni en los eventos de ciclo de vida del mensaje. Bird mantiene dos vistas en su lugar: las reacciones presentes en el mensaje en este momento y un registro de cada cambio que llevó a ese estado. Ambas registran cambios del contacto y de tu número comercial.
Para recibir aviso de la reacción de un contacto en el momento en que ocurre, suscríbete a whatsapp.reacted. Para agregar o eliminar las tuyas, consulta Enviar reacciones.

Requisitos previos

Una clave API con permiso de lectura WhatsApp, y el ID (wam_…) del mensaje al que se reaccionó.

1. Leer las reacciones actuales

Si tu aplicación muestra la reacción actualmente asociada a un mensaje, recupera el mensaje y lee su reactions. La lista contiene una reacción vigente por remitente y se omite cuando no hay reacciones presentes.
Para GET /v1/whatsapp/messages/wam_01ky8b3xq4gd7pmzn2ka51f7te, los campos relacionados con reacciones tienen esta forma (otros campos del mensaje omitidos):
Ejemplo de código
{
  "id": "wam_01ky8b3xq4gd7pmzn2ka51f7te",
  "reactions": [
    {
      "emoji": "👍",
      "from": { "phone_number": "+14155550100" }
    }
  ]
}
El mensaje conserva su contenido, dirección y estado de entrega originales. reactions[].from identifica a la persona que reaccionó.
Este es el estado que debes mostrar. Los webhooks de reacción pueden compartir marca de tiempo y llegar desordenados, así que úsalos como disparador para volver a leer el mensaje en lugar de como el estado actual.

2. Leer el registro de reacciones

Lista de eventos de reacción con GET /v1/whatsapp/messages/{message_id}/reaction-events para ver cada cambio en el mensaje referenciado, del más reciente al más antiguo: adiciones, reemplazos y eliminaciones. Cada entrada tiene un ID de reacción (war_…), el emoji, quién hizo el cambio en from, una marca de tiempo occurred_at y un status:
  • received: un cambio de un contacto.
  • sent: WhatsApp aceptó un cambio de tu número comercial.
  • failed: WhatsApp rechazó tu cambio.
  • rejected: Bird rechazó tu cambio antes de enviarlo.
Una entrada failed o rejected incluye el motivo en error. Una eliminación incluye emoji: null. Un cambio tuyo que aún está pendiente no tiene entrada hasta que se conozca su resultado. Una reacción nunca se cobra, por lo que ningún fallo aquí es de facturación.
El API de eventos de reacción devuelve una respuesta paginada. Este ejemplo muestra una reacción comercial rechazada y una reacción de contacto recibida anteriormente:
Ejemplo de código
{
  "data": [
    {
      "id": "war_01krdgeqcxet5s7t44vh8rt9mh",
      "emoji": "🎉",
      "status": "rejected",
      "from": {
        "phone_number": "+13124495569"
      },
      "error": {
        "code": "internal_error",
        "description": "the receiving number is no longer connected",
        "occurred_at": "2026-08-28T19:04:22Z"
      },
      "occurred_at": "2026-08-28T19:04:22Z"
    },
    {
      "id": "war_01krdgeqcxet5s7t44vh8rt9mg",
      "emoji": "👍",
      "status": "received",
      "from": {
        "phone_number": "+14155550100",
        "bsuid": "US.13491208655302741918"
      },
      "occurred_at": "2026-08-28T19:01:10Z"
    }
  ],
  "next_cursor": null,
  "prev_cursor": null,
  "refresh_cursor": "eyJ2IjoxLCJzIjoiMjAyNi0wOC0yOFQxOTowNDoyMloiLCJpIjoiMDE5ZTFiMDctNWQ5ZC03NjhiLTkzZTgtODRkYzUxOGQyNjkxIn0"
}
El historial de reacciones es independiente de los eventos de entrega del mensaje. El endpoint de eventos de ciclo de vida no contiene cambios de whatsapp.reacted. Para retención y paginación, sigue la referencia del registro de reacciones.

Solución de problemas

  • La reacción no aparece en la lista de mensajes: Busca el mensaje original. Una reacción está asociada a él y no tiene una fila de mensaje independiente.
  • El estado de la reacción cambia inesperadamente: Lee el reactions del mensaje en lugar de ordenar los eventos de webhook por hora de llegada o marca de tiempo.

Próximos pasos