DOCUMENTATION
Send your first SMS in a few minutes
The Sendozi API is plain HTTPS with JSON. There is no SDK to install and no separate sandbox host: the same endpoints serve test and live traffic, and the key prefix decides which.
curl -X POST https://api.sendozi.com/v1/sms/send \
-H "Authorization: Bearer $SENDOZI_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: first-send-001" \
-d '{
"sender": "Sendozi",
"recipient": "+2348012345678",
"message": "Your code is 492811. Valid for 10 minutes.",
"sms_type": "transactional"
}'- Base URL
- https://api.sendozi.com
- Version
- v1
- Auth
- Bearer API key, or X-API-Key
- Sandbox
- sk_test_ keys, same endpoints
- SMS rate
- ₦7.00 per page
- Send rate limit
- 300/min per workspace
- Max SMS length
- 1000 characters
- Recipients
- Nigerian mobile numbers, +234 format
Getting started
Quickstart: send your first SMS
Create an account, take a sk_test_ key, POST to /v1/sms/send with a sender, a +234 recipient, a message and an sms_type, then read the success envelope. Sandbox runs the same validation without calling a provider or debiting the wallet.
Authentication and API keys
Every /v1 request carries an API key as a bearer token. The key prefix determines the mode: sk_test_ is sandbox, sk_live_ is production. Keys are stored as SHA-256 hashes, so a lost key can only be replaced.
Sandbox testing
Sandbox is the same API with the same validation, reached with a sk_test_ key. The send is recorded, no provider is called and nothing is debited. It is not a separate environment and needs no separate base URL.
Channels
SMS API reference
POST /v1/sms/send queues one message; POST /v1/sms/bulk queues a promotional recipient set and returns a batch. Set route explicitly: transactional is strictly one recipient per request.
Reliability
Delivery webhooks
Register an endpoint with POST /v1/webhooks/endpoints and Sendozi posts delivery events to it as networks report them. Each endpoint has a signing secret, shown once at creation, which you use to verify every payload before acting on it.
Idempotency
Send endpoints accept an Idempotency-Key header. A repeat of the same key with the same body replays the stored response instead of sending again. Keys are scoped to your workspace, fingerprinted against the request body and retained for 24 hours.
Errors and the response envelope
Every response uses the same envelope with success, data or error, and a request_id. Each error carries a code, a message and a resolution written for a developer to act on. The code tells you whether to fix the request, wait, or contact support.
Rate limits and pagination
Send endpoints allow 300 requests per minute per workspace and return 429 rate_limit_exceeded with a retry delay. List endpoints use keyset cursor pagination with a default limit of 50 and a maximum of 100.
Integrations
Send SMS with Node.js
Node 18 and later ship fetch, so no HTTP dependency is needed. POST to /v1/sms/send with an Authorization header, a +234 recipient and an sms_type, and branch on error.code rather than the HTTP status alone.
Send SMS with Python
There is no Sendozi Python SDK. Post JSON to /v1/sms/send with httpx or requests, normalise recipients to +234 first, and raise on the error code in the envelope rather than on the HTTP status alone.
Send SMS with PHP and Laravel
There is no Sendozi PHP package. Plain PHP posts JSON with cURL; Laravel uses Http::withToken. Normalise recipients to +234 first, put the key in config rather than in code, and queue anything larger than a single OTP.
Channel availability
- SMSLive
- Bulk and transactional SMS to Nigerian numbers is live. Production sending opens once KYC is approved and a sender ID is registered.