يتيح

Toome Developer API واجهةٌ برمجية من نوع REST تتيح لأي نظام خارجي التكامل مع منصة تومي. يمكن عبرها إرسال إشعارات واتساب، استقبال الطلبات من المتاجر الخارجية، وإدارة بيانات العملاء في CRM — كل ذلك من خلال Bearer Token آمن يُصدَر لكل تطبيق مسجَّل.

Base URL: https://toome.cloud/api/v1
جميع الطلبات والاستجابات بصيغة JSON. يجب إرفاق الترويستَين Content-Type: application/json و Accept: application/json في كل طلب.

يتيح

تعتمد الواجهة البرمجية نظام OAuth2 Client Credentials، وهو النمط المخصص للاتصالات بين الخوادم (server-to-server) حيث لا يتدخل المستخدم النهائي في عملية المصادقة. خطوات الاستخدام:

  1. سجِّل تطبيقاً جديداً من لوحة المطورين للحصول على client_id و client_secret.
  2. أرسِل طلب POST /api/v1/token بهذه البيانات للحصول على access_token.
  3. أرفِق رمز الوصول في ترويسة كل طلب لاحق: Authorization: Bearer {token}.
رموز الوصول محدودة الصلاحية. عند انتهاء صلاحية الرمز يُعيد الخادم 401 Unauthorized، فيتعين إصدار رمز جديد تلقائياً.

نطاقات الصلاحية (Scopes)

يتمتع كل تطبيق بمجموعة محددة من نطاقات الصلاحية تُمنح عند إنشائه. لا يمكن لأي طلب تجاوز النطاقات المُسندة إليه.

Scopeفي دقائق
notifyإرسال إشعارات واتساب عبر قوالب Template معتمدة من Meta
send_notificationsإرسال إشعارات واتساب لحالات الطلبات (تأكيد، شحن، تسليم...) عبر قوالب تومي الجاهزة — يُستهلك رصيد لكل رسالة
orders.writeإنشاء طلبات خارجية وتحديث حالاتها في تومي
orders.readاسترجاع الطلبات المحفوظة والاطلاع عليها
customers.writeإضافة عملاء جدد وتعديل بياناتهم في نظام CRM
customers.readاسترجاع بيانات العملاء مع دعم البحث والتصفية
brain.chatالتفاعل مع نظام الذكاء الاصطناعي المرتبط بحسابك

في دقائق

تُعيد الواجهة البرمجية رموز HTTP معيارية مصحوبةً بجسم JSON يتضمن تفاصيل الخطأ.

رمز HTTPيتيح
401رمز الوصول مفقود أو منتهي الصلاحية — أعِد إصدار التوكن
402INSUFFICIENT_CREDITS — رصيد الحساب غير كافٍ لإتمام العملية — راجع balance و required في الاستجابة
403التطبيق لا يملك النطاق (scope) المطلوب، أو الميزة معطَّلة (FEATURE_DISABLED) — تواصل مع الإدارة لتفعيلها
404المورد المطلوب غير موجود (مثل: قالب Template غير معرَّف)
422خطأ في التحقق من صحة البيانات المُرسَلة — راجع حقل errors في الاستجابة
429تجاوزت الحد المسموح به من الطلبات — انتظِر قبل إعادة المحاولة
502فشل إرسال الرسالة عبر Meta API — قد يكون خللاً مؤقتاً من طرف واتساب

POST /token

إصدار رمز وصول (Access Token) باستخدام بيانات اعتماد التطبيق. يُستخدم هذا الرمز في ترويسة Authorization لجميع طلبات الواجهة البرمجية اللاحقة.

POST /api/v1/token

في دقائق

يتيحيتيحيتيحيتيح
client_idstringمطلوبمعرّف التطبيق الفريد — يبدأ بـ tm_
client_secretstringمطلوبالمفتاح السري للتطبيق — احتفظ به في متغيرات البيئة ولا تُضمِّنه في الكود
curl -X POST https://toome.cloud/api/v1/token \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
    "client_id": "tm_xxxxxxxxxxxxxxxx",
    "client_secret": "your_secret_here"
  }'
