curl --request POST \
--url https://api.wppfy.com/send/text \
--header 'Content-Type: application/json' \
--header 'token: <api-key>' \
--data '
{
"number": "5511999999999",
"text": "Olá! Como posso ajudar?"
}
'{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"messageid": "<string>",
"chatid": "<string>",
"sender": "<string>",
"senderName": "<string>",
"isGroup": false,
"fromMe": false,
"messageType": "<string>",
"source": "<string>",
"messageTimestamp": 0,
"status": "<string>",
"text": "",
"quoted": "",
"edited": "",
"reaction": "",
"vote": "",
"convertOptions": "",
"buttonOrListid": "",
"owner": "",
"error": "",
"content": {},
"wasSentByApi": true,
"pinned": true,
"sendFunction": "<string>",
"sendPayload": {},
"fileURL": "<string>",
"callPeer": {
"jid": "<string>",
"name": "<string>",
"imagePreviewUrl": "<string>"
},
"send_folder_id": "<string>",
"track_source": "<string>",
"track_id": "<string>",
"ai_metadata": {
"agent_id": "<string>",
"turn": "<string>",
"flow_id": "<string>",
"request": {
"messages": "<array>",
"tools": "<array>",
"options": {
"model": "<string>",
"temperature": 123,
"maxTokens": 123,
"topP": 123,
"frequencyPenalty": 123,
"presencePenalty": 123
}
},
"response": {
"choices": "<array>",
"toolResults": "<array>",
"error": "<string>"
},
"outcome": {
"status": "sent",
"texts": 123,
"audio": true,
"menus": 123,
"files": 123,
"handoff": "<string>",
"lead": [
"<string>"
],
"detail": "<string>"
}
},
"sender_pn": "<string>",
"sender_lid": "<string>",
"sender_image_preview_url": "<string>",
"response": {
"status": "success",
"message": "Message sent successfully"
}
}Send text message
Sends a text message to a contact, group, or channel/newsletter.
Specific Features
- Link previews with support for automatic or custom personalization
- Basic text formatting
- Automatic replacement of dynamic placeholders
Sending to a Newsletter
To send text to a channel, use the same number field, but provide the full channel JID:
- Example:
120363123456789012@newsletter
{
"number": "120363123456789012@newsletter",
"text": "Post publicado no canal"
}
Replying to a poll, list, or button
Use this same endpoint to reply to an interactive message that is stored in the instance’s local history. Send:
number: chat where the original message was received or sent;replyid: ID of the original interactive message;text: selection starting with>.
The > marker is required to generate an interactive reply. Without it,
the API only sends a text message quoting the original.
Replying to a poll
Use the option’s position, starting at 1. In this public documentation, reply to only one option per request.
{
"number": "5511999999999",
"replyid": "3EB0ID_DA_ENQUETE",
"text": ">1"
}
Replying to a list
Prefer the rowId configured when creating the list. The exact text
of the item or its position (>1) is also accepted.
{
"number": "5511999999999",
"replyid": "3EB0ID_DA_LISTA",
"text": ">plano_pro"
}
Replying to a button
Prefer the quick reply button ID. The exact displayed text or its
position (>1) is also accepted. This applies to legacy quick buttons,
templates, native flow, and carousel. URL, call, or copy buttons perform
their own action and are not replied to through this flow.
{
"number": "5511999999999",
"replyid": "3EB0ID_DOS_BOTOES",
"text": ">confirmar"
}
The API returns an error when the original message is not available or the provided option does not exist.
Common Fields
This endpoint supports all common optional fields documented in the “Send Message” tag, including:
delay, readchat, readmessages, replyid, mentions, forward, track_source, track_id, placeholders, and sending to groups.
Link Previews
Automatic Preview
{
"number": "5511999999999",
"text": "Confira: https://exemplo.com",
"linkPreview": true
}
Custom Preview
{
"number": "5511999999999",
"text": "Confira nosso site! https://exemplo.com",
"linkPreview": true,
"linkPreviewTitle": "Título Personalizado",
"linkPreviewDescription": "Uma descrição personalizada do link",
"linkPreviewImage": "https://exemplo.com/imagem.jpg",
"linkPreviewLarge": true
}
curl --request POST \
--url https://api.wppfy.com/send/text \
--header 'Content-Type: application/json' \
--header 'token: <api-key>' \
--data '
{
"number": "5511999999999",
"text": "Olá! Como posso ajudar?"
}
'{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"messageid": "<string>",
"chatid": "<string>",
"sender": "<string>",
"senderName": "<string>",
"isGroup": false,
"fromMe": false,
"messageType": "<string>",
"source": "<string>",
"messageTimestamp": 0,
"status": "<string>",
"text": "",
"quoted": "",
"edited": "",
"reaction": "",
"vote": "",
"convertOptions": "",
"buttonOrListid": "",
"owner": "",
"error": "",
"content": {},
"wasSentByApi": true,
"pinned": true,
"sendFunction": "<string>",
"sendPayload": {},
"fileURL": "<string>",
"callPeer": {
"jid": "<string>",
"name": "<string>",
"imagePreviewUrl": "<string>"
},
"send_folder_id": "<string>",
"track_source": "<string>",
"track_id": "<string>",
"ai_metadata": {
"agent_id": "<string>",
"turn": "<string>",
"flow_id": "<string>",
"request": {
"messages": "<array>",
"tools": "<array>",
"options": {
"model": "<string>",
"temperature": 123,
"maxTokens": 123,
"topP": 123,
"frequencyPenalty": 123,
"presencePenalty": 123
}
},
"response": {
"choices": "<array>",
"toolResults": "<array>",
"error": "<string>"
},
"outcome": {
"status": "sent",
"texts": 123,
"audio": true,
"menus": 123,
"files": 123,
"handoff": "<string>",
"lead": [
"<string>"
],
"detail": "<string>"
}
},
"sender_pn": "<string>",
"sender_lid": "<string>",
"sender_image_preview_url": "<string>",
"response": {
"status": "success",
"message": "Message sent successfully"
}
}Authorizations
Body
ID of the chat the message will be sent to. Can be a phone number in international format, a group ID (@g.us), a user ID (with @s.whatsapp.net or @lid) or a channel/newsletter ID (@newsletter).
"5511999999999"
Message text. To reply to a poll, list, or button, use a selection starting with > together with replyid. Accepts placeholders in regular text messages.
"Hello {{name}}! How can I help?"
Enables/disables link previews. If true, automatically looks for a link in the text to generate a preview.
Behavior:
- If only linkPreview=true: generates an automatic preview of the first link found in the text
- If custom fields are provided (title, description, image): uses the provided values
- If custom fields are partial: combines them with automatic link data as fallback
- Title or description containing only whitespace: the preview is generated without that field, without fetching from the link
true
Sets a custom title for the link preview. Empty uses the link's title; with only a space (" "), the preview has no title.
"Custom Title"
Sets a custom description for the link preview. Empty uses the link's description; with only a space (" "), the preview has no description.
"Custom link description"
URL or Base64 of the image to use in the link preview
"https://exemplo.com/imagem.jpg"
If true, generates a large preview with image upload. If false, generates a small preview without upload
true
Original message ID. With text starting with >, generates the native poll, list or button reply when the original type is supported.
"3EB0538DA65A59F6D8A251"
Numbers to mention (comma separated)
"5511999999999,5511888888888"
Marks chat as read after sending
true
Marks latest received messages as read
true
Delay in milliseconds before sending; during delay 'Typing...' will appear
1000
Marks the message as forwarded on WhatsApp
true
Message tracking source
"chatwoot"
ID for message tracking (accepts duplicate values)
"msg_123456789"
If true, sends the message asynchronously via the internal queue. Useful for high message volume.
false
Response
Message sent successfully
Represents a message exchanged in the system
Internal unique message ID (format r + 7 random hex characters)
Original message ID at the provider
Related conversation ID
Message sender ID
Sender's display name
Indicates whether it is a group message
Indicates whether the message was sent by the user
Message content type
Message source platform
Original message timestamp in milliseconds
Message lifecycle status.
Common examples: Queued, Canceled, Failed, Sent, Delivered, Read.
In group messages, it follows the most advanced participant: Delivered when at least one received it, Read when at least one read it, and Played when at least one listened to it.
Original message text
ID of the quoted/replied message
Message edit history
ID of the reacted message
Poll and list voting data
Conversion of message options, list, poll and buttons
ID of the selected button or list item
Message owner
Error message if sending failed
Raw message content (serialized JSON or text)
Indicates whether the message was sent via API
Message pinned in the conversation (pin and unpin also arrive in messages_update, types Pinned and Unpinned)
Function used to send the message (when sent via API)
Payload used in the send when available. Base64 media data is omitted.
Message file URL or reference
Known contact associated with a call, when available in messageType: call.
Show child attributes
Show child attributes
Folder associated with the send (when applicable)
Tracking source
Tracking ID (may repeat)
Record of an AI round. The full one (request to the model, response, and outcome) is stored once, on the contact's last message that the round replied to, even when nothing went out (error, discarded response). Each message sent by the AI carries only agent_id and turn (the id of that contact message).
Show child attributes
Show child attributes
Sender's resolved PN JID (when available)
Sender's original LID (when available)
Temporary preview URL of the sender, when known. Hydration in this version fills in messages received in groups; the field may be omitted. It does not trigger a photo query to WhatsApp during listing.
Show child attributes
Show child attributes
