Reaction

React to a specific message with an emoji (👍, ❤️, 😂, etc.).

PUT
https://api.wawp.net/v2/send/reaction?access_token=YOUR_ACCESS_TOKEN&chatId=201234567890%40c.us&instance_id=123456789&messageId=false_20123456789%40c.us_3F351BFA105BA281C054&reaction=%F0%9F%91%8D

Authentication Required

Login to swap the placeholders with your real Instance ID and Access Token.

Log In
Test /v2/send/reaction endpoint
PUT
PUT

No query parameters required

This endpoint doesn't expect data in the URL.

Best practices

  • Use "reply_to" to maintain conversation context.

  • Handle distinct message types (text, image, video) appropriately.

  • Implement a robust retry mechanism for failed sends.

Micro-Interactions: Mastering the Message Reaction Engine

Reactions (/v2/send/reaction) are one of the most powerful micro-interactions in a modern messaging ecosystem. They allow users and bots to acknowledge information, express sentiment, or provide feedback without the friction of a full text reply. In a Wawp-powered application, reactions aren't just cosmetic; they are structural signals that can be used to track engagement, build interactive voting systems, or simplify bot-to-user acknowledgements.


🏗️ The Reaction Lifecycle Architecture

Unlike full messages, reactions are additive metadata attached to an existing message. Wawp’s reaction engine manages this attachment with high precision:

  1. Target Identification: The engine uses the messageId to locate the specific message on the WhatsApp backend. This must be the unique ID of an existing message in the chat identified by chatId.
  2. Emoji Normalization: While you can send any emoji, Wawp ensures the character is correctly encoded for the WhatsApp WebSocket. If you send an empty string (""), the engine interprets this as a "Delete Reaction" command, instructing the WhatsApp network to remove your previous sentiment from that particular message.
  3. Atomic Delivery: Reactions are delivered as light-weight, high-priority packets. This ensures that a reaction appears almost instantaneously on the recipient's phone, making the chat feel "Live" and responsive.

🛡️ Strategic Best Practices for Sentiment Engagement

1. The "Standard Set" Strategy

While WhatsApp supports any emoji as a reaction, users are most accustomed to the "Standard Quick Actions": 👍 (Acknowledgement), ❤️ (Love/Quality), 😂 (Laughter), 😮 (Surprise), 😢 (Sympathy), and 🙏 (Thanks).

  • UX Impact: By sticking to these standards, you match the user's muscle memory.
  • Compatibility: Rare or complex combined emojis (like multi-colored family units) can sometimes render inconsistently across older Android or Desktop versions. Standard emojis are universally safe.

2. Automated Acknowledgements

Modern bots shouldn't always respond with text.

  • Example: If a user says "Got it!" or "Thanks!", instead of the bot replying with "You're welcome!" (another message for the user to clear), have the bot react with a 👍 or 💙.
  • Value: This keeps the chat history clean while still providing the user with positive reinforcement that their input was received.

3. Removal and Cleanup

Don't let outdated sentiments linger.

  • Workflow: If your bot reacts with a ⏳ (Processing) while it’s working on a long task, make sure to call the endpoint again with an empty string "" to remove the ⏳ once the task is finished, or replace it with a ✅ (Done). This prevents the UI from becoming cluttered with conflicting status emojis.

🧩 Advanced Use Cases

Lightweight Interactive Voting

You can build a low-friction voting system by asking a question and having users react with different emojis for different options.

  • Logic: Use your Webhooks (message.reaction) للاستماع إلى التفاعلات الواردة من المستخدمين. Your backend then tallies the counts for each emoji type, enabling "Reactions-as-Votes" functionality without a single line of extra UI code.

Sentiment Monitoring for Human Agents

When an automated flow is running, have your system monitor the emojis users react with. If a user consistently reacts with 😢 or 😠 to bot messages, your system can interpret this as a "Frustration Signal" and automatically escalate the chat to a human agent.


🛠️ Common Pitfalls and Solutions

  • The "Missing ID" Error: If you provide a correctly formatted messageId but the message was sent too long ago (typically several weeks), the reaction may fail. Reactions are most reliable when applied to recent (active) conversation history.
  • Rapid Re-Reaction: Sending five different reactions to the same message in one second can be flagged as "Suspicious Scripting." Implement a small jitter or debounce (at least 200ms) between reaction updates to the same target message.
  • Encryption Resync: In rare cases, if a session's security keys are out of sync, a reaction might fail while standard text succeeds. A quick /v2/session/restart usually resolves these synchronization edge cases.

