الانتقال إلى المحتوى الرئيسي
POST
cURL
استخدم نقطة النهاية هذه لإنشاء سير عمل عبر API دون بناء عُقد مخطط سير العمل بنفسك. أرسل مصفوفة features بالترتيب الذي يجب أن يُنفّذ به المستخدمون الفحوصات. يحوّلها Didit داخليًا إلى سير عمل قائم على العُقد، ويضيف خطوة الحالة النهائية تلقائيًا. تُنشئ نقطة النهاية POST /v3/workflows/ هذه سير عمل بسيطًا وخطيًا فقط، أي قائمة features مسطّحة. أما التفرّع والتوجيه الشرطي وDocument AI وعُقد الرفض والقرار، فاستخدم تنسيق المخطط البياني للعقد الموثّق أدناه، فهو يشغّل المُنشئ المرئي في الكونسول وأدوات سير العمل في Didit MCP. راجع إعدادات ميزات سير العمل لكل حقل config تقبله كل ميزة.

سير عمل KYC الأساسي

سير عمل الاستبيان

أنشئ أولاً الاستبيان باستخدام POST /v3/questionnaires/. ثم استخدم questionnaire_id المُعاد كقيمة لـ questionnaire_uuid.
ترتيب الميزات مهم. على سبيل المثال، ضع OCR قبل FACE_MATCH أو NFC أو DATABASE_VALIDATION أو فحوصات AML للمستخدم التي تعتمد على بيانات المستند.

مرجع إعدادات الميزات

يتّبع كل عنصر في features[] هذا الشكل:
يعتمد كائن config الدقيق على الميزة. راجع قائمة الحقول الكاملة والقيم الافتراضية والإعدادات المطلوبة ونطاقات القيم والأمثلة في إعدادات ميزات سير العمل. بالنسبة إلى OCR، احذف config.documents_allowed، أو أرسل null، أو أرسل {} للسماح بكل أنواع المستندات المدعومة. أدرجه فقط عندما تريد قصر سير العمل على دول أو أنواع مستندات محددة. أما بالنسبة إلى QUESTIONNAIRE، فإن config.questionnaire_uuid مطلوب.

إعدادات سير العمل الاختيارية

يمكنك إدراج أي من هذه الحقول على المستوى الأعلى عند إنشاء سير عمل للتحكم في سلوك الجلسة. كلها اختيارية، وتعود إلى القيم الافتراضية لسير العمل عند عدم إدراجها.

سير عمل قائم على الفروع والعُقد (مخطط)

لا تستطيع قائمة features الخطية التعبير عن “إذا حدث X فافعل Y”. للتفرّع الشرطي (الرفض بناءً على الحالة، أو التوجيه بناءً على حقل مستخرج، أو جعل خطوة مشروطة بنتيجة مطابقة)، أو لخطوة طلب Document AI، أو لعُقد الرفض/القرار النهائية، تستخدم سير عمل Didit مخططاً من العُقد، وهو البنية نفسها التي ينتجها المنشئ المرئي في وحدة التحكم.
أبسط طريقة لبناء سير عمل بمخطط هي Didit MCP. اطلب من وكيل بلغة عادية (مثلاً: “بعد التحقق من الهوية، إذا كانت المهنة ≈ ‘Software Engineer’، فأضف خطوة إثبات الأموال”)، وسيُنشئ المخطط ويتحقق منه ويحفظه لك. البنية أدناه هي ما تنتجه هذه الأدوات (وكذلك وحدة التحكم).

بنية المخطط

المخطط كائن بالشكل { start_node, nodes }. وحقل nodes خريطة من معرّف العقدة إلى العقدة. الروابط ضمنية: كل عقدة تشير إلى ما بعدها عبر next (بلا شرط) و/أو branches[].goto (بشرط). يجب أن تكون start_node عقدة من نوع feature. تُقيَّم الفروع بالترتيب، وأول تطابق يفوز. والفرع الذي يحتوي على rules: [] فارغة هو الفرع الاحتياطي “else” الذي يشمل كل ما عداه، ويجب أن يأتي في الآخر. تقرّر القيمة session_status: "Determine" النتيجة تلقائياً من مجموع نتائج الميزات.
يجب أن تحتوي كل عقدة فرع على فرع else صريح، أي فرع بـ rules: [] يوجّه الجلسات التي لا تطابق أيّاً من الشروط. لا تعتمد على next الخاصة بعقدة الفرع كبديل احتياطي: فحقل next المفرد يظهر كحافة غامضة في المنشئ المرئي، ويسهل نسيانه. عندما ترسل عقدة فرع تحمل next دون فرع else، يحوّل الـ API هذا الـ next إلى فرع else صريح نيابةً عنك (فالمدخل { …, "branches": [<conditions>], "next": "liveness" } يُحفظ بالشكل branches: [<conditions>, { "id": "else", "rules": [], "goto": "liveness" }]). أنشئ فرع else بنفسك لتكون واضحاً؛ فهذا التحويل شبكة أمان وليس بديلاً عن ذلك.

