Skip to main content

إلغاء الاشتراك وقوائم الحظر

قائمة الحظر هي مجموعة العناوين التي يجب عدم مراسلتها مرة أخرى — الأشخاص الذين ردّوا بـ STOP، أو ألغوا الاشتراك، أو ارتدّت رسائلهم، أو اشتكوا. احترامها متطلب قانوني على كل قناة منظَّمة، ويتعامل Orbit معها كبوابة إرسال صارمة: يُسقَط العنوان المحظور قبل الإرسال بغض النظر عن الحملة أو استيراد جهات الاتصال أو استدعاء API. تغطي هذه الصفحة كيفية عمل الحظر، وكيفية الاستيراد الجماعي لقائمة حظر موجودة — على سبيل المثال عند الترحيل من منصة أخرى — عبر رفع ملف CSV واحد، وكيفية تصدير السجل للخارج لغرض التدقيق. جميع نقاط النهاية أدناه متجذّرة في https://api.orbit.devotel.io/api/v1/compliance.

كيف يحدث الحظر

ينتهي عنوانٌ ما في قائمة الحظر بعدّة طرق:
  • ردّ جهة اتصال بكلمة STOP المفتاحية على SMS/WhatsApp.
  • إلغاء اشتراك جهة اتصال عبر مركز التفضيلات.
  • تسجيل إلغاء اشتراك عبر Consent API (opt_in: false).
  • استيراد قائمة جماعياً (هذه الصفحة).
لكل إدخال نطاق قناة. مجموعة النطاقات الكاملة هي: all وsms وvoice وwhatsapp وemail وpush وtelegram وmessenger وrcs. يعتمد اختيار النطاق على نقطة الدخول:
  • الاستيراد الجماعي عبر CSV يستنتج النطاق من نوع العنوان في كل صف: عناوين الهاتف وWhatsApp تكون افتراضياً بنطاق all — إشارة STOP على رقم هاتف تحظر كل قناة يمكن الوصول إليها على ذلك الرقم — بينما عناوين البريد الإلكتروني تُنطِق بـ email. عمود channel يتجاوز هذا لكل صف (انظر استيراد CSV جماعي).
  • Consent API ومركز التفضيلات يحظران دائماً النطاق all، بغض النظر عما إذا كان المعرف المسجَّل رقم هاتف أو عنوان بريد إلكتروني. إلغاء الاشتراك عبر أي من هاتين نقطتي الدخول يزيل جهة الاتصال من كل قناة.
أياً كانت طريقة حظر رقم الهاتف، فإن بوابتي الصوت والمُتصل يحترمانه: الرقم الذي يلغي الاشتراك على أي قناة يتوقف عن استقبال المكالمات كما الرسائل. تختلف الآلية بحسب نقطة الدخول. الاستيراد الجماعي عبر CSV يُنعكِس بالإضافة إلى ذلك لصفوف الهاتف على قائمة DNC ويُعلِّم جهات الاتصال المطابقة. أما إلغاء الاشتراك عبر كلمة STOP المفتاحية أو مركز التفضيلات أو Consent API فيُسجَّل بالنطاق all، الذي تقرؤه بوابتا الصوت والمُتصل من قائمة الحظر مباشرة — لا تزال المكالمة محظورة، لكن لا يُكتب صف مستقل في قائمة DNC ولا علم على جهة الاتصال.

استيراد CSV جماعي

POST /compliance/suppression-list/import يقبل رفع multipart/form-data لملف CSV. يتطلب مفتاح admin أو owner وهو محدود بمعدل 5 طلبات/الدقيقة.

حقول النموذج

تنسيق CSV

الصف الأول هو ترويسة. أسماء الأعمدة غير حسّاسة لحالة الأحرف ومستقلّة عن الموضع، والأسماء المستعارة الشائعة مقبولة: يجب أن يحتوي كل صف على واحد على الأقل من phone / email / wa_id. قد يحمل الصف الواحد عدّة أنواع عناوين — وكل نوع ينتج إدخال حظر خاصًّا به. مثال:
إذا كان عمود channel موجوداً فإنه يتجاوز النطاق الافتراضي لذلك الصف ويجب أن يكون أحد قيم النطاق المذكورة أعلاه.

نتائج كل صف

يُبلِغ الرد عن النتائج لكل صف. الصفوف المقبولة تُكتَب؛ وأما الباقي فُتصنَّف، ولا تُسقَط بصمت أبداً.
يُبلَغ عدّادا التكرار منفصلين وعن قصد: intra_file_duplicates هي التكرارات داخل الملف الذي رفعته للتو، بينما duplicates كانت على قائمتك من قبل. لا يُعدّ أيّ منهما خطأً، ولا يُبتلَع أيّ منهما بصمت — كلاهما يُحسَب حتى يتطابق التسوية لديك.

أسباب التحقق

يحمل كل إدخال errors[] reason واضحاً وraw_line المصدر حتى تتمكن من التصحيح وإعادة الرفع:

الحدود

للأحجام التي تتجاوز 100,000 صف، قسِّم الملف واستورِد على دفعات — كشف التكرار يعني أن إعادة استيراد النطاقات المتداخلة آمنة.

عند فشل الاستيراد

شخِّص الأعطال على مستويين: رفض على مستوى HTTP (لا يُكتَب شيء) وتصنيفات على مستوى الصف (الملف مقبول لكن صفوفاً محدَّدة ليست كذلك). رفضات مستوى HTTP: تصنيفات مستوى الصف (إدخالات errors[] المصاحبة لاستيراد ناجح) تُرسَم إلى الأسباب كما يلي: تُعاد أول 100 إدخال errors[] فقط بالتفاصيل الكاملة — وعدّاد invalid يعكس دائماً الإجمالي الحقيقي. يحزِّم معالج لوحة التحكم (أدناه) الصفوف الظاهرة كملف skipped.csv قابل للتنزيل حتى تتمكن من تصحيح وإعادة استيراد الإخفاقات فقط.