Summary of Capabilities:

  • Apply and remove native WhatsApp reactions (emojis) to any existing message.
  • Support for "Delete Reaction" via empty string payloads.
  • High-concurrency support for voting and acknowledgement systems.
  • Real-time event tracking through message.reaction Webhooks.
  • Lightweight and low-priority execution to minimize chat-history clutter.

Request Parameters

Configure the parameters required to interact with this endpoint. All query and body arguments are listed below with their details.

Request Body

Sent as a JSON object
string

Your unique WhatsApp Instance ID

Example:
string

Your API Access Token

Example:
string

Recipient's WhatsApp ID (JID). Supports Individuals (@c.us), Groups (@g.us), and Newsletters (@newsletter).

Example:
string

The ID of the message you want to react to.

Example:
string

The emoji reaction. Use an empty string to remove.

Example:

Request Samples

Use these ready-to-go code snippets to integrate our API into your project quickly and efficiently. Choose your preferred language and library.

1const baseUrl = "https://api.wawp.net";
2const endpoint = "/v2/send/reaction";
3const params = new URLSearchParams({
4 "instance_id": "123456789",
5 "access_token": "YOUR_ACCESS_TOKEN"
6}).toString();
7const body = {
8 "chatId": "201234567890@c.us",
9 "messageId": "false_20123456789@c.us_3F351BFA105BA281C054",
10 "reaction": "👍"
11};
12
13fetch(`${baseUrl}${endpoint}${params ? '?' + params : ''}`, {
14 method: "PUT",
15 headers: { "Content-Type": "application/json" },
16 body: JSON.stringify(body)
17})
18 .then(async (response) => {
19 if (response.ok) {
20 const data = await response.json();
21 console.log("Success:", data);
22 return data;
23 }
24
25 // Error Handling
26 if (response.status === 400) {
27 console.error("Error 400: Bad Request - Missing Required Parameter(s)");
28 }
29 if (response.status === 400) {
30 console.error("Error 400: Bad Request - Invalid Number (Egypt)");
31 }
32 if (response.status === 400) {
33 console.error("Error 400: Bad Request - Invalid Number (Saudi Arabia)");
34 }
35 if (response.status === 400) {
36 console.error("Error 400: Bad Request - Invalid Number (Unknown)");
37 }
38 if (response.status === 400) {
39 console.error("Error 400: Bad Request (XML Format)");
40 }
41 if (response.status === 400) {
42 console.error("Error 400: Bad Request (Plain Text)");
43 }
44 if (response.status === 401) {
45 console.error("Error 401: Unauthorized - Invalid or Missing Access Token");
46 }
47 if (response.status === 401) {
48 console.error("Error 401: Unauthorized (XML Format)");
49 }
50 if (response.status === 404) {
51 console.error("Error 404: Not Found - Session Does Not Exist");
52 }
53 if (response.status === 404) {
54 console.error("Error 404: Not Found (XML Format)");
55 }
56 if (response.status === 429) {
57 console.error("Error 429: Too Many Requests - Rate Limit Exceeded");
58 }
59 if (response.status === 500) {
60 console.error("Error 500: Internal Server Error - Unexpected Failure");
61 }
62 if (response.status === 500) {
63 console.error("Error 500: Internal Server Error (HTML)");
64 }
65 if (response.status === 502) {
66 console.error("Error 502: Bad Gateway - Connection Failed to Upstream");
67 }
68 if (response.status === 502) {
69 console.error("Error 502: Bad Gateway (XML Format)");
70 }
71
72 const errorText = await response.text();
73 console.error(`Error ${response.status}: ${errorText}`);
74 })
75 .catch((error) => console.error("Network Error:", error));
Interactive Samples
Ln 75, Col 1javascript

Expected Responses

Explore all possible responses and outcomes from the server. We have documented each status code with data examples to make success and error handling easier.

Message Sent Successfully
Type:
application/json
object *
string *
object *
number *
boolean *
string *
string *
number *
string *
string *
string *
boolean *
number *
boolean *
boolean *
boolean *
boolean *
boolean *
array *
array *
array *
boolean *
array *

Example

