أرسل رسالتك الأولى في خمس دقائق.
تعمل واجهة REST API على الأرقام التي ربطتها في صندوق الرسائل. اعرضها، وابحث عن محادثة، وأرسل، وتابع كل حالة عبر خطافات ويب موقّعة.
- عنوان URL الأساسي
- https://api.wrelay.site/v1
- المصادقة
- Bearer rl_live_…
- الأخطاء
- application/problem+json
- المواصفة
- OpenAPI 3.1
البدء السريع
خمس خطوات من مفتاح API إلى رسالة مُسلَّمة. اختر لغة البرمجة مرة واحدة فتتبعها كل الأمثلة.
أنشئ مفتاح API
في لوحة التحكم، افتح الإعدادات › المطوّرون › مفاتيح API وأنشئ مفتاحًا. يعمل المفتاح باسم المؤسسة كلها ولا يُعرض إلا مرة واحدة: لا نحتفظ إلا ببصمته.
الصلاحيات لا تتراكم. يحتاج هذا البدء السريع إلى
readوsend، ويحتاج تسجيل نقطة نهاية لخطاف ويب عبر API إلىadmin.Authorization: Bearer rl_live_…# Settings › Developers › API keys › Create keyexport RELAY_API_KEY="rl_live_…"بمفتاح مفقود أو ملغى أو منتهي الصلاحية401{"type": "urn:relay:problem:unauthorized","title": "Authentication required","status": 401,"code": "unauthorized","detail": "Send a valid API key as `Authorization: Bearer rl_live_…`."}اعرض أرقامك
يُرجع
GET /v1/numbersأرقام المؤسسة من الأقدم إلى الأحدث. احتفظ بالمعرّفidلرقم حالتهstatusهيworking: تدلّcan_sendعلى أنه جاهز.القوائم مقسّمة إلى صفحات عبر
limitوcursor: أعد إرسالnext_cursorحتى تصبح قيمتهnull.GET/v1/numberscurl "https://api.wrelay.site/v1/numbers?status=working" \-H "Authorization: Bearer $RELAY_API_KEY"الاستجابة200{"data": [{"id": "num_01a1a1c6c2007a3f9c41e2b7d5a60813","label": "Sales","phone": "+212600000001","display_name": "Atelier Exemple","avatar_url": null,"status": "working","status_reason": null,"status_changed_at": "2026-11-10T08:02:11.000Z","first_connected_at": "2026-11-03T14:20:05.000Z","connected_at": "2026-11-10T08:02:11.000Z","last_event_at": "2026-11-12T09:11:57.000Z","can_send": true,"daily_send_cap": 400,"history_import": {"status": "completed","started_at": "2026-11-03T14:20:09.000Z","finished_at": "2026-11-03T14:31:52.000Z","chats_total": 214,"chats_done": 214,"messages": 18342,"error_code": null},"created_at": "2026-11-03T14:18:40.000Z"}],"has_more": false,"next_cursor": null}ابحث عن محادثة أو ابدأ واحدة
ابحث في محادثات رقم واحد بالاسم أو بأرقام الهاتف، واحتفظ بمعرّف المحادثة
id.لا توجد محادثة بعد؟ تخطَّ هذه الخطوة وأرسل باستخدام
number_idوtoبدلًا منchat_id: تُفتح المحادثة مع أول رسالة.GET/v1/chatscurl "https://api.wrelay.site/v1/chats?number_id=num_01a1a1c6c2007a3f9c41e2b7d5a60813&search=Maison" \-H "Authorization: Bearer $RELAY_API_KEY"الاستجابة200{"data": [{"id": "chat_01a1a1d0f4a87c128e5d4b9a2f61c37e","number_id": "num_01a1a1c6c2007a3f9c41e2b7d5a60813","type": "dm","jid": "212612345678@s.whatsapp.net","phone": "+212612345678","name": "Maison Exemple","description": null,"avatar_url": null,"unread_count": 1,"last_message_at": "2026-11-12T09:10:03.000Z","archived": false,"pinned": false,"pinned_at": null,"muted": false,"muted_until": null,"left_at": null,"only_admins_send": false,"only_admins_edit": false,"group_created_at": null,"created_at": "2026-11-03T14:24:17.000Z"}],"has_more": false,"next_cursor": null}أرسل رسالة
يسجّل
POST /v1/messagesالرسالة بالحالةpendingويضعها في قائمة الانتظار. تغادر إلى واتساب خلال ثوانٍ، بفاصل بضع ثوانٍ لكل رقم.أعد محاولة أي طلب فشل أو انتهت مهلته بالمفتاح
Idempotency-Keyنفسه والمحتوى نفسه: تحصل على الرسالة نفسها بحالتها الحالية، ولا تُرسَل مرتين أبدًا.POST/v1/messagescurl https://api.wrelay.site/v1/messages \-H "Authorization: Bearer $RELAY_API_KEY" \-H "Idempotency-Key: $(uuidgen)" \-H "Content-Type: application/json" \-d '{"chat_id": "chat_01a1a1d0f4a87c128e5d4b9a2f61c37e", "type": "text","text": "Friday works, your order is updated."}'الاستجابة202{"id": "msg_01a1cf07d7407d84b2a619f3c8e05d47","status": "pending","chat_id": "chat_01a1a1d0f4a87c128e5d4b9a2f61c37e"}استقبل خطافات الويب
أضف نقطة نهاية للحدثين
message.receivedوmessage.status، من لوحة التحكم أو بمفتاح يملك صلاحيةadmin. تتضمّن الاستجابة سرّ التوقيع مرة واحدة فقط.بعد ذلك يصل كل حدث كطلب POST موقّع. أجب بأي رمز 2xx خلال 10 ثوانٍ، وتحقّق من التوقيع قبل الوثوق بالمحتوى.
POST/v1/webhooks/endpointscurl https://api.wrelay.site/v1/webhooks/endpoints \-H "Authorization: Bearer $RELAY_ADMIN_KEY" \-H "Idempotency-Key: $(uuidgen)" \-H "Content-Type: application/json" \-d '{"url": "https://example.com/hooks/relay","events": ["message.received", "message.status"]}'الاستجابة201{"id": "whk_01a1c5e0a9407e8db0c27f4a19d3e65b","url": "https://example.com/hooks/relay","description": null,"events": ["message.received","message.status"],"number_ids": [],"enabled": true,"disabled_at": null,"disabled_reason": null,"consecutive_failures": 0,"last_delivery_at": null,"last_success_at": null,"created_at": "2026-11-12T09:05:31.000Z","secret": "whsec_…"}على نقطة النهاية لديكPOST /hooks/relayContent-Type: application/jsonUser-Agent: relay-webhooks/1X-Relay-Event: message.statusX-Relay-Delivery: dlv_01a1cf07f1a27b6e9d20c3a85e17f4b9X-Relay-Timestamp: 1794474764X-Relay-Signature: v1=…{"id": "evt_01a1cf07f1a27b6e9d20c3a85e17f4b9","event": "message.status","created_at": "2026-11-12T09:12:44.120Z","data": {"id": "msg_01a1cf07d7407d84b2a619f3c8e05d47","number_id": "num_01a1a1c6c2007a3f9c41e2b7d5a60813","chat_id": "chat_01a1a1d0f4a87c128e5d4b9a2f61c37e","wa_message_id": "3EB0A7C2F51D9E84B6C3","from_me": true,"client_key": "3f1c9a52-7d43-4bb8-9a3e-1e2f5c6d7a80","status": "delivered","error_code": null,"sent_at": "2026-11-12T09:12:41.000Z"}}
كيف تعمل واجهة API
القواعد المشتركة بين كل نقاط النهاية. يوثّق المرجع كل نقطة نهاية بالتفصيل.
المعرّفات العامة
يتكوّن كل معرّف من بادئة تدلّ على المورد و32 حرفًا ست عشريًا. المعرّف التابع لمؤسسة أخرى أو المشوّه أو ذو البادئة الخاطئة يُرجع 404 <resource>_not_found، وليس خطأً مختلفًا.
num_رقمchat_محادثة أو مجموعةmsg_رسالةct_جهة اتصالupl_ملف مرفوعmedia_مرفق مُستلَمwhk_نقطة نهاية خطاف ويبdlv_تسليم خطاف ويبevt_حدث خطاف ويبop_عملية
الصلاحيات
يحمل كل مفتاح صلاحية واحدة أو أكثر. أي طلب خارجها يُرجع 403 insufficient_scope، ويقبل GET /v1/operations/{id} أي مفتاح.
readكل طلبات GET: الأرقام والمحادثات والرسائل والمجموعات وجهات الاتصال وتنزيل الوسائط.sendالإرسال والتفاعلات والتعديل والحذف، وحالة المحادثات (الأرشفة والتثبيت والكتم والقراءة)، والمجموعات، ورفع الملفات، والتحقق من الأرقام.adminربط الأرقام واقترانها وتسجيل خروجها وحذفها، ونقاط نهاية خطافات الويب وسجل التسليم.الصلاحيات لا تتراكم: امنح المفتاح كل صلاحية يحتاجها.
منع التكرار
يحتاج كل طلب POST وPATCH وDELETE إلى الترويسة Idempotency-Key: من 1 إلى 150 حرف ASCII مرئي، ويُفضَّل UUID.
- المفتاح نفسه والمحتوى نفسه خلال 24 ساعة: تعود الاستجابة الأصلية مع
Idempotent-Replayed: true، ولا يحدث شيء مرتين. - المفتاح نفسه لطلب مختلف:
422 idempotency_key_reused. الطلب الأول ما زال قيد التنفيذ:409 idempotency_key_in_use. - لا تُحفظ إلا الاستجابات الناجحة: بعد أي خطأ، يُعيد المفتاح نفسه تنفيذ الطلب.
- في الإرسال، المفتاح هو أيضًا
client_keyللرسالة: إعادة محاولةPOST /v1/messages، حتى بعد 24 ساعة، تُرجع الرسالة نفسها بحالتها الحالية. - استثناء واحد: لا يأخذ
POST /v1/numbers/{id}/pairing-codeأي مفتاح، لأن رمزه لا يُخزَّن أبدًا.
حدود المعدّل
لكل مفتاح سقف للدفعات وحصة في الدقيقة، ولكل رقم ولكل مؤسسة حدودهما الخاصة فوق ذلك.
rate_limitedrate_limitedrate_limitedquota_exceededquota_exceededsend_cap_reachedrecipient_never_wroteتحمل كل استجابة موثّقة الترويسات RateLimit-Limit وRateLimit-Remaining وRateLimit-Reset (بالثواني) لأضيق نافذة، وRateLimit-Policy لكل النوافذ. وتضيف الاستجابة 429 الترويسة Retry-After.
الأخطاء
كل استجابة خارج 2xx هي مشكلة وفق RFC 9457 بصيغة application/problem+json. اعتمد على code: لا تُعاد تسمية الرموز ولا تُحذف أبدًا، وقد تُضاف رموز جديدة. يسرد errors الحقول المطلوب تصحيحها.
idempotency_key_requiredأضف الترويسة Idempotency-Key إلى طلب الكتابة.unauthorizedتحقّق من المفتاح: المفتاح المجهول والملغى والمنتهي يُرجع هذا الرمز نفسه.insufficient_scopeاستخدم مفتاحًا يملك صلاحية نقطة النهاية.chat_not_foundالمعرّف لا ينتمي إلى هذه المؤسسة، أو بادئته خاطئة.number_not_workingالرقم غير متصل: انتظر حتى تصبح قيمة number.status هي working.validation_failedصحّح الحقول المذكورة في errors.rate_limitedانتظر عدد الثواني في Retry-After ثم أعد المحاولة.gateway_<reason>لم يُجب واتساب عن طلب فوري: أعد المحاولة بعد قليل.enqueue_failedحُفظ الطلب ولم يدخل قائمة الانتظار: أعد المحاولة بالمفتاح Idempotency-Key نفسه.العمليات الطويلة
الطلبات التي تنتظر واتساب (ربط رقم أو حذفه، وأوامر المجموعات، والتحقق من الأرقام) تُجيب بالرمز 202 مع operation_id وترويسة Location.
- استعلم عن
GET /v1/operations/{id}كل ثانية إلى ثانيتين حتى تصبحstatusبالقيمةsucceeded(اقرأresult) أوfailed(اقرأerror.code)، ثم أعد قراءة المورد. - العملية التي لا تنتهي خلال ساعة تصبح
failedبالرمزexpired.
إرسال الملفات
لا تمرّ الملفات عبر واجهة API أبدًا: تُرفع مباشرة إلى التخزين، ثم تشير الرسالة إليها.
الصور والصوت حتى 16 ميغابايت، والفيديو حتى 64 ميغابايت، والمستندات حتى 100 ميغابايت. يُنزَّل المرفق المُستلَم عبر GET /v1/media/{id} الذي يُرجع رابطًا موقّعًا صالحًا لمدة 5 دقائق.
POST /v1/media/uploadsمعmime_typeوsize_bytes: تحصل على معرّفupl_ورابطupload.urlموقّع مسبقًا.- أرسل البايتات الخام بطلب
PUTإلىupload.urlمعupload.headersكما هي تمامًا ودون ترويسة Authorization، خلال 15 دقيقة. POST /v1/media/uploads/{id}/finalize: تصبح حالة الملفready.POST /v1/messagesمعtypeوupload_idوتعليق اختياري فيtext، خلال 24 ساعة.
كل نقاط النهاية في المرجع.
يُولَّد المرجع المستضاف وملف OpenAPI 3.1 من المخططات نفسها التي تتحقق من طلباتك، فلا يمكن أن يختلفا عمّا تقبله الواجهة.