المصادقة (Authentication)

جميع طلبات API تتطلب مفتاح API صالح. يُرسل المفتاح في هيدر Authorization مع كل طلب.

Header Authorization: Bearer YOUR_API_TOKEN
يمكنك إنشاء مفاتيح API من لوحة التحكم → مفاتيح API. المفتاح يظهر مرة واحدة فقط عند الإنشاء.

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

Base URL https://waslapi.com/api/v1

أكواد الأخطاء

الكودالمعنى
200نجاح
201تم الإنشاء بنجاح
400خطأ في البيانات المرسلة
401غير مصرح - مفتاح API غير صالح
403محظور - تجاوزت حد الاشتراك
404غير موجود
422خطأ في التحقق من البيانات
429تجاوزت حد الطلبات (Rate Limit)
503الخدمة غير متاحة / لا توجد سعة على النودات
500خطأ في الخادم

إدارة الأرقام (Instances)

GET /instances

عرض جميع الأرقام المسجلة في حسابك.

مثال cURL:
cURL
curl -X GET https://waslapi.com/api/v1/instances \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Accept: application/json"
مثال PHP:
PHP
$response = Http::withToken('YOUR_API_TOKEN')
    ->get('https://waslapi.com/api/v1/instances');

$instances = $response->json();
POST /instances

إنشاء رقم جديد.

المعاملات:
المعاملالنوعمطلوبالوصف
namestringنعماسم الرقم (للتعريف)
proxy_countrystringلاكود الدولة للبروكسي (2 حروف). القيم المتاحة عبر /proxy/countries
مثال cURL:
cURL
curl -X POST https://waslapi.com/api/v1/instances \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name": "رقم المتجر", "proxy_country": "sa"}'
الاستجابات المحتملة:
HTTPerrorالوصف
201-تم إنشاء الرقم وبدء انتظار QR
403INSTANCE_LIMIT_REACHEDالمستخدم تجاوز حد الأرقام في باقته
503NO_CAPACITYلا توجد سعة متاحة على أي Node
500INSTANCE_CREATION_FAILEDفشل إنشاء الرقم داخل Evolution API
مثال استجابة 503:
JSON Response
{
  "success": false,
  "error": "NO_CAPACITY",
  "message": "No server capacity available. Please contact support."
}
GET /proxy/countries

جلب قائمة الدول المدعومة لحقل proxy_country عند إنشاء رقم جديد.

مثال cURL:
cURL
curl -X GET https://waslapi.com/api/v1/proxy/countries \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Accept: application/json"
مثال استجابة:
JSON Response
{
  "success": true,
  "data": [
    {
      "code": "sa",
      "name_ar": "السعودية",
      "name_en": "Saudi Arabia"
    },
    {
      "code": "ae",
      "name_ar": "الإمارات",
      "name_en": "United Arab Emirates"
    }
  ]
}
GET /instances/{id}/qr

جلب رمز QR لربط الرقم بالتطبيق. افتح التطبيق → الأجهزة المرتبطة → امسح الرمز.

cURL
curl -X GET https://waslapi.com/api/v1/instances/1/qr \
  -H "Authorization: Bearer YOUR_API_TOKEN"
GET /instances/{id}/status

فحص حالة اتصال الرقم (متصل / غير متصل / معلّق).

GET /instances/{id}

عرض تفاصيل رقم محدد.

cURL
curl -X GET https://waslapi.com/api/v1/instances/1 \
  -H "Authorization: Bearer YOUR_API_TOKEN"
مثال استجابة:
JSON Response
{
  "success": true,
  "data": {
    "id": 1,
    "instance_name": "1_my_store",
    "status": "connected",
    "phone_number": "966501234567",
    "proxy_country": "sa",
    "connected_at": "2026-03-01T10:00:00.000000Z",
    "created_at": "2026-02-28T08:00:00.000000Z"
  }
}
DELETE /instances/{id}

حذف رقم نهائياً مع جميع بياناته.

الرسائل (Messages)

POST /messages/send-text

إرسال رسالة نصية.

