Skip to main content

إدارة الموافقة والإيصالات

قبل مراسلة أي جهة اتصال عبر قناة خاضعة للتنظيم، تحتاج عمومًا إلى أساس قانوني — وغالبًا ما يكون الموافقة. تُعد واجهة Consent API في Orbit السجل المرجعي لمن وافق أو رفض، وعلى أي قناة، ومتى، وبموجب أي أساس قانوني. كل عملية كتابة تتشر إلى الواجهات التي تُستخدم لتحديد السماح بالإرسال، وبالتالي فإن تسجيل الموافقة هنا هو ما يتيح (أو يمنع) الرسالة فعليًا. ويمكنك أيضًا تصدير المسار الكامل كملف CSV أو JSON جاهز للتدقيق. جميع نقاط النهاية أدناه متجذرة على https://api.orbit.devotel.io/api/v1/compliance.
تسجيل الموافقة في Orbit يُنشئ مسارًا قابلًا للتدقيق، لكنه وحده لا يجعل الإرسال قانونيًا. تظل مسؤولًا عن الحصول على موافقة صالحة وعن المحتوى الذي تُرسله. هذه الصفحة ليست استشارة قانونية.

القنوات والحالات

تُتتبع الموافقة لكل قناة على حدة. مجموعة القنوات المدعومة هي: email, fax, instagram, line, messenger, push, rcs, sms, viber, voice, whatsapp. كل زوج (contact, channel) يُحوّل إلى إحدى ثلاث حالات:

تسجيل الموافقة

POST /compliance/consent يسجّل موافقة أو رفضًا عبر قناة أو أكثر في استدعاء واحد. حدّد جهة الاتصال بـ contact_id أو بـ identifier (بريد إلكتروني أو هاتف بصيغة E.164 أو معرّف WhatsApp — وOrbit يحدد النوع تلقائيًا).
يُرجع 201 Created:
تقديم كليهما valid_until و expires_in_days أمر ملتبِس ويُرفَض بـ 422 VALIDATION_ERROR. عند تحديد نافذة، يُرجع الرد 201 قيمة valid_until المحسوبة (لحظة الانتهاء المطلقة)؛ وتكون null لمنح غير منتهية الصلاحية أو للرفض. إعادة تسجيل الموافقة بنافذة جديدة تمدّد الصلاحية — يبقى granted_at الأصلي محفوظًا، لكن تُحدَّث نهاية الصلاحية. ماذا يفعل الكتابة. كل قناة مسجّلة تحدّث أربع وُجوه متزامنة: جدول التدقيق consent_records، مرآة channel_preferences لجهة الاتصال (المسار السريع للقراءة الذي تتحقق منه إرسالاتك)، suppression_list (عند الرفض)، وسياج STOP قصير العمر في Redis بحيث تلتزم دُفعات الحملة الجارية بالتغيير خلال ~10 دقائق.
الكتابات آمنة جزئيًا: إن فشلت قناة واحدة، تبقى القنوات الأخرى سارية. قارن consent_record_ids.length بعدد القنوات التي طلبتها لاكتشاف كتابة جزئية. إعادة تسجيل الموافقة لقناة موافق عليها أصلًا تحدّث البيانات الوصفية/الإثبات لكن تحافظ على granted_at الأصلي.

الاستعلام عن الموافقة

GET /compliance/consent/lookup يُرجع الحالة الحالية لزوج (contact, channel) واحد — استخدمه كبوابة قبل الإرسال.
حالة unknown تعني عدم وجود سجل للزوج — ويقرر تطبيقك ما إذا كان ذلك يعني وجود موافقة (بعض التدفقات التعاملية) أو منع الإرسال (معظم التدفقات التسويقية). الحقول الثلاثة الأخيرة تُبلغ عن الموافقة المقيدة زمنيًا وهي دائمًا حاضرة:

العثور على الموافقات المنتهية

