Send messages across every channel (TEXT, media, TEMPLATE, INTERACTIVE) through a single REST endpoint. Addressing is channel-agnostic β supply a channel + recipient and the conversation is resolved-or-created for you.
Send a message
Send a message to a contact on any channel β WhatsApp Official/Unofficial, Instagram, Facebook, Telegram, or Webchat.
Addressing. Provide channel_id (the inbox/number to send from β get it from GET /inboxes or GET /channels/by-identifier) plus a to recipient. The server resolves-or-creates the conversation automatically, so you never manage conversation_id. To reply inside a known thread, pass conversation_id instead of to.
Recipient by channel β what to put in to:
| Channel | How to address (to) |
|---|---|
| WHATSAPP_OFFICIAL / WHATSAPP_UNOFFICIAL | to.phone = full international number, e.g. 628123456789 |
to.type = external_id, to.value = the Instagram-scoped user id | |
to.type = external_id, to.value = the Page-scoped PSID | |
| TELEGRAM | to.type = external_id, to.value = the Telegram user id |
| WEBCHAT | reply via conversation_id (webchat visitors have no dialable address) |
For Instagram / Facebook / Telegram the recipient id is the platform-scoped user id captured on inbound webhooks (stored as the contact's external_id). On any channel you can reply inside an existing thread by passing conversation_id instead of to.
Phone format. to.phone is the full international number with the country code included and no leading 0 (e.g. 628123456789) β do not send a separate country code.
Message types & channel support:
| Type | WA Official | WA Unofficial | Telegram | Webchat | ||
|---|---|---|---|---|---|---|
| TEXT | Yes | Yes | Yes | Yes | Yes | Yes |
| IMAGE / VIDEO / DOCUMENT / AUDIO / FILE | Yes | Yes | Yes | Yes | Yes | Yes |
| TEMPLATE | Yes | β | β | β | β | β |
| INTERACTIVE | Yes (native, β€3) | As numbered text | Yes (native, β€13) | β | β | β |
FILE is an alias for DOCUMENT. Unsupported (channel, type) combinations return 400 UNSUPPORTED_MESSAGE_TYPE.
Media. Upload a file via POST /uploads and pass the returned id as media.file_id, or pass a public media.url directly.
Errors. The human-readable reason is in message; a stable machine code is in data.error_code (see the error responses below). A provider-side rejection still persists a FAILED message + returns 502 PROVIDER_ERROR.
Send a message βΊ Request Body
channel_idThe inbox/number to send from. Obtain it from GET /inboxes or GET /channels/by-identifier.
typeMessage kind. FILE is an alias for DOCUMENT.
conversation_idOptional. Target an existing conversation directly. When set, to is ignored; when omitted, to is required and the conversation is resolved-or-created.
Recipient addressing. Required unless conversation_id is set. Exactly one identifier is used, chosen by type.
textBody for TEXT (also the interactive body fallback).
Media reference for IMAGE / VIDEO / DOCUMENT / AUDIO / FILE. Provide file_id (from POST /uploads) OR a public url.
WhatsApp Official template payload (TEMPLATE type). The approved template is re-resolved server-side by (name + language + channel); variables fill the {{n}} body placeholders.
Reply buttons (INTERACTIVE type). Native on WhatsApp Official (max 3) and Instagram (max 13); on WhatsApp Unofficial it degrades to a numbered-text list.
reply_to_message_idOptional. Native quoted reply β the internal message UUID or the channel-side external id of the parent.
client_referenceOptional partner correlation id, echoed back in the response and stored on the message.
Send a message βΊ Responses
Message accepted, persisted, and dispatched to the channel.
successcodemessage