قواعد الفروع والمعاملات

تقارن كل قاعدة حقلاً بـ قيمة باستخدام معامل:
  • الحقول تسمّي نتيجة ميزة (kyc.status، aml.status، document_ai.status، face_match.score، …) أو قيمة مستخرجة (kyc.full_name، kyc.age، kyc.nationality، kyc.extra_fields.profession، أو حقل Document AI document_ai.<key>، أو expected_details.*). ولا يجوز لفرع أن يقرأ حقلاً إلا إذا كانت ميزته قد نُفِّذت على كل مسار يصل إلى ذلك الفرع.
  • المعاملات: equals، وnot_equals، وgreater_than(_or_equals)، وless_than(_or_equals)، وcontains، وnot_contains، وin، وnot_in، وis_empty، وis_not_empty، وregex، وfuzzy_match (للحقول النصية فقط؛ ويتطلب score بين 0 و100، وهو عتبة تشابه، مثلاً: المهنة مشابهة بنسبة 80% على الأقل لـ “Software Engineer”).

التفرّع حسب سبب عدم تنفيذ NFC

بعد عقدة NFC، استخدم nfc.skip_reason مع equals أو in لتوجيه الجلسات بحسب سبب عدم قراءة الشريحة. للحقل سبع قيم ثابتة:
  • USER_SKIPPED
  • DOCUMENT_WITHOUT_CHIP
  • CHIP_CERTIFICATE_UNAVAILABLE
  • DEVICE_WITHOUT_NFC
  • INTEGRATION_WITHOUT_NFC_ACCESS
  • MRZ_KEY_UNAVAILABLE
  • JPKI_UNAVAILABLE
راجع أسباب تخطي NFC لمعرفة ما تعنيه كل قيمة. وعندما ينجح NFC تكون قيمة nfc.skip_reason هي null، فلا تطابق قاعدة equals أو in لسبب التخطي. يُحسب هذا الحقل أيضاً للعُقد التي تخطّتها البوابة. ويشمل ذلك الحالات التي لا يوجد فيها تقرير أو تحذير لـ NFC، والحالات التي تكون فيها القيمة allow_nfc_skip مساوية لـ false لكن بوابة المستند أو الجهاز تمنع تشغيل NFC. لذلك يمكنك توجيه هذه الجلسات دون الاعتماد على وجود عنصر في nfc_verifications[].
قد تحمل الجلسات المحفوظة قبل أن تصبح قدرة NFC ثلاثية الحالات القيمة has_device_nfc_support: false. لذلك قد تُحسب جلسة ويب قديمة على أنها DEVICE_WITHOUT_NFC بدلاً من INTEGRATION_WITHOUT_NFC_ACCESS.
يستخدم هذا المخطط المعامل equals لتخطي المستخدم، والمعامل in لتخطي البوابة أو القدرة، ووجود فرع else صريح لحالة نجاح NFC. يأتي الفرع بعد عقدة NFC، وتشير كل الوجهات إلى الأمام نحو عقدة نهائية:
لتعبّر عن “لم يُنفَّذ NFC لأي سبب معروف”، استخدم المعامل in مع القيم السبع جميعها. واحتفظ بفرع else صريح لحالة نجاح NFC (nfc.skip_reason: null) ولأي قيمة مستقبلية لا يتعرف عليها مخططك بعد.

Document AI (مثل إثبات الأموال)

تطلب عقدة الميزة DOCUMENT_AI مستنداً واحداً أو أكثر، وتستخرج حقولاً مسماة:
يصبح كل حقل مُعدّ قيمة قابلة للتفرّع بالاسم document_ai.<key>، وتكون نتيجة الخطوة في document_ai.status. اضبط "is_full_name": true على الحقل الذي يحتوي على الاسم الكامل لحامل المستند. تُقارن قيمته المستخرجة بالاسم الكامل للهوية المتحقَّق منها (اسم OCR أو اسم التحقق من الهوية، أو التفاصيل المتوقعة للجلسة)، ويحدد document_ai_name_mismatch_action ما يحدث عندما تكون درجة المطابقة أدنى من document_ai_name_match_score_threshold. هذه العلامة اختيارية، فقد لا يحدد المستند أي حقل، ولا يجوز لأكثر من حقل واحد في كل مستند أن يضبطها. راجع إعدادات ميزات سير العمل ← Document AI لمعرفة كل حقل إعداد في Document AI.