المعاملات:
المعاملالنوعمطلوبالوصف
instance_idintegerنعممعرّف الرقم
tostringنعمرقم المستلم (مع كود الدولة بدون +)
messagestringنعمنص الرسالة
مثال cURL:
cURL
curl -X POST https://waslapi.com/api/v1/messages/send-text \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "instance_id": 1,
    "to": "966501234567",
    "message": "مرحباً! هذه رسالة تجريبية."
  }'
مثال Python:
Python
import requests

url = "https://waslapi.com/api/v1/messages/send-text"
headers = {
    "Authorization": "Bearer YOUR_API_TOKEN",
    "Content-Type": "application/json"
}
data = {
    "instance_id": 1,
    "to": "966501234567",
    "message": "مرحباً من Python!"
}

response = requests.post(url, json=data, headers=headers)
print(response.json())
مثال Node.js:
Node.js
const response = await fetch('https://waslapi.com/api/v1/messages/send-text', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    instance_id: 1,
    to: '966501234567',
    message: 'مرحباً من Node.js!'
  })
});

const data = await response.json();
console.log(data);
POST /messages/send-media

إرسال رسالة وسائط (صورة، فيديو، مستند، صوت).

المعاملات:
المعاملالنوعمطلوبالوصف
instance_idintegerنعممعرّف الرقم
tostringنعمرقم المستلم
media_typestringنعمنوع الوسائط: image, video, document, audio
media_urlstringنعمرابط الملف (URL عام)
captionstringلانص مرفق مع الوسائط
media_filefileلارفع ملف مباشرة بدلاً من URL (يتطلب multipart/form-data)
cURL
curl -X POST https://waslapi.com/api/v1/messages/send-media \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "instance_id": 1,
    "to": "966501234567",
    "media_type": "image",
    "media_url": "https://example.com/photo.jpg",
    "caption": "صورة المنتج"
  }'
GET /messages

عرض سجل الرسائل المرسلة مع إمكانية الفلترة حسب الرقم والحالة والتاريخ.

معاملات الفلترة (Query Params):
المعاملالنوعالوصف
instance_idintegerفلترة حسب رقم محدد
statusstringحالة الرسالة: queued, processing, sent, delivered, failed
directionstringالاتجاه: incoming, outgoing
date_fromdateمن تاريخ (YYYY-MM-DD)
date_todateإلى تاريخ (YYYY-MM-DD)
per_pageintegerعدد النتائج في الصفحة (افتراضي 20)

جهات الاتصال (Contacts)

نظام التصنيف التلقائي

يقوم النظام بحفظ جهات الاتصال تلقائياً وتصنيفها حسب مستوى الأمان:

التصنيفالمعنىالخطورة
safe 🟢العميل راسلك أولاً أو رد على رسالتكآمن تماماً للإرسال الجماعي
caution 🟡أنت من راسلت هذا الرقم ولم يرد بعدقد يسبب حظر عند الإرسال الجماعي
new 🔴رقم مستورد لم يتم التواصل معهخطر حظر عالي جداً
يتم ترقية التصنيف تلقائياً من caution إلى safe عندما يرد العميل على رسالتك.
GET /contacts

عرض جميع جهات الاتصال مع إمكانية الفلترة.

معاملات الفلترة (Query Params):
المعاملالنوعالوصف
classificationstringفلترة حسب التصنيف: safe, caution, new
instance_idintegerفلترة حسب رقم محدد
searchstringبحث في رقم الهاتف أو الاسم
per_pageintegerعدد النتائج في الصفحة (افتراضي 25)
cURL
curl -X GET https://waslapi.com/api/v1/contacts?classification=safe \
  -H "Authorization: Bearer YOUR_API_TOKEN"
GET /contacts/stats

عرض إحصائيات جهات الاتصال حسب التصنيف.

JSON Response
{
  "success": true,
  "data": {
    "total": 150,
    "safe": 95,
    "caution": 30,
    "new": 25,
    "blocked": 3
  }
}
POST /contacts

إضافة جهة اتصال جديدة.

المعاملات:
المعاملالنوعالوصف
phone_numberstring *رقم الهاتف (مثل 966500000000)
namestringاسم جهة الاتصال (اختياري)
instance_idinteger *معرّف الرقم المربوط
cURL
curl -X POST https://waslapi.com/api/v1/contacts \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"phone_number":"966500000000","name":"أحمد","instance_id":1}'
PUT /contacts/{id}

