Catálogo de eventos

Los eventos que emite hoy cada área, con su payload de ejemplo, y los que están planificados.

Los nombres son recurso.acción en inglés y se publican tal como los emite el código: renombrar un evento ya emitido rompería integraciones, así que no se hace en v0. Las descripciones están en español. (Q36, enmienda C3 del 04-10)

  • Construido: el catálogo de eventos de su dominio lo declara emitido (live o active) en el commit que el dominio tiene en producción, que es de donde sale cada instantánea. Si el catálogo no declara estado, se toma el de DECISIONES-2026-10-04. Cada evento dice de dónde sale su estado.
  • Planificado: anunciado para que te prepares. Todavía no lo vas a recibir, aunque te suscribas (ver abajo).

Los ejemplos de payload salen del código de cada dominio, no se escriben a mano. Si un evento no trae ejemplo, dice «ejemplo pendiente».

Construidos (48)

broadcast.finished — Conversations · construido

Una campaña llegó a su estado final (enviada, fallida o con fallos parciales), con sus conteos.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

broadcast.paused — Conversations · construido

Una campaña se pausó sola, por ejemplo porque bajó la calidad del número.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

contact.created — Conversations · construido

Se creó un contacto nuevo en la cuenta.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

contact.stage_changed — Conversations · construido

Un contacto cambió de etapa en un tablero.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

contact.tag_added — Conversations · construido

Un contacto recibió una etiqueta.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

contact.tag_removed — Conversations · construido

Un contacto perdió una etiqueta.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

conversation.assigned — Conversations · construido

Una conversación quedó asignada a una persona del equipo o a un agente de IA.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

conversation.closed — Conversations · construido

Una conversación pasó a cerrada.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

flow.completed — Conversations · construido

Un contacto terminó un flujo de automatización.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

flow.failed — Conversations · construido

La ejecución de un flujo para un contacto terminó por un error.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

message.received — Conversations · construido

Un contacto le escribió a un número de WhatsApp de la cuenta.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

message.status_changed — Conversations · construido

Cambió el estado de entrega de un mensaje enviado.

Estados: sent, delivered, read, failed. DECISIONES-2026-10-04 lo registra como planificado; el dominio ya lo emite.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

template.status_changed — Conversations · construido

Una plantilla cambió de estado de aprobación en Meta.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

whatsapp_form.completed — Conversations · construido

Un contacto completó un formulario de WhatsApp.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

campaign.no_groups_available — Communities · construido

Una campaña no tiene grupos a los que dirigir a las personas que entran por su link.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

campaign.status_changed — Communities · construido

Una campaña se activó o se pausó.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

daily_report.generated — Communities · construido

Se generó el reporte diario de la cuenta (clics, ingresos y salidas).

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

group.blocked — Communities · construido

Un grupo quedó inoperable: sin administrador conectado, con el link de invitación inválido o suspendido por WhatsApp.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

group.created — Communities · construido

Se creó o se importó un grupo dentro de una campaña de la cuenta.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

group.full — Communities · construido

Un grupo pasó de no estar lleno a estarlo.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

El enlace de invitación de un grupo quedó confirmado caído (WhatsApp respondió que no existe y la renovación no consiguió otro); no se publica por errores transitorios ni por grupos prohibidos o suspendidos, y se publica una sola vez por episodio de bloqueo.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

El enlace de invitación de un grupo cambió por una renovación, automática al detectarse inválido o pedida por el usuario; en v0 no se publican los cambios que detecta la sincronización ni el enlace inicial al crear el grupo.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

group.message_received — Communities · construido

Una persona escribió un mensaje en un grupo.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

group.reaction_added — Communities · construido

Una persona reaccionó a un mensaje de un grupo.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

group.recovered — Communities · construido

Un grupo que estaba bloqueado volvió a operar.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

group_action.completed — Communities · construido

Terminó una acción sobre un grupo. action.uuid es el mismo action_id que devolvió la API al pedirla, y action.type dice qué acción fue. result depende del tipo de acción: en las que reciben una lista de teléfonos (agregar o quitar participantes, nombrar o quitar administradores) trae participants, con el resultado por persona: identity, identity_type, status (added, removed, promoted o demoted según la acción, o failed) y reason, que es null salvo cuando status es failed; al crear un grupo o renovar su link de invitación trae invite_link; al enviar un mensaje trae message.uid; en las demás (cambiar el nombre, la descripción, la foto o los ajustes) viene como objeto vacío ({}). group y campaign pueden venir null.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

group_action.failed — Communities · construido

Una acción sobre un grupo falló entera (si terminó con resultados por persona, llega group_action.completed). Si la pidió la API, action.uuid es el mismo action_id que devolvió al pedirla y pipeline viene null. Si la ejecutó una campaña o un pipeline, action.uuid viene null, y pipeline trae ese pipeline (uuid y name) o viene null fuera de un pipeline. reason es el motivo de la falla. group y campaign pueden venir null.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