نقاط endpoint ودورة حياة المسودة

يتم تحرير المخطط لكل تطبيق، ويستخدم نقاط endpoint الخاصة بوحدة التحكم والإدارة (Bearer للمستخدم مع read:workflows/write:workflows). ولا يمكن تعديل المخطط إلا في نسخة مسودة، لذلك تكون دورة الحياة: إنشاء المسودة ← تعيين المخطط ← النشر.

تحذيرات التحقق

تُرجع نقطة التحقق { "is_valid": true, "graph": …, "warnings": [] }. التحذير إرشادي: المخطط صالح، ويُحفظ وينشر حتى مع وجود تحذيرات. يتضمن كل عنصر عقدة الفرع والذراع المعني بها، ليتمكن المنشئ من تحديد الشرط الدقيق:
ترجع المخططات غير الصالحة الاستجابة 400 مع قائمة errors و قائمة warnings بأفضل جهد ممكن. فقط errors تمنع الحفظ.

مثال عملي: توجيه مهندسي البرمجيات إلى إثبات الأموال

بعد التحقق من الهوية: إذا كانت النتيجة مرفوضة، فارفض الجلسة؛ وإذا كانت مهنة حامل الوثيقة ≈ “Software Engineer” (بتشابه 80% أو أكثر)، فاطلب مستنداً لإثبات الأموال؛ ثم اتخذ القرار النهائي.
تستخدم العقدة النهائية session_status: "Determine"، التي تتخذ القرار تلقائياً (مقبولة / مرفوضة / قيد المراجعة) استناداً إلى الميزات التي نُفذت فعلياً في الجلسة. لذلك يُحسم كل من مسار إثبات الأموال ومسار else بشكل صحيح، دون أن يقرأ أي فرع الحقل document_ai.status، لأن هذا الحقل غير موجود في المسار الذي يتجاوز Document AI. تذكّر: يجوز للفرع أن يقرأ حقلاً فقط إذا نُفذت ميزته على كل مسار يصل إليه. أرسله بالشكل { "graph": <above> } إلى نقطة …/workflow-graph/ (تحقّق منه أولاً). لإنشاء سير عمل جديد من الصفر، استخدم أداة didit_workflow_set_graph في MCP. ولتعديل سير عمل موجود، استخدم didit_workflow_edit_graph (عمليات صغيرة، تحافظ على العقد الموجودة وقوائم السماح). راجع Didit MCP.

التفويضات

x-api-key
string
header
مطلوب

مفتاح API الخاص بتطبيقك، من Developers -> API keys في Business Console. يمتلك المفتاح الأساسي وصولاً كاملاً. يمكن تحديد نطاق المفتاح المسمى: لا شيء، أو قراءة، أو كتابة لكل مورد، ومحدوداً ببعض مسارات العمل أو بالجلسات المقبولة، وبقائمة من عناوين IP، وبتاريخ انتهاء الصلاحية. يشير 401 إلى أن المفتاح غير صحيح أو ملغى أو منتهي الصلاحية؛ ويشير 403 إلى أنه لم يتم إرسال أي مفتاح، أو أن المفتاح ليس لديه حق الوصول إلى هذا المورد أو الإجراء، أو أن الطلب جاء من عنوان خارج قائمة عناوين IP الخاصة به؛ ويشير 404 في مسار جلسة إلى أن الجلسة خارج مسارات العمل أو الحالات الخاصة بالمفتاح. يتلقى المفتاح الذي لا يمتلك حق الوصول إلى الوسائط عناوين URL للصور ومقاطع الفيديو وملفات PDF كـ null، ويتلقى المفتاح الذي لا يمتلك إذن كتابة للجلسات روابط الجلسة وtoken كـ null. راجع https://docs.didit.me/console/api-keys.

الجسم

application/json

أنشئ سير عمل خطياً بسيطاً. تحوّل API قائمة الميزات هذه داخلياً إلى مخطط سير عمل قائم على العقد. قائمة بيضاء صارمة للحقول: أي مفتاح غير مدرج هنا (بما في ذلك workflow_type) يتم رفضه برمز 400.

