Send a message
One call for a template, media, or plain text. The action is chosen by the payload:
a template wins, then media, then text.
Address the message either with conversationId (an existing thread) or with
channelId + to (finds the thread, or starts one).
Outside the 24-hour customer service window, WhatsApp only accepts templates. A plain-text send to a cold contact will be rejected by the platform.
to must be in E.164 with no + — 201001234567, not 01001234567. A local
number without a country code will not be delivered.
Authorizations
Your workspace API key. Create one in Settings → API Keys; the plaintext value is shown once and never again.
Keys are scoped. A key needs conversations:send to send, conversations:read to
read threads and messages, templates:read to list templates, and channels:read
to list channels. A key missing the scope for an endpoint gets 403.
The CRM endpoints use the same resource:action form: leads:read, leads:create,
leads:update, leads:delete, customers:read, customers:create,
customers:update, customers:delete, customers:manage.
Several resources have no scope of their own and borrow one:
Grant only what the integration needs — a key that only sends notifications should
hold conversations:send and nothing else.
Your workspace UUID. Required on every request in addition to x-api-key.
It does not select the workspace — data access is always scoped to the workspace that owns the API key, and a mismatched value cannot read anyone else's data.
Body
Provide conversationId, or channelId + to. Then exactly one of a template,
media, or text.
An existing thread to send into.
Which connected account to send from. Required with to.
Recipient in E.164 without +, e.g. 201001234567.
"201001234567"
Display name to store if this starts a new thread.
Plain text body. Ignored when a template or media is present.
Flat alias for template.templateName.
Flat alias for template.templateLanguage.
Flat alias for template.templateParams. Accepts an array, a JSON array
string, or a comma-separated list.
Response
Accepted and queued for delivery.
inbound, outbound Drives how text and media are interpreted.
text, image, video, audio, document, sticker, location, contact, poll, reaction, template The body for text; the caption for image/video/document; the emoji for a reaction; the place name for a location; null for audio and stickers.
Type-specific metadata. Null for plain text.
Delivery state. failed is terminal and error_reason explains it. Read
status only appears when the contact has read receipts enabled.
pending, sent, delivered, read, failed True when we sent it.
The platform's own id. Empty until the send is acknowledged.

