Send Message
This endpoint is used to send a message to a chat
Documentation Index
Fetch the complete documentation index at: https://docs.periskope.app/llms.txt
Use this file to discover all available pages before exploring further.
Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Headers
Please provide the number of the phone you want to call with this API in the header. The number must be in country code + number format without any characters or spaces, e.g. 919876543210; Alternatively, provide the phone_id (phone-xxxxxxxxxxxx) in the header
"{{orgPhone}}"
Body
- For groups, enter the chat_id of the group. This will be a string that ends with @g.us
- For 1-1 chats, enter the country_code + number of the recipient e.g. 919537851844@c.us (The @c.us is optional)
"919537851844@c.us"
The text body or caption. You can use basic markdown formatting supported by WhatsApp e.g. * for bold, and _ for italic, etc.
Media object containing file information and content
Note: You must specify either filedata or url
pollName- The question or title of the pollpollOptions- Raw bytes of the file, represented in base64options- Additional options to be sent with the pollallowMultipleAnswers- Boolean. When set to true, respondents can select multiple optionspollId- Optional unique identifier of the poll. Useful when sending it across multiple chats
To reply to a message, add the message_id in this field
hide_url_preview- Set it to true to disable automatic link previews in the messages containing URLs
Response
Text Message / Media Message / Reply Message / Poll Message
The response object confirms that your message request has been accepted and added to the processing queue for asynchronous delivery.
What you receive:
queue_id— A unique identifier for your enqueued message task. Save this value to track your message's progress, correlate it with webhook events, or reference it in support requests.queue_position— Your message's position in the processing queue at the moment it was enqueued. This is zero-based (0 = first in queue, 1 = second, etc.). Note that this position reflects the queue state at enqueue time and may change as other messages are processed.status— The initial status of the message, alwaysqueuedat this point.unique_id— A provisional identifier (when available) that helps correlate the queued request with downstream message objects or WhatsApp provider references.track_by— A convenience object with ready-to-use tracking URLs. Usetrack_by.unique_idto poll delivery status viaGET /message/{unique_id}/status, ortrack_by.queue_idto look up the job via the queue API.
Understanding the queue system:
- Messages are NOT sent immediately upon receiving this response. Instead, they are queued and processed asynchronously in the background.
- Processing typically begins within seconds, but actual timing depends on:
- Current queue depth and system throughput
- Message type and size (text messages are faster than media)
- Media file size and processing requirements
- Rate limits applied to your phone number or organization
- WhatsApp provider connectivity and response times
- The system automatically retries failed messages for transient errors (network issues, temporary provider unavailability, etc.). Messages will be retried up to 3 times with exponential backoff delays between attempts. After 3 failed attempts, the message will be marked as failed and no further retries will occur.
How the queue_id maps to your message:
- When you receive the
queue_id, your message is in a "queued" state - Once processing begins, the
queue_idbecomes associated with a provisionalsent_message_idin the message object - After successful delivery to WhatsApp, the
queue_idmaps to the final provider message ID - You can use the
queue_idto track the message through its entire lifecycle: queued → processing → sent → delivered → read (or failed)
Tracking your message status: You have two primary methods to monitor your message:
-
Message Status API — Use
GET /message/{unique_id}/statusto check the delivery status of your message. Theunique_idis returned in this response. The status field can be one of:queued— Waiting to be processedsending— Currently being sent to WhatsAppsent— Successfully sent to WhatsApp serversdelivered— Delivered to the recipient's deviceread— Read by the recipientfailed— Delivery failed after all retry attempts (checkstatus_descriptionfor reason)
-
Webhook notifications — If you have webhooks configured, you'll automatically receive real-time events as your message progresses:
message.sent— Fired when the message is successfully sent to WhatsAppmessage.delivered— Fired when the message is delivered to the recipientmessage.read— Fired when the message is read (requires read receipts to be enabled)message.failed— Fired if the message fails to send or deliver after all retry attempts- Each webhook event includes the
queue_idso you can correlate it with your original request
Error handling and retries:
- If a message fails due to transient errors (network issues, temporary provider unavailability, timeouts), the system will automatically retry the message
- Messages are retried up to 3 times with exponential backoff delays (the delay increases with each retry attempt)
- Permanent failures (invalid chat_id, blocked numbers, etc.) will not be retried
- After 3 failed retry attempts, the message status will be set to
failedand you'll receive amessage.failedwebhook event if configured
Best practices:
- Always save the
queue_idimmediately after receiving the response - Don't poll the queue status too frequently (recommended: every 1-2 seconds for active monitoring, or use webhooks for real-time updates)
- Implement proper error handling for failed messages
- Use webhooks when possible for more efficient, event-driven tracking
- Monitor your message status and handle failed messages appropriately in your application
Related documentation:
- Message Status API — Track delivery status by unique_id
- List Queue Jobs API — Query job status by queue_id or broadcast_id
- Queue Health API — Check the overall status of the message queue
- Webhooks Documentation — Guide to setting up and handling webhook events