This article covers sending messages, tracking status updates, and editing or deleting messages.
You can also use Wazzup's built-in interface for messaging, eliminating the need to develop, maintain, or customize your own dialog handling UI.
When using the methods listed below, include the end‑customer's client_access_token (obtained via simplified authorization or OAuth) in the request header: Authorization: Bearer client_access_token
POST /v2/messages — Send a message.PATCH /v2/messages/{message_id} — Edit a message.DELETE /v2/messages/{message_id} — Delete a message (supported transports only).POST /v2/messages/messages_dump — Create a job to download messages for a period.GET /v2/messages/messages_dump/{export_id} — Find out the status of the message download.Message sending is asynchronous. Upon successful submission, you receive a request_id. The presence of a request_id does not guarantee delivery — it simply indicates that Wazzup has accepted your message for processing. The final outcome and the actual message_id will be delivered via a webhook that updates the message status.
You cannot include both text (text parameter) and an attachment (attachment) in a single send request. Doing so will return the error: "Cannot provide more than one of text, attachment or template". Use separate requests to send text and a file.
POST /v2/messages| Body parameter. Required are marked with * | Type | Description |
channel_id* |
string(uuid) |
Channel ID |
quoted_message_id |
string(uuid) |
ID of the message being quoted |
recipient * |
object recipient |
Message recipient |
text |
string |
Message text. Either text or attachment must be provided. You cannot send both text and attachment in the same request |
attachment |
object attachment |
Attachment. Either text or attachment must be provided. You cannot send both text and attachment in the same request |
crm_user_id |
string |
CRM user ID |
reset_unanswered |
boolean |
Whether to reset the unanswered counter. Set to false to prevent the message from resetting the counter |
template |
object template |
Template object |
keyboard |
object keyboard |
Interactive buttons |
| Body parameter. Required are marked with * | Type | Description |
chat_type * |
string |
Chat type. Supported values:
|
chat_id |
string |
Chat ID — the contact's identifier in the messenger. The format depends on the chat type:
|
username |
string |
For Telegram only. Telegram username without the @ symbol. Use this when sending messages via Telegram if the chat_id is unknown |
phone |
string |
For Telegram and MAX only. Contact's phone number in international format, without the + or any other symbols: only digits with the correct country code. Can be used when sending messages via Telegram if the chat_id is unknown |
crm_contact_name |
string |
Contact name in the CRM |
| Body parameter. Required are marked with * |
Type | Description |
url * |
string |
Direct link to the file |
name |
string |
File name |
mimetype |
string(mime-type) |
MIME type of the file |
size |
number |
File size |
sha1 |
string(hex) |
SHA1 hash |
| Body parameter. Required are marked with * | Type | Description |
id * |
string(uuid) |
WABA template ID. See how to retrieve WABA template IDs |
values |
array(string) |
Values for template variables |
buttons |
array(object) |
Buttons attached to the WABA template. Use this only if you need to assign a payload to the buttons. Button labels are predefined in the template and do not need to be provided |
buttons.text |
string |
Button label |
buttons.type |
string |
Button type |
buttons.payload * |
string |
Button payload |
| Body parameter. Required are marked with * | Type | Description |
| For interactive WABA messages | ||
buttons * |
array(object) |
Array of button objects. Maximum 10. If more than 10 are provided, only the first 10 will be used |
buttons.text |
string |
Button label. Max 20 characters |
buttons.type |
string |
Button type |
buttons.payload * |
string |
Button payload |
| For Telegram Bot messages | ||
reply_markup |
string |
Telegram keyboard type: inline, reply |
one_time_keyboard |
boolean |
If true, the custom keyboard is hidden (not removed) after a button is pressed |
resize_keyboard |
boolean |
Adjusts keyboard size |
selective |
boolean |
Selective keyboard |
remove_keyboard |
boolean |
If true, removes the custom keyboard |
buttons* |
array |
An array of button objects. No more than 12. If there are more, only the first 12 will be sent. |
buttons[].text |
string |
For inline buttons. Button label. Max 64 characters. Buttons longer than 64 characters will not be sent. |
buttons[].url |
string(url) |
For inline buttons. URL to open when the button is clicked |
buttons[].callback_data |
string |
For inline buttons. Callback payload. Data sent back to the bot when the button is pressed. 1–64 bytes |
buttons[].text * |
string |
For reply buttons. Button label. Max 64 characters |
| For MAX Bot messages | ||
buttons * |
array of arrays |
Two-dimensional array of buttons |
buttons[].type * |
string |
Button type. Possible values: callback, link, message |
buttons[].text * |
string |
Button label for all types |
buttons[].payload * |
string |
Button payload. For callback type only |
buttons[].intent |
string |
Button intent. Possible values: default, positive, negative |
buttons[].url * |
string |
Button URL. For link type only |
curl -L 'https://tech.wazzup24.com/v2/messages' \
-H 'Authorization: Bearer <client_access_token>' \
-H 'Content-Type: application/json' \
-d '{
"channel_id": "020e3f61-e5df-447f-8ef9-ce8258e92c7a",
"recipient": {
"chat_type": "whatsapp",
"chat_id": "79999999999"
},
"text": "Hello World"
}'
curl -L 'https://tech.wazzup24.com/v2/messages' \
-H 'Authorization: Bearer <client_access_token>' \
-H 'Content-Type: application/json' \
-d '{
"channel_id": "020e3f61-e5df-447f-8ef9-ce8258e92c7a",
"recipient": {
"chat_type": "whatsapp",
"chat_id": "37193850059"
},
"attachment": {
"url": "https://drive.google.com/uc?export=download&id=123456test",
"name": "new.pdf",
"mimetype": "application/pdf",
"size": 86176,
"sha1": "153e030466873745ce4a66da02d0610a7ee6ce4f"
},
"crm_user_id": "crm-123"
}'
curl -L 'https://tech.wazzup24.com/v2/messages' \
-H 'Authorization: Bearer <client_access_token>' \
-H 'Content-Type: application/json' \
-d '{
"channel_id": "020e3f61-e5df-447f-8ef9-ce8258e92c7a",
"recipient": {
"chat_type": "whatsapp",
"chat_id": "37193850059"
},
"template": {
"id": "385bf0c5-9f2a-4f9f-be85-9b84d797cf95",
"values": [
"https://drive.google.com/uc?export=download&id=123456test"
]
},
"buttons": [
{
"text": "Thank you!",
"type": "text",
"payload": "yes"
},
{
"text": "I need more!",
"type": "text",
"payload": "yes"
},
{
"text": "I need even more!",
"type": "text",
"payload": "yes"
}
]
}'
Response example:
{
"data": {
"request_id": "9820d14f-66ae-4170-997f-0f06c0800664",
"chat_id": 79385005913
},
"meta": {
"timestamp": 1759492896
}
}
Result: The send request has been accepted. You will receive a webhook with the delivery status.
Editing is supported on the following channels:
Messages can be edited within 15 minutes of delivery. Learn more about how message editing works in our guide.
PATCH /v2/messages/{message_id}Path Parametersmessage_id — ID of the message to be edited.
| Body parameter. Required are marked with * | Type | Description |
text |
string |
Message text. Either text or attachment must be provided |
attachment |
object attachment |
Attachment object. Either text or attachment must be provided |
crm_user_id |
string |
CRM user ID of the person editing the message |
Example:
curl -L -X PATCH 'https://tech.wazzup24.com/v2/messages/8e074add-828d-4f35-afcc-99ccbfa9d0ae' \
-H 'Authorization: Bearer <client_access_token>' \
-H 'Content-Type: application/json' \
-d '{
"text": "Edited message"
}'
Response example:
{
"data": {
"message_id": "8e074add-828d-4f35-afcc-99ccbfa9d0ae",
"chat_id": "1234567890"
},
"meta": {
"timestamp": 1759397203
}
}
Result: Message message_id: 8e074add-828d-4f35-afcc-99ccbfa9d0ae has been edited.
Message deletion is supported on the following channels:
When a message is deleted, it is removed from the messenger for both the sender and the recipient. In the Wazzup iframe, the message will still appear but will be marked as deleted.
Learn more about how message deletion works in our guide.
DELETE /v2/messages/{message_id}Path Parametersmessage_id — ID of the message to be deleted.
Example:
curl -L -X DELETE 'https://tech.wazzup24.com/v2/messages/8a3f7a93-2b25-45da-8695-671bd56439e5' \ -H 'Authorization: Bearer <client_access_token>'
Response example:
{
"data": {
"message_id": "8a3f7a93-2b25-45da-8695-671bd56439e5",
"chat_id": "1234567890"
},
"meta": {
"timestamp": 1759397203
}
}
Result: Message message_id: 8a3f7a93-2b25-45da-8695-671bd56439e5 has been deleted.
The method creates a job to export messages for the specified period.
POST /v2/messages/messages_dumpRequest parameters
| Body parameter. Required are marked with * | Type | Description |
start_at* |
string |
Start of the message export period (ISO 8601) |
end_at* |
string |
End of the message export period (ISO 8601) |
channel_id |
string |
Channel ID if you need to get messages only from chats on this channel |
Request example:
{
"start_at": "2025-01-01T00:00:00.000Z",
"end_at": "2025-01-31T23:59:59.999Z",
"channel_id": "6a200e75-b1e6-4c92-950b-31801a31aa95"
}
Response example:
{
"data": {
"status": "pending",
"export_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
},
"meta": {
"timestamp": 1777885780
}
}
| Response parameters. Required are marked with * | Type | Description |
status* |
string |
Export status. Possible values:
|
export_id* |
string |
Job ID. Useful for checking the export status. |
Result: A job is created. When the export is ready, a link to a CSV file with messages will be sent in the webhook.
GET /v2/messages/messages_dump/{export_id}Path parameter
export_id — Job ID. Returned in the response to the POST /v2/messages/messages_dump request
Response example
{
"data": {
"status": "pending",
"url": null
},
"meta": {
"timestamp": 1777974260
}
}
Result: The job status is returned in the status field. Possible values:
pending — queued,processing — in progress,done — export is ready,webhook_failed — export is ready but failed to send: an error is returned.If the status is done or webhook_failed, a link to the export is also provided in the url field of the response.