eSMS AfricaeSMS Africa
eSMS Verify

eSMS Verify

Managed phone verification and OTP across Africa - generate, send, rate-limit, expire and check one-time codes in two API calls.

eSMS Verify runs the whole one-time-passcode (OTP) flow for you. It generates the code, sends it on a priority route, stores it hashed, expires it, rate-limits it and validates the user's input. You call two endpoints - start and check - and never store or compare codes yourself.

Why Verify

  • Two calls to ship. POST /v1/verify/start sends the code; POST /v1/verify/check validates it. That is the entire integration.
  • You are never charged for a code that didn't send. A gateway rejection refunds automatically and returns 502 otp_send_failed - never a silent "pending" you can't complete.
  • Test keys work end-to-end. esms_test_ keys don't send real SMS; the response returns a sandbox_code and the fixed code 000000 always passes check.
  • Safe retries. An Idempotency-Key header makes a repeated start return the original verification instead of sending a second code.
  • Verify Apps. Bundle your brand, template, allowed countries and OTP policy into an app and pass its app_id - see Verify Apps.
  • 54-country coverage on direct operator routes, with priority routing for fast delivery.

Quickstart

# 1. Start - eSMS generates and sends the code
curl -X POST https://sms.esmsafrica.io/v1/verify/start \
  -H "Authorization: Bearer esms_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{ "to": "+254712345678", "app_id": "vera_ab12cd34ef56gh78ij90" }'

# 2. Check - validate the code the user typed
curl -X POST https://sms.esmsafrica.io/v1/verify/check \
  -H "Authorization: Bearer esms_live_your_api_key" \
  -H "Content-Type: application/json" \
  -d '{ "verification_id": "ver_9f8c1234ab", "code": "482193" }'

Create a free account at auth.esmsafrica.io, grab an API key, and try it with a esms_test_ key first - no SMS is sent and there is no charge.

Next steps

On this page