> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zexa.ao/llms.txt
> Use this file to discover all available pages before exploring further.

# Send and Track SMS Messages Using the Zexa Platform

> Configure and send SMS messages through Zexa. Register a Sender ID, send single messages or campaigns, and track delivery in real time.

SMS is the most universally accessible channel. Zexa routes SMS through local and international carriers, ensuring high deliverability to Angolan and international numbers. Whether you're sending a single transactional alert or a bulk campaign, SMS reaches your customers directly on any mobile device — no app required.

## Before you start

Before you can send your first SMS, make sure you have the following in place:

<Steps>
  <Step title="Register a Sender ID">
    A Sender ID is the name or number displayed to recipients as the message sender. Register and get your Sender ID approved in the Zexa dashboard before sending. See [Sender IDs](/messaging/sender-ids) for full instructions.
  </Step>

  <Step title="Check your credit balance">
    Each SMS segment consumes one credit from your account balance. Make sure your account has sufficient credits before sending. Top up your balance at [app.zexa.ao](https://app.zexa.ao).
  </Step>
</Steps>

<Note>
  You must have a registered and approved Sender ID before sending any SMS messages through Zexa.
</Note>

## Send an SMS via API

Send a `POST` request to `/messages` with `"channel": "sms"` to dispatch an SMS message.

<CodeGroup>
  ```bash curl theme={null}
  curl --request POST \
    --url https://api.zexa.ao/v1/messages \
    --header 'Authorization: Bearer <api_key>' \
    --header 'Content-Type: application/json' \
    --data '{
      "channel": "sms",
      "to": "+244912345678",
      "from": "MYSENDER",
      "body": "Your order #1234 has been shipped."
    }'
  ```

  ```python python theme={null}
  import requests

  url = "https://api.zexa.ao/v1/messages"

  payload = {
      "channel": "sms",
      "to": "+244912345678",
      "from": "MYSENDER",
      "body": "Your order #1234 has been shipped."
  }

  headers = {
      "Authorization": "Bearer <api_key>",
      "Content-Type": "application/json"
  }

  response = requests.post(url, json=payload, headers=headers)
  print(response.json())
  ```
</CodeGroup>

A successful request returns a `201` response with the message object:

```json theme={null}
{
  "id": "msg_xyz789",
  "status": "queued",
  "channel": "sms",
  "to": "+244912345678",
  "created_at": "2026-06-24T10:00:00Z"
}
```

<Tip>
  Always use E.164 format for phone numbers (e.g., `+244912345678` for Angola). Numbers without the country code prefix may fail to deliver.
</Tip>

## Message limits

Keep the following character limits in mind when composing SMS messages:

* **Single segment:** Up to 160 characters using standard GSM-7 encoding.
* **Multi-part SMS:** Messages longer than 160 characters are automatically split into multiple segments. Each segment consumes one credit.
* **Unicode messages:** Messages containing Unicode characters (e.g., Arabic, Chinese, emoji) have a reduced per-segment limit of **70 characters**.

Plan your message length carefully to control credit usage. For longer content, consider using [WhatsApp](/channels/whatsapp) or [Email](/channels/email) instead.

## Delivery statuses

After a message is sent, Zexa updates its status as it moves through the delivery pipeline. Use the `id` returned at send time to poll for status updates or configure a webhook.

| Status          | Description                                                                 |
| --------------- | --------------------------------------------------------------------------- |
| `queued`        | The message has been accepted and is waiting to be dispatched to a carrier. |
| `sent`          | The message has been handed off to the carrier for delivery.                |
| `delivered`     | The carrier has confirmed the message was delivered to the handset.         |
| `failed`        | The message could not be sent due to an error (e.g., invalid number).       |
| `undeliverable` | The message reached the carrier but could not be delivered to the handset.  |

## Next steps

<CardGroup cols={2}>
  <Card title="Bulk SMS Campaigns" icon="bullhorn" href="/messaging/campaigns">
    Send SMS to large contact lists with scheduling, personalisation, and delivery reporting.
  </Card>

  <Card title="Sender IDs" icon="id-card" href="/messaging/sender-ids">
    Register and manage the Sender IDs displayed to your SMS recipients.
  </Card>
</CardGroup>