$response = Http::post('https://toome.cloud/api/v1/token', [
    'client_id'     => 'tm_xxxxxxxxxxxxxxxx',
    'client_secret' => 'your_secret_here',
]);
$token = $response->json('access_token');
import requests
res = requests.post('https://toome.cloud/api/v1/token', json={
    'client_id': 'tm_xxxxxxxxxxxxxxxx',
    'client_secret': 'your_secret_here'
})
token = res.json()['access_token']
200 { "access_token": "...", "token_type": "Bearer", "scopes": ["notify","orders.write"] }
401 { "error": "invalid_client", "message": "بيانات الاعتماد غير صحيحة" }

GET /test-connection

التحقق من صلاحية رمز الوصول واستعراض نطاقات الصلاحية المُسندة إلى التطبيق. يُفيد هذا الطلب في التشخيص والتأكد من صحة الاندماج قبل الإطلاق.

GET/api/v1/test-connection
curl https://toome.cloud/api/v1/test-connection \
  -H "Authorization: Bearer {your_token}"
200 { "status":"success", "app":{"name":"My App","tenant_id":42}, "scopes":{...} }

GET /templates

استرجاع جميع قوالب الرسائل (Templates) المعتمدة من Meta والمتاحة لحسابك. لا يمكن إرسال رسالة Template إلا بعد ظهورها في هذه القائمة بحالة معتمدة.

GET/api/v1/templates
تُنشأ القوالب من داخل لوحة تومي، ثم تُرسَل تلقائياً إلى Meta لمراجعتها. فور الموافقة عليها تظهر هنا جاهزةً للاستخدام — لا يلزم أي إجراء إضافي من المطور.
200
{
  "success": true,
  "count": 2,
  "data": [
    {
      "id": 5,
      "name": "order_confirmed",
      "language": "ar",
      "category": "UTILITY",
      "body": "مرحباً 1، تم تأكيد طلبك رقم 2 ✅",
      "variables_count": 2
    }
  ]
}

POST /notify

إرسال قالب رسالة واتساب (Template) إلى أي رقم هاتف — حتى في غياب محادثة سابقة مع المستخدم. يُستخدم لإرسال إشعارات المعاملات كتأكيد الطلبات وتذكيرات المواعيد وتنبيهات الشحن. يستلزم نطاق الصلاحية: notify.

POST/api/v1/notify

في دقائق

يتيحيتيحيتيحيتيح
phonestringمطلوبرقم الهاتف بالصيغة الدولية بدون + (مثال: 201012345678)
template_namestringمطلوباسم القالب المعتمد كما يظهر في GET /templates
variablesarrayاختياريقيم المتغيرات الديناميكية مرتّبةً وفق ترتيب {{1}}، {{2}}، ...
languagestringاختياريرمز اللغة (القيمة الافتراضية: ar)
curl -X POST https://toome.cloud/api/v1/notify \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{
    "phone": "201012345678",
    "template_name": "order_confirmed",
    "variables": ["Ahmed", "#1042", "150 ج.م"]
  }'
Http::withToken($token)->post('/api/v1/notify', [
    'phone'         => '201012345678',
    'template_name' => 'order_confirmed',
    'variables'     => ['Ahmed', '#1042', '150 ج.م'],
]);
requests.post('/api/v1/notify',
    headers={'Authorization': f'Bearer {token}'},
    json={
        'phone': '201012345678',
        'template_name': 'order_confirmed',
        'variables': ['Ahmed', '#1042', '150 ج.م']
    }
)
200 { "success": true, "message": "تم إرسال الإشعار بنجاح.", "phone": "201012345678", "template_used": "order_confirmed" }
404 { "error": "template_not_found", "message": "القالب غير موجود أو لم تُوافق عليه Meta بعد." }

POST /notifications/order

إرسال إشعار واتساب جاهز لحالة طلب معين باستخدام قوالب تومي المعتمدة من Meta. لا يستلزم وجود محادثة سابقة مع العميل — الرسالة تصل دائماً. يُستهلك رصيد من حسابك عند كل إرسال ناجح. يستلزم النطاق: send_notifications بالإضافة إلى تفعيل ميزة Order Notifications من الإدارة.

