One-time passwords
Login, signup and checkout verification, with idempotency so a client retry cannot send or charge twice.
Transactional & OTP SMS
One-time passwords, payment alerts and account notifications, sent from your product through an HTTP API. Idempotent requests, per-recipient delivery states, signed webhooks, and a route that is not filtered as marketing. ₦7.00 per page to MTN, Airtel, Glo, 9mobile.
Developer proof
POST /v1/sms/send
curl https://api.sendozi.com/v1/sms/send -H "Authorization: Bearer $SENDOZI_API_KEY" -H "Idempotency-Key: otp-248391" -H "Content-Type: application/json" -d '{
"sender": "Sendozi",
"recipient": "+2348012345678",
"message": "Your Sendozi OTP is 248391.",
"sms_type": "transactional"
}'Webhook event preview
{
"type": "message.delivered",
"id": "evt_sample_92f1",
"message_id": "msg_8F41",
"status": "delivered",
"delivered_at": "2026-07-02T12:06:18+01:00"
}Product capabilities
Transactional messages are triggered by something the customer just did, so they belong in your code. One POST with the recipient, the body and sms_type: transactional, and a message ID you can follow.
The networks approve a transactional Sender ID against an OTP or alert sample message. Sendozi checks the route and the sender together on every production request: a transactional send naming a promotional Sender ID fails before wallet reservation, and the reverse fails too.
Transactional traffic travels the corporate route, which is not filtered against the Do Not Disturb register the way promotional traffic is. That is what the route is for; it is not a way to send campaigns to DND numbers.
Send an Idempotency-Key with the request. A client retry after a timeout returns the original result instead of sending the code twice and charging for it twice.
Delivery, failure and rejection events are posted to your endpoint and signed, so your system can react to a failed OTP rather than waiting for the customer to complain.
No delivery window applies. A code requested at 03:00 is handed to the network at 03:00, because the customer is on your login screen right now.
Transactional messages travel the operators' corporate route, which is not filtered against the Do Not Disturb register, and are delivered at any hour. The route is for messages the recipient triggered: sending campaigns over it is a misuse the networks act on. Final delivery is the recipient network's decision, and Sendozi reports the state it receives.
Use cases
Each use case maps to a concrete workflow, report or next channel.
Login, signup and checkout verification, with idempotency so a client retry cannot send or charge twice.
Debits, credits and confirmations, delivered within seconds of the event that caused them.
Dispatch, out-for-delivery and delivered notices triggered from your own order system.
Password changes, new-device sign-ins and expiry notices the recipient expects because they caused them.
Pricing note
Transactional SMS is ₦7.00 per page, the same rate as promotional traffic. No setup fee, no monthly minimum and no contract See SMS pricing.
Request a transactional Sender ID
POST with sms_type
Read the message ID
Receive signed delivery events
Transactional and OTP SMS is API-led and needs a Sender ID approved on the transactional route. The Console shows the delivery record, the wallet and the Sender ID request, but the send itself comes from your code.
Read the SMS API referenceCreate a free account, or talk to sales before a larger rollout.