Send message
Send a message in a conversation. Supports text, attachments, quick replies, buttons, templates, and message tags. Attachment and interactive message support varies by platform.
WhatsApp template messages: to send an approved template into this
conversation (required when the 24-hour customer-service window is
closed), use the template field with a single element carrying the
template reference: { "elements": [{ "name": ..., "language": ..., "components": [...] }] }.
See the template field below for the exact shape. To send a template
to a phone number you have no conversation with yet, use the
create-conversation endpoint (POST /v1/inbox/conversations) instead.
WhatsApp rich interactive messages (list, CTA URL, Flow, location request)
are available via the interactive field. Tap events are delivered through
the message.received webhook with WhatsApp-specific metadata fields
(interactiveType, interactiveId, flowResponseJson, flowResponseData).
API key authentication - use your Zernio API key as a Bearer token
In: header
Path Parameters
The conversation ID (id field from list conversations endpoint). This is the platform-specific conversation identifier, not an internal database ID.
Social account ID
Message text
URL of the attachment to send (image, video, audio, or file). The URL must be publicly accessible. For binary file uploads, use multipart/form-data instead.
Type of attachment. Defaults to file if not specified.
"image" | "video" | "audio" | "file"WhatsApp only. Display name for a document sent via attachmentUrl with attachmentType: file (e.g. "Report.pdf"). Maps to the recipient's file name; without it WhatsApp derives the name from the URL and shows "Untitled". Ignored for image/video/audio and for binary uploads (which use the uploaded file's name).
WhatsApp only. When true on an audio attachment, the message is sent
as a voice message (PTT) — the recipient sees the waveform + voice-note
UI instead of a basic audio attachment. The audio file MUST be .ogg
encoded with the OPUS codec (mono) per Meta's voice-message contract;
other formats are rejected by WhatsApp. Ignored for non-audio attachments.
Quick reply buttons. Mutually exclusive with buttons. Max 13 items.
items <= 13Action buttons. Mutually exclusive with quickReplies. Max 3 items.
WhatsApp: buttons always render as interactive reply buttons.
Only title and payload are used — type, url, and phone
are ignored (WhatsApp has no URL/phone button in this field; use
the interactive field with type: cta_url for a link button).
payload becomes the button reply ID delivered on the
message.received webhook when the user taps. To send a simple
reply-button message, provide title + payload and set
type: postback, e.g.
{ "type": "postback", "title": "Yes", "payload": "yes" }.
items <= 3Platform-dependent template payload. Ignored on Telegram.
Instagram / Facebook: a generic template (carousel). Set type: generic
and provide up to 10 elements, each with a title (required) and
optional subtitle, imageUrl, and buttons.
WhatsApp: sends an approved WhatsApp template message, the only message
type WhatsApp accepts when the 24-hour customer-service window is closed.
Provide exactly one element carrying the template reference:
{ "elements": [{ "name": "order_update", "language": "en_US", "components": [...] }] }
(type is ignored on WhatsApp). components is optional and is forwarded
unchanged as the template.components array of Meta's Cloud API send
payload; use it to fill body/header variables and button parameters, e.g.
[{ "type": "body", "parameters": [{ "type": "text", "text": "John" }] }].
Templates with media headers (image, video, document) must include the
header component with its media link here at send time. To send a template
to a phone number with no existing conversation, or to have media headers
filled in automatically from the template definition, use the
create-conversation endpoint (POST /v1/inbox/conversations) instead.
WhatsApp-only. Rich interactive payload for list messages, CTA URL
buttons, Flow prompts, location requests, voice-call buttons, and
commerce messages (single product, product list, catalog, and
carousel). When set, takes priority over buttons and
quickReplies. The shape mirrors Meta's Cloud API interactive
object verbatim, so any payload that works against Meta directly
will also work here.
Use buttons / quickReplies for simple button replies
(WhatsApp's interactive.type: "button"): the abstraction caps at
3 buttons and handles the auto-conversion for you. Use this field
only for the types listed in the enum below.
All interactive messages are session messages: they can only be sent inside the 24-hour customer service window opened by the user's last inbound message.
Commerce types (product, product_list, catalog_message, and
product carousels) require a Meta catalog connected to the
WhatsApp Business Account in Commerce Manager. Media carousels
(image/video cards) do not need a catalog.
For product, body is optional (WhatsApp renders the product
card itself) and header is not allowed (the product image is
the header). For product_list, a header with type: "text"
is required. For carousel, top-level header/footer are not
supported; media goes on each card instead.
For voice_call, the message renders WhatsApp's native call
button; tapping it starts a voice call to your business number.
Requires WhatsApp Business Calling to be enabled on the sending
number. The optional parameters.payload string is echoed back on
the calls webhook (as cta_payload) for attribution.
For location_request_message, action may be omitted (we default
it to { "name": "send_location" }). WhatsApp renders a localized
"Send location" button; the user's reply arrives as a regular
location message in the conversation.
For catalog_message, action may also be omitted (we default it
to { "name": "catalog_message" }).
Tap events come back via the message.received webhook with
metadata.interactiveType set to list_reply or nfm_reply.
Carts submitted from commerce messages arrive as metadata.order;
product inquiries arrive as metadata.referredProduct.
Telegram-native keyboard markup. Ignored on other platforms.
Facebook messaging type. Required when using messageTag.
"RESPONSE" | "UPDATE" | "MESSAGE_TAG"Facebook message tag for messaging outside 24h window. Requires messagingType MESSAGE_TAG. Instagram only supports HUMAN_AGENT.
"CONFIRMED_EVENT_UPDATE" | "POST_PURCHASE_UPDATE" | "ACCOUNT_UPDATE" | "HUMAN_AGENT"Platform message ID to quote-reply to. For WhatsApp, pass the wamid (available in message.platformMessageId from webhooks). For Telegram, pass the Telegram message ID.
WhatsApp-only. Send a location pin.
WhatsApp-only. Send one or more contact cards.
Response Body
application/json
application/json
application/json
import Zernio from '@zernio/node';const zernio = new Zernio({ apiKey: process.env.ZERNIO_API_KEY });const { data } = await zernio.messages.sendInboxMessage({ path: { conversationId: 'conversation_abc123', }, body: { accountId: 'account_abc123', },});console.log(data);{
"success": true,
"data": {
"messageId": "string",
"conversationId": "string",
"sentAt": "2019-08-24T14:15:22Z",
"message": "string"
}
}{
"error": "string",
"code": "PLATFORM_LIMITATION",
"platformError": {
"code": 0,
"subcode": 0,
"fbtraceId": "string",
"type": "string"
}
}{
"error": "Unauthorized"
}List messages GET
Fetch messages for a specific conversation, with cursor-based pagination and ordering control. Pagination: pass `pagination.nextCursor` from a prior response back as the `cursor` query param to fetch the next page. The cursor is opaque; do not parse or construct it client-side. Sort order: defaults to `asc` (oldest first, chat style). For the "show me the latest messages" pattern, pass `?sortOrder=desc&limit=N`. Twitter, Instagram, Telegram, WhatsApp and Reddit honor the requested order from the local message store. For Facebook and Bluesky, the upstream APIs only return newest-first and have no order parameter — sort order is best-effort and only reverses items within a single page (pages still walk newest→oldest). The response field `sortOrderApplied` tells you what was actually applied. Reddit threads are paginated client-side because Reddit's API has no per-thread cursor. Very long threads may be upstream-truncated by Reddit's inbox/sent windows (~100 most-recent items each); this is a Reddit platform limitation. Instagram and Facebook conversations include history from before the account was connected, replayed from Meta. That replay covers the 500 most recent messages per conversation: a longer thread keeps its newest 500 and older messages are not retrievable. Messages that arrived after the account was connected are unaffected. Replayed messages are stored as already read and emit no webhooks. Twitter/X limitation: X's encrypted "X Chat" messages are not accessible via the API. Conversations where the other participant uses encrypted X Chat may only show your outgoing messages. See the list conversations endpoint for more details. This endpoint is read-only and does NOT mark messages as read or send read receipts. To mark a conversation read (and send WhatsApp blue ticks on eligible accounts), call `POST /v1/inbox/conversations/{conversationId}/read`.
Edit message PATCH
Edit the text and/or reply markup of a previously sent Telegram message. Only supported for Telegram. Returns 400 for other platforms.