eSMS AfricaeSMS Africa
eSMS Verify

Verify Apps

Bundle your brand, message template, allowed countries and OTP policy into a reusable app_id.

A Verify App bundles everything a verification flow needs - your brand/sender, the message template, the allowed countries and the OTP policy (code length, expiry, max attempts). Create one in the dashboard (Verify → New app) or via the API, then pass its app_id to /verify/start and those settings apply automatically. Verifications are tracked per app so you get success-rate stats.

Endpoints

GET    /v1/verify/apps                 # list your apps
POST   /v1/verify/apps                 # create
GET    /v1/verify/apps/{id}            # fetch one
PATCH  /v1/verify/apps/{id}            # update (full replace - send all fields)
DELETE /v1/verify/apps/{id}            # delete
GET    /v1/verify/apps/{id}/stats      # starts / success rate (?days=1-90, default 30)

Create an app

{
  "name": "Acme Login",
  "sender_id": "Acme",
  "template": "Your {app} code is {code}. It expires in {min} minutes.",
  "code_length": 6,
  "expiry_seconds": 300,
  "max_attempts": 5,
  "allowed_countries": ["KE", "UG", "NG"],
  "locale": "en",
  "enabled": true
}
FieldTypeDescription
namestringApp name (used for the {app} token). Required, ≤ 80 chars.
sender_idstringBrand shown as the SMS sender (≤ 11 chars).
templatestringMessage template. Must contain {code}. Tokens: {code}, {app}, {min}.
code_lengthint4-8 (default 6).
expiry_secondsint60-900 (default 300).
max_attemptsint1-10 (default 5).
allowed_countriesstring[]ISO-2 codes. Empty = all countries. A start to a country outside this list is rejected with country_not_allowed.
localestringLanguage tag for the template (default en).
enabledboolWhen false, start with this app returns 403 app_disabled. Default true.

PATCH is a full replace, not a partial update - name is required and any field you omit reverts to its default. Send the app's complete current settings when updating.

The response is the app object, including the id (e.g. vera_ab12cd34ef56gh78ij90) - that's the app_id you pass to /verify/start.

App stats response

{
  "app_id": "vera_ab12",
  "days": 30,
  "total_starts": 1204,
  "approved": 1010,
  "failed": 62,
  "expired": 40,
  "pending": 92,
  "success_rate": 90.8
}

success_rate = approved ÷ (approved + failed + expired) - pending verifications are excluded from the denominator.

On this page