group_join_request.created — Communities · construido

Una persona pidió unirse a un grupo oficial que pide aprobación para entrar, y su solicitud quedó pendiente. Si el grupo es de una campaña, también llega a las suscripciones filtradas por esa campaña. Se aprueba o rechaza por API con el teléfono de la persona, cuando el número anuncia groups.join_requests en "list_and_decide"; el resultado por persona llega en group_action.completed.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

group_join_request.revoked — Communities · construido

Una persona retiró su solicitud pendiente para unirse a un grupo antes de que se aprobara o rechazara. Trae los mismos campos que group_join_request.created.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

group_participant.joined — Communities · construido

Una persona entró a un grupo de la cuenta; campaign es null si el grupo no es de una campaña.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

group_participant.left — Communities · construido

Una persona salió de un grupo de la cuenta; campaign es null si el grupo no es de una campaña.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

pipeline.finished — Communities · construido

Terminó un pipeline de operaciones sobre grupos, con su resultado agregado y la clave de idempotencia del pedido que lo originó, cuando la hay.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

poll.voted — Communities · construido

Un participante votó en una encuesta enviada a un grupo, o cambió su voto.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

scheduled_message.finished — Communities · construido

Un envío programado terminó, con su resultado agregado.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

scheduled_message.group_delivery_failed — Communities · construido

Un envío programado falló en un grupo concreto, con el motivo desagregado.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

scheduled_message.response_received — Communities · construido

Alguien respondió a un envío programado votando una encuesta o respondiendo a un evento.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

account.blocked — Accounts · construido

La cuenta quedó bloqueada por consumo: terminó la gracia de 24 horas tras agotar los contactos activos mensuales sin que se regularizara.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

billing.payment_failed — Accounts · construido

Un cobro de la suscripción no pudo procesarse (solo suscripciones de Stripe). Se emite una vez por factura (el primer intento fallido); no se repite en los reintentos de cobro. No incluye las recargas de IA.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

billing.upcoming_charge — Accounts · construido

Se acerca el próximo cobro de la suscripción (solo suscripciones de Stripe); el aviso llega unos días antes de la fecha de cobro.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

device.connected — Accounts · construido

Uno de los números de WhatsApp de la cuenta quedó conectado: al escanear el código QR o al terminar el alta de un número de WhatsApp Cloud.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

device.disconnected — Accounts · construido

Uno de los números de WhatsApp de la cuenta se desconectó y dejó de poder enviar o recibir.

Solo números conectados por código QR: los de WhatsApp Cloud todavía no lo emiten.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

mac.expiring — Accounts · construido

Hay contactos activos mensuales que vencen en los próximos 7 días.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

mac.usage_100 — Accounts · construido

La cuenta agotó sus contactos activos mensuales del ciclo; se abre una gracia de 24 horas cuyo vencimiento viaja en grace_expires_at.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

mac.usage_80 — Accounts · construido

La cuenta alcanzó el 80% de sus contactos activos mensuales del ciclo.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

subscription.cancellation_confirmed — Accounts · construido

Quedó confirmada la cancelación de la suscripción (solo suscripciones de Stripe): se conserva el acceso hasta la fecha indicada.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

subscription.dormant_ending — Accounts · construido

El período de cuenta en reposo está por terminar (el aviso llega unos 7 días antes); en esa fecha se intenta el cobro indicado.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

subscription.reactivated — Accounts · construido

Se revirtió la cancelación programada de la suscripción (solo suscripciones de Stripe): sigue vigente y se renueva en la fecha indicada.

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

subscription.trial_ending — Accounts · construido

El período de prueba está por terminar; el aviso llega entre 1 y 3 días antes del final, según cómo se contrató (en las suscripciones de Stripe, el aviso de Stripe).

Fuente: catálogo del dominio (GET …/webhooks/events); estado según dominio.

Planificados (0) — todavía no se emiten

EventoDominioDescripciónNota

Suscribirse a un evento planificado

El catálogo (GET /api/v1/webhooks/events, con una clave con accounts:read) lista los eventos de las tres áreas. Cada entrada trae type, area (accounts, conversations o communities), label, description, status, subscribable y example con el cuerpo completo que vas a recibir; meta dice cuántos hay, cuántos se emiten y el formato de la firma.

status es active si el evento se emite y planned si se puede suscribir pero todavía no se emite. El alta de una suscripción acepta los planificados en events: suscribirte a uno no da error, pero no te llega nada hasta que se empiece a emitir.

  • Antes de depender de un evento, mirá su status en el catálogo: active se emite; planned, todavía no.
  • No hay comodín para «todos»: elegís cada tipo, así que solo recibís lo que pediste.
  • El ejemplo de un evento planificado puede cambiar antes de que se empiece a emitir.
  • webhook.test figura en el catálogo con subscribable: false: llega solo cuando pedís una prueba.

