الانتقال إلى المحتوى الرئيسي
POST
curl

المحافظ ذاتية الاستضافة

عندما يُعلَن أن محفظة الطرف المقابل ذاتية الاستضافة (counterparty.payment_method.method_type: "unhosted_wallet")، ينتظر التحويل في الحالة UNCONFIRMED_OWNERSHIP. عند استدعاء هذا endpoint مع confirmed: true، يُسجَّل أن عميلك تحقق ممن يتحكم في تلك المحفظة، ويكتمل التحويل (COMPLETED)، سواء كان سحباً صادراً أو إيداعاً وارداً. إذا كانت تجزئة المعاملة على السلسلة معروفةً مسبقاً لإيداع وارد، ينتقل التحويل إلى FINISHED. المحفظة التي يتم التحقق منها هي محفظة الطرف المقابل: الوجهة في حالة السحب الصادر، أو المصدر (محفظة المُرسِل) في حالة الإيداع الوارد. تضيف Didit هذه المحفظة إلى دفتر العناوين بوصفها ملكية موثّقة باسم الطرف المقابل، فتُطابَق مع اسم الطرف المقابل (المُرسِل في حالة الإيداع). إذا كان دفتر العناوين يحتوي بالفعل على تلك المحفظة باسم حائز مختلف، ينتقل التحويل بدلاً من ذلك إلى COUNTERPARTY_MISMATCHED_DATA. إذا لم يذكر التحويل أي محفظة للطرف المقابل، فمرّر wallet_address في جسم الطلب. عندما لا يتضمن التحويل ولا الطلب عنوان محفظة، يُرفض الطلب برمز 400. يؤدي confirmed: false إلى رفض التحويل (COUNTERPARTY_VASP_GENERAL_DECLINE).

التفويضات

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.

معلمات المسار

transaction_id
string<uuid>
مطلوب

معرّف UUID الثابت من Didit للمعاملة التي يحتفظ بها تطبيقك لهذا التحويل: معاملة جانب المستفيد في تحويل عبر مسار INTERNAL، أو المعاملة التي أنشأتها (صادرة أو واردة) عندما تم التصريح بأن محفظة الطرف المقابل ذاتية الاستضافة.

الجسم

application/json
confirmed
boolean
مطلوب

true لتأكيد الملكية، وfalse لإنكارها.

wallet_address
string
افتراضي:""

تحويلات TRP الواردة: عنوان الدفع الذي تعيده Didit إلى VASP المُرسِل عند الموافقة. القيمة الافتراضية هي عنوان الإدخال المطابق في دفتر العناوين، ثم beneficiary_data.wallet_address. وفي تحويل محفظة ذاتية الاستضافة مُصرَّح عنها لا يذكر محفظة الطرف المقابل، تكون المحفظة التي تحققت من ملكيتها؛ وبدونها يُرفض الطلب برمز 400. يتم تجاهله للتحويلات الأخرى.

الاستجابة

التحويل المحدث. بالنسبة للتحويل الوارد، تظل originator_data/beneficiary_data الخاصة بالطرف المقابل محجوبة (data_masked: true) حتى يتم تأكيد الملكية، ثم تسجل data_unmasked متى ولماذا وبواسطة من تم كشفها.

كائن التحويل الكامل الذي يتم إرجاعه بواسطة endpoints الخاصة بتأكيد الملكية والإنهاء/الإلغاء. طالما أن ملكية المحفظة لتحويل وارد غير مؤكدة، يتم إرجاع originator_data وbeneficiary_data للطرف المقابل محجوبة (يتم الاحتفاظ بالحرف الأول من كل كلمة؛ بينما تظل المحفظة، والبلوكتشين، وتوجيه VASP قابلة للقراءة) وتكون قيمة data_masked هي true.

uuid
string<uuid>
status
enum<string>
الخيارات المتاحة:
AWAITING_COUNTERPARTY,
ON_HOLD,
COMPLETED,
FINISHED,
CANCELLED,
EXPIRED,
COUNTERPARTY_MISMATCHED_DATA,
COUNTERPARTY_VASP_NOT_FOUND,
COUNTERPARTY_VASP_NOT_REACHABLE,
UNCONFIRMED_OWNERSHIP,
COUNTERPARTY_VASP_GENERAL_DECLINE,
NOT_ENOUGH_COUNTERPARTY_DATA,
NOT_APPLICABLE
direction
enum<string>
الخيارات المتاحة:
INBOUND,
OUTBOUND
rail
enum<string> | null

المسار الذي تم توجيه التحويل عبره، أو null عند عدم تحديد أي مسار (على سبيل المثال أقل من الحد، أو محفظة طرف مقابل ذاتية الاستضافة، أو تسجيل بعد الإيداع، أو عدم وجود طرف مقابل يمكن الوصول إليه). تعني INTERNAL أن كلا الجانبين هما تطبيقا Didit؛ وتعني EMAIL أنه تم الوصول إلى الطرف المقابل عبر رابط استلام تم إرساله بالبريد الإلكتروني. تعني TEST_VASP أن Didit Test VASP استجاب للتحويل في البيئة التجريبية. عبر GTR وVERIFYVASP وSYGNA، تقرأ Didit إجابة الطرف المقابل من استجابة الشبكة أو عبر استقصائها كل 5 دقائق. تقوم TRUST بالإرسال فقط، لذا يظل تحويل TRUST في حالة AWAITING_COUNTERPARTY حتى تنتهي صلاحيته. لا يُستخدم مسار الشبكة إلا عندما تكون قد ربطت عضويتك الخاصة بتلك الشبكة. ويتم اختياره بعد اكتمال إنشاء المعاملة، لذا يكون null في تلك الاستجابة.

