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- Top up credits. The API draws from the same balance as the dashboard. 1 credit = 1 message part.
- Copy your API key from the Your credentials section below.
- Call
POST /api/v1/send-smswith anumberand amessage. That's it.
Authentication
Bearer token on every requestAuthenticate with your API key as a bearer token. Requests without a valid key are rejected with 401.
Authorization: Bearer <API_KEY>
Content-Type: application/jsonYour credentials
Unique to your account — treat them like passwordsEvery 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
/api/v1/send-smsSends one message to one recipient and deducts the appropriate number of credits.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
| number | string | yes | Recipient phone number. Local or international format — see Phone number formats. |
| message | string | yes | The 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"
}| Field | Type | Description |
|---|---|---|
| timestamp | number | Unix timestamp (seconds) when the message was accepted. |
| calculatedCredits | number | Credits (message parts) charged for this send. |
| message | string | The message body as sent. |
| contact | string | The recipient in normalised +256 E.164 format. |
| status | string | Initial gateway status — usually Sent or Submitted. Poll the status endpoint for the final result. |
| id | string | Message ID (bsmsugId… prefix). Store this to check delivery status later. |
Check delivery status
/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
| Parameter | Type | Description |
|---|---|---|
| message-id | string | The 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/api/v1/authValidates 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 sendingYou 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 send | Example | Interpreted as |
|---|---|---|
| 9 digits | 712345678 | +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 outA 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.
| Encoding | Single message | Per part when concatenated |
|---|---|---|
| GSM-7 (plain text) | 160 chars | 153 chars |
| Unicode (UCS-2) | 70 chars | 67 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.
| Status | Meaning | Final? |
|---|---|---|
| Sent | Accepted by our platform and handed to the carrier. | No |
| Submitted | Acknowledged by the carrier, awaiting a delivery receipt. | No |
| Buffered | Queued on the carrier network (e.g. handset unreachable). | No |
| Success | Delivered to the handset. | Yes |
| Rejected | Refused by the carrier (invalid number, blocked, sender ID). | Yes |
| Failed | Could not be delivered before expiry. | Yes |
Errors
Errors use standard HTTP status codes. Error bodies are { "status": 0, "data": "<reason>" }.
| Code | When | Example body |
|---|---|---|
| 400 | Missing number or message on a send. | {"status":0,"data":"Request body must contain both a phone number and a message"} |
| 401 | Missing or invalid API key. | {"status":0,"data":"Invalid API Key"} |
| 404 | Unknown message ID or account (status endpoint). | {"status":0,"data":"Message not found"} |
| 405 | Wrong HTTP method for the endpoint. | {"status":0,"data":"Method Not Allowed"} |
| 500 | Send failed downstream (e.g. insufficient credits, gateway error). | {"status":0,"data":"Insufficient credits"} |
SMPP (high volume)
Bind over SMPP v3.4 for sustained throughput| Setting | Value |
|---|---|
| Host | smpp.bulksmsug.com |
| Port | 2775 |
| System ID | bsmsug<your-uid> |
| Password | your API key |
| System type | (leave blank) |
| Bind type | transceiver (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