Get reactions
After a message is sent or received, you can look up all of its active reactions. Each phone number can have at most one active reaction per message. The latest reaction sent replaces the previous one.
This page covers looking up reactions. To send or remove a reaction, see Send a reaction.
Get reactions
To list a message’s reactions, make a GET request with the message_id returned when you sent it.
Endpoint: GET /v1/messages/{message_id}/reactions for the main number. For extra numbers, use GET /v1/numbers/{ref}/messages/{message_id}/reactions, where {ref} is the number’s current alias or the number’s id (num_…, the message’s number_id).
Required scope: messages:read
Path parameters:
| Parameter | Type | Description |
|---|---|---|
ref | string | (extra number route only) Alias of the number the message belongs to (main or the alias of an extra number) or its id (num_…). |
message_id | string | Public message identifier (msg_{hex32}) |
curl -X GET \ https://api.turbonotify.com/v1/messages/msg_0198d3c5a1b24d3e9f01a2b3c4d5e6f7/reactions \ -H "Authorization: Bearer YOUR_KEY"const response = await fetch( 'https://api.turbonotify.com/v1/messages/msg_0198d3c5a1b24d3e9f01a2b3c4d5e6f7/reactions', { method: 'GET', headers: { 'Authorization': 'Bearer YOUR_KEY' } });
const result = await response.json();console.log(result);import requests
url = "https://api.turbonotify.com/v1/messages/msg_0198d3c5a1b24d3e9f01a2b3c4d5e6f7/reactions"headers = { "Authorization": "Bearer YOUR_KEY"}
response = requests.get(url, headers=headers)result = response.json()print(result)package main
import ( "fmt" "io" "net/http")
func main() { req, _ := http.NewRequest("GET", "https://api.turbonotify.com/v1/messages/msg_0198d3c5a1b24d3e9f01a2b3c4d5e6f7/reactions", nil) req.Header.Set("Authorization", "Bearer YOUR_KEY") resp, _ := http.DefaultClient.Do(req) defer resp.Body.Close() body, _ := io.ReadAll(resp.Body) fmt.Println(string(body))}<?php$url = 'https://api.turbonotify.com/v1/messages/msg_0198d3c5a1b24d3e9f01a2b3c4d5e6f7/reactions';
$options = [ 'http' => [ 'header' => [ 'Authorization: Bearer YOUR_KEY' ], 'method' => 'GET' ]];
$context = stream_context_create($options);$result = file_get_contents($url, false, $context);$response = json_decode($result, true);var_dump($response);?>var client = new HttpClient();client.DefaultRequestHeaders.Add("Authorization", "Bearer YOUR_KEY");
var response = await client.GetAsync( "https://api.turbonotify.com/v1/messages/msg_0198d3c5a1b24d3e9f01a2b3c4d5e6f7/reactions");var result = await response.Content.ReadAsStringAsync();Console.WriteLine(result);import java.net.http.*;import java.net.URI;
public class TurboNotify { public static void main(String[] args) throws Exception { var client = HttpClient.newHttpClient();
var request = HttpRequest.newBuilder() .uri(URI.create("https://api.turbonotify.com/v1/messages/msg_0198d3c5a1b24d3e9f01a2b3c4d5e6f7/reactions")) .header("Authorization", "Bearer YOUR_KEY") .GET() .build();
var response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.body()); }}Response examples
With reactions
HTTP status: 200
{
"message_id": "msg_0198d3c5a1b24d3e9f01a2b3c4d5e6f7",
"reactions": [
{
"from": {
"number": "5511988887777",
"contact_id": "ct_a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4",
"name": "Ana Souza"
},
"emoji": "👍",
"at": "2025-07-16T10:05:00Z",
"direction": "inbound"
},
{
"from": {
"number": "5511977776666"
},
"emoji": "❤️",
"at": "2025-07-16T10:06:30Z",
"direction": "inbound"
}
]
} No reactions
HTTP status: 200
{
"message_id": "msg_0198d3c5a1b24d3e9f01a2b3c4d5e6f7",
"reactions": []
} Response structure
| Field | Type | Description |
|---|---|---|
message_id | string | Public message identifier. |
reactions | array | List of active reactions (one per phone number). |
reactions[].from | object | Sender of the reaction. |
reactions[].from.number | string | Phone number of who reacted (without +). |
reactions[].from.contact_id | string | Public contact identifier (ct_{hex32}). Omitted when not available. |
reactions[].from.name | string | Sender’s name on WhatsApp. Omitted when not available. |
reactions[].emoji | string | Reaction emoji. |
reactions[].at | string | ISO 8601 date and time when the reaction was recorded. |
reactions[].direction | string | "inbound" (reaction from a contact) or "outbound" (reaction from the organization’s number). |
Possible errors
| Status | Error code | Description |
|---|---|---|
401 | not_authenticated | The API key is invalid or missing. |
403 | insufficient_scope | The API key does not have the messages:read scope. |
404 | not_found | The 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. |
404 | number_not_found | (only on the route with {ref}) The alias or id in the URL does not match any registered number. |
400 | invalid_number_id | (only on the route with {ref}) The value in the URL starts with num_ but is not a valid number id. |
500 | internal_error | Unexpected internal server error. |