الخيارات المتاحة:
INTERNAL,
TRP,
GTR,
TRUST,
VERIFYVASP,
SYGNA,
EMAIL,
TEST_VASP,
null
protocol
string | null
ivms_version
string
مثال:

"ivms101.2023"

required
boolean
ownership_confirmed
boolean | null
deadline_at
string<date-time> | null
timeline
object[]
counterparty_vasp
object | null
originator_data
object

جهة المُرسِل. بالنسبة للتحويلات الواردة، يتم حجب قيم الطرف المقابل حتى يتم تأكيد الملكية.

beneficiary_data
object

طرف المستفيد. بالنسبة للتحويلات الواردة، يتم حجب قيم الطرف المقابل حتى يتم تأكيد الملكية.

name_match
object · null · null

مقارنة الاسم التي حسمت التحويل، أو null حتى يتم تشغيل مقارنة واحدة. عندما تكون الأطراف مقنّعة، وفي نسخة العميل الآخر من تبادل INTERNAL، يتم إخفاء transfer_name وcompared_name وmatched_names وmismatched_names. قد تختلف قيمة score عن matched: تتبع matched مستوى الصرامة، بينما تمثل score مدى التشابه بين الاسمين الكاملين.

data_match
object | null

مقارنة حقلاً بحقل لبيانات طرف التحويل مع ما يعرفه الطرف الآخر عن صاحب المحفظة. تذكر أسماء الحقول والنتائج، ولا تذكر القيم مطلقاً، بحيث تظل قابلة للقراءة مع حجب بيانات الطرف المقابل. تكون Null حتى يتم إجراء المقارنة.

mismatched_fields
string[]

اختصار لـ data_match.mismatched_fields. يكون فارغاً عندما لا يختلف أي شيء.

data_unmasked
object | null

سجل تدقيق للحظة التي تم فيها كشف بيانات الطرف المقابل. تكون القيمة فارغة (Null) طالما بقيت البيانات محجوبة، وكذلك للتحويلات الصادرة.

data_masked
boolean

صحيح طالما أن البيانات الشخصية للطرف المقابل محجوبة في هذه الاستجابة.

created_at
string<date-time>
delivery
object | null

حالة آخر رسالة يتعين على هذا التحويل إرسالها إلى الطرف الآخر. تكون القيمة Null عندما لا يتعين على التحويل إرسال أي رسالة على الإطلاق (على سبيل المثال، إذا كان أقل من threshold_amount، أو محفظة ذاتية الاستضافة مُعلنة، أو تسجيل sunrise).

discovery
object[]

كيف بحثت Didit عن الطرف المقابل، إدخال واحد لكل خطوة تم تشغيلها. يكون فارغاً عند عدم تشغيل أي عملية اكتشاف، على سبيل المثال في المعاملات الواردة.

reason
string

سبب تعثر معاملة بحالة COUNTERPARTY_VASP_NOT_FOUND أو COUNTERPARTY_VASP_NOT_REACHABLE؛ وتكون "" لأي حالة أخرى. يُحدد فشل التسليم ذلك أولاً، في حالة COUNTERPARTY_VASP_NOT_REACHABLE فقط: email_undeliverable (رفض مزود البريد رسالة الامتثال الإلكترونية ولم يتبق أي عنوان لتجربته: عند إرسالها، أو في رسالة تذكير، أو كارتداد دائم تم الإبلاغ عنه لاحقاً) أو delivery_failed (فشل مسار التسليم نهائياً: رفض مسار الشبكة الرسالة أو استنفد محاولات إعادة المحاولة، أو لم يستجب مضيف هوية TRP، أو لم يقبل مضيف TRP الخاص بالطرف المقابل الاستعلام). وإلا فإن تتبع discovery يحدد ذلك: awaiting_end_user (لم تُحدد أي خطوة طرفاً مقابلاً يمكن لـ Didit الوصول إليه)، أو directory_match_no_route (حددت إحدى الخطوات VASP في الدليل ليس لديه مسار)، أو picked_member_without_proven_wallet (اختار المستخدم النهائي أحد عملاء Didit الذي لم يثبت سيطرته على المحفظة)، أو no_directory_match عندما لا يُقدم التتبع أي سبب آخر. تؤدي إعادة الإرسال إلى تحريك المعاملة، وبالتالي يتم مسح السبب. راجع سبب تعثر المعاملة.

next_actions
object[]

ما يتيح متابعة التحويل؛ [] لأي حالة باستثناء COUNTERPARTY_VASP_NOT_FOUND أو COUNTERPARTY_VASP_NOT_REACHABLE. يتيح email_undeliverable خيار update_compliance_email، ثم resend. ويتيح delivery_failed خيار resend. ويتيح سبب الاكتشاف select_counterparty_vasp و declare_self_hosted و add_vasp_hint و resend.

chain_details
object

كيفية تسمية سلسلة التحويل لمحفظتيه، وذلك عندما يكون هناك أكثر من عنوان يدفع لآخر. يكون فارغاً ({}) لتحويلات سلاسل الحسابات (EVM، Solana، Tron)، حيث يكون العنوانان هما المحفظتان. تقرأ المطابقة والتوجيه ودفتر العناوين المحافظ من هنا أولاً.

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