eSMS Verify runs the whole OTP flow for you - generate, send, rate-limit, expire and check the code. Brand every message, pick your countries, and ship phone verification across Africa without managing a single code.
Demo only - create an account to send real OTPs.
We generate the code, send it, store it hashed, expire it and check it. You never handle code state, storage or comparison.
Set the sender ID and write the message - "Your {app} code is {code}" - per Verify app. Recipients see your brand, not ours.
Allow only the countries you serve. Requests outside your list are rejected before a message ever sends.
Per-phone rate limits and a capped number of check attempts stop code-guessing and pumping out of the box.
Create an app, get an app_id, pass it to the API from cURL, Node, Python, PHP, Go or Java. SDKs included.
Track starts, verified and success rate for every app - so you can see conversion at a glance and spot problems.
Name it, set your sender ID, template, countries and code policy. You get an app_id like vera_ab12…
POST /verify/start with the phone number and your app_id. We send the branded OTP and return a verification_id.
POST /verify/check with the code the user typed. Get "approved" or a clear reason - done.
Pass your app_id to /verify/start and the app's brand, template, countries and policy apply automatically. Official SDKs for Node, Python, PHP, Go and Java, plus a signed webhook for delivery events.
curl -X POST https://sms.esmsafrica.io/api/verify/start \
-H "Authorization: Bearer esms_live_..." \
-H "Content-Type: application/json" \
-d '{"to":"+254712345678","app_id":"vera_your_app"}'
# → { "verification_id": "ver_...", "status": "pending" }
curl -X POST https://sms.esmsafrica.io/api/verify/check \
-H "Authorization: Bearer esms_live_..." \
-d '{"verification_id":"ver_...","code":"482913"}'
# → { "status": "approved" }Create a Verify app, brand the message, and send a real OTP in minutes. One account for all of eSMS Africa.