Message history, receipts and replies

Every send with its full lifecycle, including read receipts, which SMS can never give you. Replies from your customers land in the inbox.

Sent messages

GEThttps://api.mobilesasa.com/api/v1/whatsapp/messages

Query parameters

FieldTypeRequiredDescription
account_uuiduuidNoFilter to one number.
statusstringNoOne of queued, sent, delivered, read, failed.
searchstringNoMatch against recipient numbers or message text.
page / page_sizeintNoStandard pagination.
# Paste your token once (it starts with mbs_):
export MOBILESASA_TOKEN="mbs_your_token_here"

curl "https://api.mobilesasa.com/api/v1/whatsapp/messages?status=read&page=1" \
  -H "Authorization: Bearer $MOBILESASA_TOKEN"
Response
{
  "success": true,
  "data": {
    "messages": [
      {
        "uuid": "7c31…",
        "msisdn": "254712345678",
        "body": "Hi Jane, your February statement is ready. Balance: KES 128,400.",
        "template_name": "t1234_statement_ready",
        "tracking_id": "a0f3…",
        "status": "read",
        "cost": 2.5,
        "source": "api",
        "sent_at": "2026-10-10T09:32:12Z",
        "delivered_at": "2026-10-10T09:32:15Z",
        "read_at": "2026-10-10T09:40:02Z",
        "created_at": "2026-10-10T09:32:11Z"
      },
      {
        "uuid": "8d42…",
        "msisdn": "254733000002",
        "body": "…",
        "template_name": "t1234_statement_ready",
        "tracking_id": "b1e4…",
        "status": "failed",
        "error": "(131026) Message undeliverable",
        "cost": 2.5,
        "refunded_at": "2026-10-10T09:32:20Z",
        "source": "api",
        "created_at": "2026-10-10T09:32:11Z"
      }
    ],
    "total": 412,
    "page": 1,
    "page_size": 50
  }
}

Status lifecycle

  • queued: accepted and charged, awaiting dispatch to Meta.
  • sent: one tick. Accepted by WhatsApp.
  • delivered: two ticks. Reached the recipient's device.
  • read: blue ticks. The recipient opened it.
  • failed: not deliverable (not a WhatsApp user, policy rejection, expired token…). error carries Meta's reason and refunded_at confirms the charge went back to your wallet.

Statuses update in near-real time as Meta's webhooks arrive. Poll this endpoint or reconcile in batches, whichever suits your system.

user_id on a message

When Meta hides the recipient's phone number behind a WhatsApp username, messages and replies carry a user_id (a business-scoped user ID) and msisdn may be empty. See usernames.

Replies (inbox)

GEThttps://api.mobilesasa.com/api/v1/whatsapp/inbox

Query parameters

FieldTypeRequiredDescription
account_uuiduuidNoFilter to one number.
searchstringNoMatch against sender numbers or message text.
page / page_sizeintNoStandard pagination.
# Paste your token once (it starts with mbs_):
export MOBILESASA_TOKEN="mbs_your_token_here"

curl "https://api.mobilesasa.com/api/v1/whatsapp/inbox" \
  -H "Authorization: Bearer $MOBILESASA_TOKEN"
Response
{
  "success": true,
  "data": {
    "messages": [
      {
        "uuid": "3e9a…",
        "account_name": "Mobile Sasa",
        "msisdn": "254712345678",
        "msg_type": "text",
        "body": "Yes, confirm my appointment",
        "received_at": "2026-10-10T09:41:30Z"
      },
      {
        "uuid": "4fab…",
        "account_name": "Mobile Sasa",
        "msisdn": "",
        "user_id": "4040…",
        "msg_type": "button",
        "body": "Yes",
        "received_at": "2026-10-10T09:42:01Z"
      }
    ],
    "total": 87,
    "page": 1,
    "page_size": 50
  }
}

msg_type is text, button (a quick-reply tap; body is the button text), image, document, audio or reaction. On the Mobile Sasa number you see replies to your own messages only. Replying from the API is a template send; a free-form reply window (24 hours after the customer writes) is on the roadmap.