توثيق واجهة API

أرسل الرسائل وأدِر الجلسات وادمج واتساب في تطبيقاتك عبر واجهة 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
يمكن إنشاء مفاتيح الـ API من صفحة الإعدادات > مفاتيح API في لوحة التحكم.
مثال على الطلب
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!"}'

Choosing the send channel / اختيار قناة الإرسال

قد تدعم كل حاوية قناتَي إرسال مستقلتين:

  • Baileys — جلسة (أو جلسات) واتساب ويب، تُستخدم عبر /api/v1/messages/send-*.
  • Cloud API — واجهة واتساب للأعمال الرسمية من Meta، تُستخدم عبر /api/v1/cloud-api/*.

يمكن ربط كل مفتاح API ربطًا دائمًا بقناة واحدة محددة من لوحة التحكم (الإعدادات > مفاتيح API > قناة الإرسال). ويُرفض المفتاح المربوط على نقاط نهاية القناة الأخرى مع الرمز CHANNEL_MISMATCH — حتى لا يرسل الكود الخارجي عن طريق الخطأ عبر الحساب الخاطئ. أما المفاتيح ذات الربط Auto فتتبع ترويسات كل طلب.

ترتيب التحديد (نقاط نهاية Baileys)
  1. ترويسة X-Session-Key — تجاوز لكل طلب.
  2. مفتاح API المربوط بـ baileys:<id>.
  3. الحقل القديم api_keys.session_id.
  4. الجلسة الأساسية — البديل الافتراضي.
ترتيب التحديد (نقاط نهاية Cloud API)
  1. ترويسة X-Cloud-Account-Id — تجاوز لكل طلب.
  2. مفتاح API المربوط بـ cloud_api:<id>.
  3. أول حساب Cloud API نشط — تسهيلًا لحالة الحساب الواحد.
مثال — الإرسال من جلسة Baileys محددة
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"}'
مثال — الإرسال من حساب Cloud API محدد
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"}'
ربط مفتاح API بقناة من لوحة التحكم هو البديل الدائم عن إرسال ترويسات التوجيه مع كل طلب. أنشئ مفتاحًا مربوطًا واحدًا لكل قناة بدلًا من مفتاح واحد يعتمد على التخمين.

في الحاويات القديمة ذات الجلسة الواحدة، تُتجاهل ترويسة X-Session-Key بصمت ويُوجَّه كل نداء Baileys إلى الجلسة الوحيدة — فالمرجع آمن حتى قبل تفعيل تعدد الجلسات.

إدارة الجلسة

GET /api/v1/health لا تتطلب مصادقة

تحقق مما إذا كان خادم الـ API يعمل.

الاستجابة
{
    "success": true,
    "message": "WA-Connect API is running",
    "timestamp": "2026-02-27T10:00:00.000Z"
}
GET /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"
    }
}
POST /api/v1/session/connect

ابدأ الاتصال بواتساب. تُرجِع رمز QR إذا لم تتم المصادقة.

الاستجابة (يلزم رمز QR)
{
    "success": true,
    "data": {
        "status": "qr_ready",
        "qr": "2@ABC123...base64-qr-data..."
    }
}
الاستجابة (تمت المصادقة مسبقًا)
{
    "success": true,
    "data": {
        "status": "connecting",
        "message": "Reconnecting with saved credentials"
    }
}
POST /api/v1/session/disconnect

اقطع جلسة واتساب (مع الاحتفاظ ببيانات الاعتماد لإعادة الاتصال).

الاستجابة
{
    "success": true,
    "message": "Disconnected successfully"
}
POST /api/v1/session/logout

تسجيل الخروج من واتساب ومسح جميع بيانات الجلسة.

الاستجابة
{
    "success": true,
    "message": "Logged out successfully"
}

الرسائل

POST /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"
    }
}
POST /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"
    }
}
POST /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"
    }
}
POST /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"
    }
}
POST /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"
    }
}
POST /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"
    }
}
POST /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"
    }
}
POST /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" }
        ]
    }
}

سجل الرسائل

GET /api/v1/messages/log

احصل على سجل الرسائل مقسمًا إلى صفحات.

معاملات الاستعلام
المعاملالنوعالافتراضيالوصف
pageinteger1رقم الصفحة
limitinteger20عدد العناصر في الصفحة
directionstringallالتصفية: 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
        }
    }
}
GET /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

اكتشف القوالب المعتمَدة على واتساب Cloud API من Meta وأرسلها بمعاملات مرقَّمة {{1}} {{2}}. يتطلب ذلك حساب Cloud API مُهيَّأً. ويتبع تحديدُ الحساب المستخدَم ترتيبَ التحديد في اختيار قناة الإرسال — وترويسة X-Cloud-Account-Id هي التجاوز لكل طلب.

GET /api/v1/cloud-api/templates

اسرد القوالب المعتمَدة للحساب، مع مرشّحات اختيارية من جانب الخادم.

معاملات الاستعلام
المعاملالنوعالافتراضيالوصف
languagestring-التصفية حسب رمز اللغة الدقيق (مثل ar، en_US)
categorystring-AUTHENTICATION | MARKETING | UTILITY
statusstringAPPROVEDAPPROVED | PENDING | REJECTED | ALL
searchstring-مطابقة جزئية غير حساسة لحالة الأحرف على الاسم
limitinteger50حجم الصفحة (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 ثانية.

GET /api/v1/cloud-api/templates/:name

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

معاملات الاستعلام
المعاملالنوعمطلوبالوصف
languagestringنعمرمز اللغة — قد يوجد القالب نفسه بعدة لغات
الاستجابة
{
    "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": []
    }
}
POST /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"
    }
}

معالجة الأخطاء

رموز حالة HTTP
الرمزالوصف
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_OFFCloud API غير مُفعَّل على هذه الحاوية.
مثال على استجابة الخطأ
{
    "success": false,
    "message": "WhatsApp is not connected",
    "error": "Service unavailable"
}

حدود المعدل

طلبات الـ API محدودة المعدل لمنع إساءة الاستخدام:

نوع نقطة النهايةالحد
واجهة API عامة100 طلب كل 15 دقيقة
إرسال الرسائل30 رسالة في الدقيقة
الحد اليومي لمفتاح APIقابل للتهيئة لكل مفتاح (الافتراضي: 1000)
عند تجاوز حد المعدل، ستتلقى استجابة 429 Too Many Requests. انتظر قبل إعادة المحاولة.

Webhooks

نظرة عامة

تتيح 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

تُرسَل جميع طلبات Webhook بصيغة HTTP POST مع جسم JSON:

{
    "event": "message.received",
    "timestamp": "2026-02-27T10:00:00.000Z",
    "data": {
        // Event-specific data
    }
}
ترويسات الطلب
الترويسةالوصف
Content-Typeapplication/json
User-AgentWA-Connect-Webhook/1.0
X-Webhook-Eventنوع الحدث
X-Webhook-Timestampطابع زمني للحدث (ISO 8601)
X-Webhook-Signatureتوقيع HMAC-SHA256 (إذا كان السر مُهيَّأً)
X-Webhook-Signature-256sha256=SIGNATURE (بتنسيق على طراز GitHub)
التحقق من التوقيع

إذا هيّأت سرًّا لـ Webhook الخاص بك، يوقّع WA-Connect كل طلب باستخدام HMAC-SHA256. وينبغي لك التحقق من هذا التوقيع للتأكد من أصالة الطلب.

مثال على التحقق (Node.js)
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');
});
EVENT 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"
    }
}
EVENT 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"
    }
}
EVENT 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"
    }
}
EVENT connection.connected

يُطلَق عند اتصال جلسة واتساب.

الحمولة
{
    "event": "connection.connected",
    "timestamp": "2026-02-27T10:00:00.000Z",
    "data": {
        "status": "connected",
        "phone_number": "968XXXXXXXX",
        "wa_name": "Your Name"
    }
}
EVENT connection.disconnected

يُطلَق عند قطع جلسة واتساب.

الحمولة
{
    "event": "connection.disconnected",
    "timestamp": "2026-02-27T10:00:00.000Z",
    "data": {
        "status": "disconnected",
        "reason": "logout"
    }
}
EVENT 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 محاولة التسليم:

  • عدد محاولات إعادة المحاولة الافتراضي: 3 (قابل للتهيئة لكل Webhook)
  • مهلة إعادة المحاولة: 30 ثانية بين المحاولات
  • المهلة: 30 ثانية لكل طلب
ينبغي أن تستجيب نقطة نهايتك بـ HTTP 200 خلال 30 ثانية لتأكيد الاستلام.

جهات الاتصال

POST /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"
}
GET /api/v1/contacts

احصل على قائمة جهات الاتصال المتزامنة.

معاملات الاستعلام
المعاملالنوعالافتراضيالوصف
pageinteger1رقم الصفحة
limitinteger50عدد العناصر في الصفحة
searchstring-البحث بالاسم أو الهاتف
typestringallالتصفية: 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
        }
    }
}
GET /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"
    }
}
GET /api/v1/contacts/search

ابحث في جهات الاتصال بالاسم أو رقم الهاتف.

معاملات الاستعلام
المعاملالنوعالوصف
qstringاستعلام البحث (حرفان على الأقل)
الاستجابة
{
    "success": true,
    "data": {
        "contacts": [
            {
                "id": 1,
                "jid": "968XXXXXXXX@s.whatsapp.net",
                "phone": "968XXXXXXXX",
                "push_name": "John Doe"
            }
        ]
    }
}
GET /api/v1/contacts/export

صدّر جميع جهات الاتصال كملف CSV.

الاستجابة

يُرجِع تنزيل ملف CSV يتضمن الأعمدة: jid, phone, name, is_group, message_count, last_message_at

POST /api/v1/contacts/sync

ابدأ مزامنة يدوية لجهات الاتصال من واتساب. ملاحظة: تتم مزامنة جهات الاتصال تلقائيًا عند اتصال واتساب.

الاستجابة
{
    "success": true,
    "message": "Contacts are synced automatically when WhatsApp connects."
}
جهات اتصال المجموعات

تُخزَّن محادثات المجموعات أيضًا كجهات اتصال مع is_group: true. ويمكنك تصفيتها باستخدام المعامل type:

GET /api/v1/contacts?type=group