مرجع WapFlow OTP API

أرسل رموز التحقق وتحقق منها من رقم WhatsApp الخاص بك. جميع الاستجابات بصيغة JSON.

عنوان URL الأساسي: https://wapflow.net/api/otp/v1

المصادقة

أرسل الترويسة Authorization: Bearer <key> مع كل طلب. تُنشأ المفاتيح في صفحة WapFlow OTP داخل لوحة WapFlow؛ تبدأ المفاتيح الحية بـ wfo_live_ والمفاتيح التجريبية بـ wfo_test_. يُعرض المفتاح مرة واحدة فقط عند إنشائه — احفظه بأمان واستخدمه على خادمك فقط.

تكون الاستجابة الناجحة بالشكل { "success": true, ... }، وتكون استجابة الخطأ بالشكل { "success": false, "error": { "code": "...", "message": "..." } }.

إرسال رمز

POST/send

phone (مطلوب) هو رقم المستلم. اختيارياً: code_length (من 4 إلى 8)، وttl (من 60 إلى 900 ثانية)، وlang (مثل tr وen) وapp_name. أي قيمة لا تحددها تُؤخذ من إعدادات لوحتك.

الطلب
{
  "phone": "905321234567",
  "code_length": 6,
  "ttl": 300,
  "lang": "tr",
  "app_name": "Acme"
}
الاستجابة (200)
{
  "success": true,
  "request_id": "req_...",
  "phone": "905321234567",
  "expires_at": "2026-11-12T10:05:00.000Z",
  "status": "sent"            // "sent" | "queued"
}

التحقق من رمز

POST/verify

الحقلان phone وcode مطلوبان. إذا أرسلت request_id يُتحقق من ذلك الطلب تحديداً؛ وإن لم ترسله فيُتحقق من آخر رمز غير منتهٍ أُرسل إلى هذا الرقم بهذا المفتاح. بعد 5 محاولات خاطئة يُقفل الطلب، ولا يمكن إعادة استخدام الرمز بعد التحقق منه.

الطلب
{ "request_id": "req_...", "phone": "905321234567", "code": "123456" }
الاستجابة (200)
{ "success": true, "valid": true }

{ "success": true, "valid": false,
  "reason": "invalid_code",     // invalid_code | expired | too_many_attempts | already_verified | not_found
  "attempts_left": 3 }

الاستعلام عن الحالة

GET/status/:request_id

يعيد حالة الطلب: queued، sent، delivered، read، failed، verified أو expired.

{ "success": true, "request_id": "req_...", "status": "delivered",
  "sent_at": "...", "delivered_at": "...", "verified_at": null }

اختبار الاتصال

GET/me

يعرض أن المفتاح صالح، وباقتك، وعدد الحسابات المرتبطة، واستخدام الحصة لهذا الشهر (يستخدمه زر "اختبار الاتصال" في إضافة WordPress).

{ "success": true, "plan": "otp-2",
  "accounts": { "limit": 2, "connected": 1 },
  "quota": { "monthly": 15000, "used": 42, "period": "2026-11" },
  "ends_at": "2026-12-12T10:00:00.000Z", "mode": "live" }

أمثلة

تُرسل هذه الأمثلة رمزاً ثم تتحقق من الرمز الذي يُدخله المستخدم. استبدل wfo_live_XXXX بمفتاحك الخاص.

# 1) send
curl -X POST https://wapflow.net/api/otp/v1/send \
  -H "Authorization: Bearer wfo_live_XXXX" \
  -H "Content-Type: application/json" \
  -d '{"phone":"905321234567","app_name":"Acme"}'

# 2) verify
curl -X POST https://wapflow.net/api/otp/v1/verify \
  -H "Authorization: Bearer wfo_live_XXXX" \
  -H "Content-Type: application/json" \
  -d '{"request_id":"req_...","phone":"905321234567","code":"123456"}'
<?php
function wapflow_otp(string $path, array $body): array {
    $ch = curl_init('https://wapflow.net/api/otp/v1' . $path);
    curl_setopt_array($ch, [
        CURLOPT_POST => true,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT => 15,
        CURLOPT_HTTPHEADER => [
            'Authorization: Bearer ' . getenv('WAPFLOW_OTP_KEY'),
            'Content-Type: application/json',
        ],
        CURLOPT_POSTFIELDS => json_encode($body),
    ]);
    $res = json_decode(curl_exec($ch), true) ?: [];
    curl_close($ch);
    return $res;
}

