POST /v3/transactions/ وGET /v3/transactions/{transaction_id}/. يُعيد كلاهما الكائن نفسه TransactionDetail، أما مرجع API ففيه مخطط الحقول حقلًا حقلًا، وتشرح هذه الصفحة بنيته.
البنية على المستوى الأعلى
uuid هو المعرّف الثابت لدى Didit، وهو ما تتوقعه GET /v3/transactions/{transaction_id}/ في مسارها. أما txn_id فهو transaction_id الذي أرسلته عند الإنشاء. وtransaction_number هو الرقم التسلسلي الخاص بالتطبيق الذي تعرضه وحدة التحكم.
لا تُعاد الأطراف التي أرسلتها، أي الطرف الخاضع للفحص والطرف المقابل، كمفاتيح على المستوى الأعلى. بل هي عناصر في المصفوفة parties، ويُميَّز كلٌّ منها بالحقل role. أما vendor_data على المستوى الأعلى فهو نسخة للتيسير من vendor_data الخاص بمقدّم الطلب.
الحقول الرئيسية
الحقول المالية
amount/currency: مبلغ المعاملة كما أُرسل. الحقلamountسلسلة عشرية تُحذف منها الأصفار الزائدة في النهاية ("1500","0.5")، وتصل إلى 18 منزلة عشرية كحد أقصى.currency_type: القيمةfiatأوcrypto، كما أُرسلت فيcurrency_kind؛ وتكونnullإذا لم تُرسَل.amount_in_default_currency/default_currency_code: المبلغ المحوّل مسبقاً الذي أرسلته في الطلب، ويُعاد إليك كما هو؛ وتكونnullإذا لم ترسل مبلغاً.preferred_currency_amount/preferred_currency_code: القيمةamountبعد تحويلها إلى العملة المفضلة لتطبيقك. تكونnullعندما لا يتوفر سعر صرف للعملةcurrencyولم ترسلamount_in_default_currency.payment_details/payment_txn_id: المرجع النصي الحر للدفعة، والمرجع الخارجي للدفعة (مثل هاش معاملة البلوكتشين) كما وردا في الطلب.
حقول الحالة
status: القيمAPPROVEDوIN_REVIEWوDECLINEDوAWAITING_USER. تُنشأ المعاملات بالحالةAPPROVED، ويمكن للقواعد أن تغيّرها فوراً وبشكل متزامن.score: درجة المخاطر الصحيحة المتراكمة من القواعد. كلما ارتفعت الدرجة زادت المخاطر.severity: القيمUNKNOWNوLOWوMEDIUMوHIGHوCRITICAL، أوnullإلى أن تحدد قاعدة أو مزوّد الخدمة الشدة.decision_reason_code/decision_reason_label: سبب الحالة الحالية في صيغة منظمة وفي صيغة مقروءة للإنسان.environment: القيمةliveأوsandbox، وهي مأخوذة من التطبيق الذي تنتمي إليه المعاملة. المعاملةsandboxتُخزَّن ولا تخضع للتقييم أبداً، لذلك فإنrule_runsالفارغة فيها تعني “لم يُقيَّم”، لا “لم تتطابق أي قاعدة”. راجع مراقبة المعاملات في البيئة التجريبية.source: القيمةLIVEللمعاملات المُرسلة عبر API أو SDK، والقيمةIMPORTEDللمعاملات المُحمّلة عبر استيراد CSV من وحدة التحكم.
الأطراف
يُسجَّل كل طرف في المعاملة كعنصر ضمنparties. يُسجّل endpoint الإنشاء الطرف المعني بالقيمة APPLICANT، والطرف المقابل الاختياري بالقيمة COUNTERPARTY. ويتضمن التعداد role أيضاً القيمتين REMITTER وBENEFICIARY. وتشترك جميع العناصر في بنية واحدة.
role: القيمAPPLICANTوCOUNTERPARTYوREMITTERوBENEFICIARY. استخدم هذا الحقل للتصفية لإيجاد الطرف المعني.entity_type: القيمindividualوcompanyوexternalوunhostedWallet، كما أُرسلت.kind: القيمةUSERأوBUSINESSعندما يرتبط الطرف بمستخدم أو شركة لدى Didit عبرvendor_data، والقيمةEXTERNALفي غير ذلك.country_code/dob: مأخوذان منaddress.countryوdate_of_birthالمُرسلين.address/institution_info: الكائنان كما أُرسلا، ويكونان{}إذا لم يُرسلا.external_party_snapshot: نسخة مجمّدة من بيانات الطرف للأطراف من النوعEXTERNAL، وتكونnullطالما أن الطرف مرتبط بمستخدم أو شركة لدى Didit.
device
الحقل device هو device_context الذي أرسلته لذلك الطرف، بعد تحويل مفاتيحه إلى صيغة snake_case، مع الإثراء الذي يجريه الخادم لعنوان IP. يكون {} إذا لم يتضمن الطلب أي سياق للجهاز، لذلك عامِل كل مفتاح على أنه اختياري دائماً.
لا يوجد كائن إثراء منفصل. عندما يتضمن الطرف عنوان IP عاماً في
network_context.ip_address، يحلّ Didit العنوان مباشرةً ويكتب الحقول المُثرّاة في الكائن network_context نفسه، ولا يملأ إلا المفاتيح التي لم ترسلها. وتُحذف المفاتيح التي أعادها المحلّل فارغة، لذلك يحتوي network_context المُثرّى بالكامل على المفاتيح الأربعة المُرسلة (ip_address, ip_country_code, latitude, longitude) مع أي من المفاتيح التالية التي جرى تحديدها: ip_country وip_state وip_city وisp وorganization وis_vpn_or_tor وis_data_center وtime_zone وtime_zone_offset وasn_number وasn_organization وconnection_type وcarrier وproxy_type. ويكون is_vpn_or_tor وis_data_center موجودين دائماً بعد نجاح عملية الحل.
يُتخطى الإثراء، ويُعاد network_context كما أُرسل تماماً، عندما يكون عنوان IP مفقوداً أو غير قابل للتوجيه، أو عندما يكون التطبيق في البيئة التجريبية، أو عندما يفشل الحل. ويكون ip_country_code بصيغة ISO 3166-1 alpha-2 عندما يحدده Didit، وبالقيمة التي أرسلتها في الحالات الأخرى؛ وتوحّد شروط القواعد الصيغتين قبل المقارنة.
طرق الدفع
role: القيمSOURCEوDESTINATIONوFUNDINGوBENEFICIARY. يُعيّن endpoint الإنشاء القيمتينSOURCEوDESTINATIONبحسبdirection: في المعاملة الصادرة تكون طريقة الطرف المعني هيSOURCEوطريقة الطرف المقابل هيDESTINATION، وفي المعاملة الواردة يكون العكس.payment_method_type: القيمbank_cardوbank_accountوe_walletوcrypto_walletوunhosted_walletوother.fingerprint: قيمة SHA-256 تُحسب علىtype:account_id:issuing_country، وتبقى ثابتة عبر المعاملات، لتتمكن من ربط إعادة استخدام الأداة المالية نفسها. وتكونnullإذا لم يُرسلaccount_id.owner_kind/vendor_data/owner_name: من يملك الأداة المالية، وفق الاصطلاح نفسهUSER/BUSINESS/EXTERNALالمستخدم للأطراف.details: كائنpayment_methodالخام كما أُرسل.
تشغيلات القواعد
rule: معرّف UUID للقاعدة التي تم تشغيلها، وrule_titleوrule_descriptionوrule_categoryمنسوخة منها.matched: لا يُسجَّل التشغيل إلا عندما تتطابق شروط القاعدة، لذلك تحمل تقييمات الإنتاج دائماً القيمةmatched: true. ولا تترك القواعد التي قُيّمت دون تطابق أي سجل. وقد تتضمن بيانات العرض التوضيحي صفوفاً بالقيمةmatched: false.is_test/mode: القيمتانtrueوTESTعندما تعمل القاعدة في وضع الاختبار؛ ويُسجَّل تشغيل الاختبار لكنه لا يؤثر فيstatusأوscoreأوseverity.score_delta/status_target/severity: ما أسهم به هذا التشغيل. يُضبطstatus_targetعندما يُنفَّذ إجراءchange_status، أو عندما تتجاوز الدرجة المضافة الحد.action_summary: نص يلخّص الإجراءات التي نفّذتها القاعدة، مفصولة بـ;(score +30,change_status:IN_REVIEW,add_tag:<name>,add_note,add_to_list,open_case)؛ وتكونnullإذا لم تنفّذ القاعدة أي إجراء.metadata: تفاصيل التقييم، وتشملscope_match، بالإضافة إلىconditions[]وaggregations[]. تستخدم القائمتان مفاتيح قيم مختلفة:conditions[]: عنصر واحد لكل شرط، ويحملfieldوoperatorوexpected_valueوcurrent_valueالتي قُرئت من المعاملة وmatchedوgroup_indexوgroup_logic. تكونfield_sourceدائماًnullفي تشغيلات قواعد المعاملات، ولا تُصنَّف إلا لـأحداث المراقبة.aggregations[]: عنصر واحد لكل تجميع من نوع معدل التكرار أو العدد أو المجموع، ويحملmetricوfieldوoperatorوexpected_valueوcomputed_valueالذي وصل إليه التجميع وwindowوfiltersوmatchedوsample_references. وتحمل التجميعات التي لا يمكن حسابها إلا بشكل غير متزامن القيمةcomputed_value: nullوالقيمةdeferred: true.
التنبيهات
alerts مصفوفة فارغة دائمًا في الوقت الحالي.
التنبيه المفتوح يعني معاملة محجوزة، لذا اقرأ status بدلًا من ذلك (IN_REVIEW أو AWAITING_USER). راجع التنبيهات.
الأنشطة
سجل أنشطة المعاملة: الإنشاء والملاحظات والمراجعات اليدوية وتغييرات الحالة.TRANSACTION_NOTE_ADDED؛ لا توجد مصفوفة notes منفصلة.
المستندات
ملفات مرفقة بالمعاملة من وحدة التحكم. تكون[] عند عدم وجود ملفات.
file_url رابط موقّع قصير الأمد؛ اجلبه عند الحاجة بدلًا من تخزينه.
نتائج المزوّدين
مخرجات مزوّدين خارجيين (فحص تجزئة المعاملة، وفحص المحافظ، ومراقبة العملات الفيات، وفحص العقوبات).result_type: FIAT_MONITORING, WALLET_SCREENING, TRANSACTION_SCREENING, TRAVEL_RULE, NETWORK_GRAPH, CUSTOM.
payload.risk_factors هو التفسير المرتب لـ score: ما الذي أنتج الحكم، مع عرض عوامل الخطر المرتفعة أولًا ثم بحسب قيمة المبالغ المحوّلة. تعني score مرتفعة دون إدخال is_high_risk أن المزوّد صنّف الكيان وفق نموذج التعرض الخاص به دون الإبلاغ عن تطابق مع العقوبات أو مع كيان منسوب؛ وتوضح summary ذلك صراحةً. المرجع التفصيلي للحقول: عوامل المخاطر. النتائج التي فُحصت قبل إضافة هذا الحقل لا تتضمن هذا المفتاح.
في فحص تجزئة معاملات العملات المشفرة، يُعبَّأ transaction_flows عند توفر الإثراء على السلسلة. وهو يطبّع نشاط السلسلة حتى تتمكن وحدة التحكم من عرض نظرة عامة على المعاملة ومخطط التصور من حمولة الاستجابة نفسها.
مصادر الإثراء المدعومة:
- تستخدم سلاسل EVM خدمة Blockscout لتطبيع المعاملة الرئيسية والاستدعاءات الداخلية وتحويلات الرموز.
- يستخدم Bitcoin خدمة mempool.space لتطبيع مدخلات المعاملة ومخرجاتها.
- يستخدم Solana خدمة Helius لتطبيع تحويلات SOL الأصلية وتحويلات رموز SPL وسياق أحداث NFT المتاح.
transaction_flows[] حقولًا مُطَبَّعة ثابتة (flow_type, from_address, to_address, amount, amount_usd, currency, token_name, token_address, transaction_hash, block_timestamp, index, success) إضافةً إلى metadata خاصة بالمزوّد.
أمثلة شائعة على metadata:
metadata إضافية وخاصة بالمزوّد. لا تبنِ تكاملات حرجة تشترط وجود كل مفتاح في كل سلسلة.
Travel Rule
تكونnull عندما لا تتضمن المعاملة تحويل Travel Rule أو فحصه. تُعبَّأ عند إرسالك travel_rule_details، وكذلك عندما تكون Travel Rule مفعّلة للتطبيق وأُنشئت المعاملة بالقيمة transaction_category: "travelRule": عندئذٍ يبدأ Didit تبادل البيانات بنفسه، سواء أُرسل travel_rule_details أم لم يُرسَل، ويعرض حالته status هنا. اقرأ هذا الحقل بدلًا من الطلب الذي أرسلته.
في التحويل الوارد، تبقى originator_data وbeneficiary_data الخاصتان بالطرف المقابل مخفيتين (data_masked: true) إلى أن تُؤكَّد ملكية المحفظة (راجع بيانات الطرف المقابل المخفية).
direction وrail وcounterparty_vasp وdelivery وdiscovery وreason وnext_actions البنية نفسها الموجودة على endpoint الخاص بالتحويل.
يوضح reason وnext_actions سبب توقف تحويل COUNTERPARTY_VASP_NOT_FOUND أو COUNTERPARTY_VASP_NOT_REACHABLE وما الذي يدفعه إلى الأمام، وتكونان "" و[] لأي حالة أخرى: راجع سبب توقف التحويل.
يتضمن كل صف في GET /v3/transactions/ الكتلة نفسها.
راجع Travel Rule.
لقطة الشبكة
المخطط المخزَّن نفسه، لا مرجع إليه. ويأتي من أحد المصدرين:network_snapshotأرسلته مع المعاملة، أو- المخطط الذي يبنيه Didit عند نجاح فحص المحافظ بـ AML لمعاملة بعملة مشفّرة، حتى لو لم يتضمن الطلب
network_snapshot. يحلّ المخطط المبني من الفحص محل المخطط المُرسَل، وتُحدّثه إعادة فحص غير متزامنة.
null عند عدم وجود أيٍّ منهما:
الوسوم والبيانات الوصفية والخصائص
tags[]: الوسوم المرفقة (إما بإجراء قاعدة أو بواسطة المحلل):{ "uuid", "name", "color", "description", "source" }، حيث تكون قيمةsourceهيdiditللوسم المعدّ مسبقًا وcustomللوسم الخاص بك.metadata: لقطة من بياناتsubjectوcounterpartyتمامًا كما أرسلتها وقت الإنشاء، ضمن هذين المفتاحين.props: قيمcustom_propertiesالتي أرسلتها وقت الإنشاء. يمكن الإشارة إلى كل مفتاح في شروط القواعد باستخدامcustom_values.<key>.
المعالجة
عندما تُشغّل قاعدةٌ الحالةAWAITING_USER، ينشئ Didit جلسة التحقق المرتبطة ويعيدها في حقلين:
remediation: الجلسة المرتبطة:{ "session_id", "session_token", "url", "status" }. تبقى مُعبّأة طوال عمر المعاملة، لتتمكن دائمًا من معرفة كيف انتهى إجراء المستخدم.action_required: الإجراء الذي يجب على المستخدم اتخاذه الآن، أوnullعندما لا يكون هناك شيء معلّق:{ "type": "verification_session", "url", "session_id", "session_token", "status" }. وجِّه المستخدم إلىurl، أو مرّرsession_tokenإلى Didit SDK. تستخدم إجراءات ملكية المحفظة في Travel Rule الكتلة{ "type": "wallet_ownership", "url", "widget_session_id", "expires_at" }، وتكون لها الأولوية عندما ينطبق الاحتمالان معًا. وعندما يكون إجراء ملكية المحفظة معلّقًا ولم يُعثر على الطرف المقابل للتحويل، تتضمن الكتلة نفسها أيضًاreasonوnext_actions(راجع اكتشاف الطرف المقابل).
transaction.created وtransaction.status.updated (action_required)، راجع webhooks.
تفصيل التكلفة
تكونnull إلى أن تُنفَّذ ميزة خاضعة للفوترة للمعاملة. وإلا فهي { "total_price", "items": [ { "usage_type", "price", "details" } ] }، بعنصر واحد لكل ميزة تُحتسب بالاستخدام (الفحص، والإثراء، وغير ذلك).
تحويل العملات
preferred_currency_amount هي قيمة amount بعد تحويلها إلى العملة المفضلة لتطبيقك وفق أسعار السوق المتوسطة، ما لم تُرسل amount_in_default_currency، وفي هذه الحالة تُستخدم القيمة المحوّلة مسبقاً كما هي. تقارن شروط القواعد التي تستخدم amount المبلغ الأصلي؛ استخدم preferred_currency_amount في الشروط عندما تحتاج إلى حد واحد عبر العملات.
الخطوات التالية
إرسال المعاملات
مخطط الطلب الكامل.
الحالات
ما تعنيه كل حالة.
احتساب الدرجات
كيف تُحسب الدرجة.