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
}| Field | Type | Description |
|---|---|---|
name | string | App name (used for the {app} token). Required, ≤ 80 chars. |
sender_id | string | Brand shown as the SMS sender (≤ 11 chars). |
template | string | Message template. Must contain {code}. Tokens: {code}, {app}, {min}. |
code_length | int | 4-8 (default 6). |
expiry_seconds | int | 60-900 (default 300). |
max_attempts | int | 1-10 (default 5). |
allowed_countries | string[] | ISO-2 codes. Empty = all countries. A start to a country outside this list is rejected with country_not_allowed. |
locale | string | Language tag for the template (default en). |
enabled | bool | When 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.