مرجع WhatsApp OTP API

أرسل رموز OTP وتحقق منها عبر واتساب باستخدام مفتاح Sanctum API. مناسب للتحقق من الهوية، تسجيل الدخول بخطوتين، وإجراءات الأمان الأخرى.

المصادقة

تستخدم الواجهة مصادقة Bearer Token. أنشئ مفتاح API من لوحة التحكم › الإعدادات › مفاتيح API وامنحه صلاحيتَي otp:send وotp:verify.

رأس الطلب
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
Accept: application/json
⚠ لا تُضمّن مفاتيح API في الكود المصدري أو المستودعات العامة. استخدم متغيرات البيئة أو قواعد بيانات الأسرار.

Base URL

https://app.zervixo.com/api/v1

جميع الطلبات يجب أن تتضمن Accept: application/json. الاستجابات دائمًا بصيغة JSON.

POST /api/v1/otp/send

يُرسل رمز OTP إلى رقم هاتف عبر واتساب. يتطلب صلاحية otp:send على مفتاح API.

POST /api/v1/otp/send

المعاملات

الحقل النوع مطلوب الوصف
phone string ✓ رقم الهاتف بصيغة E.164 (مثال: +966501234567).
purpose string — الغرض من الرمز. القيم المقبولة: login، register، verify. الافتراضي: verify.
expires_in integer — مدة صلاحية الرمز بالثواني. الافتراضي: 300 (5 دقائق). الحد الأقصى: 3600.
locale string — لغة الرسالة. القيم المقبولة: ar، en. الافتراضي: إعدادات المستأجر.

الاستجابات

200 تم إرسال الرمز بنجاح.
{
  "success": true,
  "message": "OTP sent",
  "expires_at": "2026-10-20T14:35:00Z",
  "ref": "otp_01jd3k8m4v2xq6z"
}
422 بيانات غير صالحة.
429 تجاوزت حد المعدل.
401 مفتاح API مفقود أو غير صالح.

POST /api/v1/otp/verify

يتحقق من رمز OTP مُرسَل سابقًا. يتطلب صلاحية otp:verify على مفتاح API.

POST /api/v1/otp/verify

المعاملات

الحقل النوع مطلوب الوصف
phone string ✓ رقم الهاتف بصيغة E.164، نفس الرقم المستخدم في الإرسال.
code string ✓ رمز OTP المكوّن من 6 أرقام الذي أدخله المستخدم.
ref string — معرّف التحقق المُعاد من /otp/send. يُنصح باستخدامه لربط الطلبَين.

الاستجابات

200 رمز صحيح.
{
  "success": true,
  "verified": true,
  "phone": "+966501234567"
}
200 رمز غير صحيح أو منتهي الصلاحية.
{
  "success": false,
  "verified": false,
  "error": "invalid_or_expired"
}
429 تجاوزت حد المعدل.
401 مفتاح API مفقود أو غير صالح.

حدود المعدل

تُطبَّق الحدود على مستوى مفتاح API. عند تجاوزها تُعاد استجابة 429 Too Many Requests مع رأس Retry-After يُحدد وقت الانتظار بالثواني.

POST /api/v1/otp/send
100 طلب
/ ساعة
POST /api/v1/otp/verify
20 طلب
/ دقيقة
ⓘ إذا احتجت إلى حدود أعلى للاستخدام في الإنتاج، تواصل مع فريق الدعم.

رموز الأخطاء

HTTP رمز الخطأ الوصف
401 unauthenticated مفتاح API مفقود أو منتهي الصلاحية أو ملغى.
403 insufficient_scope المفتاح لا يملك الصلاحية المطلوبة (otp:send أو otp:verify).
422 validation_error أحد الحقول المطلوبة مفقود أو يحتوي قيمة غير صالحة.
400 invalid_or_expired رمز OTP غير صحيح أو انتهت صلاحيته.
429 too_many_requests تم تجاوز حد المعدل. راجع رأس Retry-After.
500 server_error خطأ في الخادم. يرجى المحاولة مرة أخرى أو التواصل مع الدعم.

أمثلة على الكود

cURL — إرسال OTP

curl -X POST https://app.zervixo.com/api/v1/otp/send \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
    "phone": "+966501234567",
    "purpose": "login",
    "expires_in": 300,
    "locale": "ar"
  }'

cURL — التحقق من OTP

curl -X POST https://app.zervixo.com/api/v1/otp/verify \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
    "phone": "+966501234567",
    "code": "483921",
    "ref": "otp_01jd3k8m4v2xq6z"
  }'

PHP (Guzzle) — إرسال OTP

use GuzzleHttp\Client;

$client = new Client([
    'base_uri' => 'https://app.zervixo.com/api/v1/',
    'headers' => [
        'Authorization' => 'Bearer ' . $apiKey,
        'Accept'        => 'application/json',
    ],
]);

$response = $client->post('otp/send', [
    'json' => [
        'phone'      => '+966501234567',
        'purpose'    => 'login',
        'expires_in' => 300,
        'locale'     => 'ar',
    ],
]);

$data = json_decode($response->getBody(), true);
echo $data['ref']; // store this for verify step

PHP (Guzzle) — التحقق من OTP

$response = $client->post('otp/verify', [
    'json' => [
        'phone' => '+966501234567',
        'code'  => $userEnteredCode,
        'ref'   => $ref,
    ],
]);

$data = json_decode($response->getBody(), true);

if ($data['verified']) {
    // proceed with login / registration
} else {
    // show "incorrect code" message to user
}