Skip to main content
تُرحّب قائمة الرد الصوتي (IVR) بالمتّصل، وتقرأ عليه بعض الخيارات، ثم توجّهه حسب الزرّ الذي يضغطه — “اضغط 1 للمبيعات، اضغط 2 للدعم.” تُنشئ القائمة مرّة واحدة عبر هذه الواجهة (أو لوحة التحكّم)، وتربطها بأحد أرقام Wave لديك، فتُقدّمها Wave مباشرةً لكلّ متّصل — دون إعادة نشر. خلف الكواليس تُترجَم القائمة إلى أمر WaveML وهو <Gather> يُشغّل التحية ويجمع ضغطة زرّ واحدة، ثم يُنفّذ الفرع الخاصّ بذلك الرقم. هذه الواجهة هي طبقة التأليف فوق WaveML — تصف القائمة بصيغة JSON وتحوّلها Wave إلى مسار مكالمة.
هذه هي القائمة أحادية المستوى — تحية واحدة ومجموعة خيارات واحدة، ينهي كلٌّ منها المكالمة أو يحوّلها. القوائم الفرعية المتداخلة وأداة البناء المرئية ميزات منفصلة لاحقة. للتفريعات الكاملة اليوم، أعِد WaveML من نقطة النهاية الخاصّة بك بدلاً من ذلك.

المصادقة والطبقات

تتطلّب جميع نقاط /v1/callflows مفتاح واجهة بنطاق callflows:read أو callflows:write، أو جلسة لوحة تحكّم. يمكنك التأليف والاختبار بمفتاح sandbox (sk_sandbox_)، أمّا تقديم قائمة إلى مكالمة واردة حقيقية فيتطلّب مفتاح production (sk_live_) ومؤسسة بطبقة production ورقمًا مربوطًا (راجع ربط رقم أدناه).

تعريف القائمة

القائمة عبارة عن definition بصيغة JSON: تحية، وفروع لوحة المفاتيح، واحتياطيّ اختياريّ عند عدم ضغط المتّصل أيّ زرّ.

التحية والإجراءات

التحية وكلّ إجراء فرع هو أحد هذه الأنواع. إجراء الفرع طرفيّ — ينهي المكالمة أو يحوّلها.
أهداف dial مقيّدة بأرقام سعوديّة (KSA) — حماية من الاحتيال، لأنّ <Dial> يجسر المتّصل إلى مسار جديد.

مُدخل الفرع (حمولة webhook خاصّتك)

امنح الفرع كائن input، فتدمجه Wave في webhook باسم call.input حين يختار المتّصل ذلك الخيار — نقطة ربط تكاملك لمعرفة ما اختاره المتّصل.
  • حتّى 20 حقلًا؛ القيم نصّ (≤512) أو عدد أو قيمة منطقيّة.
  • المفتاحان call_id وdigits محجوزان (تضبطهما Wave) ويُرفضان.

إنشاء قائمة

POST /v1/callflows — أنشئ قائمة بالاسم. مرّر "activate": true لجعلها مباشرة فورًا.
يُعيد 201 Created القائمة، متضمّنةً سجلّ إصداراتها:
الاسم المكرّر يُعيد 409 — استخدم PUT لإضافة إصدار بدلاً من ذلك.

سرد القوائم وجلبها

يسرد GET /v1/callflows صفًّا واحدًا لكلّ قائمة (إصدارها النشط أو الأحدث):
يُعيد GET /v1/callflows/{name} القائمة كاملةً — definition الإصدار النشط (أو الأحدث) مع سجلّ versions الكامل. 404 إن لم تكن القائمة موجودة.

الإصدارات والاسترجاع

القوائم غير قابلة للتغيير وتُضاف فقط. التعديل لا يغيّر إصدارًا في مكانه أبدًا — بل يُضيف إصدارًا جديدًا.
  • PUT /v1/callflows/{name} بتعريف definition جديد (وactivate اختياريّ) يُضيف الإصدار التالي. 404 إن لم تكن القائمة موجودة.
  • POST /v1/callflows/{name}/activate بـ { "version": N } يجعل الإصدار N مباشرًا — الاسترجاع هو ببساطة تفعيل إصدار أقدم. 404 إن لم يكن ذلك الإصدار موجودًا.
يُعيد كلاهما كائن القائمة بالإصدار المُفعَّل حديثًا.

ربط رقم

POST /v1/callflows/{name}/bind-number يوجّه أحد أرقام Wave لديك إلى الإصدار النشط للقائمة — عندها تُنفّذ المكالمات الواردة إلى ذلك الرقم القائمة.
cURL
يُعيد { "bound": true }. الأرقام تُوفّرها Wave — راجع الأرقام الافتراضيّة.

إيقاف قائمة

DELETE /v1/callflows/{name} يوقف القائمة إيقافًا ناعمًا: تتوقّف عن خدمة المتّصلين ويُلغى ربط أيّ رقم، لكن يُحفَظ سجلّ الإصدارات (يمكنك إعادة إنشائها لاحقًا). يُعيد { "retired": true }؛ و404 إن لم تكن القائمة موجودة.

webhook باسم call.input

حين يضغط المتّصل رقمًا، تُرسل Wave webhook باسم call.input. تحمل data الأرقام المضغوطة digits إضافةً إلى كائن input لذلك الفرع — فيعرف نظامك الخلفيّ بالضبط ما اختاره المتّصل:
سجّل نقطة نهاية وتحقّق من التوقيع كما هو موضّح في Webhooks.

المقاطع الصوتيّة

تُشغّل تحية أو إجراء play ملفًّا مسجّلًا بدلاً من TTS — مناسب لتحية مُنتَجة، ويتجاوز تأخّر التركيب الصوتيّ. ارفع الملفّ أوّلًا، ثم أشِر إلى audio_ref المُعاد. POST /v1/callflows/audio يأخذ ملفّ WAV مُرمَّزًا بـ base64 (يُوصى بـ 8 kHz أحاديّ 16-bit PCM — جودة الهاتف) ويُعيد audio_ref مُستضافًا لدى Wave:
cURL
استخدم audio_ref في play:
رفع الملفّات الصوتيّة قيد الإطلاق. حتّى تفعيله لحسابك، يُعيد الرفع 503 وتستخدم القوائم تحيات say (TTS). يجب أن يكون audio_ref ملفًّا رفعته أنت — تُرفض الروابط العشوائيّة.

الخطوات التالية

  • WaveML — الأوامر التي تُترجَم إليها القائمة، والمسارات المخصّصة الكاملة.
  • Webhooks — استقبال call.input والتحقّق منه.
  • الطوابير — حيث يُرسل فرع enqueue المتّصل.