POST /api/v1/notifications/order
استهلاك الرصيد: تُخصَم الكريدتس فقط عند نجاح الإرسال الفعلي عبر واتساب. إذا فشلت الرسالة لسبب تقني، لا يُستهلَك أي رصيد.
تأكيد الطلب: 0.5 كريدت — تحديثات الحالة: 0.3 كريدت (القيم قابلة للتعديل من الإدارة).

في دقائق

يتيحيتيحيتيحيتيح
phonestringمطلوبرقم هاتف العميل بالصيغة الدولية بدون + (مثال: 201012345678)
statusstringمطلوبحالة الطلب — راجع القيم المتاحة أدناه
trackingstringمطلوبرقم الطلب أو رمز التتبع في نظامك
customer_namestringاختيارياسم العميل الذي سيظهر في الرسالة
store_namestringاختيارياسم المتجر أو المنصة الذي سيظهر في الرسالة
totalstringاختياريإجمالي الطلب كنص (مثال: "350 ج.م") — يظهر في رسالة التأكيد فقط

قيم status المتاحة

القيمةالمعنىالكريدت
order_confirmedتم تأكيد الطلب ✅0.5
assignedتم تعيين المندوب0.3
out_for_deliveryالطلب في الطريق 🚗0.3
at_dropoff_pointوصل لنقطة التسليم0.3
deliveredتم التسليم ✅0.3
failed_deliveryفشل التسليم ❌0.3
rescheduledأُعيد جدولة التسليم0.3
returnedتم الإرجاع0.3
curl -X POST https://toome.cloud/api/v1/notifications/order \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{
    "phone":         "201012345678",
    "status":        "order_confirmed",
    "tracking":      "ORD-1042",
    "customer_name": "أحمد علي",
    "store_name":    "متجري",
    "total":         "350 ج.م"
  }'
Http::withToken($token)->post('https://toome.cloud/api/v1/notifications/order', [
    'phone'         => $order->customer_phone,
    'status'        => 'order_confirmed',
    'tracking'      => $order->reference,
    'customer_name' => $order->customer_name,
    'store_name'    => 'متجري',
    'total'         => $order->total . ' ج.م',
]);
requests.post('https://toome.cloud/api/v1/notifications/order',
    headers={'Authorization': f'Bearer {token}'},
    json={
        'phone':         '201012345678',
        'status':        'out_for_delivery',
        'tracking':      'ORD-1042',
        'customer_name': 'أحمد علي',
    }
)
200
{
  "success": true,
  "message_id": "wamid.HBgM...",
  "status_sent": "order_confirmed",
  "credits_charged": 0.5,
  "balance_after": 49.5
}
402 { "error": "INSUFFICIENT_CREDITS", "balance": 0.2, "required": 0.5 }
403 { "error": "FEATURE_DISABLED", "message": "ميزة إشعارات الطلبات غير مفعَّلة لهذا التطبيق" }

POST /orders

استقبال طلب قادم من نظامك الخارجي وحفظه في تومي، مع إمكانية إرسال إشعار واتساب للعميل في الوقت ذاته. يستلزم نطاق الصلاحية: orders.write.

POST/api/v1/orders

في دقائق

يتيحيتيحيتيحيتيح
order_refstringمطلوبرقم الطلب الفريد في نظامك الخارجي
customer_phonestringمطلوبرقم هاتف العميل بالصيغة الدولية
customer_namestringاختيارياسم العميل الكامل
totalnumberاختياريإجمالي قيمة الطلب
currencystringاختياريرمز العملة وفق ISO 4217 (مثال: EGP، SAR، USD)
itemsarrayاختياريقائمة المنتجات — كل عنصر: {name, qty, price}
statusstringاختياريحالة الطلب: pending | confirmed | shipped | cancelled
notify_templatestringاختيارياسم قالب الإشعار الذي سيُرسَل للعميل فور تسجيل الطلب
notify_variablesarrayاختياريقيم متغيرات القالب مرتّبةً وفق ترتيب ظهورها في النص
metaobjectاختياريبيانات إضافية مخصصة تُحفظ مع الطلب للرجوع إليها لاحقاً
curl -X POST https://toome.cloud/api/v1/orders \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{
    "order_ref": "ORD-1042",
    "customer_phone": "201012345678",
    "customer_name": "Ahmed Ali",
    "total": 350.00,
    "currency": "EGP",
    "items": [
      {"name": "تيشيرت أبيض", "qty": 2, "price": 175}
    ],
    "notify_template": "order_confirmed",
    "notify_variables": ["Ahmed", "ORD-1042"]
  }'
