Eventos de calendário
Um evento de calendário enviado pelo número (Enviar evento de calendário) gera eventos de webhook quando um convidado responde e quando o evento é editado ou cancelado. Eles chegam à mesma URL de webhook e no mesmo polling dos demais eventos: veja Webhook: configuração e envelope para a assinatura e o formato do envelope.
Tabela
| Evento | Quando |
|---|---|
message.calendar_responded | Um convidado respondeu ao evento (vai, não vai ou talvez) ou trocou a resposta |
message.edited | O evento foi editado ou cancelado, pela API ou pelo aplicativo do WhatsApp. Traz content_type: "calendar" |
message.edit.failed | A edição de um evento pela API não foi feita |
message.calendar_responded
Campos de data
| Campo | Tipo | Descrição |
|---|---|---|
id | string | Identificador público do evento respondido (msg_{hex32}), o mesmo que o envio devolveu. |
from | object | O convidado que respondeu: {contact_id?, name?, number}. Quando a resposta foi dada no celular do seu próprio número (direction: "outbound"), é a sua linha: {contact_id?, name?, alias, number}. |
to | object | O seu número que recebeu a resposta, ou o grupo em que o evento foi enviado ({group_id, name?}). Em uma resposta outbound, é a outra pessoa da conversa ({contact_id?, name?, number}) ou o grupo. |
response | string | going (vai), not_going (não vai) ou maybe (talvez). |
extra_guests | integer | Quantos convidados extras a pessoa leva. Omitido quando ela não leva nenhum. |
direction | string | "inbound" quando a resposta vem de um convidado. "outbound" quando a resposta foi dada pelo próprio celular conectado, como acontece com uma reação. |
channel | string | Sempre "whatsapp". |
origin | string | Sempre "native": a resposta é dada no aplicativo do WhatsApp. |
at | string | ISO 8601 em UTC com sufixo Z: momento em que a resposta foi dada no WhatsApp. |
Cada resposta de um convidado é um evento novo. Quem muda de ideia gera outro message.calendar_responded com a resposta nova; use o at para saber qual é a mais recente. Para ver só a última resposta de cada convidado, com os totais, leia Consultar respostas de um evento.
As respostas dadas antes de este evento existir não estão disponíveis.
Exemplo: resposta em conversa 1:1
{ "id": "evt_5e0b7a3c9d1f4e28a6c4b2d9e8f70a13", "type": "message.calendar_responded", "organization_id": "org_a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4", "number_alias": "main", "number_id": "num_0a1b2c3d4e5f60718293a4b5c6d7e8f9", "created_at": "2026-11-03T12:00:02Z", "data": { "id": "msg_01993c5a1b24d3e9f01a2b3c4d5e6f70", "from": { "contact_id": "ct_a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4", "name": "Ana Souza", "number": "5511999990002" }, "to": { "name": "Turbo Notify", "alias": "main", "number": "5511999990001" }, "response": "going", "extra_guests": 1, "direction": "inbound", "channel": "whatsapp", "origin": "native", "at": "2026-11-03T12:00:00Z" }}Exemplo: resposta em grupo
{ "id": "evt_9a8b7c6d5e4f43a2b1c0d9e8f7a6b5c4", "type": "message.calendar_responded", "organization_id": "org_a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4", "number_alias": "main", "number_id": "num_0a1b2c3d4e5f60718293a4b5c6d7e8f9", "created_at": "2026-11-03T12:10:02Z", "data": { "id": "msg_01993c5a1b24d3e9f01a2b3c4d5e6f70", "from": { "name": "Carlos Lima", "number": "5511999990003" }, "to": { "group_id": "grp_e442553a56b14e2695f6acfd7d651b1a", "name": "Equipe" }, "response": "maybe", "direction": "inbound", "channel": "whatsapp", "origin": "native", "at": "2026-11-03T12:10:00Z" }}message.edited de um evento de calendário
É o mesmo evento de edição de mensagem, com estas diferenças:
content_typeé"calendar".previewé o nome do evento.canceled: trueaparece só quando o evento foi cancelado. Em um evento que não está cancelado o campo não existe.originé"tn"quando a edição veio da API e"native"quando quem criou o evento o editou no aplicativo do WhatsApp.
{ "id": "evt_4d3c2b1a0f9e48d7c6b5a4f3e2d1c0b9", "type": "message.edited", "organization_id": "org_a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4", "number_alias": "main", "number_id": "num_0a1b2c3d4e5f60718293a4b5c6d7e8f9", "created_at": "2026-11-02T14:05:01Z", "data": { "id": "msg_01993c5a1b24d3e9f01a2b3c4d5e6f70", "from": { "name": "Turbo Notify", "alias": "main", "number": "5511999990001" }, "to": { "name": "Ana Souza", "number": "5511999990002" }, "preview": "Sprint Planning", "content_type": "calendar", "direction": "outbound", "channel": "whatsapp", "origin": "tn", "at": "2026-11-02T14:05:00Z" }}{ "id": "evt_0f1e2d3c4b5a49687766554433221100", "type": "message.edited", "organization_id": "org_a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4", "number_alias": "main", "number_id": "num_0a1b2c3d4e5f60718293a4b5c6d7e8f9", "created_at": "2026-11-02T15:00:01Z", "data": { "id": "msg_01993c5a1b24d3e9f01a2b3c4d5e6f70", "from": { "name": "Turbo Notify", "alias": "main", "number": "5511999990001" }, "to": { "name": "Ana Souza", "number": "5511999990002" }, "preview": "Sprint Planning", "content_type": "calendar", "direction": "outbound", "channel": "whatsapp", "origin": "tn", "canceled": true, "at": "2026-11-02T15:00:00Z" }}Para ler o evento depois da edição, use GET /v1/numbers/{ref}/messages/{id} com o data.id.
Quem já respondeu continua com a resposta depois de uma edição. A entrada que o convidado criou na agenda com o botão “Adicionar ao calendário” não muda nem é marcada como cancelada: veja O que acontece com os convidados, inclusive quando editar e quando cancelar e enviar um novo evento.
message.edit.failed de um evento
Tem a mesma forma de message.edit.failed. Quando error.code é message_secret_unavailable, este número não pode mais alterar o evento, por exemplo porque foi vinculado de novo depois do envio. O error.hint orienta a enviar um novo evento. Quando é calendar_edit_unavailable, a plataforma não consegue alterar nem cancelar eventos no momento, e a orientação é a mesma. Se o WhatsApp recusar a edição depois de algum tempo, o desfecho também é um message.edit.failed.
Veja também: Editar ou cancelar um evento de calendário · Consultar respostas de um evento · Códigos de erro.