Send SMS from your own systems
Getting started
- Create an account, verify your email and log in.
- Get an approved sender ID from Sender IDs and top up from your wallet. The API uses the same balance and sender IDs as the dashboard.
- Open API Keys, create a key and copy it. You can reveal and copy it again at any time.
- Call /balance/ with your key to check that it works.
https://uellosend.comPOST with Content-Type: application/jsonapi_key in the JSON body{
"status": "Success" | "Error",
"code": "200", // the HTTP status, as a string
"desc": ... // the result, or the error message
}Check balance (test your key)
POST /balance/The quickest way to check that your API key works. Returns your balance in GHS.
https://uellosend.com/balance/| Parameter | Type | Required | Description |
|---|---|---|---|
| api_key | String | Yes | Your API key, from the API Keys page of your SMS dashboard. |
curl -X POST https://uellosend.com/balance/ \
-H "Content-Type: application/json" \
-d '{
"api_key": "YOUR_API_KEY"
}'{
"status": "Success",
"code": "200",
"desc": "balance: 25.4"
}If you hold an SMS bundle, its remaining credits are counted at the current credit rate.
Quicksend -- one recipient
POST /quicksend/Send one message to one number: one-time passwords, verification codes and notifications.
https://uellosend.com/quicksend/| Parameter | Type | Required | Description |
|---|---|---|---|
| api_key | String | Yes | Your API key, from the API Keys page of your SMS dashboard. |
| sender_id | String | Yes | The name recipients see, e.g. UviTech. At most 11 characters, and it must be an approved sender ID on your account. |
| message | String | Yes | The message text. Supports standard GSM-7 (up to 612 chars, 160 chars/part) and UCS-2 Unicode for emojis and accents (up to 268 units, 70 chars/part). Maximum 4 parts. |
| recipient | String | Yes | One number, e.g. 0240000000 or +233240000000. |
curl -X POST https://uellosend.com/quicksend/ \
-H "Content-Type: application/json" \
-d '{
"api_key": "YOUR_API_KEY",
"sender_id": "UelloSend",
"message": "Your verification code is 482913",
"recipient": "0240000000"
}'{
"status": "Success",
"code": "200",
"desc": [
{ "status": "success", "recipient": "233240000000", "message_id": "3f2b9c1e-7a4d-4e8b-9c21-5d6e0f1a2b3c" }
]
}Keep message_id if you want to look up delivery later with /delivery/. Store it as text: it is an ID string with no fixed length or format. recipient comes back in international form (233 followed by 9 digits, no +), whatever form you sent it in.
Campaign -- many recipients, same message
POST /campaign/Send one message to many numbers at once, now or at a scheduled time.
https://uellosend.com/campaign/| Parameter | Type | Required | Description |
|---|---|---|---|
| api_key | String | Yes | Your API key, from the API Keys page of your SMS dashboard. |
| sender_id | String | Yes | The name recipients see, e.g. UviTech. At most 11 characters, and it must be an approved sender ID on your account. |
| message | String | Yes | The message text. Supports standard GSM-7 (up to 612 chars, 160 chars/part) and UCS-2 Unicode for emojis and accents (up to 268 units, 70 chars/part). Maximum 4 parts. |
| recipient | Array | Yes | Numbers as strings, e.g. ["0240000000", "+233200000000"]. At most 5,000 per request. |
| date | String | No | Only to schedule instead of sending now. Format DD-MM-YYYY HH:MM AM/PM, e.g. 30-11-2026 03:30 PM (Ghana time). |
curl -X POST https://uellosend.com/campaign/ \
-H "Content-Type: application/json" \
-d '{
"api_key": "YOUR_API_KEY",
"sender_id": "UelloSend",
"message": "Our offices are closed on Friday for the holiday.",
"recipient": [
"0240000000",
"0200000000"
]
}'// Sent now
{
"status": "Success",
"code": "200",
"desc": [
{ "status": "success", "recipient": "233240000000", "message_id": "3f2b9c1e-7a4d-4e8b-9c21-5d6e0f1a2b3c" },
{ "status": "success", "recipient": "233200000000", "message_id": "8c0d4e5f-1a2b-4c3d-8e9f-0a1b2c3d4e5f" }
]
}
// With "date" (scheduled)
{
"status": "Success",
"code": "200",
"desc": "Scheduled: reserved 2 credit(s) for 2026-11-30T15:30:00.000Z"
}A scheduled campaign reserves its credits straight away and is sent at the chosen time.
Personalised SMS -- each recipient’s own name
POST /personalisedsms/Like a campaign, but the message is a template with a {NAME} placeholder that is replaced with each recipient’s name.
https://uellosend.com/personalisedsms/| Parameter | Type | Required | Description |
|---|---|---|---|
| api_key | String | Yes | Your API key, from the API Keys page of your SMS dashboard. |
| sender_id | String | Yes | The name recipients see, e.g. UviTech. At most 11 characters, and it must be an approved sender ID on your account. |
| message | Array | Yes | The template in a one-item array, e.g. ["Hello {NAME}, your order is ready."]. It must contain {NAME}. A plain string is also accepted. |
| recipient | Array | Yes | Numbers as strings, e.g. ["0240000000", "+233200000000"]. At most 5,000 per request. |
| names | Array | Yes | One name per recipient, in the same order, e.g. ["Ama", "Kofi"]. Must be the same length as recipient. |
| date | String | No | Only to schedule instead of sending now. Format DD-MM-YYYY HH:MM AM/PM, e.g. 30-11-2026 03:30 PM (Ghana time). |
curl -X POST https://uellosend.com/personalisedsms/ \
-H "Content-Type: application/json" \
-d '{
"api_key": "YOUR_API_KEY",
"sender_id": "UelloSend",
"message": [
"Hello {NAME}, your order is ready for pickup."
],
"recipient": [
"0240000000",
"0200000000"
],
"names": [
"Ama",
"Kofi"
]
}'{
"status": "Success",
"code": "200",
"desc": [
{ "status": "success", "recipient": "233240000000", "message_id": "3f2b9c1e-7a4d-4e8b-9c21-5d6e0f1a2b3c" },
{ "status": "success", "recipient": "233200000000", "message_id": "8c0d4e5f-1a2b-4c3d-8e9f-0a1b2c3d4e5f" }
]
}Each personalised message is priced on its own length after the name is filled in. Emojis and Unicode characters are supported in the template and recipient names.
Delivery report
POST /delivery/Look up the delivery status of a message you sent, using the message_id from the send response.
https://uellosend.com/delivery/| Parameter | Type | Required | Description |
|---|---|---|---|
| api_key | String | Yes | Your API key, from the API Keys page of your SMS dashboard. |
| message_id | String | Yes | The message_id returned when the message was sent. |
curl -X POST https://uellosend.com/delivery/ \
-H "Content-Type: application/json" \
-d '{
"api_key": "YOUR_API_KEY",
"message_id": "3f2b9c1e-7a4d-4e8b-9c21-5d6e0f1a2b3c"
}'{
"status": "Success",
"code": "200",
"desc": [
{
"msg": "Your verification code is 482913",
"msg_cost": "0.035",
"recipient": "233240000000",
"date_sent": "2026-09-27 10:15:02",
"subject": "UelloSend",
"server_response": "success",
"message_uuid": "3f2b9c1e-7a4d-4e8b-9c21-5d6e0f1a2b3c",
"delivery_status": "DELIVERED",
"error": null,
"date": "2026-09-27"
}
]
}delivery_status is one of DELIVERED (delivered), NOT_DELIVERED (the network could not deliver it), FAILED (rejected when sending), SENT or SUBMITTED (sent, waiting for the network’s report), QUEUED or PENDING_APPROVAL (not sent yet). You can only look up messages sent with your own account.
Estimate cost
POST /cost/Work out what a send would cost before sending it. Nothing is sent or charged.
https://uellosend.com/cost/| Parameter | Type | Required | Description |
|---|---|---|---|
| api_key | String | Yes | Your API key, from the API Keys page of your SMS dashboard. |
| message | String | Yes | The message (or template, if you pass names). |
| recipient | Array | Yes | Numbers as strings, e.g. ["0240000000", "+233200000000"]. At most 5,000 per request. |
| names | Array | No | For a personalised message: one name per recipient, same length as recipient. |
curl -X POST https://uellosend.com/cost/ \
-H "Content-Type: application/json" \
-d '{
"api_key": "YOUR_API_KEY",
"message": "Our offices are closed on Friday for the holiday.",
"recipient": [
"0240000000",
"0200000000"
]
}'{
"status": "Success",
"code": "200",
"desc": 0.07
}The cost is in GHS at the current credit rate.
Errors
Errors use the same shape, with "status": "Error", the HTTP status in code and the reason in desc. Nothing is charged when a request fails.
{
"status": "Error",
"code": "401",
"desc": "Invalid API key"
}| Code | desc | What to do |
|---|---|---|
| 400 | "api_key missing!", "message missing!", … | A required parameter is missing -- the message names it. |
| 401 | "Invalid API key" | The key is wrong or has been revoked. Copy it again from your API Keys page. |
| 400 | "SenderID cannot exceed 11 characters!" | Shorten the sender ID. |
| 401 | Sender ID not approved / Insufficient credit | Use an approved sender ID, or top up your account. |
| 400 | "Message exceeds maximum allowable length …" | Keep standard messages to 612 characters or fewer (or 268 characters for Unicode/emoji messages). |
| 400 | "Message can't be forwarded, prohibited …" | The message contains a blocked word or phrase. Reword it. |
| 400 | "Size of Names and Recipient parameters must be the same!" | Send one name for every number. |
| 400 | "Invalid Schedule Date Format …" | Use DD-MM-YYYY HH:MM AM/PM, e.g. 30-11-2026 03:30 PM. |