Send template messages
One call sends an approved template to one recipient or a list, with variable values filled per send.
POSThttps://api.mobilesasa.com/api/v1/whatsapp/send
Parameters
| Field | Type | Required | Description |
|---|---|---|---|
| account_uuid | uuid | Yes | Which connected WhatsApp account to send from. |
| template_uuid | uuid | Yes | An APPROVED template on that account. |
| recipients | string[] | Yes | Phone numbers of opted-in recipients (Kenyan formats accepted). |
| params | string[] | No | Values for the template's {{1}}, {{2}}… placeholders, in order. Same values apply to every recipient in the call. |
| media_id | string | No | Meta media ID for templates with an image/document header. |
curl -X POST https://api.mobilesasa.com/api/v1/whatsapp/send \
-H "Authorization: Bearer $MOBILESASA_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"account_uuid": "ACCOUNT_UUID",
"template_uuid": "TEMPLATE_UUID",
"recipients": [
"0712345678",
"0733000002"
],
"params": [
"Jane",
"February",
"KES 128,400"
]
}'Response
{
"success": true,
"data": {
"queued": 2,
"failed": 0
}
}Per-recipient personalisation
Variables apply per call — to give each recipient different values (their own name, their own balance), loop single-recipient calls. Each send is billed individually at the template category rate either way.
Requirements & failure modes
- The template must be
APPROVED; sends with pending or rejected templates fail with a validation error. - Billing draws from your KES wallet at the category rate; insufficient wallet balance fails the call before anything sends.
- Recipients must have opted in to WhatsApp messages from you — Meta enforces quality signals, and sustained blocks hurt your number's rating.
Track outcomes in message history — statuses move through queued → sent → delivered → read, with failed carrying the reason.