Calendar events
A calendar event your number sent (Send a calendar event) produces webhook events when a guest answers and when the event is edited or canceled. They arrive at the same webhook URL and through the same polling as the other events: see Webhook: setup and envelope for the signature and the envelope format.
Table
| Event | When |
|---|---|
message.calendar_responded | A guest answered the event (going, not going or maybe) or changed the answer |
message.edited | The event was edited or canceled, through the API or in the WhatsApp app. It carries content_type: "calendar" |
message.edit.failed | An event edit made through the API was not applied |
message.calendar_responded
data fields
| Field | Type | Description |
|---|---|---|
id | string | Public id of the event that was answered (msg_{hex32}), the same one the send returned. |
from | object | The guest who answered: {contact_id?, name?, number}. When the answer was given on the phone of your own number (direction: "outbound"), it is your line: {contact_id?, name?, alias, number}. |
to | object | Your number that received the answer, or the group the event was sent to ({group_id, name?}). For an outbound answer, it is the other person in the conversation ({contact_id?, name?, number}) or the group. |
response | string | going, not_going or maybe. |
extra_guests | integer | How many extra guests the person brings. Omitted when they bring none. |
direction | string | "inbound" when the answer comes from a guest. "outbound" when the answer was given from the connected phone itself, as with a reaction. |
channel | string | Always "whatsapp". |
origin | string | Always "native": the answer is given in the WhatsApp app. |
at | string | ISO 8601 in UTC with a Z suffix: when the answer was given on WhatsApp. |
Each answer from a guest is a new event. A guest who changes their mind produces another message.calendar_responded with the new answer; use at to tell which one is the latest. To see only the latest answer of each guest, with totals, read Get event responses.
Answers given before this event existed are not available.
Example: answer in a 1:1 chat
{ "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" }}Example: answer in a group
{ "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": "Team" }, "response": "maybe", "direction": "inbound", "channel": "whatsapp", "origin": "native", "at": "2026-11-03T12:10:00Z" }}message.edited for a calendar event
It is the same event as a message edit, with these differences:
content_typeis"calendar".previewis the event name.canceled: trueappears only when the event was canceled. On an event that is not canceled the field does not exist.originis"tn"when the edit came from the API and"native"when the creator of the event edited it in the WhatsApp app.
{ "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" }}To read the event after the edit, use GET /v1/numbers/{ref}/messages/{id} with the data.id.
A guest who already answered keeps the answer after an edit. The entry the guest created in their calendar with the “Add to calendar” button does not change and is not marked as canceled: see What happens to the guests, including when to edit and when to cancel and send a new event.
message.edit.failed for an event
It has the same shape as message.edit.failed. When error.code is message_secret_unavailable, this number can no longer change the event, for example because it was linked again after the event was sent. The error.hint tells you to send a new event. When it is calendar_edit_unavailable, the platform cannot change or cancel events at the moment, and the advice is the same. If WhatsApp refuses the edit after some time, the outcome is also a message.edit.failed.
See also: Edit or cancel a calendar event · Get event responses · Error codes.