Skip to content

Get event responses

After you send a calendar event, guests answer on WhatsApp: going, not going or maybe, with or without extra guests. This page shows how to read those answers. Each guest has one answer per event, and the latest replaces the previous one.

To be told the moment someone answers, use the message.calendar_responded webhook event (see Calendar events). Answers given before this feature existed are not available.

Get responses

Endpoint: GET /v1/messages/{message_id}/responses for the main number. For extra numbers, use GET /v1/numbers/{ref}/messages/{message_id}/responses, where {ref} is the number’s current alias or its id (num_…, the message’s number_id).

Required scope: messages:read

Path parameters:

ParameterTypeDescription
refstring(only on the extra number route) Alias of the number the event belongs to (main or the alias of an extra number) or its id (num_…).
message_idstringPublic id of the calendar event (msg_{hex32}), the same one the send returned.
turbo-notify.sh
curl -X GET \
https://api.turbonotify.com/v1/messages/msg_01993c5a1b24d3e9f01a2b3c4d5e6f70/responses \
-H "Authorization: Bearer YOUR_KEY"

Response examples

With responses

Responses are listed from the newest to the oldest.

HTTP status: 200
{
  "message_id": "msg_01993c5a1b24d3e9f01a2b3c4d5e6f70",
  "counts": {
    "going": 2,
    "not_going": 1,
    "maybe": 1,
    "extra_guests": 3
  },
  "responses": [
    {
      "from": {
        "number": "5511999990004",
        "name": "Marina Costa"
      },
      "response": "going",
      "at": "2026-11-03T15:30:00Z"
    },
    {
      "from": {
        "number": "5511999990003",
        "name": "Carlos Lima"
      },
      "response": "maybe",
      "extra_guests": 1,
      "at": "2026-11-03T12:10:00Z"
    },
    {
      "from": {
        "number": "5511999990002",
        "contact_id": "ct_a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4",
        "name": "Ana Souza"
      },
      "response": "going",
      "extra_guests": 2,
      "at": "2026-11-03T12:00:00Z"
    },
    {
      "from": {
        "number": "5511999990005"
      },
      "response": "not_going",
      "at": "2026-11-03T11:45:00Z"
    }
  ]
}

No responses

HTTP status: 200
{
  "message_id": "msg_01993c5a1b24d3e9f01a2b3c4d5e6f70",
  "counts": {
    "going": 0,
    "not_going": 0,
    "maybe": 0,
    "extra_guests": 0
  },
  "responses": []
}

Response structure

FieldTypeDescription
message_idstringPublic id of the event.
countsobjectTotals of the latest answers. Always carries the four keys.
counts.goingintegerGuests whose latest answer is going.
counts.not_goingintegerGuests whose latest answer is not_going.
counts.maybeintegerGuests whose latest answer is maybe.
counts.extra_guestsintegerTotal extra guests brought by those who answered going or maybe.
responsesarrayThe latest answer of each guest, from the newest to the oldest.
responses[].fromobjectThe guest.
responses[].from.numberstringGuest phone number (without +).
responses[].from.namestringThe guest’s name on WhatsApp. Omitted when not available.
responses[].from.contact_idstringPublic id of the contact (ct_{hex32}). Omitted when not available.
responses[].responsestringgoing, not_going or maybe.
responses[].extra_guestsintegerExtra guests the person brings. Appears only when greater than zero.
responses[].atstringISO 8601 date and time when the answer was given.

The data follows the same period as reactions: answers are kept for 12 months together with the message. The content of the event (name, description, place) follows your plan’s content period. See Retention.

Possible errors

StatusError codeDescription
400invalid_message_idThe message_id is not in the msg_{hex32} format.
400message_not_calendarThe message is not a calendar event.
401not_authenticatedThe API key is invalid or missing.
403insufficient_scopeThe API key does not have the messages:read scope.
404not_foundThe message was not found, belongs to another organization, or belongs to a number other than the one in the URL (on the shortcut route without {ref}, the main number): all of these cases return the same response, with no distinction.
404number_not_found(only on the route with {ref}) The alias or id in the URL does not match any registered number.
400invalid_number_id(only on the route with {ref}) The value in the URL starts with num_ but is not a valid number id.
500internal_errorUnexpected internal server error.