Skip to content

Send a reaction

Your application can add or remove a reaction on a specific message.

The endpoint is addressed by the target message’s message_id in the URL: there is no to field in the body, because the recipient is taken from the original message.

This page covers sending and removing reactions. To list the active reactions on a message, see Get reactions.

Before sending the reaction, Turbo Notify opens the conversation the way a person would: the number shows as online, the unread messages in the target message’s chat are marked as read, and only then is the reaction sent. See Mark as read.

Add a reaction

POST /v1/messages/{message_id}/react: adds a reaction to the message identified by {message_id} (format msg_{hex32}). This route acts on the main number. To react from an extra number, use the full form POST /v1/numbers/{ref}/messages/{message_id}/react with the number’s alias in the URL path.

reaction.sh
curl -X POST \
https://api.turbonotify.com/v1/messages/msg_01993c5a1b24d3e9f01a2b3c4d5e6f70/react \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"reaction": "🎉"
}'

Turbo Notify responds with an asynchronous acceptance:

HTTP status: 202
{
  "message_id": "msg_01993c5a1b24d3e9f01a2b3c4d5e6f70",
  "reaction_event_id": "op_reaction_a1b2c3d4e5f6",
  "status": {
    "state": "pending",
    "at": "2025-07-16T10:00:00Z"
  }
}

Remove a reaction

To remove a reaction you sent earlier, send the reaction property as null (or an empty string) to the same endpoint.

reaction.sh
curl -X POST \
https://api.turbonotify.com/v1/messages/msg_01993c5a1b24d3e9f01a2b3c4d5e6f70/react \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"reaction": null
}'

Turbo Notify responds with an asynchronous acceptance:

HTTP status: 202
{
  "message_id": "msg_01993c5a1b24d3e9f01a2b3c4d5e6f70",
  "reaction_event_id": "op_reaction_9f8e7d6c5b4a",
  "status": {
    "state": "pending",
    "at": "2025-07-16T10:00:05Z"
  }
}

The outcome arrives by webhook as message.reacted (success) or message.react.failed (failure). The failure payload includes the target message’s message_id, so you do not need request_id to match it.

Reacting from an extra number

To react from a registered, active extra number, put that number’s alias in the URL path. The recipient is still taken from the message_id.

reaction.sh
curl -X POST \
https://api.turbonotify.com/v1/numbers/vendas-sp/messages/msg_01993c5a1b24d3e9f01a2b3c4d5e6f70/react \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"reaction": "🎉"
}'

If the alias in the URL is not registered as an extra number, or the number is not active, the request is rejected.

Learn more about extra numbers.

Possible errors

StatusError codeDescription
400invalid_message_idThe message_id in the URL is not in the msg_{hex32} format.
402feature_not_availableThe feature is not available on your plan.
401not_authenticatedThe API key is invalid or missing.
403insufficient_scopeThe API key does not have the messages:send scope (the response includes required_scope).
404number_not_foundThe {ref} in the path does not match any number on the account (on the flat route: the account has no main number yet).
400invalid_number_idThe value in the URL starts with num_ but is not a valid number id.
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.
409number_not_connectedThe sending number is not connected to WhatsApp. Reconnect the number and try again.
422message_not_reactableThe target message has not been sent to WhatsApp yet, or has already been deleted.
422sender_not_foundThe alias or number given does not match any sender on the account.
422validation_errorThe request body is malformed or failed validation. The response includes details.errors with the list of invalid fields.
500internal_errorUnexpected internal server error.

A message that does not exist and a message from another number return the same not_found, on both routes (the shortcut without {ref} and the nested /numbers/{ref}/messages/...). If you know the message exists but got not_found, check that you are using the id (or current alias) of the number that sent or received it.