Use text for everyday replies and short updates while the customer can still receive free-form messages.

At a glance

ItemDetail
typetext
Channel supportOfficial and unofficial (matrix)
Body fieldPrefer content.body; content.text (string or { "body": "..." }) is accepted for compatibility
URL previewSet preview behavior in content when the body includes a URL (provider-dependent)
ReplyOptional content.reply_to.id and content.reply_to.participant
Outside the 24-hour customer service window on official channels, use an approved template message for business-initiated outreach.

Request body

FieldRequiredDescription
channel_idYesSender channel ID
toYesRecipient in international format (e.g. 6281234567890)
typeYestext
content.body or content.textYesMessage text

Example

curl -X POST "https://api.wazapin.com/v1/messages" \
  -H "X-Api-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "channel_id": "wzp_abc123",
    "to": "6281234567890",
    "type": "text",
    "content": {
      "body": "Hello! Your order has been shipped."
    }
  }'

Quoted reply

curl -X POST "https://api.wazapin.com/v1/messages" \
  -H "X-Api-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "channel_id": "wzp_abc123",
    "to": "6281234567890",
    "type": "text",
    "content": {
      "body": "Thanks, we received your question.",
      "reply_to": {
        "id": "wamid.HBgL..."
      }
    }
  }'
When the user replies, see Handle inbound text or Handle interactive replies.

Endpoint

POST https://api.wazapin.com/v1/messages Authenticate with X-Api-Key. See Authentication.

Response

On success, the API returns 201 Created with a message record (status often starts as queued).
201 Created
{
  "data": {
    "id": "9f1fd66d-c37a-4b50-a8c2-b4dca523f9c8",
    "channel_id": "wzp_abc123",
    "to_phone": "6281234567890",
    "type": "text",
    "status": "queued",
    "created_at": "2026-03-04T06:20:10Z",
    "updated_at": "2026-03-04T06:20:10Z"
  }
}
Track delivery with Webhooks or GET /v1/messages/.