Skip to content
Sendozi

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.

Your first request. Swap sk_test_ for sk_live_ when you go to production.
cURL
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.

Get a sandbox key

Sandbox runs the same validation as a live send, without calling a provider or debiting the wallet.