Skip to content

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

EventWhen
message.calendar_respondedA guest answered the event (going, not going or maybe) or changed the answer
message.editedThe event was edited or canceled, through the API or in the WhatsApp app. It carries content_type: "calendar"
message.edit.failedAn event edit made through the API was not applied

message.calendar_responded

data fields

FieldTypeDescription
idstringPublic id of the event that was answered (msg_{hex32}), the same one the send returned.
fromobjectThe 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}.
toobjectYour 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.
responsestringgoing, not_going or maybe.
extra_guestsintegerHow many extra guests the person brings. Omitted when they bring none.
directionstring"inbound" when the answer comes from a guest. "outbound" when the answer was given from the connected phone itself, as with a reaction.
channelstringAlways "whatsapp".
originstringAlways "native": the answer is given in the WhatsApp app.
atstringISO 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

message.calendar_responded (guest is going and brings 1 person)
{
"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

message.calendar_responded (maybe, 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_type is "calendar".
  • preview is the event name.
  • canceled: true appears only when the event was canceled. On an event that is not canceled the field does not exist.
  • origin is "tn" when the edit came from the API and "native" when the creator of the event edited it in the WhatsApp app.
message.edited (event changed through the API)
{
"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"
}
}
message.edited (event canceled through the API)
{
"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.