تعديل اسم أو تصنيف جهة اتصال.

المعاملات:
المعاملالنوعالوصف
namestringالاسم الجديد
classificationstringالتصنيف: safe, caution, new
cURL
curl -X PUT https://waslapi.com/api/v1/contacts/1 \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name":"أحمد محمد","classification":"safe"}'
POST /contacts/{id}/block  |  /contacts/{id}/unblock

حظر أو رفع حظر جهة اتصال. الجهات المحظورة لا تُشمل في الإرسال الجماعي.

cURL
curl -X POST https://waslapi.com/api/v1/contacts/1/block \
  -H "Authorization: Bearer YOUR_API_TOKEN"
DELETE /contacts/{id}

حذف جهة اتصال.

cURL
curl -X DELETE https://waslapi.com/api/v1/contacts/1 \
  -H "Authorization: Bearer YOUR_API_TOKEN"
POST /contacts/transfer

نقل جميع جهات الاتصال من رقم إلى آخر. يتم تغيير التصنيف تلقائياً إلى caution بعد النقل.

المعاملات:
المعاملالنوعمطلوبالوصف
source_instance_idintegerنعممعرّف الرقم المصدر
target_instance_idintegerنعممعرّف الرقم الهدف
cURL
curl -X POST https://waslapi.com/api/v1/contacts/transfer \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"source_instance_id": 1, "target_instance_id": 2}'
استيراد وتصدير جهات الاتصال
POST /contacts/import

استيراد جهات اتصال من ملف CSV أو VCF. إرسال كـ multipart/form-data.

المعاملالنوعالوصف
contacts_filefile *ملف CSV أو VCF (حد أقصى 5MB / 10,000 جهة)
instance_idinteger *معرّف الرقم المربوط
cURL
curl -X POST https://waslapi.com/api/v1/contacts/import \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -F "contacts_file=@contacts.vcf" \
  -F "instance_id=1"

GET /contacts/export/csv  |  /contacts/export/vcf

تصدير جهات الاتصال بصيغة CSV أو VCF مع إمكانية الفلترة.

المعاملالنوعالوصف
classificationstringفلترة: safe, caution, new
blockedstring1 = المحظورين فقط
cURL
curl -X GET https://waslapi.com/api/v1/contacts/export/csv?classification=safe \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -o contacts.csv
الأمان: يتم فحص جميع الملفات تلقائياً — تنظيف الأرقام والأسماء من أي محتوى خبيث، رفض الملفات المشبوهة.
الاسم التلقائي: عند استقبال أول رسالة واردة، يُحفظ اسم المرسل (pushName) تلقائياً.

الإرسال الجماعي (Broadcasts)

تنبيه: الإرسال الجماعي متاح فقط في الخطط المدفوعة (أساسي وأعلى). ننصح بشدة بالإرسال لجهات الاتصال من تصنيف safe فقط لتجنب حظر رقمك.
POST /broadcasts

إنشاء حملة إرسال جماعي جديدة.

المعاملات:
المعاملالنوعمطلوبالوصف
namestringنعماسم الحملة
instance_idintegerنعممعرّف الرقم المرسل (يجب أن يكون متصلاً)
message_contentstringنعمنص الرسالة (حد أقصى 4096 حرف)
target_classificationstringنعمتصنيف المستلمين: safe, caution, new, all
rate_limit_secondsintegerنعمالفاصل الزمني بين كل رسالة (بالثواني) — يُضاف ±2 ثانية عشوائياً للحماية
scheduled_atdatetimeلاجدولة الإرسال لوقت محدد (ISO 8601)
broadcast_imagefileلاصورة مرفقة (JPEG, PNG, WebP, GIF — حد أقصى 5MB). تُضغط تلقائياً إلى JPEG 80%. يتطلب multipart/form-data
cURL
curl -X POST https://waslapi.com/api/v1/broadcasts \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "حملة العيد",
    "instance_id": 1,
    "message_content": "كل عام وأنتم بخير! 🎉",
    "target_classification": "safe",
    "rate_limit_seconds": 5
  }'
