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
}Pre-built CMS & E-commerce Plugins
Running WordPress, WooCommerce, or WHMCS? You don't have to write HTTP requests from scratch. Download our official, verified marketplace plugins, paste your UelloSend API key, and start sending automated order and billing alerts in minutes.
UelloSend SMS for WooCommerce
Sends automated order, checkout, and account notifications to Ghanaian customers and admins (+233).
- Dynamic template tags (
{first_name},{order_id}) - Admin dispatch for new orders & low stock
- Dry Run Mode to test triggers without consuming credits
- Customer checkout SMS opt-out compliance
UelloSend SMS Alert for WHMCS
Automated billing and support notifications for web hosting providers and cloud service platforms.
- Invoices: Generated, Paid, Reminders & Overdue
- Support tickets: Instant SMS on client/admin replies
- Domains: Registration, Transfer, Renewal & Expiry
- Admin SMS dispatch for critical hosting events
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. |