WhatsAble
API v1Messages

Send a message

posthttps://api.whatsable.app/v1/messages
Build a request to copy

This page never sends a request. Fill in the fields, then copy the request and run it from your server.

Request
curl -X POST 'https://api.whatsable.app/v1/messages' \
  -H 'Content-Type: application/json' \
  -d '{
  "to": "+5491155550000",
  "from": "cm2v8a1b20002qz8h9i0j1k2l",
  "type": "template",
  "template": {
    "id": "cm2v8t1a00001qz8habcd1234",
    "variables": {
      "1": "Ana",
      "2": "#1042",
      "header_image": {
        "url": "https://acme.example/box.jpg"
      },
      "button_0": "1042"
    }
  }
}'

Sends one WhatsApp message: text, a template, an image, a video, an audio file, a sticker, a document or reply buttons.

Check status, not the status code. A 201 means that the message was recorded.

  • sent: WhatsApp accepted it.
  • failed, retryable: try again later with a new Idempotency-Key.
  • failed, not retryable: do not resend. Show error.how_to_fix to whoever can fix it.

Outside the 24-hour window, only a template reaches the contact.

Authorization

bearerAuth
headerAuthorizationBearer <nfy_live_<32 characters>>

An API key from Settings > API keys, sent as Authorization: Bearer <key>.

Header Parameters

Idempotency-Key?string

Any string up to 255 characters. A repeat with the same key and body answers the stored response; with another body, 409 idempotency_key_reused.

Lengthlength <= 255

Request Body

application/json
  1. body

A message to send. type decides which object carries the content. Every type except template is a session message and needs an open 24-hour window.

to?string

An E.164 phone (+, spaces, dashes optional), a Business-Scoped User ID or a WhatsApp @username. A new phone or ID creates a contact; a username must be known.

Length1 <= length <= 256
conversation_id?string

Send into this existing conversation, from its number. Exactly one of to and conversation_id.

Length1 <= length <= 64
from?string

The number to send from, by id or E.164 phone. Absent, the key's default number sends. Never another fallback.

Length1 <= length <= 64
type*string
text*

Response Body

Created does not mean sent: check status.

application/json
  1. response

A WhatsApp message, inbound or outbound.

object*string
id*string
Length1 <= length <= 64
conversation_id*string
Length1 <= length <= 64
contact_id*string
Length1 <= length <= 64
number_id*string

The business number the message was sent from or received on.

Length1 <= length <= 64
direction*string
Value in"inbound""outbound"
type*|string
status*string

pending (Meta did not acknowledge it yet), sent, delivered, read or failed. A send answers sent or failed.

Value in"pending""sent""delivered""read""failed"
sent_by*||

Who sent an outbound message. Null on inbound.

to*|

The recipient of an outbound message. Null on inbound.

from*|

The sender of an inbound message. Null on outbound.

text*|

The text, a caption, or the body of a template or buttons message.

template*|

The template a template message used. Null otherwise.

media*|null
whatsapp_message_id*|

Meta's message id (wamid). Null when Meta never accepted the message.

error*|

Why the message failed. Null unless status is failed.

created_at*string
Formatdate-time
delivered_at*|null
read_at*|null
edited_at*|

When the customer edited this inbound message.

deleted_at*|

When the customer withdrew this inbound message. Its text is kept.

referral*|

Meta's Click-to-WhatsApp referral object as Meta sent it, with keys such as ctwa_clid. Set only on the inbound message that started a chat from an ad or a post.

button_reply*|null
Example Request
curl -X POST 'https://api.whatsable.app/v1/messages' \  -H 'Content-Type: application/json' \  -d '{  "to": "+5491155550000",  "from": "cm2v8a1b20002qz8h9i0j1k2l",  "type": "template",  "template": {    "id": "cm2v8t1a00001qz8habcd1234",    "variables": {      "1": "Ana",      "2": "#1042",      "header_image": {        "url": "https://acme.example/box.jpg"      },      "button_0": "1042"    }  }}'
Example Response
{  "object": "message",  "id": "cm2v8m1a00001qz8h0p1q2r3s",  "conversation_id": "cm2v8c1a00001qz8h4t5u6v7w",  "contact_id": "cm2v8k1a00001qz8h8x9y0z1a",  "number_id": "cm2v8a1b20002qz8h9i0j1k2l",  "direction": "outbound",  "type": "template",  "status": "sent",  "sent_by": "api",  "to": {    "phone": "+5491155550000",    "wa_user_id": null,    "username": null  },  "from": null,  "text": "Hi Ana, your order #1042 is on its way.",  "template": {    "id": "cm2v8t1a00001qz8habcd1234",    "name": "order_shipped",    "language": "en_US"  },  "media": null,  "whatsapp_message_id": "wamid.HBgMNTQ5MTE1NTU1MDAwMBUCABEYEjQ",  "error": null,  "created_at": "2026-10-20T19:51:21Z",  "delivered_at": null,  "read_at": null,  "edited_at": null,  "deleted_at": null,  "referral": null,  "button_reply": null}