Skip to main content

Send (or schedule) a message

POST 

/messages

The one way to send. What changes between a text and a template is type in the body — not the URL.

typeWhat for
textFree text. Only inside the 24-hour window
templateApproved template. Opens a conversation at any time
testSame as template, defaulting to hello_world with translated errors

Need an image, a video, a document, buttons or a carousel? The mirror is the way: POST /v1/{phone_number_id}/messages takes the full Cloud API payload, with any type Meta supports.

Scheduling. With sendAt (an ISO 8601 instant) or delaySeconds (relative), the answer is 202 and the message goes on the queue. Entitlement and phone number are re-checked at send time, not now.

Idempotency. With the Idempotency-Key header, a repeat of the same call returns the first answer, with Idempotent-Replayed: true, and nothing is sent again — not even when the first answer was an error. The same key with another body is refused with 422 idempotency_key_reused; while the first request is still running, the repeat gets 409 idempotency_in_progress.

Request​

Responses​

Record found.