WhatsApp API
Send Meta-approved template messages from the Mobile Sasa number, a number we set up for you, or your own Meta app. The official Business Platform, not a grey-route bot.
Auth: mbs_ scoped tokens
/api/v1/ and requires an mbs_ token with WhatsApp scopes. See Authentication. Responses use the { success, data, error } envelope.Three ways to send
Every message leaves from a WhatsApp number, which the API calls an account. You can have more than one. Each account has a mode that decides how it is billed.
| Account | mode | Billing | Setup |
|---|---|---|---|
| The Mobile Sasa number | managed, is_platform: true | Per message at the category rate (updates, promotions, passcodes) | None. Join it with one call and send today. |
| Your number, set up by Mobile Sasa | managed | Per message at the category rate | Talk to us. We register your business and number at Meta on our portfolio. |
| Your own Meta developer app | own_app | Flat platform fee per message; Meta bills you for the conversations | Connect your phone number ID, WABA and token. See Your own Meta app. |
Live rates are on GET /api/v1/whatsapp/pricing; all amounts are KES, VAT inclusive, and are drawn from your wallet.
How it fits together
- Pick a number: join the Mobile Sasa number or connect your own.
- Create templates: written here, submitted to Meta for review, usually approved within minutes to a day. Only approved templates can send.
- Send: name a template, recipients and the values for its blanks; delivery and read receipts stream back. Replies land in your inbox.
The portal and the API share the same accounts: anything you see under WhatsApp in your dashboard is returned by the API, and vice versa.
Pricing
# Paste your token once (it starts with mbs_):
export MOBILESASA_TOKEN="mbs_your_token_here"
curl "https://api.mobilesasa.com/api/v1/whatsapp/pricing" \
-H "Authorization: Bearer $MOBILESASA_TOKEN"{
"success": true,
"data": {
"marketing": 8.00,
"utility": 2.50,
"authentication": 2.50,
"own_app_fee": 0.10,
"currency": "KES"
}
}marketing, utility and authentication are the per-message rates on a managed number, chosen by the template's category. own_app_fee is what Mobile Sasa charges per message on your own Meta app.
The Mobile Sasa number
# Paste your token once (it starts with mbs_):
export MOBILESASA_TOKEN="mbs_your_token_here"
curl "https://api.mobilesasa.com/api/v1/whatsapp/platform" \
-H "Authorization: Bearer $MOBILESASA_TOKEN"{
"success": true,
"data": {
"available": true,
"joined": false,
"pricing": { "marketing": 8.00, "utility": 2.50, "authentication": 2.50, "own_app_fee": 0.10, "currency": "KES" }
}
}# Paste your token once (it starts with mbs_):
export MOBILESASA_TOKEN="mbs_your_token_here"
curl -X POST "https://api.mobilesasa.com/api/v1/whatsapp/platform/join" \
-H "Authorization: Bearer $MOBILESASA_TOKEN"Joining returns the platform account, which then appears in your account list with granted: true. Templates you create on it are yours alone: other teams on the same number never see them, and Meta sees them under a team prefix (t1234_) that the API's display_name hides from you.
Messages arrive from Mobile Sasa
List your accounts
Returns every number your team can send from, your own and granted. The uuid on each account is the account_uuid you pass when sending and when working with templates. The portal shows the same id as "Account ID" on each number under WhatsApp, My numbers.
# Paste your token once (it starts with mbs_):
export MOBILESASA_TOKEN="mbs_your_token_here"
curl "https://api.mobilesasa.com/api/v1/whatsapp/accounts" \
-H "Authorization: Bearer $MOBILESASA_TOKEN"{
"success": true,
"data": {
"accounts": [
{
"uuid": "9f6e2a1c-…",
"name": "Mobile Sasa",
"display_name": "Mobile Sasa",
"phone_number_id": "114655268399531",
"msisdn": "254780249966",
"waba_id": "130438810142006",
"mode": "managed",
"is_platform": true,
"granted": true,
"status": true,
"template_count": 3,
"created_at": "2026-07-10T09:30:00Z"
},
{
"uuid": "4b0c7d2e-…",
"name": "Main line",
"display_name": "Acme Ltd",
"phone_number_id": "1093857629",
"msisdn": "254700000001",
"waba_id": "204817593",
"mode": "own_app",
"is_platform": false,
"granted": false,
"status": true,
"template_count": 4,
"created_at": "2026-09-01T09:30:00Z"
}
]
}
}See a number you did not connect?
managed account that is not the platform number was set up for you by Mobile Sasa. It works on the API exactly like one you connected yourself: use its uuid as the account_uuid in sends and create templates on it the same way. Nothing else to connect.Connect your own Meta app
Parameters
| Field | Type | Required | Description |
|---|---|---|---|
| name | string | Yes | A label for this account (shown in listings). |
| phone_number_id | string | Yes | Meta phone number ID from the WhatsApp Business Platform. |
| waba_id | string | Yes | Your WhatsApp Business Account ID. |
| api_key | string | Yes | A permanent (System User) Meta access token for the WABA. |
| app_id | string | No | Meta app ID. Needed to upload image, video or PDF samples for template headers. |
| app_secret | string | No | Meta app secret. With it, webhooks from your app are signature-checked before they touch your data. |
| msisdn | string | No | The display number. Left out, it is read from Meta along with the verified business name. |
# Paste your token once (it starts with mbs_):
export MOBILESASA_TOKEN="mbs_your_token_here"
curl -X POST https://api.mobilesasa.com/api/v1/whatsapp/accounts \
-H "Authorization: Bearer $MOBILESASA_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Main line",
"phone_number_id": "1093857629",
"waba_id": "204817593",
"api_key": "EAAG…",
"app_id": "1537…",
"app_secret": "…"
}'The credentials are checked against Meta before the account is saved, and the templates already on the WABA are pulled in. Point your app's webhook at Mobile Sasa so statuses, replies and template reviews reach you: see Your own Meta app. Disconnect with DELETE /api/v1/whatsapp/accounts/{uuid}.
Account overview
# Paste your token once (it starts with mbs_):
export MOBILESASA_TOKEN="mbs_your_token_here"
curl "https://api.mobilesasa.com/api/v1/whatsapp/overview" \
-H "Authorization: Bearer $MOBILESASA_TOKEN"{
"success": true,
"data": {
"sent_30d": 1240,
"delivered_30d": 1198,
"read_30d": 902,
"failed_30d": 11,
"replies_30d": 87,
"cost_30d": 3100.00,
"balance": 56048.50,
"templates": 6,
"approved": 5,
"in_review": 1
}
}