Http::withToken($token)->post('/api/v1/orders', [
    'order_ref'        => 'ORD-1042',
    'customer_phone'   => '201012345678',
    'total'            => 350.00,
    'notify_template'  => 'order_confirmed',
    'notify_variables' => ['Ahmed', 'ORD-1042'],
]);
201 { "success": true, "order_id": 7, "order_ref": "ORD-1042", "notified": true }

GET /orders

استرجاع قائمة الطلبات الخارجية المحفوظة في تومي مع دعم ترقيم الصفحات. يستلزم نطاق الصلاحية: orders.read.

GET/api/v1/orders?per_page=20

POST /customers

إضافة عميل جديد إلى نظام CRM في تومي، أو تحديث بياناته إن كان رقم هاتفه موجوداً مسبقاً. يستلزم نطاق الصلاحية: customers.write.

POST/api/v1/customers

في دقائق

يتيحيتيحيتيحيتيح
phonestringمطلوبرقم الهاتف — يُستخدم معرّفاً فريداً للعميل في النظام
namestringاختياريالاسم الكامل للعميل
emailstringاختياريعنوان البريد الإلكتروني
genderstringاختياريmale | female | unknown
sourcestringاختياريمصدر اكتساب العميل (مثال: shopify، website، referral)
statusstringاختياريمرحلة العميل في مسار المبيعات: lead | interested | customer
curl -X POST https://toome.cloud/api/v1/customers \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{
    "phone": "201012345678",
    "name": "Ahmed Ali",
    "email": "ahmed@example.com",
    "source": "shopify",
    "status": "customer"
  }'
201 { "success": true, "action": "created", "customer": {"id":15,"name":"Ahmed Ali","phone":"201012345678"} }
200 { "success": true, "action": "updated", ... }

GET /customers

استرجاع قائمة العملاء مع دعم البحث النصي والتصفية بالحالة وترقيم الصفحات. يستلزم نطاق الصلاحية: customers.read.

GET/api/v1/customers?status=customer&search=ahmed&per_page=20

مثال تطبيقي: ربط متجر إلكتروني

عند وصول طلب جديد من متجر Shopify عبر Webhook، أرسِله إلى تومي لحفظه وإشعار العميل فوراً عبر واتساب:

// معالج Webhook القادم من Shopify
$order = $request->json()->all();

Http::withToken($token)->post('https://toome.cloud/api/v1/orders', [
    'order_ref'        => $order['order_number'],
    'customer_phone'   => $order['phone'],
    'customer_name'    => $order['customer']['first_name'],
    'total'            => $order['total_price'],
    'notify_template'  => 'order_confirmed',
    'notify_variables' => [$order['customer']['first_name'], $order['order_number']],
]);

مثال تطبيقي: تأكيد الحجوزات

عقب تسجيل حجز مؤكَّد في نظامك، أرسِل قالب الإشعار مباشرةً إلى العميل دون الحاجة إلى محادثة مسبقة معه:

Http::withToken($token)->post('https://toome.cloud/api/v1/notify', [
    'phone'         => $booking->customer_phone,
    'template_name' => 'booking_confirmed',
    'variables'     => [
        $booking->customer_name,
        $booking->service_name,
        $booking->date->format('Y-m-d H:i'),
    ],
]);

مثال تطبيقي: استيراد العملاء تلقائياً

عند إتمام المستخدم تسجيله في موقعك، أضِفه تلقائياً إلى نظام CRM في تومي كي يبدأ الذكاء الاصطناعي التفاعل معه فوراً:

// بعد إتمام تسجيل المستخدم في موقعك
Http::withToken($token)->post('https://toome.cloud/api/v1/customers', [
    'phone'  => $user->phone,
    'name'   => $user->name,
    'email'  => $user->email,
    'source' => 'website_registration',
    'status' => 'lead',
]);

🔐 Toome Auth — خدمة التحقق بكلمة مرور لمرة واحدة (OTP)