مثال مع جدولة:
cURL
curl -X POST https://waslapi.com/api/v1/broadcasts \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "حملة مجدولة",
    "instance_id": 1,
    "message_content": "رسالة مجدولة",
    "target_classification": "safe",
    "rate_limit_seconds": 5,
    "scheduled_at": "2026-03-01T10:00:00"
  }'
مثال مع صورة (multipart/form-data):
cURL
curl -X POST https://waslapi.com/api/v1/broadcasts \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -F "name=حملة بصورة" \
  -F "instance_id=1" \
  -F "message_content=مرحباً! شاهد عرضنا الجديد" \
  -F "target_classification=safe" \
  -F "rate_limit_seconds=5" \
  -F "broadcast_image=@/path/to/image.png"
ملاحظات الصور: يتم ضغط جميع الصور تلقائياً إلى JPEG بجودة 80% لتوفير الباندويث. الباندويث يُحسب لكل مستلم (حجم الصورة × عدد المستلمين). يتطلب باقة تدعم الوسائط مع باندويث كافٍ.
GET /broadcasts

عرض جميع حملات الإرسال الجماعي.

cURL
curl -X GET https://waslapi.com/api/v1/broadcasts \
  -H "Authorization: Bearer YOUR_API_TOKEN"
GET /broadcasts/{id}

عرض تفاصيل حملة محددة مع حالة كل مستلم.

cURL
curl -X GET https://waslapi.com/api/v1/broadcasts/1 \
  -H "Authorization: Bearer YOUR_API_TOKEN"
POST /broadcasts/{id}/cancel

إلغاء حملة إرسال جماعي (قيد الإرسال أو مجدولة).

cURL
curl -X POST https://waslapi.com/api/v1/broadcasts/1/cancel \
  -H "Authorization: Bearer YOUR_API_TOKEN"

Webhooks

إعداد Webhooks

يمكنك تحديد Webhook URL لحسابك عبر POST /webhooks/setup. المنصة ترسل لك الأحداث التالية لجميع أرقامك:

الحدثالوصف
message.receivedعند استقبال رسالة جديدة
message.sentعند إرسال رسالة بنجاح
message.failedعند فشل إرسال رسالة
connection.updateعند تغيّر حالة اتصال الرقم (اتصال أو انقطاع)
جميع طلبات Webhook تتضمن هيدر X-Webhook-Signature يحتوي على توقيع HMAC-SHA256 للتحقق من المصدر.
POST /webhooks/setup

تسجيل أو تحديث رابط Webhook لحسابك. جميع أحداث أرقامك سترسل لهذا الرابط.

المعاملات:
المعاملالنوعمطلوبالوصف
webhook_urlstringنعمرابط URL لاستقبال الأحداث
webhook_secretstringلامفتاح سري لتوقيع HMAC-SHA256
cURL
curl -X POST https://waslapi.com/api/v1/webhooks/setup \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"webhook_url":"https://example.com/webhook","webhook_secret":"my_secret"}'
GET /webhooks/config

عرض إعدادات Webhook الحالية لحسابك.

cURL
curl -X GET https://waslapi.com/api/v1/webhooks/config \
  -H "Authorization: Bearer YOUR_API_TOKEN"
مثال استجابة:
JSON Response
{
  "success": true,
  "data": {
    "webhook_url": "https://example.com/webhook",
    "has_secret": true
  }
}

الاستهلاك

GET /usage

عرض بيانات استهلاك الاشتراك الحالي.

cURL
curl -X GET https://waslapi.com/api/v1/usage \
  -H "Authorization: Bearer YOUR_API_TOKEN"
الاستجابة:
JSON
{
  "plan": "احترافي",
  "messages_used": 1250,
  "messages_limit": 10000,
  "messages_remaining": 8750,
  "bandwidth_used_mb": 45.2,
  "bandwidth_limit_mb": 500,
  "instances_count": 3,
  "instances_limit": 5,
  "contacts_count": 150,
  "contacts_limit": 10000,
  "allows_broadcast": true,
  "allows_scheduling": true,
  "expires_at": "2026-04-15"
}