Skip to main content
POST

Authorizations

x-api-key
string
header
required

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.

X-Tenant-Id
string
header
required

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

application/json

Provide conversationId, or channelId + to. Then exactly one of a template, media, or text.

conversationId
string<uuid>

An existing thread to send into.

channelId
string<uuid>

Which connected account to send from. Required with to.

to
string

Recipient in E.164 without +, e.g. 201001234567.

Example:

"201001234567"

contactName
string

Display name to store if this starts a new thread.

text
string

Plain text body. Ignored when a template or media is present.

media
object
template
object
templateName
string

Flat alias for template.templateName.

templateLanguage
string

Flat alias for template.templateLanguage.

templateParams

Flat alias for template.templateParams. Accepts an array, a JSON array string, or a comma-separated list.

Response

Accepted and queued for delivery.

id
string<uuid>
conversation_id
string<uuid>
direction
enum<string>
Available options:
inbound,
outbound
type
enum<string>

Drives how text and media are interpreted.

Available options:
text,
image,
video,
audio,
document,
sticker,
location,
contact,
poll,
reaction,
template
text
string | null

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.

media
object | null

Type-specific metadata. Null for plain text.

status
enum<string>

Delivery state. failed is terminal and error_reason explains it. Read status only appears when the contact has read receipts enabled.

Available options:
pending,
sent,
delivered,
read,
failed
error_reason
string | null
sender_name
string | null
from_me
boolean

True when we sent it.

platform_message_id
string

The platform's own id. Empty until the send is acknowledged.

created_at
string<date-time>