إدارة الموافقة والإيصالات
قبل مراسلة أي جهة اتصال عبر قناة خاضعة للتنظيم، تحتاج عمومًا إلى أساس قانوني — وغالبًا ما يكون الموافقة. تُعد واجهة Consent API في Orbit السجل المرجعي لمن وافق أو رفض، وعلى أي قناة، ومتى، وبموجب أي أساس قانوني. كل عملية كتابة تتشر إلى الواجهات التي تُستخدم لتحديد السماح بالإرسال، وبالتالي فإن تسجيل الموافقة هنا هو ما يتيح (أو يمنع) الرسالة فعليًا. ويمكنك أيضًا تصدير المسار الكامل كملف CSV أو JSON جاهز للتدقيق. جميع نقاط النهاية أدناه متجذرة علىhttps://api.orbit.devotel.io/api/v1/compliance.
القنوات والحالات
تُتتبع الموافقة لكل قناة على حدة. مجموعة القنوات المدعومة هي: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 جديدة.
مصافحات الموافقة المؤكدة (الاشتراك المزدوج)
تؤكّدPOST /compliance/consent العادية المنح — فهي السجل المرجعي
بمجرد حصول سطحك الخاص على الموافقة. عندما تتطلب طبقة الدليل
ردًا مسجّلًا من المستلِم (الموافقة الكتابية الصريحة وفق TCPA، أو
الاشتراك المؤكد في الاتحاد الأوروبي، أو مراجعة حملة 10DLC)، وجّه
مصافحة الاشتراك المزدوج المُدارة بدلًا من ذلك:
POST /compliance/consent/double-opt-in— البدء: يسجّل صفًا معلّقًا (ليس منحة موافقة بعد) ويُرجع نص موجه التأكيد للزوج.- يردّ المستلِم؛ فمرِّر النص إلى
POST /compliance/consent/double-opt-in/confirm— التأكيد: كلمة مفتاحية إيجابية مقابل الموجه المعلّق تحوّل الزوج إلى منحةopted_inمؤكدة. 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 مُعْتَم.
تصدير إثبات سجل الموافقة
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
على المستأجرين السابقين للترحيل بدلًا من التدهور — نفّذ الترحيل
قبل إصدار الإيصالات.مراجع ذات صلة
- تجميع وضعية GDPR من البداية إلى النهاية — التسلسل الذي تغذيه طبقة الموافقة هذه.
- مصافحات الموافقة المؤكدة (الاشتراك المزدوج) — تدفق البدء/التأكيد/الحالة فوق سجل الموافقة العادي.
- وضعية الموافقة: سياسات الموافقة غير المعروفة — مقابض مستوى المؤسسة التي تقرر ما قد تتلقاه جهات الاتصال التي لا تملك صفًا في السجل (إرسالات التسويق مقابل نشر CDP).
- قوائم الرفض والمنع — استيراد الرفضات بالجملة وكيف تُغلَق الإرسالات بواسطة قائمة المنع.
- DSAR — تلبية طلبات الوصول/الحذف على سجل الموافقة.
- التسجيل في DLT الهند — طبقة التسجيل التي تُقرن بموافقة DPDP على الرسائل القصيرة الهندية.
- مرجع API ← Compliance — مخططات الطلب/الاستجابة الكاملة (مُعاد توليدها من API الحي).