Skip to main content
All requests go to https://ugatext.com/api/v1 and need your API credentials.

Send a single SMS

POST /sms/send sends one message.
The response contains a message_id (format msg_<13-digit-unix-ms>_<8-hex-chars>) and the initial status queued. Add an Idempotency-Key header to retry safely. See Idempotency.
sender_id is required. A missing, blank, or unapproved value returns 403 SENDER_ID_NOT_APPROVED.

Phone number formats

UgaText delivers to Uganda (+256), Kenya (+254), Tanzania (+255), and DR Congo (+243). Each of these formats is accepted: The API normalizes leading zeros and local formatting before sending. Invalid numbers return 422 INVALID_PHONE_NUMBER. To test for free, send to +256700000000, +254700000000, +255700000000, or +243810000000. See Sandbox.

Tanzania numbers

Tanzanian national numbers have 9 digits after the country code and start with 6 or 7, for example 0712 345 678 or 0682 123 456. Send them as +255712345678 or 255712345678.

Supported destinations

Costs and currency

Rates are listed in Supported destinations. Volume discounts apply. See ugatext.com/pricing for current rates. Send and status responses report cost in several currencies:

Cross-border billing

Accounts billed in UGX, KES, or USD can send to Tanzania (+255) numbers directly. The TZS 16 rate is converted to your wallet currency at the real-time exchange rate and deducted from your balance.

Send bulk SMS

POST /sms/bulk sends one message to up to 5,000 recipients per request. Larger batches return 400 BATCH_SIZE_EXCEEDED.
  • recipients also accepts the aliases phones, to, and messages.
  • Items can be objects with their own to, message, and sender_id, so each recipient can get a different message.
The response includes a batch_id, totals (total_recipients, dispatched_count, failed_count, total_segments, total_cost_ugx), and a results array with one entry per recipient. See Bulk results.

Schedule a message

POST /sms/schedule queues a message for a future time. Send to one number or pass an array for a scheduled bulk broadcast.
Response (200 OK)

Cancel or reschedule

You can change a scheduled message until its send time.
Cancel response
Cancelling an unknown ID returns 404 NOT_FOUND. Cancelling a message that is already cancelled returns 400 ALREADY_CANCELLED, and cancelling one that was already sent or delivered returns 400 CANNOT_CANCEL.

Campaigns

Group a broadcast under a named campaign to track and cancel it as one unit.

Track delivery

Messages move from queued to sent to delivered, or end as failed.
  • Poll: GET /sms/status/{id} returns the status, timestamps (sent_at, delivered_at, failed_at), failure_reason, network, and provider_reference.
  • Push: register a webhook to receive sms.sent, sms.delivered, and sms.failed events.
  • History: GET /sms/history (alias GET /messages) lists your recent messages.
GET /sms/history accepts these optional query parameters:

Segments and encoding

Long messages are split into segments, and you’re billed per segment. Unicode supports Luganda, Swahili, and other regional character sets. Each response includes segments and encoding so you can confirm the cost. To check a message before sending, use the compliance pre-check.

Check your balance

GET /sms/balance returns your wallet balance in UGX, the price per SMS, and the remaining SMS units.
When the balance is too low, sends return 402 INSUFFICIENT_BALANCE. Top up with MTN Mobile Money, Airtel Money, or M-Pesa from the dashboard.