Send SMS from your own backend over HTTPS. JSON in, JSON out, one API key.
Create a key at Developers, then send it as a bearer token on every request. Keys are shown once and stored only as a hash, so save it somewhere safe.
Every request
Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Content-Type: application/jsonA key carries your full sending balance. Keep it on your server — never in a browser, a mobile app, or a public repository. If one leaks, revoke it from the Developers page; revocation takes effect immediately.
A key created as test authenticates exactly like a live one, returns the same response shape, and never sends a real message or spends units. Build your integration against it, then swap in a live key. A test response always carries "test_mode": true, so you can assert you are not about to bill anyone.
POST https://sendam.africa/api/sms/send
curl
curl -X POST https://sendam.africa/api/sms/send \
-H "Authorization: Bearer sk_test_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"senderId": "SENDAM",
"body": "Your verification code is 4821",
"recipients": [
{ "e164": "+2348033333333", "country": "NG" }
]
}'200 OK
{
"messages": [
{
"messageId": "d4bd8637-2a9d-43e2-99b1-040087fdca68",
"provider": "gbest",
"providerMessageId": null,
"recipientCount": 1,
"acceptedCount": 1,
"rejectedCount": 0,
"deliveryReportsAvailable": false
}
]
}| Field | Type | Notes |
|---|---|---|
| body | string | Required. 160 GSM-7 characters per segment; longer messages cost more. |
| recipients | array | Required. Each item needs e164 (+234…) and country (ISO 3166-1 alpha-2). |
| senderId | string | Optional. Must be an approved sender ID. Ignored where the provider registers its own. |
On delivery reports: acceptedCount means the provider took the message, not that a handset received it. Where deliveryReportsAvailable is false, accepted is the last word you will get — treat it as sent, not delivered.
SMS POST /sms/send
Live. Nigeria and Kenya.
Email POST /email/send
Built, not yet enabled — returns 503 Email is not live yet.
WhatsApp POST /whatsapp/send
Built, not yet enabled — returns 503.
Every error is JSON with a single error field. The status code tells you whether to retry.
| 400 | Malformed request — a required field is missing or the wrong shape. Do not retry unchanged. |
| 401 | Missing, unknown or revoked API key. Do not retry. |
| 402 | Insufficient units balance. Top up, then retry. |
| 403 | Account is suspended or pending deletion. |
| 429 | Rate limited. Wait for the Retry-After header, then retry. |
| 502 | The downstream provider rejected the send. Its own response is included in the message. |
| 503 | Channel not enabled on your account. |
120 requests per minute per key. Exceeding it returns 429 with a Retry-After header giving the seconds until the window resets. Limits are counted per key, so a runaway job on one key does not throttle another.