POST
/
v1
/
messages
curl -X POST "https://api.wazapin.id/v1/messages" \
  -H "X-Api-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "channel_id": "wzp_abc123",
    "to": "6281234567890",
    "type": "text",
    "content": {
      "text": "Hello from Wazapin API"
    }
  }'
{
  "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"
  }
}

Endpoint

POST /v1/messages Send a message through a specific channel.

Headers

X-Api-Key
string
required
Primary auth header for public API requests.
Content-Type
string
required
Use application/json.

Request body

channel_id
string
required
Channel ID used to send the message.
conversation_id
string
Optional conversation ID. If omitted, Wazapin resolves or creates the matching conversation for the destination phone number.
to
string
required
Recipient phone number in international format.
to_phone
string
Alias for to. Prefer to in new integrations.
type
string
required
Operation type, for example text.
content
object
required
Payload for the selected operation type.

Common request shape

{
  "channel_id": "wzp_abc123",
  "to": "6281234567890",
  "type": "text",
  "content": {}
}
Use to for the destination phone number. to_phone is still accepted as a compatibility alias.
curl -X POST "https://api.wazapin.id/v1/messages" \
  -H "X-Api-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "channel_id": "wzp_abc123",
    "to": "6281234567890",
    "type": "text",
    "content": {
      "text": "Hello from Wazapin API"
    }
  }'
{
  "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"
  }
}

Supported type values

typeRequired content fieldsNotes
textbody or textcontent.text can be a string or object with body.
imagemedia_urlSupports optional caption.
videomedia_urlSupports optional caption.
audiomedia_urlAudio is sent as media payload.
documentmedia_urlSupports optional caption and file_name.
templatetemplate.name, template.language.code, template.componentsUses approved template content.
buttonsbody, buttonsInteractive buttons.
listbody, button_text, sectionsInteractive list picker.
locationname, address, latitude, longitudeSends a location pin.
location_requestbody or textAsks the user to share a location.
contactfull_name, phoneSupports optional organization.
reactionmessage_id, reactionSupports optional from_me and participant.
mark_as_readmessage_idMarks a provider message as read.

Media field aliases

For image, video, audio, and document, Wazapin accepts these compatibility aliases:
Canonical fieldAccepted aliasesNotes
media_urlmedia, urlPrefer media_url in public integrations.
media_typemediaType, type, mediatypeUsually optional because the API infers it from the top-level type.
file_namefileNameUseful mainly for document.

Text message notes

  • Prefer content.body for new integrations.
  • content.text is still accepted for backwards compatibility.
  • To reply to a previous message, send content.reply_to.id. You can also include content.reply_to.participant when the provider requires it.

Advanced message types

The backend also supports additional type values such as cta_url, media_carousel, product_carousel, single_product, multi_product, catalog, link, poll, sticker, address, presence, edit_message, and delete_message. These advanced payloads are available in the API implementation, but they are not yet covered by public getting-started guides.

Message type quick examples