{
"_data": {
  "id": {
    "fromMe": true,
    "remote": "000000000000@c.us",
    "id": "MSG_ID_123456",
    "_serialized": "true_000000000000@c.us_MSG_ID_123456"
    },
  "viewed": false,
  "body": "BASE64_IMAGE_DATA",
  "type": "image",
  "t": 1759108866,
  "from": {
    "server": "c.us",
    "user": "111111111111",
    "_serialized": "111111111111@c.us"
    },
  "to": {
    "server": "c.us",
    "user": "000000000000",
    "_serialized": "000000000000@c.us"
    },
  "ack": 0,
  "isNewMsg": true,
  "star": false,
  "kicNotified": false,
  "caption": "Here's your requested image.",
  "deprecatedMms3Url": "https://example.com/media-url",
  "directPath": "/media/direct/path/example",
  "mimetype": "image/jpeg",
  "filehash": "FILE_HASH_PLACEHOLDER",
  "encFilehash": "ENC_FILE_HASH_PLACEHOLDER",
  "size": 192487,
  "mediaKey": "MEDIA_KEY_PLACEHOLDER",
  "mediaKeyTimestamp": 1759108865,
  "streamable": false,
  "mediaHandle": null,
  "isFromTemplate": false,
  "pollInvalidated": false,
  "isSentCagPollCreation": false,
  "latestEditMsgKey": null,
  "latestEditSenderTimestampMs": null,
  "mentionedJidList": {
    },
  "groupMentions": {
    },
  "isEventCanceled": false,
  "eventInvalidated": false,
  "isVcardOverMmsDocument": false,
  "isForwarded": false,
  "isQuestion": false,
  "questionReplyQuotedMessage": null,
  "questionResponsesCount": 0,
  "readQuestionResponsesCount": 0,
  "labels": {
    },
  "hasReaction": false,
  "disappearingModeInitiator": "chat",
  "disappearingModeTrigger": "chat_settings",
  "productHeaderImageRejected": false,
  "lastPlaybackProgress": 0,
  "isDynamicReplyButtonsMsg": false,
  "isCarouselCard": false,
  "parentMsgId": null,
  "callSilenceReason": null,
  "isVideoCall": false,
  "callDuration": null,
  "callCreator": null,
  "callParticipants": null,
  "isCallLink": null,
  "callLinkToken": null,
  "isMdHistoryMsg": false,
  "stickerSentTs": 0,
  "lastUpdateFromServerTs": 0,
  "invokedBotWid": null,
  "bizBotType": null,
  "botResponseTargetId": null,
  "botPluginType": null,
  "botPluginReferenceIndex": null,
  "botPluginSearchProvider": null,
  "botPluginSearchUrl": null,
  "botPluginSearchQuery": null,
  "botPluginMaybeParent": false,
  "botReelPluginThumbnailCdnUrl": null,
  "botMessageDisclaimerText": null,
  "botMsgBodyType": null,
  "requiresDirectConnection": false,
  "bizContentPlaceholderType": null,
  "hostedBizEncStateMismatch": false,
  "senderOrRecipientAccountTypeHosted": false,
  "placeholderCreatedWhenAccountIsHosted": false,
  "galaxyFlowDisabled": false,
  "links": {
    }
  },
"mediaKey": "MEDIA_KEY_PLACEHOLDER",
"id": {
  "fromMe": true,
  "remote": "000000000000@c.us",
  "id": "MSG_ID_123456",
  "_serialized": "true_000000000000@c.us_MSG_ID_123456"
  },
"ack": 0,
"hasMedia": true,
"body": "Here's your requested image.",
"type": "image",
"timestamp": 1759108866,
"from": "111111111111@c.us",
"to": "000000000000@c.us",
"deviceType": "android",
"isForwarded": false,
"forwardingScore": 0,
"isStatus": false,
"isStarred": false,
"fromMe": true,
"hasQuotedMsg": false,
"hasReaction": false,
"vCards": {
  },
"mentionedIds": {
  },
"groupMentions": {
  },
"isGif": false,
"links": {
  }
}
Bad Request - Missing Required Parameter(s)
Unauthorized - Invalid or Missing Access Token
Not Found - Session Does Not Exist
Too Many Requests - Rate Limit Exceeded
Internal Server Error - Unexpected Failure
Bad Gateway - Connection Failed to Upstream
Previous TopicStop Typing
Next TopicChat Management

Command Palette

Search for a command to run...