Send one WhatsApp message. The request is accepted (202) once it is stored and admitted; delivery progress arrives as `message.*` webhook events and on the message itself. Send an `Idempotency-Key` header so a retry never sends twice. Outside the 24-hour customer service window only an approved template can be sent.
Account-scoped credential: Required scope: `messages:send`.
Alternatively, a normal tenant USER session may use `messages:send` on the exact inbox resolved from this resource. Actual inbox membership, tenant/subaccount visibility and per-operation checks still apply. This does not grant account-wide scopes, API-key permission, staff-delegation authority or platform access.
This reply alternative requires conversationSid and a valid composerClaimToken. from must be omitted or the exact conversation sender SID; sender pools and composer overrides require account-level authorization.
Derived from the template when absent; must match it when present
composerClaimToken
string (uuid)
composerOverrideReason
string (max 1000 chars)
contactSid
string (CT… SID)
Contact SID; addresses an existing contact directly
contacts
object
contacts.contacts
object[]
yes
contentSid
string (HX… SID)
Reusable content SID; alternative to type/template
context
object
context.providerMessageId
string (max 256 chars)
context.replyToMessageId
string (SM… SID)
Message SID
conversationSid
string (CO… SID)
Conversation SID for an agent inbox reply
defaultCountry
string (pattern ^[A-Za-z]{2}$)
ISO 3166-1 alpha-2 country used to read a national phone number (NG reads 08031234567 as +2348031234567). Without it the number must start with + or 00.
deferIfCapped
boolean
Defer marketing sends until a recipient cap clears
flow
object
flow.action
"navigate" | "data_exchange"
flow.body
string (max 1024 chars)
yes
flow.ctaText
string (max 20 chars)
yes
flow.data
object
flow.flowSid
string (FL… SID)
yes
Published Flow SID
flow.screen
string (max 128 chars)
from
string (WA… SID)
Sender SID
interactive
object
location
object
location.address
string (max 1000 chars)
location.latitude
number (-90–90)
yes
location.longitude
number (-180–180)
yes
location.name
string (max 1000 chars)
media
object
media.caption
string (max 1024 chars)
media.filename
string (max 255 chars)
media.sid
string (ME… SID)
yes
Media SID; must be READY
media.voice
boolean
metadata
object
priority
"P0" | "P1" | "P2" | "P3"
product
object
product.body
string (max 1024 chars)
product.catalogId
string (max 128 chars)
yes
product.footer
string (max 60 chars)
product.productRetailerId
string (max 256 chars)
yes
productList
object
productList.body
string (max 1024 chars)
productList.catalogId
string (max 128 chars)
yes
productList.footer
string (max 60 chars)
productList.header
string (max 60 chars)
yes
productList.sections
object[]
yes
productList.subtype
"product_list"
reaction
object
reaction.emoji
string (max 16 chars)
yes
reaction.targetMessageId
string (max 256 chars)
yes
recipient
object
recipient.identifierType
"phone_e164" | "bsuid" | "username"
yes
recipient.value
string (max 64 chars)
yes
sendAt
string (date-time)
RFC 3339; ≤ 35 days ahead
senderPoolSid
string (SP… SID)
Sender pool SID
statusCallbackSid
string (WH… SID)
Verified webhook endpoint SID; alternative to statusCallbackUrl
statusCallbackUrl
string (uri, max 2048 chars)
tags
string (max 40 chars)[]
template
object
template.components
object[]
template.language
string (max 16 chars)
yes
template.name
string (max 512 chars)
yes
text
object
text.body
string (max 4096 chars)
yes
text.previewUrl
boolean
to
string (max 32 chars)
E.164 recipient (whatsapp: prefix accepted and stripped)
Send up to 1,000 messages in one request. Each item is admitted or refused on its own; the response reports each item's outcome and a batch SID to follow progress.
Required scope: `messages:send`.
Check whether a message would be accepted, and what it would cost, without creating it. Takes the same body as sending.
Account-scoped credential: Required scope: `messages:send`.
Alternatively, a normal tenant USER session may use `messages:send` on the exact inbox resolved from this resource. Actual inbox membership, tenant/subaccount visibility and per-operation checks still apply. This does not grant account-wide scopes, API-key permission, staff-delegation authority or platform access.
This reply alternative requires conversationSid and a valid composerClaimToken. from must be omitted or the exact conversation sender SID; sender pools and composer overrides require account-level authorization.
Derived from the template when absent; must match it when present
composerClaimToken
string (uuid)
composerOverrideReason
string (max 1000 chars)
contactSid
string (CT… SID)
Contact SID; addresses an existing contact directly
contacts
object
contacts.contacts
object[]
yes
contentSid
string (HX… SID)
Reusable content SID; alternative to type/template
context
object
context.providerMessageId
string (max 256 chars)
context.replyToMessageId
string (SM… SID)
Message SID
conversationSid
string (CO… SID)
Conversation SID for an agent inbox reply
defaultCountry
string (pattern ^[A-Za-z]{2}$)
ISO 3166-1 alpha-2 country used to read a national phone number (NG reads 08031234567 as +2348031234567). Without it the number must start with + or 00.
deferIfCapped
boolean
Defer marketing sends until a recipient cap clears
flow
object
flow.action
"navigate" | "data_exchange"
flow.body
string (max 1024 chars)
yes
flow.ctaText
string (max 20 chars)
yes
flow.data
object
flow.flowSid
string (FL… SID)
yes
Published Flow SID
flow.screen
string (max 128 chars)
from
string (WA… SID)
Sender SID
interactive
object
location
object
location.address
string (max 1000 chars)
location.latitude
number (-90–90)
yes
location.longitude
number (-180–180)
yes
location.name
string (max 1000 chars)
media
object
media.caption
string (max 1024 chars)
media.filename
string (max 255 chars)
media.sid
string (ME… SID)
yes
Media SID; must be READY
media.voice
boolean
metadata
object
priority
"P0" | "P1" | "P2" | "P3"
product
object
product.body
string (max 1024 chars)
product.catalogId
string (max 128 chars)
yes
product.footer
string (max 60 chars)
product.productRetailerId
string (max 256 chars)
yes
productList
object
productList.body
string (max 1024 chars)
productList.catalogId
string (max 128 chars)
yes
productList.footer
string (max 60 chars)
productList.header
string (max 60 chars)
yes
productList.sections
object[]
yes
productList.subtype
"product_list"
reaction
object
reaction.emoji
string (max 16 chars)
yes
reaction.targetMessageId
string (max 256 chars)
yes
recipient
object
recipient.identifierType
"phone_e164" | "bsuid" | "username"
yes
recipient.value
string (max 64 chars)
yes
sendAt
string (date-time)
RFC 3339; ≤ 35 days ahead
senderPoolSid
string (SP… SID)
Sender pool SID
statusCallbackSid
string (WH… SID)
Verified webhook endpoint SID; alternative to statusCallbackUrl
statusCallbackUrl
string (uri, max 2048 chars)
tags
string (max 40 chars)[]
template
object
template.components
object[]
template.language
string (max 16 chars)
yes
template.name
string (max 512 chars)
yes
text
object
text.body
string (max 4096 chars)
yes
text.previewUrl
boolean
to
string (max 32 chars)
E.164 recipient (whatsapp: prefix accepted and stripped)
: requires a reason, recorded on the audit entry, and a fresh step-up grant for `MESSAGE_REDACT`, consumed in the same transaction as the redaction.
Required scope: `messages:redact`.