features
object[]
مطلوب

ميزات التحقق حسب ترتيب التنفيذ. تربط واجهة API كل عنصر بالعنصر التالي وتضيف عقدة حالة نهائية واحدة تلقائياً.

Minimum array length: 1
workflow_label
string
افتراضي:ID Verification

اسم العرض لسير العمل (بحد أقصى 50 حرفاً). القيمة الافتراضية هي "ID Verification" عند حذفه — احرص دائماً على تعيينه لتبقى مسارات سير العمل قابلة للتمييز.

Maximum string length: 50
مثال:

"Standard KYC"

is_default
boolean

تعيين سير العمل هذا كافتراضي للجلسات الجديدة.

status
enum<string>

احذف هذا الحقل لإنشاء سير عمل منشور وجاهز للجلسات. استخدم draft فقط عندما تريد الحفظ دون نشر.

الخيارات المتاحة:
draft,
published
is_white_label_enabled
boolean
افتراضي:false

تمكين تخصيص العلامة البيضاء للجلسات التي تم إنشاؤها باستخدام سير العمل هذا.

is_desktop_allowed
boolean
افتراضي:false

السماح بتشغيل مسار التحقق على متصفحات أجهزة سطح المكتب.

max_retry_attempts
integer
افتراضي:3

الحد الأقصى لمحاولات إعادة المحاولة المسموح بها بعد عملية تحقق مرفوضة. القيمة 0 تحظر المستخدم بعد الرفض الأول.

النطاق المطلوب: 0 <= x <= 10
retry_window_days
integer | null
افتراضي:7

النافذة الزمنية المتجددة بالأيام المستخدمة لحساب عمليات إعادة المحاولة. تفرض القيمة null حداً طوال الوقت.

النطاق المطلوب: 1 <= x <= 365
face_liveness_max_attempts
integer
افتراضي:3

الحد الأقصى لعمليات إرسال كشف الحيوية لكل جلسة. القيمة الافتراضية 3: محاولة أولية واحدة بالإضافة إلى محاولتي إعادة. يتم أيضاً نسخ هذه القيمة في عُقد سير عمل كشف الحيوية وتقدير العمر المنشأة ما لم يستبدلها إعداد على مستوى الميزة.

النطاق المطلوب: 1 <= x <= 3
face_match_max_attempts
integer
افتراضي:3

الحد الأقصى لعمليات إرسال مطابقة الوجه لكل جلسة. القيمة الافتراضية 3: محاولة أولية واحدة بالإضافة إلى محاولتي إعادة. يتم أيضاً نسخ هذه القيمة في عُقد سير عمل مطابقة الوجه المنشأة ما لم يستبدلها إعداد على مستوى الميزة.

النطاق المطلوب: 1 <= x <= 3
session_expiration_time
integer
افتراضي:604800

عدد الثواني قبل انتهاء صلاحية الجلسة غير المكتملة. الحد الأدنى ساعة واحدة (3600)، والحد الأقصى 4 أسابيع (2419200).

النطاق المطلوب: 3600 <= x <= 2419200

الاستجابة

تم إنشاء سير العمل. نص الاستجابة هو التكوين الكامل لسير العمل — نفس التسلسل الخام لـ VerificationSettings الذي يعود من GET /v3/workflows/{settings_uuid}/ (حوالي 190 حقلاً: كل تبديل ميزة، وحد، وإجراء، وworkflow_graph المُنشأ)، وليس عنصر القائمة المضغوط. قم بتخزين uuid (المعروض أيضاً باسم workflow_id) لتتمكن من الرجوع إليه في استدعاءات إنشاء الجلسة لاحقاً. ملاحظة: features هي سلسلة متصلة بـ " + " والأسعار هي أرقام JSON.

الحقول أدناه ذات أنواع محددة (typed)؛ ويحمل الكائن أيضاً كل عمود آخر من تكوين سير العمل (مفاتيح تبديل الميزات، والحدود، وإجراءات التحذير، والمستندات المسموح بها، وعمليات الاستدعاء) كخصائص إضافية. الحقول التي لا تنطبق على workflow_type تكون null.

uuid
string<uuid>

معرّف لكل إصدار (settings_uuid). لكل إصدار من سير العمل معرّف خاص به.

workflow_id
string<uuid>

معرّف ثابت تشترك فيه جميع إصدارات سير العمل. تستخدم الجلسات التي يتم إنشاؤها باستخدامه أحدث إصدار منشور.

workflow_label
string

اسم العرض لسير العمل.