identity_type

Los eventos de communities que traen un participante (participant) lo identifican con identity e identity_type. v0 documenta un solo valor de identity_type: phone, y en ese caso identity es un teléfono con + (cómo buscarlo en la API). Pueden aparecer otros valores sin aviso.

Qué hacer: procesá identity como teléfono solo si identity_type es phone. Si llega un valor que no conocés, respondé 2xx igual e ignorá ese participante (o registralo para revisarlo): no es un error de la entrega.

Otros eventos y notas

  • webhook.test: la entrega de prueba que manda POST /api/v1/webhooks/{id}/test, firmada igual que un evento real. No se puede suscribir a él.
  • Accounts anuncia además 5 tipos planificados que no están en el catálogo v0 (DECISIONES-2026-10-04) y por eso no se listan arriba: billing.plan_blocked, subscription.expiring, ai_quota.low_balance, ai_quota.topup_succeeded, ai_quota.topup_failed.

Fuentes del catálogo por dominio: Conversations: catálogo del dominio (GET …/webhooks/events); Communities: catálogo del dominio (GET …/webhooks/events); Accounts: catálogo del dominio (GET …/webhooks/events).

  • message.status_changed se emite cuando cambia el estado de entrega de un mensaje que enviaste a un contacto, desde el chat, una automatización, un asistente de IA o con tu clave. No se emite para los mensajes de difusiones ni para los recibidos. Hay que pedirlo de forma explícita en events. Ver Estados de mensaje.
  • group.invite_link_down puede repetirse: si después de un link caído una sincronización vuelve a habilitar el grupo aunque el link siga muerto, la validación siguiente emite otro down. Tratá el evento como idempotente por grupo. (E32)
  • device.connected y device.disconnected (accounts) se suscriben en /api/v1/webhooks, como el resto; también llegan por el sistema anterior de accounts. Su data.device.number va sin +, y un número de WhatsApp Cloud todavía no emite device.disconnected. (E29, E30, E37)
  • Datos planificados dentro de message.received, no como eventos aparte: si el contacto llegó desde un anuncio (Click-to-WhatsApp) y si está respondiendo a una difusión. El ejemplo de hoy todavía no los trae.
  • Fuera de v0: puntaje de leads, pagos y redes sociales. (Q35)
  • Un evento entra al catálogo si un integrador actúa sobre él, no es una manguera de cambios, no expone datos internos ni perfila personas, y el dominio lo emite con test. (Q33)

En esta página

Construidos (48)broadcast.finished — Conversations · construidobroadcast.paused — Conversations · construidocontact.created — Conversations · construidocontact.stage_changed — Conversations · construidocontact.tag_added — Conversations · construidocontact.tag_removed — Conversations · construidoconversation.assigned — Conversations · construidoconversation.closed — Conversations · construidoflow.completed — Conversations · construidoflow.failed — Conversations · construidomessage.received — Conversations · construidomessage.status_changed — Conversations · construidotemplate.status_changed — Conversations · construidowhatsapp_form.completed — Conversations · construidocampaign.no_groups_available — Communities · construidocampaign.status_changed — Communities · construidodaily_report.generated — Communities · construidogroup.blocked — Communities · construidogroup.created — Communities · construidogroup.full — Communities · construidogroup.invite_link_down — Communities · construidogroup.invite_link_renewed — Communities · construidogroup.message_received — Communities · construidogroup.reaction_added — Communities · construidogroup.recovered — Communities · construidogroup_action.completed — Communities · construidogroup_action.failed — Communities · construidogroup_join_request.created — Communities · construidogroup_join_request.revoked — Communities · construidogroup_participant.joined — Communities · construidogroup_participant.left — Communities · construidopipeline.finished — Communities · construidopoll.voted — Communities · construidoscheduled_message.finished — Communities · construidoscheduled_message.group_delivery_failed — Communities · construidoscheduled_message.response_received — Communities · construidoaccount.blocked — Accounts · construidobilling.payment_failed — Accounts · construidobilling.upcoming_charge — Accounts · construidodevice.connected — Accounts · construidodevice.disconnected — Accounts · construidomac.expiring — Accounts · construidomac.usage_100 — Accounts · construidomac.usage_80 — Accounts · construidosubscription.cancellation_confirmed — Accounts · construidosubscription.dormant_ending — Accounts · construidosubscription.reactivated — Accounts · construidosubscription.trial_ending — Accounts · construidoPlanificados (0) — todavía no se emitenSuscribirse a un evento planificadoidentity_typeOtros eventos y notas