API & SMPP Documentation

Send SMS from your own application over a simple JSON HTTP API, or connect over SMPP for high-volume traffic. All endpoints are versioned under /api/v1 and served from https://app.bulksmsug.com.

Getting started

Three steps to your first message

  1. Top up credits. The API draws from the same balance as the dashboard. 1 credit = 1 message part.
  2. Copy your API key from the Your credentials section below.
  3. Call POST /api/v1/send-sms with a number and a message. That's it.

Authentication

Bearer token on every request

Authenticate with your API key as a bearer token. Requests without a valid key are rejected with 401.

Authorization: Bearer <API_KEY>
Content-Type: application/json

Your credentials

Unique to your account — treat them like passwords

Every account gets its own API key and SMPP login. Sign up free (new accounts receive free SMS credits) or log in, and your credentials will appear right here and on the API page of your dashboard.

Send an SMS


POST
/api/v1/send-sms

Sends one message to one recipient and deducts the appropriate number of credits.

Request body
FieldTypeRequiredDescription
numberstringyesRecipient phone number. Local or international format — see Phone number formats.
messagestringyesThe text to send. Unicode (emoji, accents) is supported and changes the segment size.
Example request
curl -X POST "https://app.bulksmsug.com/api/v1/send-sms" \
  -H "Authorization: Bearer <API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{
  "number": "0712345678",
  "message": "Sample message"
}'
Success response — 200 OK
{
  "timestamp": 1727118964,
  "calculatedCredits": 1,
  "message": "Sample message",
  "contact": "+256712345678",
  "status": "Sent",
  "id": "bsmsugId906g5153242786d4h64f9e7349d2a7fe"
}
FieldTypeDescription
timestampnumberUnix timestamp (seconds) when the message was accepted.
calculatedCreditsnumberCredits (message parts) charged for this send.
messagestringThe message body as sent.
contactstringThe recipient in normalised +256 E.164 format.
statusstringInitial gateway status — usually Sent or Submitted. Poll the status endpoint for the final result.
idstringMessage ID (bsmsugId… prefix). Store this to check delivery status later.

Check delivery status


GET
/api/v1/status/{message-id}

Returns the latest known delivery state for a message you sent. Pass the full id from the send response, including the bsmsugId prefix.

Path parameter
ParameterTypeDescription
message-idstringThe id returned by POST /api/v1/send-sms, e.g. bsmsugId906g51532…
Example request
curl -X GET "https://app.bulksmsug.com/api/v1/status/bsmsugId906g5153242786d4h64f9e7349d2a7fe" \
  -H "Authorization: Bearer <API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{
  "number": "0712345678",
  "message": "Sample message"
}'
Success response — 200 OK
{
  "status": 1,
  "data": {
    "timestamp": 1727118964,
    "id": "bsmsugId906g5153242786d4h64f9e7349d2a7fe",
    "contact": "+256712345678",
    "status": "Success",
    "message": "Sample message"
  }
}

404 with { "status": 0, "data": "Message not found" } means the ID is unknown to your account (wrong ID, or not yet processed).

Verify a key

Handy for a health check in your integration

GET
/api/v1/auth

Validates the bearer token and echoes back the account it belongs to. No credits are used.

curl -X GET "https://app.bulksmsug.com/api/v1/auth" \
  -H "Authorization: Bearer <API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{
  "number": "0712345678",
  "message": "Sample message"
}'
Success response — 200 OK
{
  "uid": "0m2S9kQ...",
  "email": "[email protected]"
}

Phone number formats

We normalise to +256 E.164 before sending

You can send the number in any of the formats below. It is converted to +256XXXXXXXXX automatically, and the contact field in the response reflects the normalised value.

You sendExampleInterpreted as
9 digits712345678+256712345678
10 digits (leading 0)0712345678+256712345678
12 digits (256…)256712345678+256712345678
Full E.164+256712345678+256712345678 (used as-is)

Message length & credits

How calculatedCredits is worked out

A single SMS carries 160 characters using the GSM-7 alphabet, or 70 characters if the text contains any Unicode character (emoji, curly quotes, many accents). Longer messages are split into parts and each part costs one credit.

EncodingSingle messagePer part when concatenated
GSM-7 (plain text)160 chars153 chars
Unicode (UCS-2)70 chars67 chars

The calculatedCredits value in the send response is the exact number of parts (credits) charged. A send is rejected with { "status": 0, "data": "Insufficient credits" } if your balance can't cover it.

Delivery statuses


The status string moves through these values. The send response captures the initial state; the status endpoint reflects delivery receipts from the carrier.

StatusMeaningFinal?
SentAccepted by our platform and handed to the carrier.No
SubmittedAcknowledged by the carrier, awaiting a delivery receipt.No
BufferedQueued on the carrier network (e.g. handset unreachable).No
SuccessDelivered to the handset.Yes
RejectedRefused by the carrier (invalid number, blocked, sender ID).Yes
FailedCould not be delivered before expiry.Yes

Errors


Errors use standard HTTP status codes. Error bodies are { "status": 0, "data": "<reason>" }.

CodeWhenExample body
400Missing number or message on a send.{"status":0,"data":"Request body must contain both a phone number and a message"}
401Missing or invalid API key.{"status":0,"data":"Invalid API Key"}
404Unknown message ID or account (status endpoint).{"status":0,"data":"Message not found"}
405Wrong HTTP method for the endpoint.{"status":0,"data":"Method Not Allowed"}
500Send failed downstream (e.g. insufficient credits, gateway error).{"status":0,"data":"Insufficient credits"}

SMPP (high volume)

Bind over SMPP v3.4 for sustained throughput

SettingValue
Hostsmpp.bulksmsug.com
Port2775
System IDbsmsug<your-uid>
Passwordyour API key
System type(leave blank)
Bind typetransceiver (or transmitter + receiver)

Use submit_sm with a normalised MSISDN and register for delivery receipts to track status. For dedicated throughput, a custom sender ID, or two-way messaging, talk to support first.

Support


Questions about integration, sender IDs, bulk pricing or your balance:

📞 Call or WhatsApp 0774310842  •  Create a free account  •  See pricing