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

WhatsApp lives under /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.

AccountmodeBillingSetup
The Mobile Sasa numbermanaged, is_platform: truePer message at the category rate (updates, promotions, passcodes)None. Join it with one call and send today.
Your number, set up by Mobile SasamanagedPer message at the category rateTalk to us. We register your business and number at Meta on our portfolio.
Your own Meta developer appown_appFlat platform fee per message; Meta bills you for the conversationsConnect 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

  1. Pick a number: join the Mobile Sasa number or connect your own.
  2. Create templates: written here, submitted to Meta for review, usually approved within minutes to a day. Only approved templates can send.
  3. 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

GEThttps://api.mobilesasa.com/api/v1/whatsapp/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"
Response
{
  "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

GEThttps://api.mobilesasa.com/api/v1/whatsapp/platform
# 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"
Response
{
  "success": true,
  "data": {
    "available": true,
    "joined": false,
    "pricing": { "marketing": 8.00, "utility": 2.50, "authentication": 2.50, "own_app_fee": 0.10, "currency": "KES" }
  }
}
POSThttps://api.mobilesasa.com/api/v1/whatsapp/platform/join
# 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

On the shared number your recipients see the Mobile Sasa business name, so say who you are in the message. When you want your own name and profile, move to a number of your own; your templates have to be created again on the new number, since Meta ties them to the account.

List your accounts

GEThttps://api.mobilesasa.com/api/v1/whatsapp/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"
Response
{
  "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?

A 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

POSThttps://api.mobilesasa.com/api/v1/whatsapp/accounts

Parameters

FieldTypeRequiredDescription
namestringYesA label for this account (shown in listings).
phone_number_idstringYesMeta phone number ID from the WhatsApp Business Platform.
waba_idstringYesYour WhatsApp Business Account ID.
api_keystringYesA permanent (System User) Meta access token for the WABA.
app_idstringNoMeta app ID. Needed to upload image, video or PDF samples for template headers.
app_secretstringNoMeta app secret. With it, webhooks from your app are signature-checked before they touch your data.
msisdnstringNoThe 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

GEThttps://api.mobilesasa.com/api/v1/whatsapp/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"
Response
{
  "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
  }
}

Next