Reference
API Reference
Every endpoint, request, and response shape. Group by resource, expand for JSON.
Production
https://api.sendafrica.online/v1Sandbox
https://sandbox.sendafrica.online/v1Response 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
| Area | Credential |
|---|---|
| Register, login, refresh, logout, password reset | None, or the token being acted on |
| Profile, workspace, sender ID, API key management | JWT only |
| POST /v1/sms/send, /v1/sms/send-bulk | API key (preferred) or JWT |
| GET /v1/sms/{id}/status | API key or JWT |
| GET /v1/billing/balance | API key or JWT |
| Transactions, payments, webhooks config, team | JWT 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 group | Limit |
|---|---|
| /v1/auth/* | 20 req/min per IP |
| POST /v1/sms/send | 300 req/min per API key |
| POST /v1/sms/send-bulk | 20 req/min per API key |
| Everything else | 100 req/min per credential |
Errors
| HTTP | error_code | Meaning |
|---|---|---|
| 400 | validation_error | Missing/malformed field |
| 400 | invalid_phone_number | Not a valid E.164 number for a supported network |
| 401 | unauthorized / invalid_credentials | Bad or missing token/key |
| 402 | insufficient_credits | Balance too low to send |
| 403 | forbidden | Valid credential, wrong scope |
| 404 | not_found | Resource missing or not owned by caller |
| 409 | conflict / idempotency_conflict | Duplicate operation in flight |
| 422 | unsupported_network | Number's carrier not yet supported |
| 423 | account_locked | 5 failed logins, 15 min lockout |
| 429 | rate_limited | Back off and retry |
| 500 | internal_error | SendAfrica-side failure, safe to retry |
