Contents

API reference

Messages

API reference descriptions are provided in English to preserve the exact published contract.

List messages

GET /v1/accounts/{AC}/messages

List messages, newest first. Filter by status, sender, recipient or time range; follow `nextCursor` to page. Required scope: `messages:read`.

Parameters

Parameters
NameTypeRequiredDescription
limitquery · integer (1–100)
cursorquery · string (max 2048 chars)
statusquery · string (max 32 chars)
fromquery · string (WA… SID)
toquery · string (max 128 chars)
contactSidquery · string (CT… SID)
campaignSidquery · string (CP… SID)
batchSidquery · string (MB… SID)
directionquery · "outbound" | "inbound"
createdAfterquery · string (date-time)
createdBeforequery · string (date-time)
tagquery · string (max 40 chars)
templateSidquery · string (TM… SID)
templateNamequery · string (max 512 chars)
providerMessageIdquery · string (max 256 chars)
sidsquery · string (max 3299 chars)
sortquery · "createdAt" | "-createdAt"
ACpath · string (AC… SID)yes

Errors: 400, 401, 403, 404, 409, 422, 429, 500, 503 — see errors.

Create a message

POST /v1/accounts/{AC}/messages

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.

Parameters

Parameters
NameTypeRequiredDescription
ACpath · string (AC… SID)yesAccount SID
Request body (87 fields)
Request body
NameTypeRequiredDescription
addressobject
address.bodystring (max 1024 chars)yes
address.country"IN" | "SG"yes
address.savedAddressesobject[]
address.subtype"address"
address.validationErrorsobject
address.valuesobject
carouselobject
carousel.bodystring (max 1024 chars)yes
carousel.cardsobject[]yes
carousel.subtype"carousel"
catalogobject
catalog.bodystring (max 1024 chars)yes
catalog.catalogIdstring (max 128 chars)yes
catalog.footerstring (max 60 chars)
catalog.thumbnailProductRetailerIdstring (max 256 chars)
category"authentication" | "utility" | "marketing" | "service"Derived from the template when absent; must match it when present
composerClaimTokenstring (uuid)
composerOverrideReasonstring (max 1000 chars)
contactSidstring (CT… SID)Contact SID; addresses an existing contact directly
contactsobject
contacts.contactsobject[]yes
contentSidstring (HX… SID)Reusable content SID; alternative to type/template
contextobject
context.providerMessageIdstring (max 256 chars)
context.replyToMessageIdstring (SM… SID)Message SID
conversationSidstring (CO… SID)Conversation SID for an agent inbox reply
defaultCountrystring (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.
deferIfCappedbooleanDefer marketing sends until a recipient cap clears
flowobject
flow.action"navigate" | "data_exchange"
flow.bodystring (max 1024 chars)yes
flow.ctaTextstring (max 20 chars)yes
flow.dataobject
flow.flowSidstring (FL… SID)yesPublished Flow SID
flow.screenstring (max 128 chars)
fromstring (WA… SID)Sender SID
interactiveobject
locationobject
location.addressstring (max 1000 chars)
location.latitudenumber (-90–90)yes
location.longitudenumber (-180–180)yes
location.namestring (max 1000 chars)
mediaobject
media.captionstring (max 1024 chars)
media.filenamestring (max 255 chars)
media.sidstring (ME… SID)yesMedia SID; must be READY
media.voiceboolean
metadataobject
priority"P0" | "P1" | "P2" | "P3"
productobject
product.bodystring (max 1024 chars)
product.catalogIdstring (max 128 chars)yes
product.footerstring (max 60 chars)
product.productRetailerIdstring (max 256 chars)yes
productListobject
productList.bodystring (max 1024 chars)
productList.catalogIdstring (max 128 chars)yes
productList.footerstring (max 60 chars)
productList.headerstring (max 60 chars)yes
productList.sectionsobject[]yes
productList.subtype"product_list"
reactionobject
reaction.emojistring (max 16 chars)yes
reaction.targetMessageIdstring (max 256 chars)yes
recipientobject
recipient.identifierType"phone_e164" | "bsuid" | "username"yes
recipient.valuestring (max 64 chars)yes
sendAtstring (date-time)RFC 3339; ≤ 35 days ahead
senderPoolSidstring (SP… SID)Sender pool SID
statusCallbackSidstring (WH… SID)Verified webhook endpoint SID; alternative to statusCallbackUrl
statusCallbackUrlstring (uri, max 2048 chars)
tagsstring (max 40 chars)[]
templateobject
template.componentsobject[]
template.languagestring (max 16 chars)yes
template.namestring (max 512 chars)yes
textobject
text.bodystring (max 4096 chars)yes
text.previewUrlboolean
tostring (max 32 chars)E.164 recipient (whatsapp: prefix accepted and stripped)
transport"cloud_api" | "marketing_messages"
transportOptionsobject
transportOptions.ttlSecondsinteger (43200–2592000)
type"text" | "template" | "image" | "video" | "audio" | "document" | "sticker" | "location" | "contacts" | "reaction" | "interactive" | "product" | "catalog" | "flow" | "product_list" | "address" | "carousel"
validityPeriodSecondsinteger (30–2592000)
variablesobject

Errors: 400, 401, 403, 404, 409, 422, 429, 500, 503 — see errors.

Create up to 1,000 messages with independent per-item admission

POST /v1/accounts/{AC}/messages/batch

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`.

Parameters

Parameters
NameTypeRequiredDescription
ACpath · string (AC… SID)yes
Request body (1 fields)
Request body
NameTypeRequiredDescription
messagesobject[]yes

Errors: 400, 401, 403, 404, 409, 422, 429, 500, 503 — see errors.

Fetch message batch counts

GET /v1/accounts/{AC}/messages/batches/{MB}

Fetch how many items of a batch were accepted, refused, sent and delivered. Required scope: `messages:read`.

Parameters

Parameters
NameTypeRequiredDescription
ACpath · string (AC… SID)yes
MBpath · string (MB… SID)yes

Errors: 400, 401, 403, 404, 409, 422, 429, 500, 503 — see errors.

Cancel up to 100 messages

POST /v1/accounts/{AC}/messages/bulk-cancel

Required scope: `messages:cancel`.

Parameters

Parameters
NameTypeRequiredDescription
ACpath · stringyes
Request body (3 fields)
Request body
NameTypeRequiredDescription
messageSidsstring (SM… SID)[]yes
reasonstring (max 1000 chars)yes
stepUpTokenstring (max 256 chars)

Errors: 400, 401, 403, 404, 409, 422, 429, 500, 503 — see errors.

Irreversibly redact up to 100 messages through a deletion request

POST /v1/accounts/{AC}/messages/bulk-redact

Required scope: `messages:redact`.

Parameters

Parameters
NameTypeRequiredDescription
ACpath · stringyes
Request body (3 fields)
Request body
NameTypeRequiredDescription
messageSidsstring (SM… SID)[]yes
reasonstring (max 1000 chars)yes
stepUpTokenstring (max 256 chars)

Errors: 400, 401, 403, 404, 409, 422, 429, 500, 503 — see errors.

Preflight a message without creating it

POST /v1/accounts/{AC}/messages/preflight

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.

Parameters

Parameters
NameTypeRequiredDescription
ACpath · string (AC… SID)yesAccount SID
Request body (87 fields)
Request body
NameTypeRequiredDescription
addressobject
address.bodystring (max 1024 chars)yes
address.country"IN" | "SG"yes
address.savedAddressesobject[]
address.subtype"address"
address.validationErrorsobject
address.valuesobject
carouselobject
carousel.bodystring (max 1024 chars)yes
carousel.cardsobject[]yes
carousel.subtype"carousel"
catalogobject
catalog.bodystring (max 1024 chars)yes
catalog.catalogIdstring (max 128 chars)yes
catalog.footerstring (max 60 chars)
catalog.thumbnailProductRetailerIdstring (max 256 chars)
category"authentication" | "utility" | "marketing" | "service"Derived from the template when absent; must match it when present
composerClaimTokenstring (uuid)
composerOverrideReasonstring (max 1000 chars)
contactSidstring (CT… SID)Contact SID; addresses an existing contact directly
contactsobject
contacts.contactsobject[]yes
contentSidstring (HX… SID)Reusable content SID; alternative to type/template
contextobject
context.providerMessageIdstring (max 256 chars)
context.replyToMessageIdstring (SM… SID)Message SID
conversationSidstring (CO… SID)Conversation SID for an agent inbox reply
defaultCountrystring (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.
deferIfCappedbooleanDefer marketing sends until a recipient cap clears
flowobject
flow.action"navigate" | "data_exchange"
flow.bodystring (max 1024 chars)yes
flow.ctaTextstring (max 20 chars)yes
flow.dataobject
flow.flowSidstring (FL… SID)yesPublished Flow SID
flow.screenstring (max 128 chars)
fromstring (WA… SID)Sender SID
interactiveobject
locationobject
location.addressstring (max 1000 chars)
location.latitudenumber (-90–90)yes
location.longitudenumber (-180–180)yes
location.namestring (max 1000 chars)
mediaobject
media.captionstring (max 1024 chars)
media.filenamestring (max 255 chars)
media.sidstring (ME… SID)yesMedia SID; must be READY
media.voiceboolean
metadataobject
priority"P0" | "P1" | "P2" | "P3"
productobject
product.bodystring (max 1024 chars)
product.catalogIdstring (max 128 chars)yes
product.footerstring (max 60 chars)
product.productRetailerIdstring (max 256 chars)yes
productListobject
productList.bodystring (max 1024 chars)
productList.catalogIdstring (max 128 chars)yes
productList.footerstring (max 60 chars)
productList.headerstring (max 60 chars)yes
productList.sectionsobject[]yes
productList.subtype"product_list"
reactionobject
reaction.emojistring (max 16 chars)yes
reaction.targetMessageIdstring (max 256 chars)yes
recipientobject
recipient.identifierType"phone_e164" | "bsuid" | "username"yes
recipient.valuestring (max 64 chars)yes
sendAtstring (date-time)RFC 3339; ≤ 35 days ahead
senderPoolSidstring (SP… SID)Sender pool SID
statusCallbackSidstring (WH… SID)Verified webhook endpoint SID; alternative to statusCallbackUrl
statusCallbackUrlstring (uri, max 2048 chars)
tagsstring (max 40 chars)[]
templateobject
template.componentsobject[]
template.languagestring (max 16 chars)yes
template.namestring (max 512 chars)yes
textobject
text.bodystring (max 4096 chars)yes
text.previewUrlboolean
tostring (max 32 chars)E.164 recipient (whatsapp: prefix accepted and stripped)
transport"cloud_api" | "marketing_messages"
transportOptionsobject
transportOptions.ttlSecondsinteger (43200–2592000)
type"text" | "template" | "image" | "video" | "audio" | "document" | "sticker" | "location" | "contacts" | "reaction" | "interactive" | "product" | "catalog" | "flow" | "product_list" | "address" | "carousel"
validityPeriodSecondsinteger (30–2592000)
variablesobject

Errors: 400, 401, 403, 404, 409, 422, 429, 500, 503 — see errors.

Fetch a message

GET /v1/accounts/{AC}/messages/{SM}

Fetch one message with its current status, the provider's delivery timeline and, once settled, its charge. Required scope: `messages:read`.

Parameters

Parameters
NameTypeRequiredDescription
ACpath · string (AC… SID)yesAccount SID
SMpath · string (SM… SID)yesMessage SID

Errors: 400, 401, 403, 404, 409, 422, 429, 500, 503 — see errors.

Redact and schedule removal of a message

DELETE /v1/accounts/{AC}/messages/{SM}

Required scope: `messages:redact`.

Parameters

Parameters
NameTypeRequiredDescription
ACpath · string (AC… SID)yesAccount SID
SMpath · string (SM… SID)yesMessage SID

Errors: 400, 401, 403, 404, 409, 422, 429, 500, 503 — see errors.

Cancel a message before provider submission

POST /v1/accounts/{AC}/messages/{SM}/cancel

Cancel a message that has not yet been handed to WhatsApp. A message already submitted cannot be recalled. Required scope: `messages:cancel`.

Parameters

Parameters
NameTypeRequiredDescription
ACpath · string (AC… SID)yesAccount SID
SMpath · string (SM… SID)yesMessage SID

Errors: 400, 401, 403, 404, 409, 422, 429, 500, 503 — see errors.

Mark an inbound WhatsApp message read

POST /v1/accounts/{AC}/messages/{SM}/read

Mark an inbound message as read, which shows the blue ticks to the sender. Required scope: `messages:write`.

Parameters

Parameters
NameTypeRequiredDescription
ACpath · string (AC… SID)yesAccount SID
SMpath · string (SM… SID)yesMessage SID

Errors: 400, 401, 403, 404, 409, 422, 429, 500, 503 — see errors.

Irreversibly redact message content

POST /v1/accounts/{AC}/messages/{SM}/redact

: 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`.

Parameters

Parameters
NameTypeRequiredDescription
ACpath · string (AC… SID)yesAccount SID
SMpath · string (SM… SID)yesMessage SID
Request body (2 fields)
Request body
NameTypeRequiredDescription
reasonstring (max 1000 chars)yes
stepUpTokenstring (max 256 chars)yes

Errors: 400, 401, 403, 404, 409, 422, 429, 500, 503 — see errors.

Send a WhatsApp typing indicator and mark the inbound message read

POST /v1/accounts/{AC}/messages/{SM}/typing

Required scope: `messages:write`.

Parameters

Parameters
NameTypeRequiredDescription
ACpath · string (AC… SID)yesAccount SID
SMpath · string (SM… SID)yesMessage SID

Errors: 400, 401, 403, 404, 409, 422, 429, 500, 503 — see errors.