API v1

واجهة تواصل البرمجية

واجهة RESTful لإرسال واستقبال رسائل واتساب برمجياً. كل الطلبات والردود بصيغة JSON عبر HTTPS.

الرابط الأساسي

https://twasel.io/api/v1/

البروتوكول

HTTPS فقط، UTF-8

طريقة المصادقة

API Key + Secret بالـ Headers

الحد اليومي

1,000 طلب/يوم (قابل للرفع)

المصادقة

أرفق الـ Headers التالية مع كل طلب. أنشئ المفتاح والسر من لوحة الإدارة ← تبويب API.

Headerالوصف
X-API-Keyالمفتاح العام، يُنشأ من تبويب API بلوحة الإدارة
X-API-Secretالسر الخاص، يظهر مرة واحدة فقط عند الإنشاء
Content-Typeapplication/json لطلبات POST

حدود الاستخدام

لكل مفتاح حد يومي افتراضي 1,000 طلب. عند التجاوز يُرجع الخادم 429 Too Many Requests. تواصل مع الدعم لرفع الحد.

POST /api/v1/send/text

أرسل رسالة نصية حرة لرقم واتساب. تعمل فقط ضمن نافذة الرد الحر (24 ساعة من آخر رسالة للعميل).

المعاملات

الحقلالنوعالوصف
tostringمطلوبرقم المستلم بصيغة دولية بدون + (مثال: 966501234567)
bodystringمطلوبنص الرسالة، حد أقصى 4,096 حرف
account_idintegerاختياريمعرّف الحساب، مطلوب فقط إذا كان المفتاح مرتبطاً بأكثر من حساب

مثال عملي

curl -X POST https://twasel.io/api/v1/send/text \
  -H "X-API-Key: wk_abc123..." \
  -H "X-API-Secret: ws_xyz789..." \
  -H "Content-Type: application/json" \
  -d '{
    "to": "966501234567",
    "body": "مرحباً! رسالة تجريبية من تواصل."
  }'
import requests

resp = requests.post(
    "https://twasel.io/api/v1/send/text",
    headers={
        "X-API-Key": "wk_abc123...",
        "X-API-Secret": "ws_xyz789...",
    },
    json={"to": "966501234567", "body": "مرحباً من تواصل!"}
)
print(resp.json())
const resp = await fetch("https://twasel.io/api/v1/send/text", {
  method: "POST",
  headers: {
    "X-API-Key": "wk_abc123...",
    "X-API-Secret": "ws_xyz789...",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ to: "966501234567", body: "مرحباً من تواصل!" }),
});
console.log(await resp.json());

نموذج الاستجابة

{
  "ok": true,
  "wa_message_id": "wamid.HBgLOTY2NTAxMjM0..."
}
{
  "ok": false,
  "error": "to_and_body_required"
}
⚡ جرّب مباشرة

POST /api/v1/send/template

أرسل قالب رسالة معتمد من Meta. القوالب تعمل حتى خارج نافذة الرد الحر. كل قالب مُسلّم يُحاسب عليه لدى Meta مباشرة.

المعاملات

الحقلالنوعالوصف
tostringمطلوبرقم المستلم بصيغة دولية بدون +
template_namestringمطلوباسم القالب بالضبط كما هو مسجّل بـ Meta (مثال: order_confirmation)
languagestringاختياريرمز اللغة (افتراضي: ar)
componentsarrayاختياريمتغيرات القالب بصيغة Meta components
account_idintegerاختياريمعرّف الحساب، مطلوب فقط إذا كان المفتاح مرتبطاً بأكثر من حساب

مثال عملي

curl -X POST https://twasel.io/api/v1/send/template \
  -H "X-API-Key: wk_abc123..." \
  -H "X-API-Secret: ws_xyz789..." \
  -H "Content-Type: application/json" \
  -d '{
    "to": "966501234567",
    "template_name": "order_confirmation",
    "language": "ar",
    "components": [{
      "type": "body",
      "parameters": [
        { "type": "text", "text": "أحمد" },
        { "type": "text", "text": "ORD-1234" }
      ]
    }]
  }'

نموذج الاستجابة

{
  "ok": true,
  "wa_message_id": "wamid.HBgLOTY2NTAxMjM0..."
}
{
  "ok": false,
  "error": "to_and_template_name_required"
}
⚡ جرّب مباشرة

POST /api/v1/send/media

أرسل ملف وسائط (صورة، فيديو، مستند، صوت) عبر رابط HTTPS عام مباشر

المعاملات

الحقلالنوعالوصف
tostringمطلوبرقم المستلم بصيغة دولية بدون +
typestringمطلوبimage | video | document | audio
urlstringمطلوبرابط HTTPS مباشر وعام للملف
captionstringاختياريتعليق مرفق، حد أقصى 1,024 حرف
account_idintegerاختياريمعرّف الحساب، مطلوب فقط إذا كان المفتاح مرتبطاً بأكثر من حساب

مثال عملي