Toome Auth خدمةٌ مستقلة لإرسال رموز التحقق (OTP) عبر واتساب — وقريباً عبر الرسائل القصيرة (SMS). تُتيح للمطورين إضافة طبقة تحقق آمنة لأي تطبيق أو موقع إلكتروني في خطوات بسيطة. تدعم الخدمة مسارَي تكامل مختلفَين:

مسار التكامل الحالة المناسبة مسار الطلب آلية المصادقة
Type A — TenantApp صاحب متجر أو تطبيق لديه اشتراك تومي نشط وفعَّل ميزة OTP /api/v1/otp/* Bearer Token (عبر POST /token + نطاق otp)
Type B — Standalone OTP App تطبيق مستقل مخصص للتحقق فقط دون الحاجة إلى اشتراك تومي /api/auth/v1/otp/* Authorization: Bearer {api_key} + X-App-Secret

يُغطي هذا القسم Type B (التطبيق المستقل). إن كنت تستخدم Type A، راجع قسم المصادقة وتأكد من تفعيل نطاق otp.

مصادقة Toome Auth OTP

يتطلب كل طلب في هذا المسار إرفاق ترويستَين في HTTP headers: الأولى تحمل مفتاح API الخاص بتطبيقك، والثانية السر المشترك (App Secret) للتحقق من هويتك.

Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx
X-App-Secret: your_app_secret_here

يمكن الاطلاع على API Key و App Secret من لوحة المطورين ← تطبيقات OTP ← عرض المفاتيح. يشترط أن يكون التطبيق في حالة active (بعد مراجعته وقبوله من فريق الإدارة).

أمان المفاتيح: لا تُضمِّن API Key أو App Secret في كود الواجهة الأمامية (JavaScript/Mobile). يجب أن تُجرى جميع طلبات OTP من الخادم الخلفي (backend) حصراً.

POST /api/auth/v1/otp/send

إرسال رمز تحقق OTP إلى رقم هاتف عبر واتساب. يُعيد الطلب request_id فريداً يُستخدم في الخطوات اللاحقة.

💬 التحقق المجاني عبر واتساب (افتراضي وإجباري لقناة واتساب)
بدل ما نبعتلك رسالة Template مدفوعة فورًا، الرد بيرجّعلك deep_link_url — رابط wa.me برسالة معبّأة مسبقًا. وجّه المستخدم يفتحه ويضغط "إرسال" داخل واتساب، فتوصلنا الرسالة كرد عادي مجاني ونتحقق منها فورًا عبر الويب هوك (بدون أي تكلفة عليك). لو المستخدم محصلش يرد خلال fallback_after_seconds ثانية، بنبعتله تلقائيًا رسالة Template العادية المدفوعة كخطة احتياطية — يعني التحقق مضمون في الحالتين، والتكلفة بتتحمّل بس لو فعلاً احتجنا الـ Template. راقب الحالة لحظيًا بـ GET /otp/status/{request_id} بدل ما تستنى المستخدم يكتب كود — في مسار التحقق المجاني هو أصلاً مش هيكتب حاجة.
POST /api/auth/v1/otp/send
Authorization: Bearer sk_live_xxxx
X-App-Secret: your_secret

{
  "phone":   "201012345678",
  "channel": "whatsapp",
  "locale":  "ar",
  "metadata": { "order_id": "ORD-789" }
}
{
  "success":                true,
  "request_id":              "req_01JXXXXXXXXXXXXXXXXXXX",
  "channel":                 "whatsapp",
  "phone":                   "+201012345678",
  "expires_in":               600,
  "expires_at":               "2026-06-12T14:05:00Z",
  "verification_method":      "whatsapp_deeplink",
  "deep_link_url":            "https://wa.me/9687xxxxxxx?text=TOOME-VERIFY%3Areq_01JXXX...",
  "fallback_after_seconds":   25
}
$res = Http::withHeaders([
    'Authorization' => 'Bearer ' . $apiKey,
    'X-App-Secret'  => $appSecret,
])->post('https://toome.cloud/api/auth/v1/otp/send', [
    'phone'  => $user->phone,
    'locale' => 'ar',
]);
$requestId = $res->json('request_id');
$deepLink  = $res->json('deep_link_url'); // اعرضه كزرار "تحقق عبر واتساب" في واجهتك
الحقلالنوعالوصف
phone *stringرقم الهاتف بصيغة E.164 دون الرمز + (مثال: 201012345678)
channelstringقناة الإرسال: whatsapp (افتراضي) | sms
localestringلغة رسالة OTP الاحتياطية (Template): ar (افتراضي) | en
metadataobjectبيانات سياقية اختيارية تُعاد معك عند نجاح التحقق (مثال: رقم الطلب، معرّف الجلسة)

الحقول verification_method وdeep_link_url وfallback_after_seconds بترجع بس لما channel = whatsapp. قناة sms لسه من غير مسار مجاني (بترجع بس الحقول الأساسية).

POST /api/auth/v1/otp/verify

التحقق من الرمز الذي أدخله المستخدم. عند النجاح، يُبطَل الرمز فوراً ولا يمكن إعادة استخدامه. يُرجع الطلبُ success: true مع بيانات المستخدم وأي بيانات metadata أُرفقت عند الإرسال (وفيها verified_via بقيمة template). هذا المسار مخصّص لحالة الفولباك المدفوع فقط — لو استخدمت التحقق المجاني عبر واتساب، راقب GET /otp/status/{request_id} بدل كده.

{
  "request_id": "req_01JXXXXXXXXXXXXXXXXXXX",
  "code":       "482917"
}
// نجاح
{
  "success":  true,
  "phone":    "201012345678",
  "metadata": { "order_id": "ORD-789", "verified_via": "template" },
  "verified_at": "2026-06-12T14:03:22Z"
}

// كود خاطئ
{
  "success":    false,
  "error_code": "INVALID_CODE",
  "attempts_remaining": 2
}
$res = Http::withHeaders([
    'Authorization' => 'Bearer ' . $apiKey,
    'X-App-Secret'  => $appSecret,
])->post('https://toome.cloud/api/auth/v1/otp/verify', [
    'request_id' => $requestId,
    'code'       => $userInput,
]);
if ($res->json('success')) {
    // تمَّ التحقق — أكمِل تسجيل المستخدم أو منحه الصلاحية
}

POST /api/auth/v1/otp/resend

إعادة إرسال رمز OTP للرقم ذاته باستخدام request_id الأصلي. يشترط انتهاء مهلة الانتظار بين الإرساليات (افتراضياً 60 ثانية) قبل قبول هذا الطلب.

{
  "request_id": "req_01JXXXXXXXXXXXXXXXXXXX"
}

إذا استُدعي هذا الطلب قبل انتهاء مهلة الانتظار، يُعيد الخادم الخطأ COOLDOWN_ACTIVE مصحوباً بحقل retry_after يُشير إلى عدد الثواني المتبقية.

GET /api/auth/v1/otp/status/{request_id}

استعلام لحظي (polling) عن حالة طلب OTP — الاستخدام الأساسي له هو مسار التحقق المجاني عبر واتساب: المستخدم مش هيكتب كود في واجهتك، فمفيش حاجة تنادي بيها /otp/verify. استدعِ الإندبوينت ده كل 2-3 ثواني بعد ما تعرض deep_link_url للمستخدم، لحد ما status تبقى verified.

GET /api/auth/v1/otp/status/req_01JXXXXXXXXXXXXXXXXXXX
Authorization: Bearer sk_live_xxxx
X-App-Secret: your_secret
// لسه مستنيين رد المستخدم على واتساب
{ "success": true, "found": true, "status": "pending", "verified_via": null }

// اتحقق مجانًا عن طريق رد واتساب
{ "success": true, "found": true, "status": "verified", "verified_via": "webhook" }

// اتحقق عن طريق كود الـ Template (بعد ما استدعيت /otp/verify)
{ "success": true, "found": true, "status": "verified", "verified_via": "template" }

// منتهي الصلاحية أو غير موجود
{ "success": false, "found": false, "status": "not_found" }
القيمةالمعنى
status: pendingلسه مستنيين — إما رد واتساب أو انتهاء مهلة الفولباك
status: verifiedتم التحقق — كمّل تسجيل المستخدم فورًا
status: failedفشل إرسال الفولباك (نادرًا) — جرّب /otp/resend
verified_viawebhook (مجاني) أو template (مدفوع) — للمراقبة فقط، مفيش فرق في النتيجة

DELETE /api/auth/v1/otp/{request_id}

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

DELETE /api/auth/v1/otp/req_01JXXXXXXXXXXXXXXXXXXX

GET /api/auth/v1/otp/logs

استرجاع سجل تاريخي لطلبات OTP مع دعم التصفية بالهاتف وحالة الطلب وترقيم الصفحات. مفيد لأغراض المراجعة والتدقيق.

GET /api/auth/v1/otp/logs?status=verified&per_page=20&page=1
{
  "data": [
    {
      "request_id": "req_01JXXX",
      "phone":      "201012345678",
      "channel":    "whatsapp",
      "status":     "verified",
      "created_at": "2026-06-12T14:00:00Z"
    }
  ],
  "meta": { "total": 148, "per_page": 20, "current_page": 1 }
}

القيم المتاحة للتصفية بحقل status: pending (قيد الانتظار) | verified (تم التحقق) | expired (انتهت الصلاحية) | cancelled (ملغى) | failed (فشل الإرسال)

GET /api/auth/v1/apps/stats

استرجاع إحصاءات أداء تطبيق OTP خلال الثلاثين يوماً الأخيرة، مصنَّفةً حسب القناة.

{
  "total_sent":     1420,
  "total_verified": 1184,
  "verify_rate":    "83.4%",
  "today":          47,
  "by_channel": {
    "whatsapp": { "sent": 1400, "verified": 1170 },
    "sms":      { "sent": 20,   "verified": 14   }
  }
}

أرقام الاختبار (Test Phones)

تُتيح لك هذه الميزة تسجيل ما يصل إلى 10 أرقام هواتف مع رموز تحقق ثابتة لأغراض الاختبار. عند إرسال OTP إلى أي من هذه الأرقام:

  • لا تُرسَل أي رسالة واتساب فعلية.
  • لا يُستهلَك أي رصيد أو توكن.
  • يُعاد الرمز الثابت الذي حددته مسبقاً مخزَّناً في Redis.
  • تعمل الميزة في كلا الوضعَين: Live وSandbox.

يمكن إدارة هذه الأرقام من لوحة المطورين ← تطبيقات OTP ← عرض التطبيق ← قسم أرقام الاختبار. الاستجابة تتضمن حقل test_phone: true في كل طلب موجَّه إلى رقم اختبار.

أرقام الاختبار مخصصة لبيئة التطوير فقط. عند الإطلاق للإنتاج، لا حاجة لإجراء أي تغيير في الكود — فقط أزِل الأرقام من القائمة أو لا تُرسِل إليها.

إنشاء تطبيق OTP

تُعيد واجهة OTP رمز خطأ نصياً محدداً (error_code) يُسهِّل التعامل الآلي مع حالات الخطأ المختلفة.

error_codeرمز HTTPالسبب والمعالجة المقترحة
MISSING_CREDENTIALS401ترويسة Authorization أو X-App-Secret غير مُرفَقة في الطلب
INVALID_API_KEY401مفتاح API غير موجود في النظام — تحقق من صحة المفتاح
INVALID_SECRET401App Secret غير مطابق — راجع بيانات التطبيق في لوحة المطورين
APP_PENDING_REVIEW403التطبيق لا يزال قيد المراجعة ولم يُفعَّل بعد
APP_REJECTED403طلب التطبيق مرفوض — تواصَل مع الدعم الفني للاستفسار
RATE_LIMITED429تجاوز الحد المسموح به (60 طلباً / دقيقة لكل تطبيق)
COOLDOWN_ACTIVE429لم تنقضِ مهلة الانتظار بين الإرساليات — راجع retry_after في الاستجابة
INVALID_CODE422الرمز المُدخَل غير صحيح — راجع attempts_remaining لمعرفة المحاولات المتبقية
OTP_EXPIRED410انتهت صلاحية رمز OTP — أرسِل طلباً جديداً باستخدام POST /otp/send
OTP_ALREADY_VERIFIED409سبق التحقق من هذا الرمز — لا يمكن استخدامه مجدداً
NOT_FOUND404المعرّف request_id غير موجود أو انتهت صلاحيته في قاعدة البيانات