GET /compliance/consent/expiring يمسح المستأجر بحثًا عن الموافقات التي انتهت نافذة صلاحيتها أو على وشك الانتهاء — وهو المدخل لحملة إعادة الإذن (إعادة التأكيد). تُرجع فقط المنح التي تحمل valid_until؛ الموافقة غير المنتهية لا تظهر أبدًا.
معاملات الاستعلام:
العناصر مُرتَّبة من الأقدم انتهاءً أولًا. كل عنصر يحمل status (expired أو expiring) لتفصل “يجب إعادة التأكيد الآن” عن “تحذير قبل إغلاق النافذة”. إعادة التأكيد هي موافقة عادية عبر POST /compliance/consent — اختياريًا مع valid_until أو expires_in_days جديدة.
عامِل next_cursor كمُعْتَم ومرِّره حرفيًا؛ القيمة null تعني الصفحة الأخيرة. المؤشر غير الصالح أو المنتهي يُعامَل كصفحة أولى جديدة لا كخطأ.

مصافحات الموافقة المؤكدة (الاشتراك المزدوج)

تؤكّد POST /compliance/consent العادية المنح — فهي السجل المرجعي بمجرد حصول سطحك الخاص على الموافقة. عندما تتطلب طبقة الدليل ردًا مسجّلًا من المستلِم (الموافقة الكتابية الصريحة وفق TCPA، أو الاشتراك المؤكد في الاتحاد الأوروبي، أو مراجعة حملة 10DLC)، وجّه مصافحة الاشتراك المزدوج المُدارة بدلًا من ذلك:
  1. POST /compliance/consent/double-opt-inالبدء: يسجّل صفًا معلّقًا (ليس منحة موافقة بعد) ويُرجع نص موجه التأكيد للزوج.
  2. يردّ المستلِم؛ فمرِّر النص إلى POST /compliance/consent/double-opt-in/confirmالتأكيد: كلمة مفتاحية إيجابية مقابل الموجه المعلّق تحوّل الزوج إلى منحة opted_in مؤكدة.
  3. GET /compliance/consent/double-opt-in/statusالقراءة: الحالة الحالية (opted_in | opted_out | pending | none) مع علمَي confirmed / awaiting_reply، دون آثار جانبية.
المصافحات المؤكدة تدخل في نفس سجل الموافقة الذي توثّقه هذه الصفحة — ويقرؤها /lookup و /history والتصدير بالطريقة ذاتها. حتى تؤكَّد، فإن المصافحة المعلّقة ليست منحة موافقة. ملكية المستأجر: لا شيء يبدأ مصافحة نيابة عن المنصة. الآليات الكاملة في مصافحات الموافقة المؤكدة (الاشتراك المزدوج).

سجل الموافقة

GET /compliance/consent/history يُرجع مسار التدقيق الكامل المُصفَّح لجهة اتصال — كل منحة وسحب، الأحدث أولًا. معاملات الاستعلام: contact_id أو identifier (أحدهما إلزامي)، معامل اختياري channel للتصفية، و limit (≤ 100، الافتراضي 50)، و cursor مُعْتَم.
عامِل next_cursor كمُعْتَم — مرِّره حرفيًا لجلب الصفحة التالية. المؤشر غير الصالح أو المنتهي يُعامَل كصفحة أولى جديدة لا كخطأ.

تصدير إثبات سجل الموافقة

GET /compliance/consent/export ينزّل مسار الموافقة على مستوى المستأجر كملف واحد — وهو الجواب على تدقيق TCPA، أو عبء الإثبات وفق GDPR المادة 7(1)، أو طلب الاكتشاف (“أظهر من وافق أو رفض، ومتى، وعلى أي قناة، ومن أي مصدر”). وهو النظير الجماعي لـ /lookup و /history.
معاملات الاستعلام: كل صف يحمل حدث موافقة واحدًا مُربَطًا بمعرّفات جهة الاتصال — record_id, contact_id, email, phone, whatsapp_id, channel, consent_state, granted, consent_type, source، إضافة إلى أعمدة عبء الإثبات وفق GDPR: lawful_basis, purpose, policy_template, consent_text_version, consent_proof_url, ip_address, valid_until، وطوابع المنح/السحب/التحديث الزمنية. تنزيلات CSV تصل باسم ملف مؤرخ (consent-proof-of-record-YYYY-MM-DD.csv) ولا تعبر ذاكرة تخزين مؤقتة للقراءة (Cache-Control: no-store). اطلب format=json فيُرجع الرد بدلًا من ذلك غلاف columns / items / count — نفس البيانات للمستهلكين البرمجيين. الوصول مقيّد بمفاتيح owner و admin — فالحمولة تكشف معرّفات المستلِمين الخام على مستوى المستأجر، وهي نفس طبقة الثقة كاستيراد قائمة المنع. وكل تشغيل تصدير يُكتب هو نفسه في سجل التدقيق مع مرشحاته وعدد صفوفه.
عندما يتجاوز سجلّك 50,000 صف يُقتطع التصدير عند الحد: تحمل استجابات CSV ترويسة X-Export-Truncated: true، ويضبط غلاف JSON truncated: true. ضيّق البحث بالقناة أو الحالة، أو صفّح بتصدير نوافذ تاريخ متتالية بـ from/to.