$sent = wapflow_otp('/send', ['phone' => '905321234567', 'app_name' => 'Acme']);
// ... kullanıcı kodu girince:
$check = wapflow_otp('/verify', ['request_id' => $sent['request_id'], 'phone' => '905321234567', 'code' => $_POST['code']]);
if (!empty($check['valid'])) { /* giriş başarılı */ }
const BASE = 'https://wapflow.net/api/otp/v1';

async function otp(path, body) {
  const res = await fetch(BASE + path, {
    method: 'POST',
    headers: {
      Authorization: `Bearer ${process.env.WAPFLOW_OTP_KEY}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify(body),
  });
  return res.json();
}

const sent = await otp('/send', { phone: '905321234567', app_name: 'Acme' });
// ... when the user submits the code:
const check = await otp('/verify', { request_id: sent.request_id, phone: '905321234567', code: '123456' });
if (check.valid) { /* signed in */ }
import os
import requests

BASE = "https://wapflow.net/api/otp/v1"
HEADERS = {"Authorization": "Bearer " + os.environ["WAPFLOW_OTP_KEY"]}

def otp(path, body):
    return requests.post(BASE + path, json=body, headers=HEADERS, timeout=15).json()

sent = otp("/send", {"phone": "905321234567", "app_name": "Acme"})
# ... when the user submits the code:
check = otp("/verify", {"request_id": sent["request_id"], "phone": "905321234567", "code": "123456"})
if check.get("valid"):
    pass  # signed in

رموز الأخطاء

HTTPالرمزالمعنى
400invalid_requestنص الطلب أو المعلمات غير صالحة.
401invalid_keyمفتاح API غير صالح أو تم إلغاؤه.
402no_subscriptionلا يوجد اشتراك WapFlow OTP لهذا الحساب.
402subscription_expiredانتهت صلاحية الاشتراك؛ يرجى تجديده.
403sales_disabledالخدمة غير متاحة مؤقتاً.
422invalid_phoneرقم الهاتف غير صالح.
429rate_limitedتم تجاوز حد الطلبات؛ أعد المحاولة بعد عدد الثواني المذكور في retry_after في الاستجابة.
429quota_exceededتم استنفاد حصة الرموز لهذا الشهر.
429daily_limit_reachedتم الوصول إلى حد الإرسال اليومي للحسابات المتصلة بواتساب؛ أعد المحاولة بعد retry_after ثانية المذكورة في الاستجابة (الساعة 00:00 من اليوم التالي، بتوقيت إسطنبول). لا يُستهلك أي رصيد.
503no_account_connectedلا يوجد حساب WhatsApp مرتبط ومفعّل.
503send_failedتعذر إرسال الرسالة؛ أعد المحاولة بعد قليل.

حدود المعدل

تسخين الحساب والحد اليومي

المفاتيح التجريبية

المفاتيح التي تبدأ بـ wfo_test_ لا ترسل أي رسالة WhatsApp ولا تستهلك أي حصة؛ يُعاد الرمز في الحقل test_code من الاستجابة. قواعد الإرسال والحدود هي نفسها للمفتاح الحي، ويظل الاشتراك النشط مطلوباً. للانتقال إلى الوضع الحي، غيّر المفتاح فقط.

{ "success": true, "request_id": "req_...", "status": "sent", "test_code": "482913" }

صيغة رقم الهاتف

ملاحظات أمنية

إضافة WordPress

  1. حمّل wapflow-otp.zip.
  2. في لوحة إدارة WordPress انتقل إلى الإضافات → أضف جديدة → رفع إضافة، وارفع ملف zip وفعّله.
  3. في إعدادات الإضافة، الصق مفتاح API الذي أنشأته في لوحة WapFlow.
  4. استخدم زر "اختبار الاتصال" للتحقق من المفتاح وباقتك.
  5. جرّب أولاً بمفتاح تجريبي، ثم انتقل إلى المفتاح الحي.