Developer API

Send SMS from your own systems

A simple JSON API over HTTPS. Send one request per message or campaign, and get a message ID back for every recipient. Existing UelloSend integrations keep working without any change.

Getting started

  1. Create an account, verify your email and log in.
  2. 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.
  3. Open API Keys, create a key and copy it. You can reveal and copy it again at any time.
  4. Call /balance/ with your key to check that it works.
Base URL
https://uellosend.com
Method & body
POST with Content-Type: application/json
Authentication
api_key in the JSON body
Treat your API key like a password: call the API from your server, never from a web page or mobile app where users can read it. If a key leaks, revoke it on the API Keys page and create a new one.
Every response has the same shape
{
  "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.

Endpoint: https://uellosend.com/balance/
ParameterTypeRequiredDescription
api_keyStringYesYour API key, from the API Keys page of your SMS dashboard.
Request
curl -X POST https://uellosend.com/balance/ \
  -H "Content-Type: application/json" \
  -d '{
  "api_key": "YOUR_API_KEY"
}'
Response
{
  "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.

Endpoint: https://uellosend.com/quicksend/
ParameterTypeRequiredDescription
api_keyStringYesYour API key, from the API Keys page of your SMS dashboard.
sender_idStringYesThe name recipients see, e.g. UviTech. At most 11 characters, and it must be an approved sender ID on your account.
messageStringYesThe 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.
recipientStringYesOne number, e.g. 0240000000 or +233240000000.
Request
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"
}'
Response
{
  "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.

Endpoint: https://uellosend.com/campaign/
ParameterTypeRequiredDescription
api_keyStringYesYour API key, from the API Keys page of your SMS dashboard.
sender_idStringYesThe name recipients see, e.g. UviTech. At most 11 characters, and it must be an approved sender ID on your account.
messageStringYesThe 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.
recipientArrayYesNumbers as strings, e.g. ["0240000000", "+233200000000"]. At most 5,000 per request.
dateStringNoOnly to schedule instead of sending now. Format DD-MM-YYYY HH:MM AM/PM, e.g. 30-11-2026 03:30 PM (Ghana time).
Request
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"
  ]
}'
Response
// 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.

Endpoint: https://uellosend.com/personalisedsms/
ParameterTypeRequiredDescription
api_keyStringYesYour API key, from the API Keys page of your SMS dashboard.
sender_idStringYesThe name recipients see, e.g. UviTech. At most 11 characters, and it must be an approved sender ID on your account.
messageArrayYesThe template in a one-item array, e.g. ["Hello {NAME}, your order is ready."]. It must contain {NAME}. A plain string is also accepted.
recipientArrayYesNumbers as strings, e.g. ["0240000000", "+233200000000"]. At most 5,000 per request.
namesArrayYesOne name per recipient, in the same order, e.g. ["Ama", "Kofi"]. Must be the same length as recipient.
dateStringNoOnly to schedule instead of sending now. Format DD-MM-YYYY HH:MM AM/PM, e.g. 30-11-2026 03:30 PM (Ghana time).
Request
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"
  ]
}'
Response
{
  "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.

Endpoint: https://uellosend.com/delivery/
ParameterTypeRequiredDescription
api_keyStringYesYour API key, from the API Keys page of your SMS dashboard.
message_idStringYesThe message_id returned when the message was sent.
Request
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"
}'
Response
{
  "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.

Endpoint: https://uellosend.com/cost/
ParameterTypeRequiredDescription
api_keyStringYesYour API key, from the API Keys page of your SMS dashboard.
messageStringYesThe message (or template, if you pass names).
recipientArrayYesNumbers as strings, e.g. ["0240000000", "+233200000000"]. At most 5,000 per request.
namesArrayNoFor a personalised message: one name per recipient, same length as recipient.
Request
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"
  ]
}'
Response
{
  "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"
}
CodedescWhat 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.
401Sender ID not approved / Insufficient creditUse 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.