الاستيراد من لوحة التحكم

نفس نقطة النهاية مغلَّفة بمعالج موجَّه عند Settings → Compliance → Opt-out lists → Import suppression list — نفس عقد CSV، ولا حاجة إلى طرفية.
  1. اختر ملف CSV — اختر .csv أقل من 25 ميغابايت. استخدِم Download sample CSV في الحوار للحصول على ملف بداية مُنسَّق مسبقاً.
  2. عيِّن الافتراضيات (اختياري)Default country (ISO alpha-2) لمعايرة الأرقام بالصيغة الوطنية، ونص حر Reason يُختَم على كل صف مقبول.
  3. معاينة — يُشغِّل الاستيراد كتشغيل تجريبي من جهة الخادم: لا يُكتَب شيء، ويعرض الحوار تفصيل المقبول / المُدرَج مسبقاً / التكرارات داخل الملف / غير الصالح قبل أن تُثبِّت.
  4. تأكيد الاستيراد — ينفِّذ الكتابة المُثبِّتة. إذا كانت أي صفوف غير صالحة، قم بتنزيل skipped.csv لتصحيحها وإعادة استيرادها.
يفرض المعالج أيضاً فحوصات نوع الملف و25 ميغابايت من جهة العميل، فيَفشُل التصدير الخطأ قبل أن يصل إلى API أصلاً.

تصدير قائمة الحظر

GET /compliance/suppression-list/export يُنزِّل سجل الحظر — المقابل المتماثل للاستيراد أعلاه. استخدِمه لإثبات للجهة التنظيمية أو المدقّق أيّ العناوين كانت محظورة عند نقطة معيّنة، بما في ذلك الأرقام المستورَدة جماعياً بدون جهة اتصال مطابقة.
معاملات الاستعلام: يحمل كل صف suppression_id وchannel وaddress وstatus المشتقة (active أو revoked) وreason وsource وcontact_id (فارغة للعناوين المستورَدة جماعياً بدون جهة اتصال) وnotes وطوابع suppressed_at / revoked_at / created_at الزمنية. الوصول مقيَّد بمفاتيح owner وadmin، وكل تشغيل تصدير يُكتَب في سجل التدقيق. عندما يتجاوز السجل 50,000 صف يحمل رد CSV ترويسة X-Export-Truncated: true (ومكافئ JSON يعيِّن truncated: true) — ضيِّق حسب القناة أو صدِّر نوافذ تاريخية متتالية لالتقاط الذِّيل.

التحقق من نفاذ الحظر

ثِق لكن تحقَّق: بعد الاستيراد (أو أي حدث إلغاء اشتراك)، أكِّد أن بوابة الإرسال تحصِّن العنوان فعلياً قبل تسليم القائمة إلى حملة.
  1. أرسِل رسالة اختبار إلى العنوان المحظور. الإرسال المباشر عبر API إلى مستلم محظور يَفشَل تزامنياً مع HTTP 422 ورمز الخطأ RECIPIENT_OPTED_OUT. في وضع sandbox لا تُلمَس أي شركة اتصالات ولا يُخصَم أي رصيد؛ وأي مستلم ينتهي بـ 8 يُحَال أيضاً إلى إيصال التسليم المحاكى blocked، وهي رؤية جانب شركة الاتصالات لنفس الحاجز.
    إرسال حملة إلى نفس العنوان يتصرّف بشكل مختلف تصميمياً: يُتخطَّى المستلم بصمت (status: "skipped"، reason: "opted_out") حتى تستمر الدفعة — افحص تقرير الحملة لكل مستلم بدلاً من توقُّع خطأ.
  2. أكِّد أن الإدخال موجود على السجل. صدِّر بـ الاستعلام أعلاه (status=active هو الافتراضي) وتحقّق من ظهور العنوان بنطاق channel المتوقَّع. التصدير هو مصدر الحقيقة الذي تقرأ منه كل بوابة إرسال — إذا كان الصف active هناك، فالحاجز قائم.
يجيب الفحصان عن سؤالين مختلفين: الخطوة 1 تُثبِت التنفيذ (انطلاق البوابة)، والخطوة 2 تُثبِت النطاق (وجود الإدخال بالقناة التي قصدتها).

إزالة الحظر (إعادة الاشتراك)

لإعادة عنوان ما، سجِّل اشتراكاً جديداً عبر Consent API (opt_in: true). هذا يلغي إدخال الحظر المطابق ويُزيل حاجز STOP. لا تُعِد مراسلة جهة اتصال محظورة سابقاً أبداً دون حدث موافقة جديد وموثَّق. تأكيد أن الحاجز قد أُزيل. صدِّر بـ status=revoked وابحَث عن العنوان: الصف ما يزال موجوداً للتدقيق بوضع status: revoked وطابع revoked_at زمني — سجل الحظر لا يُحذَف أبداً، بل يُلغَى فقط. ثم أرسِل رسالة اختبار صغيرة إلى العنوان كما في التحقق من نفاذ الحظر: نجاح الإرسال (بدون RECIPIENT_OPTED_OUT) يؤكِّد أن البوابة لم تعد تنطلِق على السجل الملغَى. وحتى يجتاز الفحصان، عامِل العنوان كأنه ما يزال محميًّا.

مراجع ذات صلة