One endpoint (
POST /messages), one body shape discriminated by type (text / template / media / interactive). Target it with to (first contact) or conversation_id (reply). Sends are async: you get 202 with { message_id, status: "pending" }, then poll GET /messages/{message_id} or receive a webhook.Send to a number (first contact)
Provideto. sender_id is optional, the backend resolves it.
Reply in a conversation
Same endpoint, but provideconversation_id instead of to. Sender and recipient come from the thread, so you send content only (no to, no sender_id).
Provide exactly one of
to (first contact) or conversation_id (reply). Sending both, or neither, is 422 VALIDATION_ERROR.Check status
message_id is the id returned at send time. Status walks pending -> sent -> delivered -> read, or failed. For outbound messages, a paired inbound reply is included once it arrives.
Poll messages and responses
List newest-first across the workspace, or scope to one thread. Filter to inbound to read responses without webhooks.Read receipt
Mark an inbound message read on WhatsApp (the blue ticks), by its internalmessage_id (the id from GET /messages). The provider id is resolved for you.