Sendam API

Send SMS from your own backend over HTTPS. JSON in, JSON out, one API key.

Authentication

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/json

A 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.

Test mode

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.

Send an SMS

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
    }
  ]
}

Parameters

FieldTypeNotes
bodystringRequired. 160 GSM-7 characters per segment; longer messages cost more.
recipientsarrayRequired. Each item needs e164 (+234…) and country (ISO 3166-1 alpha-2).
senderIdstringOptional. 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.

Channels

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.

Errors

Every error is JSON with a single error field. The status code tells you whether to retry.

400Malformed request — a required field is missing or the wrong shape. Do not retry unchanged.
401Missing, unknown or revoked API key. Do not retry.
402Insufficient units balance. Top up, then retry.
403Account is suspended or pending deletion.
429Rate limited. Wait for the Retry-After header, then retry.
502The downstream provider rejected the send. Its own response is included in the message.
503Channel not enabled on your account.

Rate limits

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.