أرسل الرسائل وأدِر الجلسات وادمج واتساب في تطبيقاتك عبر واجهة REST.
https://your-domain.com/api/v1
تتبع جميع استجابات الـ API هذا التنسيق:
// Success Response
{
"success": true,
"data": { ... },
"message": "Optional success message"
}
// Error Response
{
"success": false,
"message": "Error description",
"error": "Detailed error message"
}
تتطلب جميع طلبات الـ API (باستثناء فحص الصحة) ترويسة X-API-Key:
X-API-Key: your-api-key-here
curl -X POST https://your-domain.com/api/v1/messages/send-text \
-H "Content-Type: application/json" \
-H "X-API-Key: your-api-key-here" \
-d '{"to": "968XXXXXXXX", "message": "Hello!"}'
قد تدعم كل حاوية قناتَي إرسال مستقلتين:
/api/v1/messages/send-*./api/v1/cloud-api/*.
يمكن ربط كل مفتاح API ربطًا دائمًا بقناة واحدة محددة من لوحة التحكم (الإعدادات > مفاتيح API > قناة الإرسال).
ويُرفض المفتاح المربوط على نقاط نهاية القناة الأخرى
مع الرمز CHANNEL_MISMATCH — حتى لا يرسل الكود الخارجي عن طريق الخطأ
عبر الحساب الخاطئ. أما المفاتيح ذات الربط Auto فتتبع
ترويسات كل طلب.
X-Session-Key — تجاوز لكل طلب.baileys:<id>.api_keys.session_id.X-Cloud-Account-Id — تجاوز لكل طلب.cloud_api:<id>.curl -X POST https://your-domain.com/api/v1/messages/send-text \
-H "X-API-Key: your_api_key" \
-H "X-Session-Key: sales" \
-H "Content-Type: application/json" \
-d '{"to":"96812345678","message":"Hello"}'
curl -X POST https://your-domain.com/api/v1/cloud-api/send-text \
-H "X-API-Key: your_api_key" \
-H "X-Cloud-Account-Id: 2" \
-H "Content-Type: application/json" \
-d '{"to":"96812345678","message":"Hello"}'
في الحاويات القديمة ذات الجلسة الواحدة، تُتجاهل ترويسة X-Session-Key
بصمت ويُوجَّه كل نداء Baileys إلى الجلسة الوحيدة — فالمرجع آمن
حتى قبل تفعيل تعدد الجلسات.
/api/v1/health
لا تتطلب مصادقة
تحقق مما إذا كان خادم الـ API يعمل.
{
"success": true,
"message": "WA-Connect API is running",
"timestamp": "2026-02-27T10:00:00.000Z"
}
/api/v1/session/status
احصل على حالة جلسة واتساب الحالية.
{
"success": true,
"data": {
"status": "connected",
"user": {
"id": "968XXXXXXXX@s.whatsapp.net",
"name": "Your Name"
},
"connected_at": "2026-02-27T10:00:00.000Z"
}
}
/api/v1/session/connect
ابدأ الاتصال بواتساب. تُرجِع رمز QR إذا لم تتم المصادقة.
{
"success": true,
"data": {
"status": "qr_ready",
"qr": "2@ABC123...base64-qr-data..."
}
}
{
"success": true,
"data": {
"status": "connecting",
"message": "Reconnecting with saved credentials"
}
}
/api/v1/session/disconnect
اقطع جلسة واتساب (مع الاحتفاظ ببيانات الاعتماد لإعادة الاتصال).
{
"success": true,
"message": "Disconnected successfully"
}
/api/v1/session/logout
تسجيل الخروج من واتساب ومسح جميع بيانات الجلسة.
{
"success": true,
"message": "Logged out successfully"
}
/api/v1/messages/send-text
أرسل رسالة نصية إلى رقم واتساب.
{
"to": "968XXXXXXXX",
"message": "Hello from WA-Connect!"
}
{
"success": true,
"data": {
"message_id": "3EB0XXXXX",
"to": "968XXXXXXXX@s.whatsapp.net",
"status": "sent",
"timestamp": "2026-02-27T10:00:00.000Z"
}
}
/api/v1/messages/send-image
أرسل صورة مع تعليق اختياري.
{
"to": "968XXXXXXXX",
"imageUrl": "https://example.com/image.jpg",
"caption": "Check this out!" // optional
}
{
"success": true,
"data": {
"message_id": "3EB0XXXXX",
"to": "968XXXXXXXX@s.whatsapp.net",
"status": "sent"
}
}
/api/v1/messages/send-document
أرسل مستندًا/ملفًا.
{
"to": "968XXXXXXXX",
"documentUrl": "https://example.com/document.pdf",
"mimetype": "application/pdf",
"fileName": "Invoice.pdf",
"caption": "Here is your invoice" // optional
}
{
"success": true,
"data": {
"message_id": "3EB0XXXXX",
"to": "968XXXXXXXX@s.whatsapp.net",
"status": "sent"
}
}
/api/v1/messages/send-video
أرسل مقطع فيديو مع تعليق اختياري.
{
"to": "968XXXXXXXX",
"videoUrl": "https://example.com/video.mp4",
"caption": "Watch this!" // optional
}
{
"success": true,
"data": {
"message_id": "3EB0XXXXX",
"to": "968XXXXXXXX@s.whatsapp.net",
"status": "sent"
}
}
/api/v1/messages/send-audio
أرسل ملفًا صوتيًا أو رسالة صوتية.
{
"to": "968XXXXXXXX",
"audioUrl": "https://example.com/audio.mp3",
"ptt": false // set to true for voice note
}
{
"success": true,
"data": {
"message_id": "3EB0XXXXX",
"to": "968XXXXXXXX@s.whatsapp.net",
"status": "sent"
}
}
/api/v1/messages/send-location
أرسل موقعًا جغرافيًا.
{
"to": "968XXXXXXXX",
"latitude": 23.5880,
"longitude": 58.3829,
"name": "Muscat, Oman", // optional
"address": "Muscat, Oman" // optional
}
{
"success": true,
"data": {
"message_id": "3EB0XXXXX",
"to": "968XXXXXXXX@s.whatsapp.net",
"status": "sent"
}
}
/api/v1/messages/send-contact
أرسل بطاقة جهة اتصال (vCard).
{
"to": "968XXXXXXXX",
"contactName": "John Doe",
"contactPhone": "+96899999999"
}
{
"success": true,
"data": {
"message_id": "3EB0XXXXX",
"to": "968XXXXXXXX@s.whatsapp.net",
"status": "sent"
}
}
/api/v1/messages/send-bulk
أرسل الرسالة نفسها إلى عدة مستلمين.
{
"recipients": ["968XXXXXXXX", "968YYYYYYYY", "968ZZZZZZZZ"],
"message": "Hello everyone!",
"delay": 1000 // optional, delay between messages in ms (default: 1000)
}
{
"success": true,
"data": {
"total": 3,
"successful": 3,
"failed": 0,
"results": [
{ "to": "968XXXXXXXX", "success": true, "message_id": "3EB0XXX" },
{ "to": "968YYYYYYYY", "success": true, "message_id": "3EB0YYY" },
{ "to": "968ZZZZZZZZ", "success": true, "message_id": "3EB0ZZZ" }
]
}
}
/api/v1/messages/log
احصل على سجل الرسائل مقسمًا إلى صفحات.
| المعامل | النوع | الافتراضي | الوصف |
|---|---|---|---|
page | integer | 1 | رقم الصفحة |
limit | integer | 20 | عدد العناصر في الصفحة |
direction | string | all | التصفية: inbound أو outbound أو all |
{
"success": true,
"data": {
"messages": [
{
"id": 1,
"message_id": "3EB0XXXXX",
"remote_jid": "968XXXXXXXX@s.whatsapp.net",
"remote_name": "John Doe",
"direction": "outbound",
"message_type": "text",
"content": "Hello!",
"status": "sent",
"created_at": "2026-02-27T10:00:00.000Z"
}
],
"pagination": {
"page": 1,
"limit": 20,
"total": 150,
"totalPages": 8
}
}
}
/api/v1/messages/:id
احصل على رسالة واحدة عبر المعرِّف id أو message_id.
{
"success": true,
"data": {
"id": 1,
"message_id": "3EB0XXXXX",
"remote_jid": "968XXXXXXXX@s.whatsapp.net",
"remote_name": "John Doe",
"direction": "outbound",
"message_type": "text",
"content": "Hello!",
"status": "sent",
"created_at": "2026-02-27T10:00:00.000Z"
}
}
اكتشف القوالب المعتمَدة على واتساب Cloud API من Meta وأرسلها
بمعاملات مرقَّمة {{1}} {{2}}. يتطلب ذلك
حساب Cloud API مُهيَّأً. ويتبع تحديدُ الحساب المستخدَم ترتيبَ
التحديد في
اختيار قناة الإرسال —
وترويسة X-Cloud-Account-Id هي التجاوز لكل طلب.
/api/v1/cloud-api/templates
اسرد القوالب المعتمَدة للحساب، مع مرشّحات اختيارية من جانب الخادم.
| المعامل | النوع | الافتراضي | الوصف |
|---|---|---|---|
language | string | - | التصفية حسب رمز اللغة الدقيق (مثل ar، en_US) |
category | string | - | AUTHENTICATION | MARKETING | UTILITY |
status | string | APPROVED | APPROVED | PENDING | REJECTED | ALL |
search | string | - | مطابقة جزئية غير حساسة لحالة الأحرف على الاسم |
limit | integer | 50 | حجم الصفحة (1..200) |
{
"success": true,
"data": {
"count": 2,
"templates": [
{
"name": "otp_login",
"language": "ar",
"category": "AUTHENTICATION",
"status": "APPROVED",
"body": "رمز التحقق: {{1}}",
"param_count": 1,
"param_placeholders": ["{{1}}"],
"body_param_count": 1,
"header_param_count": 0,
"button_param_indexes": [],
"total_param_count": 1,
"param_placeholders_tagged": ["body:{{1}}"],
"header": null,
"footer": null,
"buttons": []
}
]
}
}
يبقى param_count / param_placeholders
خاصًّا بالجسم فقط للحفاظ على التوافق مع الإصدارات السابقة. استخدم
header_param_count وbutton_param_indexes
وparam_placeholders_tagged
(header:{{1}}، body:{{2}}،
button:0:{{1}}) لرؤية كل متغيّر يتوقّعه القالب،
وtotal_param_count للعدد الإجمالي.
يتطلّب الاكتشاف أن يملك رمز الوصول (Access Token) صلاحية
whatsapp_business_management.
وتُخزَّن النتائج مؤقتًا لمدة 60 ثانية.
/api/v1/cloud-api/templates/:name
احصل على التفاصيل الكاملة لقالب واحد — مفيد لاستخراج العناصر النائبة قبل الإرسال.
| المعامل | النوع | مطلوب | الوصف |
|---|---|---|---|
language | string | نعم | رمز اللغة — قد يوجد القالب نفسه بعدة لغات |
{
"success": true,
"data": {
"name": "otp_login",
"language": "ar",
"category": "AUTHENTICATION",
"status": "APPROVED",
"body": "رمز التحقق: {{1}}",
"param_count": 1,
"param_placeholders": ["{{1}}"],
"header": { "type": "TEXT", "text": "تحقق من الحساب" },
"footer": null,
"buttons": []
}
}
/api/v1/cloud-api/templates/:name/send
أرسل قالبًا. يقبل params كمصفوفة (حسب الموضع) أو ككائن مرقَّم.
{
"to": "96812345678",
"language": "ar",
"params": ["123456"]
}
{
"to": "96812345678",
"language": "ar",
"params": {
"1": "Ahmed",
"2": "1234",
"3": "150 SAR"
}
}
تُحلَّل مفاتيح صيغة الكائن كأعداد صحيحة وتُرتَّب، فيكون
{"2":"b","1":"a"} مكافئًا لـ
["a","b"]. وتصبح الأرقام الوسطية المفقودة
سلاسل نصية فارغة.
{
"to": "96812345678",
"language": "ar",
"params": { "1": "Ahmed", "2": "8656", "3": "A13322257" },
"header_params": { "1": "إشعار إنشاء شحنة" },
"button_params": { "0": ["8656"] }
}
يملأ header_params العنصر {{1}} في الترويسة —
سواء كمصفوفة حسب الموضع أو ككائن مرقَّم، وكلاهما مقبول.
ويملأ button_params لواحق أزرار الروابط الديناميكية —
المفاتيح هي فهارس الأزرار ("0"، "1"…)،
والقيم هي معاملات ذلك الزر؛ كما تُقبل صيغة المصفوفة ضمن
مصفوفة حسب الموضع [["8656"]].
وكلا الحقلين اختياري ويمكن قراءتهما أيضًا بصيغة camelCase
(headerParams / buttonParams).
والطلبات التي لا تتضمنهما تعمل تمامًا كما في السابق (مكوّن
الجسم فقط). أما قالب الترويسة المتغيّرة المُرسَل دون
header_params فترفضه Meta بالرمز
#132000 — ولا يُملأ تلقائيًا عن قصد، حتى تظهر
القيمة المفقودة بدلًا من التخمين.
{
"success": true,
"data": {
"messaging_product": "whatsapp",
"messages": [{ "id": "wamid.HB..." }],
"sent_at": "2026-07-23T10:15:00.000Z"
}
}
| الرمز | الوصف |
|---|---|
200 | نجاح |
400 | طلب خاطئ - معاملات مفقودة أو غير صالحة |
401 | غير مصرَّح - مفتاح API غير صالح أو مفقود |
403 | ممنوع - مفتاح API يفتقر إلى الصلاحية المطلوبة |
404 | غير موجود - المورد غير موجود |
429 | طلبات كثيرة جدًا - تم تجاوز حد المعدل |
500 | خطأ داخلي في الخادم |
503 | الخدمة غير متوفرة - واتساب غير متصل |
| الرمز | متى |
|---|---|
CHANNEL_MISMATCH | مفتاح API مربوط بقناة واحدة لكن نقطة النهاية تخص القناة الأخرى (مثل مفتاح مربوط بـ cloud_api: يصل إلى /messages/send-*). |
ACCOUNT_NOT_FOUND | ترويسة X-Cloud-Account-Id أو معرِّف الحساب المربوط لم يعد موجودًا في cloud_api_accounts. |
NO_ACCOUNTS | تم استدعاء نقطة نهاية Cloud API على مستأجر لا يملك أي حساب مُهيَّأ. |
FEATURE_OFF | Cloud API غير مُفعَّل على هذه الحاوية. |
{
"success": false,
"message": "WhatsApp is not connected",
"error": "Service unavailable"
}
طلبات الـ API محدودة المعدل لمنع إساءة الاستخدام:
| نوع نقطة النهاية | الحد |
|---|---|
| واجهة API عامة | 100 طلب كل 15 دقيقة |
| إرسال الرسائل | 30 رسالة في الدقيقة |
| الحد اليومي لمفتاح API | قابل للتهيئة لكل مفتاح (الافتراضي: 1000) |
429 Too Many Requests.
انتظر قبل إعادة المحاولة.
تتيح Webhooks لتطبيقك تلقّي إشعارات فورية عند وقوع الأحداث في WA-Connect. وعند وقوع حدث، يرسل WA-Connect طلب HTTP POST إلى الرابط الذي هيّأته.
| الحدث | الوصف |
|---|---|
message.received | تم استقبال رسالة جديدة |
message.sent | تم إرسال رسالة بنجاح |
message.status | تم تحديث حالة تسليم الرسالة (مُسلَّمة، مقروءة) |
connection.connected | تم اتصال جلسة واتساب |
connection.disconnected | تم قطع جلسة واتساب |
connection.qr_ready | رمز QR جاهز للمسح |
call.incoming | تم استقبال مكالمة واردة |
call.rejected | تم رفض مكالمة واردة |
تُرسَل جميع طلبات Webhook بصيغة HTTP POST مع جسم JSON:
{
"event": "message.received",
"timestamp": "2026-02-27T10:00:00.000Z",
"data": {
// Event-specific data
}
}
| الترويسة | الوصف |
|---|---|
Content-Type | application/json |
User-Agent | WA-Connect-Webhook/1.0 |
X-Webhook-Event | نوع الحدث |
X-Webhook-Timestamp | طابع زمني للحدث (ISO 8601) |
X-Webhook-Signature | توقيع HMAC-SHA256 (إذا كان السر مُهيَّأً) |
X-Webhook-Signature-256 | sha256=SIGNATURE (بتنسيق على طراز GitHub) |
إذا هيّأت سرًّا لـ Webhook الخاص بك، يوقّع WA-Connect كل طلب باستخدام HMAC-SHA256. وينبغي لك التحقق من هذا التوقيع للتأكد من أصالة الطلب.
const crypto = require('crypto');
function verifySignature(payload, signature, secret) {
const expected = crypto
.createHmac('sha256', secret)
.update(JSON.stringify(payload))
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected)
);
}
// In your webhook handler:
app.post('/webhook', (req, res) => {
const signature = req.headers['x-webhook-signature'];
const isValid = verifySignature(req.body, signature, 'your-secret');
if (!isValid) {
return res.status(401).send('Invalid signature');
}
// Process the webhook...
res.status(200).send('OK');
});
message.received
يُطلَق عند استقبال رسالة جديدة.
{
"event": "message.received",
"timestamp": "2026-02-27T10:00:00.000Z",
"data": {
"message_id": "3EB0XXXXX",
"from": "968XXXXXXXX@s.whatsapp.net",
"from_name": "John Doe",
"type": "text",
"content": "Hello!",
"media_url": null,
"is_group": false,
"timestamp": "2026-02-27T10:00:00.000Z"
}
}
message.sent
يُطلَق عند إرسال رسالة بنجاح.
{
"event": "message.sent",
"timestamp": "2026-02-27T10:00:00.000Z",
"data": {
"message_id": "3EB0XXXXX",
"to": "968XXXXXXXX@s.whatsapp.net",
"type": "text",
"content": "Hello!",
"status": "sent"
}
}
message.status
يُطلَق عند تحديث حالة تسليم الرسالة.
{
"event": "message.status",
"timestamp": "2026-02-27T10:00:00.000Z",
"data": {
"message_id": "3EB0XXXXX",
"remote_jid": "968XXXXXXXX@s.whatsapp.net",
"status": "delivered" // "sent", "delivered", "read", "failed"
}
}
connection.connected
يُطلَق عند اتصال جلسة واتساب.
{
"event": "connection.connected",
"timestamp": "2026-02-27T10:00:00.000Z",
"data": {
"status": "connected",
"phone_number": "968XXXXXXXX",
"wa_name": "Your Name"
}
}
connection.disconnected
يُطلَق عند قطع جلسة واتساب.
{
"event": "connection.disconnected",
"timestamp": "2026-02-27T10:00:00.000Z",
"data": {
"status": "disconnected",
"reason": "logout"
}
}
call.incoming
يُطلَق عند استقبال مكالمة واردة.
{
"event": "call.incoming",
"timestamp": "2026-02-27T10:00:00.000Z",
"data": {
"from": "968XXXXXXXX@s.whatsapp.net",
"call_id": "CALL_ID_HERE",
"is_video": false
}
}
إذا أرجعت نقطة نهاية Webhook رمز حالة خارج نطاق 2xx أو انتهت مهلتها، فسيعيد WA-Connect محاولة التسليم:
/api/v1/contacts/check
تحقق مما إذا كان رقم هاتف مسجَّلًا على واتساب.
{
"phone": "968XXXXXXXX"
}
{
"success": true,
"exists": true,
"message": "Number is on WhatsApp",
"contact": {
"jid": "968XXXXXXXX@s.whatsapp.net",
"phone": "968XXXXXXXX",
"name": "John Doe"
}
}
{
"success": true,
"exists": false,
"message": "Number is not on WhatsApp"
}
/api/v1/contacts
احصل على قائمة جهات الاتصال المتزامنة.
| المعامل | النوع | الافتراضي | الوصف |
|---|---|---|---|
page | integer | 1 | رقم الصفحة |
limit | integer | 50 | عدد العناصر في الصفحة |
search | string | - | البحث بالاسم أو الهاتف |
type | string | all | التصفية: individual أو group أو all |
{
"success": true,
"data": {
"contacts": [
{
"id": 1,
"jid": "968XXXXXXXX@s.whatsapp.net",
"phone": "968XXXXXXXX",
"push_name": "John Doe",
"is_group": false,
"last_message_at": "2026-02-27T10:00:00.000Z"
}
],
"pagination": {
"page": 1,
"limit": 50,
"total": 150,
"totalPages": 3
}
}
}
/api/v1/contacts/:jid
احصل على جهة اتصال واحدة عبر JID.
{
"success": true,
"data": {
"id": 1,
"jid": "968XXXXXXXX@s.whatsapp.net",
"phone": "968XXXXXXXX",
"push_name": "John Doe",
"is_group": false,
"message_count": 25,
"last_message_at": "2026-02-27T10:00:00.000Z",
"created_at": "2026-02-20T08:00:00.000Z"
}
}
/api/v1/contacts/search
ابحث في جهات الاتصال بالاسم أو رقم الهاتف.
| المعامل | النوع | الوصف |
|---|---|---|
q | string | استعلام البحث (حرفان على الأقل) |
{
"success": true,
"data": {
"contacts": [
{
"id": 1,
"jid": "968XXXXXXXX@s.whatsapp.net",
"phone": "968XXXXXXXX",
"push_name": "John Doe"
}
]
}
}
/api/v1/contacts/export
صدّر جميع جهات الاتصال كملف CSV.
يُرجِع تنزيل ملف CSV يتضمن الأعمدة: jid, phone, name, is_group, message_count, last_message_at
/api/v1/contacts/sync
ابدأ مزامنة يدوية لجهات الاتصال من واتساب. ملاحظة: تتم مزامنة جهات الاتصال تلقائيًا عند اتصال واتساب.
{
"success": true,
"message": "Contacts are synced automatically when WhatsApp connects."
}
تُخزَّن محادثات المجموعات أيضًا كجهات اتصال مع is_group: true. ويمكنك تصفيتها باستخدام المعامل type:
GET /api/v1/contacts?type=group