قانون الهند لحماية البيانات الشخصية الرقمية (DPDP) يقدّم مفهوم مدير الموافقة (Consent Manager) — وسيط مسؤول ومسجّل ينتج إيصالات موافقة موقّعة تشفيريًا نيابة عن صاحب البيانات. يمكن لـ Orbit تسجيل المدراء الذين يمرّ عبرهم المستخدمون والتحقق من الإيصالات التي يصدرونها.

تسجيل مدير موافقة

POST /compliance/consent/managers (admin/owner) يسجّل مديرًا ويخزّن مفتاحه العام (ECDSA P-256 SPKI PEM) المستخدم في التحقق من كل إيصال يوقّعه.
  • GET /compliance/consent/managers يسرد المدراء المسجّلين (النشطون أولًا).
  • PUT /compliance/consent/managers/{id} يحدّث واحدًا أو يعطّله (تحديث جزئي؛ جميع الحقول اختيارية).

تخزين إيصال موقّع

POST /compliance/consent/receipts يتحقق من إيصال موقّع من مدير ويستمرّ بتخزينه كموافقة. يُفحَص التوقيع (ECDSA P-256 / SHA-256, IEEE-P1363, base64url) مقابل المفتاح العام للمدير المسجّل على ترميز JSON قانوني مستوحى من JCS بمفاتيح مرتبة للحمولة قبل تخزين أي شيء. هذا الترميز القانوني يرتّب مفاتيح الكائنات تصاعديًا بحسب وحدة تشفير UTF-16 ويُسقط المسافات غير الدالة، لكنه ليس تطبيقًا كاملًا لـ RFC 8785 — وتحديدًا لا يطبّق قواعد تسلسل الأرقام المفروضة في JCS. وقِّع الإيصالات بصيغة المفاتيح المرتبة نفسها التي يستخدمها Orbit بدلًا من افتراض أن متحققًا مطابقًا للمواصفة RFC 8785 سينتج بصمة مطابقة.
يُرجع 201 مع { "id": …, "receipt_id": …, "verified": true }. التوقيع السيئ، أو المدير غير المسجّل/غير النشط، يُرجع 422 CONSENT_RECEIPT_INVALID — وتشير التفاصيل إلى أن الحمولة ربما تعرّضت للعبث أو أن المدير ربما بدّل مفاتيحه.

إعادة التحقق من إيصال مخزّن

POST /compliance/consent/receipts/{id}/verify يعيد فحص إيصال مخزّن سابقًا مقابل مفتاح المدير الحالي — استخدمه أثناء التدقيق لتأكيد أن الإيصال ما زال صالحًا وما إذا كان مديره ما زال نشطًا. يقبل {id} معرّف سجل الموافقة أو receipt_id.
تتطلب إيصالات الموافقة ترحيل consent_managers للمستأجر. على المستأجرين السابقين له، تتدهور مسارات القراءة بشكل متدرج: يُرجع سرد المدراء قائمة فارغة ويُرجع نقطة إعادة التحقق 404. إصدار الإيصال fail-closed، لذا تُرجع POST /compliance/consent/receipts الخطأ 422 CONSENT_RECEIPT_INVALID على المستأجرين السابقين للترحيل بدلًا من التدهور — نفّذ الترحيل قبل إصدار الإيصالات.

مراجع ذات صلة