API v2 Documentation
RecommendedVersion 2 uses API key authentication with enhanced security and features.
Overview
Base URL
Features
- API Key Authentication - Secure token-based authentication
- Rate Limiting - 60 requests per minute per API key
- Bulk SMS Support - Send personalized messages in bulk
- Usage Statistics - Track your API usage
- Balance Check - Real-time balance inquiry
- Improved Security - No password transmission
Response Format
{
"success": true,
"message": "Operation successful",
"data": {
// Response data
}
}
Authentication
All v2 endpoints require API key authentication. You can provide the API key in three ways:
1. HTTP Header (Recommended)
X-API-Key: your_api_key_here
2. Query Parameter
GET https://ugsms.com/api/v2/account/balance?api_key=your_api_key_here
3. Request Body
{
"api_key": "your_api_key_here",
"numbers": "0702913454",
"message_body": "Hello"
}
Send SMS
/api/v2/sms/send
(GET also supported)
Send SMS to one or multiple Ugandan mobile numbers.
Request Parameters
| Parameter | Type | Required | Description | Example |
|---|---|---|---|---|
numbers |
String | Yes | Comma-separated phone numbers | 0702913454,0776913451 |
message_body |
String | Yes | SMS message content (max 160 chars per segment) | Hello from UGSMS |
sender_id |
String | No | Sender ID (max 11 characters) | UGSMS |
api_key |
String | No* | API key (if not using X-API-Key header) | abc123... |
* API key is required but can be provided via header instead.
Example Request
curl -X POST "https://ugsms.com/api/v2/sms/send" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"numbers": "0702913454,0776913451",
"message_body": "Hello from UGSMS API v2",
"sender_id": "UGSMS"
}'
fetch('https://ugsms.com/api/v2/sms/send', {
method: 'POST',
headers: {
'X-API-Key': 'YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
numbers: '0702913454,0776913451',
message_body: 'Hello from UGSMS API v2',
sender_id: 'UGSMS'
})
})
.then(response => response.json())
.then(data => console.log(data));
$apiKey = 'YOUR_API_KEY';
$data = [
'numbers' => '0702913454,0776913451',
'message_body' => 'Hello from UGSMS API v2',
'sender_id' => 'UGSMS'
];
$ch = curl_init('https://ugsms.com/api/v2/sms/send');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'X-API-Key: ' . $apiKey
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
print_r($result);
import requests
import json
url = "https://ugsms.com/api/v2/sms/send"
api_key = "YOUR_API_KEY"
data = {
"numbers": "0702913454,0776913451",
"message_body": "Hello from UGSMS API v2",
"sender_id": "UGSMS"
}
headers = {
"X-API-Key": api_key,
"Content-Type": "application/json"
}
response = requests.post(url, json=data, headers=headers)
result = response.json()
print(result)
#include <stdio.h>
#include <curl/curl.h>
#include <string.h>
struct MemoryStruct {
char *memory;
size_t size;
};
static size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp) {
size_t realsize = size * nmemb;
struct MemoryStruct *mem = (struct MemoryStruct *)userp;
char *ptr = realloc(mem->memory, mem->size + realsize + 1);
if(!ptr) {
return 0;
}
mem->memory = ptr;
memcpy(&(mem->memory[mem->size]), contents, realsize);
mem->size += realsize;
mem->memory[mem->size] = 0;
return realsize;
}
int main(void) {
CURL *curl;
CURLcode res;
char *api_key = "YOUR_API_KEY";
char *url = "https://ugsms.com/api/v2/sms/send";
struct MemoryStruct chunk;
chunk.memory = malloc(1);
chunk.size = 0;
curl = curl_easy_init();
if(curl) {
struct curl_slist *headers = NULL;
char auth_header[100];
sprintf(auth_header, "X-API-Key: %s", api_key);
headers = curl_slist_append(headers, auth_header);
headers = curl_slist_append(headers, "Content-Type: application/json");
char *json_data = "{\"numbers\":\"0702913454,0776913451\",\"message_body\":\"Hello from UGSMS API v2\",\"sender_id\":\"UGSMS\"}";
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_POST, 1L);
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, json_data);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);
res = curl_easy_perform(curl);
if(res == CURLE_OK) {
printf("%s\n", chunk.memory);
} else {
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
}
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
free(chunk.memory);
}
return 0;
}
using System;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
var apiKey = "YOUR_API_KEY";
var url = "https://ugsms.com/api/v2/sms/send";
var data = new
{
numbers = "0702913454,0776913451",
message_body = "Hello from UGSMS API v2",
sender_id = "UGSMS"
};
var json = JsonSerializer.Serialize(data);
var content = new StringContent(json, Encoding.UTF8, "application/json");
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Add("X-API-Key", apiKey);
var response = await client.PostAsync(url, content);
var responseString = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseString);
}
}
}
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
)
func main() {
apiKey := "YOUR_API_KEY"
url := "https://ugsms.com/api/v2/sms/send"
data := map[string]string{
"numbers": "0702913454,0776913451",
"message_body": "Hello from UGSMS API v2",
"sender_id": "UGSMS",
}
jsonData, err := json.Marshal(data)
if err != nil {
fmt.Println("Error marshaling JSON:", err)
return
}
req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
if err != nil {
fmt.Println("Error creating request:", err)
return
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("X-API-Key", apiKey)
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
fmt.Println("Error sending request:", err)
return
}
defer resp.Body.Close()
var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result)
fmt.Println(result)
}
import 'dart:convert';
import 'package:http/http.dart' as http;
void main() async {
final apiKey = 'YOUR_API_KEY';
final url = 'https://ugsms.com/api/v2/sms/send';
final data = {
'numbers': '0702913454,0776913451',
'message_body': 'Hello from UGSMS API v2',
'sender_id': 'UGSMS',
};
final response = await http.post(
Uri.parse(url),
headers: {
'Content-Type': 'application/json',
'X-API-Key': apiKey,
},
body: jsonEncode(data),
);
final result = jsonDecode(response.body);
print(result);
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import com.google.gson.Gson;
public class SendSMS {
public static void main(String[] args) {
String apiKey = "YOUR_API_KEY";
String url = "https://ugsms.com/api/v2/sms/send";
SMSData data = new SMSData();
data.numbers = "0702913454,0776913451";
data.message_body = "Hello from UGSMS API v2";
data.sender_id = "UGSMS";
Gson gson = new Gson();
String jsonData = gson.toJson(data);
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("Content-Type", "application/json")
.header("X-API-Key", apiKey)
.POST(HttpRequest.BodyPublishers.ofString(jsonData))
.build();
try {
HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
} catch (Exception e) {
e.printStackTrace();
}
}
}
class SMSData {
public String numbers;
public String message_body;
public String sender_id;
}
require 'net/http'
require 'json'
api_key = 'YOUR_API_KEY'
url = URI('https://ugsms.com/api/v2/sms/send')
data = {
numbers: '0702913454,0776913451',
message_body: 'Hello from UGSMS API v2',
sender_id: 'UGSMS'
}
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = (url.scheme == 'https')
request = Net::HTTP::Post.new(url)
request['Content-Type'] = 'application/json'
request['X-API-Key'] = api_key
request.body = data.to_json
response = http.request(request)
puts response.body
Example Response
{
"success": true,
"message": "Message sent successfully",
"data": {
"recipients": 2,
"message_segments": 1,
"estimated_cost": 20.0,
"remaining_balance": 980.0,
"api_version": "v2",
"status": "pending",
"timestamp": "2024-01-01T12:00:00Z"
}
}
SMS Cost Calculation
SMS cost is calculated as:
Total Cost = (Number of Recipients) × (Message Segments) × (Price per Segment)
Message Segments = ceil(Message Length / 160)
Price per Segment = Your account rate (check your dashboard)
Send Bulk SMS
/api/v2/sms/send/bulk
Batch personalized messages
Send personalized SMS messages to multiple recipients in a single request. Each message can have different content for each recipient.
Request Parameters
| Parameter | Type | Required | Description | Example |
|---|---|---|---|---|
messages |
Array | Yes | Array of message objects | [{"number": "070...", "message_body": "..."}] |
sender_id |
String | No | Sender ID (max 11 characters) | UGSMS |
reference |
String | No | Custom reference for tracking | ORDER-123 |
api_key |
String | No* | API key (if not using X-API-Key header) | abc123... |
* API key is required but can be provided via header instead.
Message Object Format
{
"number": "0702913454", // Required: Recipient phone number
"message_body": "Dear John..." // Required: Personalized message content
}
Example Request
curl -X POST "https://ugsms.com/api/v2/sms/send/bulk" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"messages": [
{
"number": "0702913454",
"message_body": "Dear John, your appointment is at 2 PM today."
},
{
"number": "0776913451",
"message_body": "Dear Jane, your payment of UGX 50,000 was received."
},
{
"number": "0755913452",
"message_body": "Dear Robert, your order #12345 is ready for pickup."
}
],
"sender_id": "UGSMS",
"reference": "NOTIFICATIONS-2024"
}'
fetch('https://ugsms.com/api/v2/sms/send/bulk', {
method: 'POST',
headers: {
'X-API-Key': 'YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
messages: [
{
number: '0702913454',
message_body: 'Dear John, your appointment is at 2 PM today.'
},
{
number: '0776913451',
message_body: 'Dear Jane, your payment of UGX 50,000 was received.'
},
{
number: '0755913452',
message_body: 'Dear Robert, your order #12345 is ready for pickup.'
}
],
sender_id: 'UGSMS',
reference: 'NOTIFICATIONS-2024'
})
})
.then(response => response.json())
.then(data => console.log(data));
$apiKey = 'YOUR_API_KEY';
$url = 'https://ugsms.com/api/v2/sms/send/bulk';
$messages = [
[
'number' => '0702913454',
'message_body' => 'Dear John, your appointment is at 2 PM today.'
],
[
'number' => '0776913451',
'message_body' => 'Dear Jane, your payment of UGX 50,000 was received.'
],
[
'number' => '0755913452',
'message_body' => 'Dear Robert, your order #12345 is ready for pickup.'
]
];
$data = [
'messages' => $messages,
'sender_id' => 'UGSMS',
'reference' => 'NOTIFICATIONS-2024'
];
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'X-API-Key: ' . $apiKey
]);
$response = curl_exec($ch);
curl_close($ch);
$result = json_decode($response, true);
echo json_encode($result, JSON_PRETTY_PRINT);
import requests
import json
api_key = "YOUR_API_KEY"
url = "https://ugsms.com/api/v2/sms/send/bulk"
messages = [
{"number": "0702913454", "message_body": "Dear John, your appointment is at 2 PM today."},
{"number": "0776913451", "message_body": "Dear Jane, your payment of UGX 50,000 was received."},
{"number": "0755913452", "message_body": "Dear Robert, your order #12345 is ready for pickup."}
]
data = {
"messages": messages,
"sender_id": "UGSMS",
"reference": "NOTIFICATIONS-2024"
}
headers = {
"X-API-Key": api_key,
"Content-Type": "application/json"
}
response = requests.post(url, json=data, headers=headers)
result = response.json()
print(json.dumps(result, indent=2))
using System;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
var apiKey = "YOUR_API_KEY";
var url = "https://ugsms.com/api/v2/sms/send/bulk";
var data = new
{
messages = new[]
{
new { number = "0702913454", message_body = "Dear John, your appointment is at 2 PM today." },
new { number = "0776913451", message_body = "Dear Jane, your payment of UGX 50,000 was received." },
new { number = "0755913452", message_body = "Dear Robert, your order #12345 is ready for pickup." }
},
sender_id = "UGSMS",
reference = "NOTIFICATIONS-2024"
};
var json = JsonSerializer.Serialize(data);
var content = new StringContent(json, Encoding.UTF8, "application/json");
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Add("X-API-Key", apiKey);
var response = await client.PostAsync(url, content);
var responseString = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseString);
}
}
}
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
)
func main() {
apiKey := "YOUR_API_KEY"
url := "https://ugsms.com/api/v2/sms/send/bulk"
messages := []map[string]string{
{"number": "0702913454", "message_body": "Dear John, your appointment is at 2 PM today."},
{"number": "0776913451", "message_body": "Dear Jane, your payment of UGX 50,000 was received."},
{"number": "0755913452", "message_body": "Dear Robert, your order #12345 is ready for pickup."},
}
data := map[string]interface{}{
"messages": messages,
"sender_id": "UGSMS",
"reference": "NOTIFICATIONS-2024",
}
jsonData, err := json.Marshal(data)
if err != nil {
fmt.Println("Error marshaling JSON:", err)
return
}
req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
if err != nil {
fmt.Println("Error creating request:", err)
return
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("X-API-Key", apiKey)
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
fmt.Println("Error sending request:", err)
return
}
defer resp.Body.Close()
var result map[string]interface{}
json.NewDecoder(resp.Body).Decode(&result)
fmt.Println(result)
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import com.google.gson.Gson;
import java.util.List;
import java.util.ArrayList;
public class SendBulkSMS {
public static void main(String[] args) {
String apiKey = "YOUR_API_KEY";
String url = "https://ugsms.com/api/v2/sms/send/bulk";
List<SMSMessage> messages = new ArrayList<>();
messages.add(new SMSMessage("0702913454", "Dear John, your appointment is at 2 PM today."));
messages.add(new SMSMessage("0776913451", "Dear Jane, your payment of UGX 50,000 was received."));
messages.add(new SMSMessage("0755913452", "Dear Robert, your order #12345 is ready for pickup."));
BulkSMSData data = new BulkSMSData();
data.messages = messages;
data.sender_id = "UGSMS";
data.reference = "NOTIFICATIONS-2024";
Gson gson = new Gson();
String jsonData = gson.toJson(data);
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("Content-Type", "application/json")
.header("X-API-Key", apiKey)
.POST(HttpRequest.BodyPublishers.ofString(jsonData))
.build();
try {
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
} catch (Exception e) {
e.printStackTrace();
}
}
}
class BulkSMSData {
public List<SMSMessage> messages;
public String sender_id;
public String reference;
}
class SMSMessage {
public String number;
public String message_body;
public SMSMessage(String number, String message_body) {
this.number = number;
this.message_body = message_body;
}
}
require 'net/http'
require 'json'
api_key = 'YOUR_API_KEY'
url = URI('https://ugsms.com/api/v2/sms/send/bulk')
messages = [
{ number: '0702913454', message_body: 'Dear John, your appointment is at 2 PM today.' },
{ number: '0776913451', message_body: 'Dear Jane, your payment of UGX 50,000 was received.' },
{ number: '0755913452', message_body: 'Dear Robert, your order #12345 is ready for pickup.' }
]
data = {
messages: messages,
sender_id: 'UGSMS',
reference: 'NOTIFICATIONS-2024'
}
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = (url.scheme == 'https')
request = Net::HTTP::Post.new(url)
request['Content-Type'] = 'application/json'
request['X-API-Key'] = api_key
request.body = data.to_json
response = http.request(request)
puts response.body
Example Response
{
"success": true,
"message": "Bulk messages processed successfully",
"data": {
"summary": {
"total_messages": 3,
"successful": 3,
"failed": 0,
"total_contacts": 3,
"total_messages": 4,
"total_cost": 140.0,
"current_balance": 1860.0,
"api_version": "v2",
"timestamp": "2024-01-01T12:00:00Z"
},
"successful_messages": [
{
"index": 0,
"number": "0702913454",
"number_of_messages": 1,
"cost": 35.0
},
{
"index": 1,
"number": "0776913451",
"number_of_messages": 2,
"cost": 70.0
},
{
"index": 2,
"number": "0755913452",
"number_of_messages": 1,
"cost": 35.0
}
],
"failed_messages": null
}
}
Error Response Example
{
"success": false,
"message": "Bulk message processing failed",
"data": {
"summary": {
"total_messages": 3,
"successful": 2,
"failed": 1,
"total_contacts": 2,
"total_messages": 3,
"total_cost": 105.0,
"current_balance": 895.0,
"api_version": "v2",
"timestamp": "2024-01-01T12:00:00Z"
},
"successful_messages": [
{
"index": 0,
"number": "0702913454",
"number_of_messages": 1,
"cost": 35.0
},
{
"index": 2,
"number": "0755913452",
"number_of_messages": 2,
"cost": 70.0
}
],
"failed_messages": [
{
"index": 1,
"number": "0776913451",
"error": "Invalid phone number format"
}
]
}
}
Account Endpoints
/api/v2/account/balance
Get current account balance and API key information.
Example Request
curl -H "X-API-Key: YOUR_API_KEY" \
"https://ugsms.com/api/v2/account/balance"
Example Response
{
"success": true,
"data": {
"balance": 1000.50,
"currency": "UGX",
"api_key": "abcd1234...xyz9",
"api_key_expires": "2024-12-31T23:59:59Z",
"last_api_used": "2024-01-01T12:30:45Z"
}
}
/api/v2/account/usage
Get API usage statistics and account information.
Example Request
curl -H "X-API-Key: YOUR_API_KEY" \
"https://ugsms.com/api/v2/account/usage"
Example Response
{
"success": true,
"data": {
"user_id": 12345,
"account_balance": 1860.0,
"message_price_per_segment": 35.0,
"api_version": "v2",
"timestamp": "2024-01-01T12:35:20Z"
}
}
Best Practices
- Store API keys in environment variables
- Use HTTPS for all API requests
- Rotate API keys periodically (every 90 days)
- Never commit API keys to version control
- Use different API keys for different environments
- Use bulk endpoint for personalized messages
- Implement retry logic with exponential backoff
- Cache balance information when possible
- Monitor rate limits (60 requests/minute)
- Batch messages when possible
- Keep messages under 160 characters to avoid extra segments
- Include a clear sender ID for brand recognition
- Personalize messages when using bulk endpoint
- Test with small batches first
- Include opt-out instructions for marketing messages
| Issue | Causes | Solutions |
|---|---|---|
| 401 Unauthorized | Invalid, missing, or expired API key | Generate new API key in dashboard |
| 400 Invalid Format | Wrong phone number format or missing required fields | Use format: 0702913454 or +256702913454 |
| 402 Insufficient Balance | Not enough balance to send SMS | Top up your account in the dashboard |
| 429 Too Many Requests | Rate limit exceeded (60 requests/minute) | Wait 1 minute or implement rate limiting |
| 400 Bulk Validation | Invalid messages array format in bulk endpoint | Ensure messages is an array of objects with number and message_body |
| Partial Success | Some messages in bulk request failed | Check failed_messages array in response for details |
Practical examples for common scenarios:
Bulk Notifications from Database (PHP)
// Example: Send personalized notifications from database
$apiKey = 'YOUR_API_KEY';
$url = 'https://ugsms.com/api/v2/sms/send/bulk';
// Fetch customers from database
$customers = [
['phone' => '0702913454', 'name' => 'John', 'appointment_time' => '2 PM'],
['phone' => '0776913451', 'name' => 'Jane', 'appointment_time' => '3 PM'],
['phone' => '0755913452', 'name' => 'Robert', 'appointment_time' => '4 PM']
];
// Prepare messages array
$messages = [];
foreach ($customers as $customer) {
$messages[] = [
'number' => $customer['phone'],
'message_body' => "Dear {$customer['name']}, your appointment is at {$customer['appointment_time']} today. Please arrive 15 minutes early."
];
}
// Send bulk SMS
$data = ['messages' => $messages, 'sender_id' => 'CLINIC'];
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'X-API-Key: ' . $apiKey
]);
$response = curl_exec($ch);
$result = json_decode($response, true);
if ($result['success']) {
echo "Sent " . count($result['data']['successful_messages']) . " messages successfully!";
} else {
echo "Some messages failed. Check failed_messages array.";
}
Payment Receipts (Python)
import requests
import json
api_key = "YOUR_API_KEY"
url = "https://ugsms.com/api/v2/sms/send/bulk"
# Simulated payment data
payments = [
{"phone": "0702913454", "name": "John Doe", "amount": 50000, "invoice": "INV-001"},
{"phone": "0776913451", "name": "Jane Smith", "amount": 75000, "invoice": "INV-002"},
{"phone": "0755913452", "name": "Robert Johnson", "amount": 120000, "invoice": "INV-003"}
]
messages = []
for payment in payments:
message = f"Dear {payment['name']}, payment of UGX {payment['amount']:,} for invoice {payment['invoice']} received. Thank you!"
messages.append({
"number": payment["phone"],
"message_body": message
})
data = {
"messages": messages,
"sender_id": "PAYMENTS",
"reference": "RECEIPTS-Q1-2024"
}
headers = {
"X-API-Key": api_key,
"Content-Type": "application/json"
}
response = requests.post(url, json=data, headers=headers)
result = response.json()
if result.get('success'):
print(f"✅ Successfully sent {len(result['data']['successful_messages'])} receipts")
if result['data'].get('failed_messages'):
print(f"⚠️ {len(result['data']['failed_messages'])} failed. Check failed_messages.")
else:
print("❌ Request failed:", result.get('message', 'Unknown error'))
Sandbox Testing
How Sandbox Works
- Uses the same API key as your live account
- Validates phone numbers and message body exactly like live
- Checks your balance exactly like live (returns error if insufficient)
- Does NOT send real SMS
- Does NOT deduct your balance
- Returns the same response format as live
Going Live is Just Changing the URL
| Endpoint | Sandbox URL | Live URL |
|---|---|---|
| Send SMS | /api/v2/sandbox/sms/send |
/api/v2/sms/send |
| Send Bulk SMS | /api/v2/sandbox/sms/send/bulk |
/api/v2/sms/send/bulk |
| Account Balance | /api/v2/sandbox/account/balance |
/api/v2/account/balance |
/api/v2/sandbox/sms/send
SANDBOX
Test sending SMS without spending balance or sending real messages.
curl -X POST "https://ugsms.com/api/v2/sandbox/sms/send" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"numbers": "0702913454,0776913451",
"message_body": "Hello from UGSMS Sandbox!"
}'
fetch('https://ugsms.com/api/v2/sandbox/sms/send', {
method: 'POST',
headers: {
'X-API-Key': 'YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
numbers: '0702913454,0776913451',
message_body: 'Hello from UGSMS Sandbox!'
})
})
.then(response => response.json())
.then(data => console.log(data));
$ch = curl_init('https://ugsms.com/api/v2/sandbox/sms/send');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
'numbers' => '0702913454,0776913451',
'message_body' => 'Hello from UGSMS Sandbox!'
]));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'X-API-Key: YOUR_API_KEY'
]);
$result = json_decode(curl_exec($ch), true);
curl_close($ch);
print_r($result);
import requests
response = requests.post(
'https://ugsms.com/api/v2/sandbox/sms/send',
headers={'X-API-Key': 'YOUR_API_KEY'},
json={
'numbers': '0702913454,0776913451',
'message_body': 'Hello from UGSMS Sandbox!'
}
)
print(response.json())
Sandbox Response
{
"success": true,
"message": "Sandbox: Message simulated successfully. No SMS was sent and no balance was deducted.",
"data": {
"recipients": 2,
"number_of_messages": 1,
"estimated_cost": 60,
"remaining_balance": 5000,
"api_version": "v2",
"status": "sandbox",
"timestamp": "2026-03-01T10:00:00.000000Z"
},
"sandbox": true,
"note": "Switch /sandbox/sms/send to /sms/send to go live"
}
"success": true in sandbox, your integration is correct and ready to go live. Just remove /sandbox from the URL.
/api/v2/sandbox/sms/send/bulk
SANDBOX
Test bulk SMS sending without spending balance.
curl -X POST "https://ugsms.com/api/v2/sandbox/sms/send/bulk" \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"numbers": "0702913454,0776913451,0755913452",
"message_body": "Dear customer, this is a test bulk message."
}'
/api/v2/sandbox/account/balance
SANDBOX
Check your account balance (same as live - shows real balance).
curl -X GET "https://ugsms.com/api/v2/sandbox/account/balance" \
-H "X-API-Key: YOUR_API_KEY"
{
"success": true,
"data": {
"balance": 5000,
"currency": "UGX",
"price_per_sms": 30,
"api_version": "v2"
},
"sandbox": true,
"note": "This is the same balance as your live account"
}
Ready to Go Live?
Once your sandbox tests pass, going live is a one-line change:
- const BASE_URL = 'https://ugsms.com/api/v2/sandbox';
+ const BASE_URL = 'https://ugsms.com/api/v2';
That's it. Same API key, same request format, same response format.