workflow_type
enum<string> | null

قالب سير العمل. يكون null لمخططات سير العمل التي تم إنشاؤها بدون قالب.

الخيارات المتاحة:
kyc,
kyb,
adaptive_age_verification,
biometric_authentication,
address_verification,
questionnaire_verification,
email_verification,
phone_verification,
null
is_default
boolean

ما إذا كان هذا هو سير العمل الافتراضي للتطبيق.

is_archived
boolean

لا يمكن لمهام سير العمل المؤرشفة بدء جلسات جديدة.

version
integer

رقم الإصدار ضمن سير العمل.

status
enum<string>

إصدارات المسودة قابلة للتعديل؛ أما الإصدارات المنشورة فغير قابلة للتغيير وتُستخدم للجلسات الجديدة.

الخيارات المتاحة:
draft,
published
published_at
string<date-time> | null

وقت نشر هذا الإصدار. القيمة null للمسودات.

is_simple_workflow
boolean

تكون true عندما لا يحتوي سير العمل على workflow_graph مخصص.

is_editable
boolean

تكون القيمة true فقط لإصدارات draft.

workflow_url
string<uri>

رابط URL عام يبدأ جلسة باستخدام سير العمل هذا.

workflow_graph
object | null

هيكل المخطط لسير العمل (العقد والحواف). null لسير العمل البسيط.

features
string

الميزات المُمكّنة مفصولة بـ " + "، على سبيل المثال "OCR + LIVENESS".

total_price
number | null

السعر لكل جلسة؛ بالنسبة لمسارات سير العمل القائمة على المخطط، يمثل المسار الأكثر تكلفة.

min_price
number | null

سعر المسار الأقل تكلفة عبر سير العمل.

max_price
number | null

سعر المسار الأكثر تكلفة عبر سير العمل.

special_add_on_prices
object | null

أسعار الإضافات الخاصة بالمؤسسة، أو null عند عدم تعيين أي منها.

max_retry_attempts
integer

عمليات إعادة المحاولة المسموح بها بعد عملية تحقق مرفوضة.

retry_window_days
integer | null

الأيام التي يُسمح خلالها بإعادة المحاولة.

session_expiration_time
integer

عدد الثواني قبل انتهاء صلاحية الجلسة غير المكتملة.

questionnaire
object | null

الاستبيان المرفق بسير العمل، أو null.

kyb_role_settings
object[]

إعدادات التحقق لكل دور للأشخاص الرئيسيين في KYB.

created_at
string<date-time>
updated_at
string<date-time>
signature_availability
object

أي مستويات التوقيع الإلكتروني يمكنها التوقيع الآن. تحقق منها قبل تعيين signature_level. يتم إرجاعها في مسارات عمل kyc وkyb والمخطط.

is_bank_verification_enabled
boolean

ما إذا كان سير عمل KYC أو KYB البسيط يشغّل التحقق المصرفي. يعمل بعد خطوات التواصل (والتحقق من الموقع) وقبل التحقق من قواعد البيانات وفحص AML وتحليل IP. التحقق المصرفي غير متاح بشكل عام بعد: يتم رفض تفعيله أينما لم يكن مُمكّناً.

bank_verification_config
object

إعدادات التحقق البنكي لسير عمل بسيط، مع نفس المفاتيح التي تقبلها عقدة BANK_VERIFICATION (على سبيل المثال bank_countries وbank_method_order). يتم تجاهل المفاتيح غير المعروفة. كل مفتاح اختياري والمفتاح الغائب يحتفظ بقيمته الافتراضية، لذا يعني {} تطبيق جميع القيم الافتراضية. راجع إعدادات التحقق البنكي.

مثال:
is_geolocation_enabled
boolean

ما إذا كان سير عمل KYC البسيط يشغّل التحقق من الموقع. يعمل بعد خطوات التواصل وقبل التحقق المصرفي والتحقق من قواعد البيانات. لا يمكن لسير عمل الشركات (KYB) تشغيله.

geolocation_config
object

إعدادات التحقق من الموقع لسير عمل بسيط، مع نفس المفاتيح التي تأخذها عقدة GEOLOCATION (على سبيل المثال is_geolocation_geofencing_enabled و geolocation_max_attempts). يتم تجاهل المفاتيح غير المعروفة. كل مفتاح اختياري ويحتفظ المفتاح الغائب بقيمته الافتراضية، لذا فإن {} تعني جميع القيم الافتراضية.

مثال:
آخر تعديل في ٧ نوفمبر ٢٠٢٦