API reference · v1
Plain JSON over HTTPS. Call it from your server only.
Send your key in the Authorization header: Bearer ov_live_… Test keys (ov_test_…) send nothing and accept 000000.
Every error is problem details (RFC 9457) with a plain-language title and detail.
GET/v1/healthReturns ok when the API is running. Needs no API key.
200The API is up.status"ok" · requiredversionstring · required"2026-11-01.abc1234"POST/v1/verify/sendCreates a 6-digit code and sends it on WhatsApp from your own number, then by SMS if WhatsApp does not deliver in time. Send an Idempotency-Key header so a retry never sends twice. Test keys (ov_test_) send nothing and accept 000000.
tostring · required"+966512345612"locale"ar" | "en"channel"auto" | "whatsapp" | "sms"end_user_ipstring (ip)"203.0.113.7"appstring202Accepted. The code is on its way.401Missing or invalid API key.402Monthly plan limit reached.403The key lacks the needed scope.409A request with this Idempotency-Key is still running.422The request did not pass checks.429Rate limited. See Retry-After.idstring · required"ver_0193f2c48a1b7c3d9e4f0123456789ab"status"pending" · requiredchannel"whatsapp" | "sms" · requiredexpires_atstring (date-time) · requiredPOST/v1/verify/checkCompares the code your user typed. Each code works once and locks after too many wrong tries.
idstring · required"ver_0193f2c48a1b7c3d9e4f0123456789ab"codestring · required"482913"200The result.401Missing or invalid API key.403The key lacks the needed scope.404No such verification for this key.409The code was already used.422The request did not pass checks.429Rate limited. See Retry-After.idstring · required"ver_0193f2c48a1b7c3d9e4f0123456789ab"status"approved" | "denied" | "expired" | "locked" | "failed" · requiredattempts_remainingintegerGET/v1/verify/{id}Status and delivery history, without the code. Useful for support teams.
200The verification.401Missing or invalid API key.403The key lacks the needed scope.404No such verification for this key.idstring · required"ver_0193f2c48a1b7c3d9e4f0123456789ab"status"pending" | "approved" | "expired" | "locked" | "failed" · requiredchannel"whatsapp" | "sms" · requiredtostring · required"+966 •••••••12"countrystring · required"SA"environment"live" | "test" · requiredattemptsinteger · requiredcreated_atstring (date-time) · requiredexpires_atstring (date-time) · requiredcompleted_atstring,null (date-time) · requireddeliveriesobject[] · required