curl -X POST https://twasel.io/api/v1/send/media \
  -H "X-API-Key: wk_abc123..." \
  -H "X-API-Secret: ws_xyz789..." \
  -H "Content-Type: application/json" \
  -d '{
    "to": "966501234567",
    "type": "image",
    "url": "https://example.com/product.jpg",
    "caption": "منتج جديد متوفر الآن!"
  }'

الصيغ المدعومة والحدود

النوعالصيغالحد الأقصى
imageJPEG, PNG5 MB
videoMP4, 3GPP16 MB
documentPDF, DOC, DOCX, XLS, XLSX, PPT, PPTX100 MB
audioAAC, MP3, MP4, AMR, OGG16 MB

نموذج الاستجابة

{
  "ok": true,
  "wa_message_id": "wamid.HBgLOTY2NTAxMjM0..."
}
{
  "ok": false,
  "error": "url_must_be_https"
}

POST /api/v1/trigger/flow

يشغّل مساراً من منشئ المسارات لرقم محدد عند وقوع حدث من نظامك. الحدث يجب أن يطابق المشغّل المضبوط بالمسار.

المعاملات

الحقلالنوعالوصف
eventstringمطلوباسم الحدث كما هو مضبوط بمشغّل المسار
tostringمطلوبرقم المستلم بصيغة دولية بدون +
varsobjectاختياريمتغيرات إضافية تُمرر للمسار
account_idintegerاختياريمعرّف الحساب، مطلوب فقط إذا كان المفتاح مرتبطاً بأكثر من حساب

مثال عملي

curl -X POST https://twasel.io/api/v1/trigger/flow \
  -H "X-API-Key: wk_abc123..." \
  -H "X-API-Secret: ws_xyz789..." \
  -H "Content-Type: application/json" \
  -d '{
    "event": "order.created",
    "to": "966501234567",
    "vars": { "order_id": "ORD-1234" }
  }'

نموذج الاستجابة

{
  "ok": true,
  "status": "flow_started"
}
{
  "ok": false,
  "status": "no_matching_flow"
}

GET /api/v1/templates

استعلم عن القوالب المعتمدة (APPROVED) المتاحة لحسابك أو لحساب محدد

معاملات الاستعلام

الحقلالنوعالوصف
account_idintegerاختياريتصفية حسب حساب معيّن

نموذج الاستجابة

{
  "ok": true,
  "templates": [
    {
      "id": 1,
      "name": "order_confirmation",
      "category": "UTILITY",
      "language": "ar",
      "status": "APPROVED"
    },
    {
      "id": 2,
      "name": "welcome_message",
      "category": "MARKETING",
      "language": "ar",
      "status": "APPROVED"
    }
  ]
}

GET /api/v1/accounts

استعلم عن حسابات واتساب النشطة المتاحة لمفتاحك

نموذج الاستجابة

{
  "ok": true,
  "accounts": [
    {
      "id": 1,
      "display_name": "الرقم الرئيسي",
      "phone_number": "+966501234567",
      "is_active": true
    }
  ]
}

جدول الأخطاء

عند حدوث خطأ، يحتوي الرد على "ok": false مع حقل error يوضّح السبب

أخطاء المصادقة

HTTPerrorالسبب
401missing_credentialsلم تُرفق Headers المصادقة مع الطلب
401invalid_keyالمفتاح غير موجود أو معطّل
401key_expiredانتهت صلاحية المفتاح
401invalid_secretالسر الخاص غير مطابق

أخطاء الاستخدام

HTTPerrorالسبب
429rate_limit_exceededتجاوز الحد اليومي للطلبات
400to_and_body_requiredحقلا to و body مطلوبان
400to_and_template_name_requiredحقلا to و template_name مطلوبان
400to_type_url_requiredحقول to و type و url مطلوبة، أو النوع غير مدعوم
400account_id_requiredالمفتاح مرتبط بعدة حسابات، حدّد account_id
400url_must_be_httpsرابط الوسائط يجب أن يكون HTTPS
422outside_customer_windowانتهت نافذة الرد الحر، يمكن إرسال قوالب فقط
403permission_deniedالمفتاح لا يملك صلاحية تنفيذ هذا الإجراء
403invalid_accountالحساب لا ينتمي لمشروعك
404unknown_endpointرابط API غير موجود
404account_not_foundالحساب غير موجود أو معطّل
405method_not_allowedHTTP method غير مسموح (مثال: أرسلت GET بدل POST)
502(Meta)خطأ مباشر من خوادم Meta أثناء الإرسال

ملاحظات عامة

البندالتوضيح
نافذة الرد الحرsend/text يعمل فقط خلال 24 ساعة من آخر رسالة واردة من العميل. بعدها استخدم send/template. التسعير لدى Meta يكون لكل رسالة قالب مُسلّمة.
صيغة الرقمرقم دولي كامل بدون + أو مسافات، مثال: 966501234567
الترميزUTF-8، النصوص العربية مدعومة بالكامل بالرسائل والقوالب
HTTPS إلزاميالطلبات عبر HTTP بدون تشفير مرفوضة
الصلاحياتكل مفتاح له صلاحيات يحدّدها المدير، صلاحية ناقصة تُرجع 403
تواصل · مرجع API، الإصدار الأول