Base URL
https://www.shulekeeper.com/api/v1/standlone-sms/apiThis URL follows the domain serving this page. On production it becomes https://shulekeeper.com/api/v1/standlone-sms/api.
Quick start
- Open API integration in the dashboard and create a named key with an expiry date.
- Copy the
slsms_...token immediately. Only its SHA-256 hash is stored. - Send it from your server as
Authorization: Bearer slsms_.... - Fund the same ShuleSMS wallet used by the dashboard before sending.
Endpoints
| Method | Path | Purpose |
|---|---|---|
| POST | /quote | Validate and estimate recipients, units and UGX cost |
| POST | /messages | Send one campaign using wallet credit |
| GET | /messages/:key | Read campaign and delivery status |
Quote payload and response
request JSON
{
"message": "Your order is ready for collection.",
"contacts": [
{ "contact": "0772123456", "name": "Jane" },
{ "contact": "+256701234567", "name": "John" }
]
}success response
{
"success": true,
"message": "SMS quote returned successfully.",
"quote": { "recipients": 2, "units": 2, "cost": 70, "currency": "UGX" }
}Send a message
POST the same payload to /messages. The message must be 1-160 characters and contacts must be valid Ugandan mobile numbers.
curl
curl -X POST "https://www.shulekeeper.com/api/v1/standlone-sms/api/messages" -H "Authorization: Bearer $SHULESMS_API_KEY" -H "Content-Type: application/json" -d '{"message":"Your order is ready.","contacts":[{"contact":"0772123456"}]}'success response
{
"success": true,
"message": "SMS accepted for delivery to 1 contact.",
"history": {
"key": "campaign-public-uuid",
"status": "SENT",
"contactsCount": 1,
"deliveredCount": 0,
"totalCost": 35
},
"account": { "balance": 99, "smsPrice": 35, "currency": "UGX" }
}Check delivery status
curl
curl "https://www.shulekeeper.com/api/v1/standlone-sms/api/messages/campaign-public-uuid" -H "Authorization: Bearer $SHULESMS_API_KEY"Statuses progress from SENDING to SENT, then DELIVERED, PARTIAL, or FAILED as provider callbacks arrive.
Errors and safety
error response
{
"success": false,
"message": "API key is invalid or revoked."
}Never place API keys in browser or mobile application code, query strings, logs, or source control. Revoke exposed keys immediately. Requests are scoped to the key owner's wallet and message history; payload owner IDs are ignored.