POST
/
v1
/
messages
curl --request POST \
  --url https://api.wazapin.com/v1/messages \
  --header 'Content-Type: application/json' \
  --header 'X-Api-Key: <api-key>' \
  --data '
{
  "channel_id": "wzp_abc123",
  "to": "6281234567890",
  "type": "text",
  "content": {
    "body": "Hello! Your order #12345 has been shipped."
  }
}
'
{
  "data": {
    "channel_id": "<string>",
    "content": "<unknown>",
    "conversation_id": "<string>",
    "created_at": "<string>",
    "delivered_at": "<string>",
    "direction": "<string>",
    "error": "<string>",
    "error_code": "<string>",
    "external_message_id": "<string>",
    "failed_at": "<string>",
    "id": "<string>",
    "max_retries": 123,
    "metadata": "<unknown>",
    "organization_id": "<string>",
    "provider_message_id": "<string>",
    "queued_at": "<string>",
    "read_at": "<string>",
    "retry_count": 123,
    "sender_phone": "<string>",
    "sending_at": "<string>",
    "sent_at": "<string>",
    "sent_by": "<string>",
    "sent_via": "<string>",
    "status": "<string>",
    "to_phone": "<string>",
    "type": "<string>",
    "updated_at": "<string>",
    "reply_preview": {
      "has_resolved_content": true,
      "text": "<string>",
      "message_id": "<string>",
      "provider_message_id": "<string>",
      "sender_label": "<string>"
    }
  }
}
Send a WhatsApp message to a recipient. Pick a type, then fill content with the fields for that message shape. Unlike Meta’s Cloud API (messaging_product, phone_number_id), Wazapin uses a channel-centric body: channel_id, to, type, and content.

Supported message types

  • text — Plain text with optional quoted reply
  • image — Images with optional caption
  • video — Videos with optional caption
  • audio — Audio files and voice notes
  • document — PDFs and files with optional caption and filename
  • sticker — WebP stickers
  • location — Map pin with coordinates
  • location_request — Ask the user to share their location
  • contact — Contact card (vCard-style)
  • template — Approved Meta templates (body, header, buttons)
  • buttons — Interactive quick-reply buttons (up to 3)
  • list — Interactive list picker
  • reaction — Emoji reaction on an existing message
  • mark_as_read — Mark a provider message as read
Outside the 24-hour customer service window on official channels, business-initiated outreach must use an approved template. See Send template.

Authentication

X-Api-Key: YOUR_API_KEY
Content-Type: application/json
Create keys in the dashboard. See Authentication.

Request body

channel_id
string
required
Connected WhatsApp channel ID (for example wzp_abc123). List channels with GET /v1/channels.
to
string
required
Recipient phone number in international format without + (for example 6281234567890).
to_phone
string
Alias for to. Prefer to in new integrations.
conversation_id
string
Optional conversation ID. If omitted, Wazapin resolves or creates the conversation for to.
type
string
required
Message type. See the table below for supported values and required content fields.
content
object
required
Payload for the selected type. Shape changes per message type — see Content by type.

Supported type values

typeRequired content fieldsNotes
textbody or textcontent.text can be a string or { "body": "..." }. Optional reply_to.id.
imagemedia_urlOptional caption.
videomedia_urlOptional caption.
audiomedia_urlAAC, AMR, MP3, M4A, OGG. Max 16 MB.
documentmedia_urlOptional caption, file_name. Max 100 MB.
stickersticker_url or media_urlWebP. Static ≤ 100 KB, animated ≤ 500 KB.
templatetemplate.name, template.language.codeOften needs template.components for variables.
buttonsbody, buttonsUp to 3 { id, title } buttons.
listbody, button_text, sectionsSections contain rows with id, title, optional description.
locationname, address, latitude, longitudeDecimal degrees.
location_requestbody or textPrompts the user to share location.
contactfull_name, phoneOptional organization.
reactionmessage_id, reactionOptional from_me, participant.
mark_as_readmessage_idMarks a provider message as read.

Media field aliases

For image, video, audio, and document, Wazapin accepts compatibility aliases:
Canonical fieldAccepted aliasesNotes
media_urlmedia, urlPrefer media_url in public integrations.
media_typemediaType, type, mediatypeUsually optional — inferred from top-level type.
file_namefileNameMainly for document.

Content by type

FieldRequiredDescription
content.bodyYes*Message text. Prefer for new integrations.
content.textYes*String or { "body": "..." } — compatibility alias.
content.reply_to.idNoProvider message ID to quote-reply.
content.reply_to.participantNoRequired in some group or multi-device contexts.
{
  "channel_id": "wzp_abc123",
  "to": "6281234567890",
  "type": "text",
  "content": {
    "body": "Hello! Your order #12345 has been shipped."
  }
}
Guide: Send text

Response

On success the API returns 201 Created with a queued message record:
{
  "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"
  }
}
Poll delivery with GET /v1/messages/{messageID}/status. See Message lifecycle.

Advanced types

The API also supports cta_url, media_carousel, product_carousel, single_product, multi_product, catalog, link, poll, address, presence, edit_message, and delete_message. These are available in the implementation but not yet covered by getting-started guides.

Authorizations

X-Api-Key
string
header
default:YOUR_API_KEY
required

API key with wzp_ prefix

Body

application/json

Request body for sending a WhatsApp message through a connected channel.

channel_id
string
required

Connected WhatsApp channel ID (e.g. wzp_abc123).

Minimum string length: 1
content
object
required

Payload for the selected type. Shape varies by message type — see docs for required fields per type.

type
string
required

Message type: text, image, video, audio, document, sticker, template, buttons, list, location, location_request, contact, reaction, mark_as_read, and more.

Minimum string length: 1
conversation_id
string

Optional conversation ID. If omitted, Wazapin resolves or creates the conversation for the destination.

to
string

Recipient phone number in international format without + (e.g. 6281234567890).

to_phone
string

Alias for to. Prefer to in new integrations.

Response

Created

data
object
required