Reference

API Reference

Every endpoint, request, and response shape. Group by resource, expand for JSON.

Production
https://api.sendafrica.online/v1
Sandbox
https://sandbox.sendafrica.online/v1

Response envelope

Every endpoint (except webhook payloads) returns this shape.

envelope.json
{
  "status": "success",
  "code": 200,
  "data": { },
  "error_code": null,
  "message": null,
  "request_id": "req_9f3a2b1c"
}

Credentials at a glance

AreaCredential
Register, login, refresh, logout, password resetNone, or the token being acted on
Profile, workspace, sender ID, API key managementJWT only
POST /v1/sms/send, /v1/sms/send-bulkAPI key (preferred) or JWT
GET /v1/sms/{id}/statusAPI key or JWT
GET /v1/billing/balanceAPI key or JWT
Transactions, payments, webhooks config, teamJWT only

Authentication

API Keys

SMS

Webhooks

Billing & Payments

Idempotency

Send an Idempotency-Key header on POST /v1/sms/send, /v1/sms/send-bulk, and /v1/payments/topup. Replays return the cached response for 24 hours with Idempotency-Replayed: true. Mint a fresh key per logical send.

Rate limits

Endpoint groupLimit
/v1/auth/*20 req/min per IP
POST /v1/sms/send300 req/min per API key
POST /v1/sms/send-bulk20 req/min per API key
Everything else100 req/min per credential

Errors

HTTPerror_codeMeaning
400validation_errorMissing/malformed field
400invalid_phone_numberNot a valid E.164 number for a supported network
401unauthorized / invalid_credentialsBad or missing token/key
402insufficient_creditsBalance too low to send
403forbiddenValid credential, wrong scope
404not_foundResource missing or not owned by caller
409conflict / idempotency_conflictDuplicate operation in flight
422unsupported_networkNumber's carrier not yet supported
423account_locked5 failed logins, 15 min lockout
429rate_limitedBack off and retry
500internal_errorSendAfrica-side failure, safe to retry