> ## Documentation Index
> Fetch the complete documentation index at: https://docs.didit.me/llms.txt
> Use this file to discover all available pages before exploring further.

# واجهة API لإنشاء المعاملات: تقديم KYT

> أرسل معاملة إلى Didit KYT لاحتساب درجة المخاطر وفحصها ومعالجة Travel Rule. تشمل 1,000 معاملة شهرياً، ثم $0.001 لكل معاملة.



موجه API لإنشاء المعاملة
        نسخ الموجّه إلى الحافظة



      
      

\<pre>

\`Submit a transaction for Didit monitoring through the Management API.

Endpoint:
POST https://verification.didit.me/v3/transactions/

Authentication:
Use the x-api-key header with my Didit API key.

Goal:
\- Submit a transaction for KYT (transaction monitoring). Didit runs the configured rules engine, blockchain analytics, and AML screening synchronously and returns the verdict in the response. The full detail (parties, rule runs, provider results, remediation links) is also returned.
\- A Travel Rule transfer is stored in the same call, but Didit contacts the counterparty after the response: travel_rule.status comes back AWAITING_COUNTERPARTY (or NOT_APPLICABLE, UNCONFIRMED_OWNERSHIP, or COMPLETED for your own verified wallet) with travel_rule.protocol null, and every later status change, including COUNTERPARTY_VASP_NOT_FOUND, arrives as a travel_rule.status.updated webhook. Your rules run again when the rail or the status changes.

When to call:
\- At payment authorization, before fanning out funds, to decide allow / hold / decline based on status, score, severity.
\- On post-trade events (gambling bets, audit-trail events, KYC events) for long-running monitoring without a per-transaction decision.
\- On crypto deposits / withdrawals — set transaction_details.currency_kind = "crypto" and provide the relevant wallet address in payment_method.account_id.
\- For Travel Rule, set transaction_category = "travel_rule" and include travel_rule_details (alias travelRule).
travel_rule_details.status is required (400 if missing); when Travel Rule is enabled, Didit runs the exchange and ignores the status you send, and otherwise Didit records the transfer passively with that status.
When the subject is a user with an approved Didit KYC verification and Travel Rule is on, Didit replaces the originator_data fields the verification holds with the verified values (metadata.originator_provenance says which); otherwise it sends originator_data as you provide it, so build it from the identity you verified.
beneficiary_data carries the beneficiary (name, wallet_address, chain) and any routing hints (travel_address, counterparty_vasp_lei, counterparty_vasp_name, counterparty_vasp_email).
If beneficiary_data.chain is empty, Didit takes transaction_details.crypto_params.crypto_chain, else custom_properties.crypto_chain, else the currency, uppercases it, and sets it only when it is a chain Didit recognises (for example ETH or BTC).
\- Chain shapes: on XRP, XLM, EOS, ATOM and HBAR send the destination tag or memo as payment_method.memo (or beneficiary_data.memo); on BTC, LTC, BCH and DOGE send the transaction's inputs and outputs as travel_rule_details.utxo; on bitcoin or Lightning, payment_method.account_id may be a Lightning payment request or Lightning Address. What Didit resolved is on travel_rule.chain_details (see /transaction-monitoring/travel-rule#chain-shapes).

Identifiers:
\- transaction_id (alias txnId) is YOUR identifier (max 128 chars), unique per application.
It becomes txn_id on subsequent calls.
Reusing a transaction_id that already exists returns 400 {"transaction_id": ["A transaction with this transaction_id already exists."]}, and when two identical requests race each other the loser gets 409.
Neither response returns the existing transaction, so to retry safely, treat a 400 or 409 for a duplicate id as already created and look the transaction up instead of resubmitting: GET /v3/transactions/{uuid}/ with the Didit uuid from the first response, or with the transaction_id (the Didit uuid) that the transaction.created webhook carries next to your txn_id.
GET does not accept your txn_id. Sandbox applications do not receive transaction.created or transaction.status.updated, so save the Didit uuid from the create response. Sandbox Travel Rule exchanges do emit travel_rule.status.updated with environment: sandbox.
\- The returned uuid is Didit's stable identifier — use it in GET /v3/transactions/{transaction_id}/.

Linking to entities:
\- subject.vendor_data (and optionally counterparty.vendor_data) are your internal user/business identifiers. They link the transaction to the long-lived User / Business entity assembled from prior verification sessions. Use the SAME vendor_data you supplied when creating the KYC session.

Minimum request body (application/json):
\{
"transaction_id": "your-txn-2026-05-17-001",
"transaction_category": "finance",   // finance | kyc | travel_rule | user_event | audit_trail_event | gambling_bet | gambling_limit_change | gambling_bonus_change
"transaction_details": {
"direction": "outbound",            // "inbound" | "outbound"
"amount": 1500,                     // number or decimal string, up to 18 decimal places (string for exact precision); never negative, because direction carries the sign
"currency": "EUR",                  // any ISO 4217 code (EUR, USD, NGN, ...) or a crypto symbol
"currency_kind": "fiat",            // "fiat" | "crypto" (optional)
"action_type": "withdrawal"         // optional, e.g. deposit/withdrawal/transfer
},
"subject": {                          // APPLICANT party
"entity_type": "individual",        // "individual" | "company"
"vendor_data": "user-12345",        // required
"full_name": "Maria Garcia",        // required
"address": { "country": "ESP" }     // optional
},
"counterparty": { ... },              // optional COUNTERPARTY party (same shape as subject)
"transaction_at": "2026-05-17T08:42:00Z",  // optional, defaults to now
"travel_rule_details": { "status": "AWAITING_COUNTERPARTY", ... }   // optional, for crypto Travel Rule; status is required inside it
}

Currency codes:
\- currency has no enum. Any ISO 4217 alphabetic code (EUR, USD, NGN, ...) and any crypto asset symbol (BTC, ETH, ...) are accepted and stored exactly as you send them, up to 10 characters.
\- Prefer a currently-circulating code. Not every accepted code has an exchange rate: withdrawn currencies and accounting units such as XDR are often still quoted, but when Didit has no rate for the code you send (for example the ISO accounting unit XSU, or a crypto symbol Didit does not price), automatic conversion to your base currency fails and preferred_currency_amount comes back null. A pre-converted amount_in_default_currency is always used as sent when present, so supply it for any code you are not sure has a rate.
\- Set currency_kind = "crypto" for on-chain amounts. The kind gates the transaction's own crypto AML screening: without currency_kind = "crypto" that regular screening step is skipped and no screening fee is estimated or charged for it, even with monitoring enabled or include_crypto_screening = true. Travel Rule attribution is a separate path: on a production application with Travel Rule and VASP attribution enabled, an outbound transaction_category = "travel_rule" request whose beneficiary wallet and chain cannot be reached over any rail triggers a VASP attribution wallet screening, and that screening is billed at the wallet screening price whatever currency_kind is or is not set. The kind does not change the stored decimal scale: up to 18 decimal places are kept either way, but only when amount arrives as a decimal string ("0.123456789012345678"). A JSON number is parsed as a binary float first, so anything beyond about 15 significant digits is rounded before it is stored (0.123456789012345678 is stored as 0.12345678901234568). The kind also decides how the amount is rendered in the transaction PDF. Crypto amounts render with up to 8 decimal places, fiat amounts with their ISO 4217 minor unit (2 for most currencies). Without the kind, RON, MNT and GEL are rendered as fiat because each is both a token and an ISO 4217 currency, so a small token amount can show as 0 in the report.
The VASP attribution screening is skipped when the transaction's own crypto screening already screened that wallet: Didit reuses that result and charges nothing extra.

Example call:
curl -X POST "https://verification.didit.me/v3/transactions/" \
-H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" \
-d '{
"transaction_id": "your-txn-2026-05-17-001",
"transaction_category": "finance",
"transaction_details": {"direction":"outbound","amount":1500,"currency":"EUR","action_type":"withdrawal"},
"subject": {"entity_type":"individual","vendor_data":"user-12345","full_name":"Maria Garcia"}
}'

What to read from the response:
\- uuid — Didit transaction id, use for GET /v3/transactions/{transaction_id}/.
\- status - APPROVED | IN_REVIEW | DECLINED | AWAITING_USER (live verdict; at creation, AWAITING_USER comes from a rule action).
\- score (0–100, higher = riskier) and severity (LOW | MEDIUM | HIGH | CRITICAL).
\- decision_reason_code / decision_reason_label — machine + human verdict reason.
\- parties (role APPLICANT for the subject, COUNTERPARTY for the counterparty; kind USER, BUSINESS or EXTERNAL), cost_breakdown, rule_runs, provider_results (crypto screening results) and network_snapshot.
\- travel_rule - the Travel Rule transfer (status, protocol, required, originator_data, beneficiary_data, direction, rail, counterparty_vasp, delivery, discovery, reason, next_actions), or null; action_required - a pending wallet-ownership or verification step, or null.
reason and next_actions say why a COUNTERPARTY_VASP_NOT_FOUND or COUNTERPARTY_VASP_NOT_REACHABLE transfer is stuck and what moves it on (for example email_undeliverable: update_compliance_email, then resend); they are "" and [] for any other status.

Webhooks:
\- transaction.created fires after this call succeeds.
\- For a travel_rule transaction, travel_rule.status.updated fires for each Travel Rule transition, after transaction.created. Each webhook is delivered and retried on its own, so key on transaction_id rather than on arrival order.
\- transaction.status.updated fires whenever the verdict changes (manual review, async screening, rule re-runs). Subscribe a destination via POST /v3/webhook/destinations/.

Failure modes:
\- 400 - duplicate transaction_id, missing required field (including travel_rule_details.status), an unknown travel_rule_details.status ("Invalid travel rule status: ..."), invalid direction/category enum, or malformed party object.
\- 409 - a concurrent request with the same transaction_id was created first.
\- 403 - missing x-api-key (a wrong, revoked or expired key gets 401), or a key without permission for this action; the body is a { "detail": "..." } envelope.
\- 403 - the organization's balance cannot cover the fees this request would charge: { "detail": "...", "code": "insufficient_credits" }, and nothing is created.
\- 429 - more than 600 ingestion requests per minute for this API key (transaction and event ingestion share this budget, apart from the 300 of every other write); wait Retry-After seconds and retry.

Side effects:
\- Creates the transaction record and runs the synchronous rules + screening pipeline.
\- Links the transaction to the User / Business entity that shares the subject.vendor_data.
\- An outbound travel_rule transaction is billed once, at creation, on one line. It pays the Travel Rule fee ($0.02) when Travel Rule is on and Didit starts an exchange for it (amount at or above threshold_amount, including a transfer to a self-hosted wallet or to the user's own verified wallet). Otherwise it is billed as transaction monitoring (included in the plan's monthly transaction allowance, $0.001 each beyond it): below threshold_amount, a Lightning payment the Travel Rule does not apply to, or data recorded while Travel Rule is disabled. A resend never charges again.
\- An inbound travel_rule transaction pays no base fee, an application that joined Travel Rule free pays none on outbound transactions until it turns outbound billing on, and sandbox applications are never charged.
\- Crypto screening, when it runs, adds the Wallet Verification & Screening charge.

For the full integration shape, see /integration/integration-prompt.`

\</pre>



      
      

الصق في



## OpenAPI

````yaml ar/openapi-25.json POST /v3/transactions/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API التحقق من الهوية. قم بالمصادقة باستخدام الرأس x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/transactions/:
    post:
      tags:
        - Transactions
      summary: إنشاء معاملة
      description: >-
        إرسال معاملة للمراقبة المتزامنة لـ AML/المخاطر. يتم إنشاء المعاملة
        بالحالة `APPROVED`، ثم تُشغَّل قواعدك (وفحص العملات المشفرة، عند
        انطباقه) بشكل متزامن وقد تغيّر قيمة `status` المُعادة إلى `IN_REVIEW` أو
        `DECLINED`. **يُعد `transaction_id` هو مفتاح idempotency الخاص بك** (بحد
        أقصى 128 حرفاً، وفريد لكل تطبيق)؛ وتؤدي إعادة استخدامه إلى إرجاع 400.
        يتم إرسال webhook من نوع `transaction.created` عند النجاح لتطبيقات بيئة
        الإنتاج. لا تتم فوترة تطبيقات البيئة التجريبية ولا تُرسل أحداث webhook
        من نوع `transaction.created` أو `transaction.status.updated`. بينما
        تُرسل عمليات تبادل Travel Rule في البيئة التجريبية أحداث webhook من نوع
        `travel_rule.status.updated` مع `environment: sandbox`. يتم تخزين تحويل
        Travel Rule وإرجاعه قبل الاتصال بأي طرف مقابل: وتعود قيمة
        `travel_rule.status` كـ `AWAITING_COUNTERPARTY` (أو `NOT_APPLICABLE` دون
        الحد الخاص بك، أو `UNCONFIRMED_OWNERSHIP` لمحفظة ذاتية الاستضافة مُعلنة،
        أو `COMPLETED` عندما تكون المحفظة الأخرى هي محفظتك الخاصة التي تم التحقق
        منها) وتكون قيمة `travel_rule.protocol` هي null. بعد ذلك تختار Didit
        المسار وتُرسل التبادل، ويصل أي تغيير لاحق في حالة التحويل، بما في ذلك
        `COUNTERPARTY_VASP_NOT_FOUND` عندما يتعذر على أي مسار الوصول إلى الطرف
        المقابل، كحدث webhook من نوع `travel_rule.status.updated`. يتم تشغيل
        قواعدك مرة أخرى عندما يتغير المسار أو الحالة.
      operationId: createTransaction
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                transaction_id:
                  type: string
                  description: معرّفك الفريد لهذه المعاملة (بحد أقصى 128 حرفاً).
                  example: your-txn-2026-05-17-001
                transaction_at:
                  type: string
                  format: date-time
                  description: >-
                    وقت حدوث المعاملة. القيمة الافتراضية هي الوقت الحالي إذا تم
                    حذفه.
                time_zone:
                  type: string
                  description: معرّف المنطقة الزمنية لـ IANA، مثل `Europe/Madrid`.
                transaction_category:
                  type: string
                  description: >-
                    فئة المعاملة. تُقبل أيضاً الأسماء المستعارة بصيغة CamelCase
                    (`travelRule`، `userPlatformEvent`، `gamblingBet`، ...)؛
                    وتكون القيمة المخزنة/المعادة بصيغة camelCase للفئات المكونة
                    من كلمات متعددة.
                  example: finance
                  enum:
                    - finance
                    - kyc
                    - travel_rule
                    - user_event
                    - audit_trail_event
                    - gambling_bet
                    - gambling_limit_change
                    - gambling_bonus_change
                    - travelRule
                transaction_details:
                  type: object
                  description: التفاصيل المالية الأساسية للمعاملة.
                  required:
                    - direction
                    - amount
                    - currency
                  properties:
                    direction:
                      type: string
                      description: >-
                        اتجاه المعاملة بالنسبة إلى الشخص المعني. غير حساس لحالة
                        الأحرف؛ يُقبل `in`/`out` كأسماء بديلة. يُعاد بأحرف كبيرة
                        (`INBOUND`/`OUTBOUND`).
                      example: outbound
                      enum:
                        - inbound
                        - outbound
                        - in
                        - out
                    amount:
                      type: number
                      description: >-
                        مبلغ المعاملة (حتى 18 منزلة عشرية). أرسله كسلسلة عشرية
                        (على سبيل المثال `"0.123456789012345678"`) عندما تكون
                        الدقة المضبوطة مهمة: يتم تحليل رقم JSON كعدد عائم ثنائي
                        أولاً، لذا يتم تقريب الأرقام التي تتجاوز حوالي 15 رقماً
                        معنوياً قبل تخزين المبلغ. يجب أن يكون صفراً أو أكبر:
                        يحمل الاتجاه الإشارة، ويعيد المبلغ السالب `400`.
                      example: 1500
                    currency:
                      type: string
                      description: >-
                        رمز العملة. يُقبل أي رمز أبجدي وفق معيار ISO 4217 (مثل
                        `EUR`، و`USD`، و`NGN`)، وكذلك يُقبل رمز أصل مشفر (مثل
                        `BTC`). يُفضل استخدام رمز متداول حالياً. ليس لكل رمز
                        مقبول سعر صرف: عندما لا يتوفر سعر صرف للرمز (على سبيل
                        المثال وحدة المحاسبة `XSU` وفق ISO، أو رمز عملة مشفرة لا
                        تحدد Didit سعراً له)، يفشل التحويل التلقائي ويتم إرجاع
                        `preferred_currency_amount` بقيمة فارغة (null) ما لم
                        يقدّم الطلب قيمة محولة مسبقاً في
                        `amount_in_default_currency`.
                      example: EUR
                    currency_kind:
                      type: string
                      description: ما إذا كانت العملة `fiat` أو `crypto`.
                    amount_in_default_currency:
                      type: number
                      nullable: true
                      description: >-
                        مبلغ محوّل مسبقاً بالعملة الافتراضية. إذا لم يُذكر، ستتم
                        محاولة تحويل العملات الأجنبية (FX) تلقائياً. يجب أن يكون
                        صفراً أو أكبر.
                    default_currency:
                      type: string
                      description: >-
                        رمز العملة الافتراضي للمبلغ المحول. أي رمز ISO 4217
                        متداول حاليًا.
                    payment_details:
                      type: string
                      nullable: true
                      description: مرجع الدفع أو الملاحظة بنص حر.
                    payment_reference_id:
                      type: string
                      nullable: true
                      description: >-
                        مرجع نظام الدفع الخارجي. بالنسبة لفحص تجزئة معاملات
                        العملات المشفرة لـ AML، أرسل تجزئة معاملة البلوكتشين،
                        وأدرِج أيضاً `subject.payment_method.account_id` مع
                        العنوان المرتبط.
                    action_type:
                      type: string
                      nullable: true
                      description: >-
                        النوع الفرعي للمعاملة، مثل `deposit`، `withdrawal`،
                        `transfer`.
                    crypto_params:
                      type: object
                      description: >-
                        تحديد شبكة العملات المشفرة، بشكل منفصل عن العملة (رمز
                        الأصل). تسجيل رمز token مخصص لا يضمن تغطية تجزئة
                        المعاملة لعقدها.
                      properties:
                        crypto_chain:
                          type: string
                          description: >-
                            الشبكة الفعلية المستخدمة للفحص. يدعم الفحص المدار
                            كلاً من BTC وETH وLTC وXRP وBCH وDOGE وTRX وSOL
                            وMATIC وBNB وBASE (Base) وOP (Optimism) وARB
                            (Arbitrum One) وAVAX (Avalanche C-Chain) وADA
                            (Cardano) وXLM (Stellar) وHBAR (Hedera). تُقبل أيضاً
                            أسماء الشبكات الشائعة، على سبيل المثال POLYGON أو
                            POL لـ MATIC، وBSC لـ BNB، وTRON لـ TRX. حدد هذا
                            دائماً للرموز المميزة متعددة الشبكات. عندما يكون
                            مفقوداً لـ USDT أو USDC أو ETH المُرسلة مع تجزئة
                            معاملة تبدأ بـ 0x، تبحث Didit عن التجزئة في Ethereum
                            وBNB Chain وPolygon وBase وArbitrum وOptimism
                            وتفحصها على الشبكة التي عُثر عليها فيها؛ وإذا لم تكن
                            موجودة على أي شبكة، فلن تُفحص المعاملة وتكون قيمة
                            custom_values.aml_screening_status هي FAILED مع ذكر
                            السبب في custom_values.aml_screening_error. عندما
                            يكون مفقوداً لـ USDT أو USDC المفحوصين بواسطة
                            المحفظة (بدون تجزئة معاملة)، يُفحص عنوان Tron على
                            Tron، وعنوان Solana على Solana، وعنوان 0x على أول
                            شبكة من تلك الشبكات الست التي أرسل عليها معاملة أو
                            يحتفظ فيها بالرمز المميز، أو على Ethereum عندما لا
                            يكون نشطاً على أي منها. تختلف تغطية المزود المتصل؛
                            وتتطلب LIGHTNING مزوداً متصلاً مدعوماً.
                          example: BASE
                subject:
                  type: object
                  description: موضوع المعاملة (مقدم الطلب).
                  required:
                    - vendor_data
                    - full_name
                  properties:
                    entity_type:
                      type: string
                      description: 'نوع الكيان: `individual` أو `company`.'
                    vendor_data:
                      type: string
                      description: معرّفك الداخلي للمستخدم/الشركة.
                      example: user-12345
                    full_name:
                      type: string
                      description: الاسم الكامل للشخص محل الفحص.
                      example: Maria Garcia
                    first_name:
                      type: string
                      description: الاسم الأول للشخص المعني.
                    last_name:
                      type: string
                      description: اسم العائلة للشخص المعني.
                    date_of_birth:
                      type: string
                      format: date
                      description: تاريخ الميلاد (YYYY-MM-DD).
                    address:
                      type: object
                      description: كائن العنوان.
                      properties:
                        country:
                          type: string
                          description: >-
                            رمز الدولة (يُوصى بـ ISO 3166-1 alpha-3). يُنسخ إلى
                            `country_code` الخاص بالطرف.
                        town:
                          type: string
                        state:
                          type: string
                        street:
                          type: string
                        post_code:
                          type: string
                    institution_details:
                      type: object
                      description: تفاصيل المؤسسة (للكيانات المؤسسية).
                      properties:
                        name:
                          type: string
                        code:
                          type: string
                        address:
                          type: object
                    device_context:
                      type: object
                      description: >-
                        سياق الجهاز الذي تم التقاطه في وقت المعاملة. يجب إرسال
                        browser_family وplatform كمفاتيح صريحة من المستوى الأعلى
                        — ولا يتم اشتقاقهما من user_agent. الاسم البديل بصيغة
                        camelCase وهو device مقبول أيضاً في الطلب.
                      properties:
                        fingerprint:
                          type: string
                          description: بصمة جهاز فريدة.
                        persistent_device_id:
                          type: string
                          description: معرّف جهاز ثابت عبر الجلسات (مخطط البصمة v2).
                        user_agent:
                          type: string
                          description: >-
                            سلسلة وكيل المستخدم (user agent) للمتصفح أو التطبيق.
                            الاسم البديل بصيغة CamelCase هو: userAgent.
                        browser_family:
                          type: string
                          description: >-
                            عائلة المتصفح (مثل Chrome، وFirefox، وSafari). يجب
                            إرسالها بشكل صريح — لا يتم استخلاصها من user_agent.
                            الاسم البديل بصيغة CamelCase هو: browserFamily.
                        browser_version:
                          type: string
                          description: >-
                            سلسلة إصدار المتصفح. يجب إرسالها بشكل صريح. الاسم
                            البديل بصيغة CamelCase هو: browserVersion.
                        platform:
                          type: string
                          description: >-
                            معرّف المنصة (web، ios، android، macos، windows،
                            linux). يجب إرساله صراحةً — لا يُشتق من user_agent.
                        os_family:
                          type: string
                          description: >-
                            عائلة نظام التشغيل (مثل iOS وAndroid وWindows).
                            الاسم البديل بنمط CamelCase: osFamily.
                        os_version:
                          type: string
                          description: >-
                            سلسلة إصدار نظام التشغيل. الاسم البديل بنمط
                            CamelCase: osVersion.
                        accept_language:
                          type: string
                          description: >-
                            قيمة ترويسة Accept-Language. الاسم البديل بنمط سنام
                            الجمل (CamelCase): acceptLang.
                        session_id:
                          type: string
                          description: >-
                            معرّف الجلسة لجلسة المستخدم الحالية. يُخزَّن في
                            البيانات الوصفية. الاسم البديل بصيغة CamelCase هو
                            sessionId.
                        session_age_ms:
                          type: number
                          description: >-
                            عمر جلسة المستخدم بالمللي ثانية في وقت المعاملة.
                            الاسم البديل بنمط CamelCase: sessionAgeMs.
                        network_context:
                          type: object
                          description: >-
                            سياق الشبكة متضمناً عنوان IP والموقع الجغرافي. تم
                            أيضاً دمج كتلة ipInfo ذات المستوى الأعلى في هذا
                            الكائن.
                          properties:
                            ip_address:
                              type: string
                              description: >-
                                عنوان IP الخاص بالعميل. الاسم البديل بنمط
                                CamelCase هو: ip.
                            ip_country_code:
                              type: string
                              description: >-
                                دولة عنوان IP المحددة جغرافياً (ISO 3166-1
                                alpha-3). الاسم البديل بأسلوب CamelCase:
                                countryCode3.
                            latitude:
                              type: number
                              description: >-
                                خط العرض الجغرافي لعنوان IP. الاسم البديل بنمط
                                CamelCase هو: lat.
                            longitude:
                              type: number
                              description: >-
                                خط الطول الجغرافي لعنوان IP. الاسم البديل بنمط
                                CamelCase هو: lon.
                    payment_method:
                      type: object
                      description: طريقة الدفع التي استخدمها الشخص المعني.
                      properties:
                        method_type:
                          type: string
                          description: >-
                            نوع طريقة الدفع: `bank_card`، `bank_account`،
                            `crypto_wallet`، `ewallet`، `unhosted_wallet`،
                            `other`.
                        account_id:
                          type: string
                          description: >-
                            معرّف الحساب (مثل IBAN، عنوان المحفظة). لفحص العملات
                            المشفرة، يجب أن يحتوي هذا على عنوان المحفظة لهذا
                            المشارك. يتطلب فحص تجزئة المعاملة الواردة عنوان
                            إيداع الخدمة/العميل للطرف المعني. يستخدم الفحص
                            الصادر المحفظة الوجهة لدى الطرف المقابل. في
                            التحويلات المشفرة عبر bitcoin أو Lightning، قد يكون
                            طلب دفع Lightning (فاتورة BOLT11 أو عرض BOLT12 أو
                            LNURL) أو Lightning Address: تخزن Didit المستفيد
                            الذي تحدده كحساب ("" عندما لا تحدد أحداً) وما ينص
                            عليه الطلب في `chain_details.lightning` الخاص بتحويل
                            Travel Rule. بحد أقصى 255 حرفاً بمجرد تخزينه. في
                            التحويلات المشفرة عبر bitcoin أو Lightning، قد يكون
                            طلب دفع Lightning (فاتورة BOLT11 أو عرض BOLT12 أو
                            LNURL) أو Lightning Address: تخزن Didit المستفيد
                            الذي تحدده كحساب ("" عندما لا تحدد أحداً) وما ينص
                            عليه الطلب في `chain_details.lightning` الخاص بتحويل
                            Travel Rule. بحد أقصى 255 حرفاً بمجرد تخزينه.
                        memo:
                          type: string
                          maxLength: 256
                          description: >-
                            علامة الوجهة (destination tag) أو المذكرة (memo)
                            التي تشكل جزءًا من المحفظة على شبكة تستخدم المذكرات
                            (XRP وXLM وEOS وATOM وHBAR). في عنوان منصة التداول
                            المشترك الواحد، تكون كل مذكرة طريقة دفع مستقلة
                            بذاتها. XRP: علامة وجهة، وهي عدد صحيح من 0 إلى
                            4294967295 (يُقبل رقم JSON). XLM: مذكرة نصية يصل
                            حجمها إلى 28 بايت، أو معرّف 64-بت أو تجزئة 32-بايت
                            بالنظام الست عشري (hex). EOS: ما يصل إلى 256 بايت.
                            ATOM: ما يصل إلى 256 حرفًا. HBAR: ما يصل إلى 100
                            بايت. لا تقبل محافظ Bitcoin وEVM وSolana وTron
                            وLitecoin وBitcoin Cash وDogecoin وLightning أي
                            مذكرات: ووجود واحدة ينتج عنه `400`. الاسم البديل:
                            `destinationTag` أو `destination_tag`.
                        issuing_country:
                          type: string
                          description: رمز دولة جهة الإصدار وفق المعيار ISO 3166-1 alpha-3.
                counterparty:
                  type: object
                  description: الطرف المقابل للمعاملة (اختياري).
                  properties:
                    entity_type:
                      type: string
                      description: 'نوع الكيان: `individual` أو `company`.'
                    vendor_data:
                      type: string
                      description: معرّفك الداخلي للطرف المقابل.
                    full_name:
                      type: string
                      description: الاسم الكامل للطرف المقابل.
                    first_name:
                      type: string
                    last_name:
                      type: string
                    date_of_birth:
                      type: string
                      format: date
                    address:
                      type: object
                      description: >-
                        كائن العنوان مع `country` (وفق معيار ISO 3166-1
                        alpha-3).
                    institution_details:
                      type: object
                    device_context:
                      type: object
                      description: >-
                        سياق الجهاز للطرف المقابل. يجب إرسال browser_family
                        وplatform كمفاتيح صريحة في المستوى الأعلى — فهما لا
                        يُستخرجان من user_agent.
                      properties:
                        fingerprint:
                          type: string
                          description: بصمة جهاز فريدة.
                        persistent_device_id:
                          type: string
                          description: معرّف جهاز ثابت عبر الجلسات (مخطط البصمة v2).
                        user_agent:
                          type: string
                          description: >-
                            سلسلة وكيل المستخدم (user agent) للمتصفح أو التطبيق.
                            الاسم البديل بصيغة CamelCase هو: userAgent.
                        browser_family:
                          type: string
                          description: >-
                            عائلة المتصفح (مثل Chrome، وFirefox، وSafari). يجب
                            إرسالها بشكل صريح — لا يتم استخلاصها من user_agent.
                            الاسم البديل بصيغة CamelCase هو: browserFamily.
                        browser_version:
                          type: string
                          description: >-
                            سلسلة إصدار المتصفح. يجب إرسالها بشكل صريح. الاسم
                            البديل بصيغة CamelCase هو: browserVersion.
                        platform:
                          type: string
                          description: >-
                            معرّف المنصة (web، ios، android، macos، windows،
                            linux). يجب إرساله صراحةً — لا يُشتق من user_agent.
                        os_family:
                          type: string
                          description: >-
                            عائلة نظام التشغيل (مثل iOS وAndroid وWindows).
                            الاسم البديل بنمط CamelCase: osFamily.
                        os_version:
                          type: string
                          description: >-
                            سلسلة إصدار نظام التشغيل. الاسم البديل بنمط
                            CamelCase: osVersion.
                        accept_language:
                          type: string
                          description: >-
                            قيمة ترويسة Accept-Language. الاسم البديل بنمط سنام
                            الجمل (CamelCase): acceptLang.
                        session_id:
                          type: string
                          description: >-
                            معرّف الجلسة لجلسة الطرف المقابل. يُخزَّن في
                            البيانات الوصفية. الاسم البديل بصيغة CamelCase هو
                            sessionId.
                        session_age_ms:
                          type: number
                          description: >-
                            عمر جلسة المستخدم بالمللي ثانية في وقت المعاملة.
                            الاسم البديل بنمط CamelCase: sessionAgeMs.
                        network_context:
                          type: object
                          description: >-
                            سياق الشبكة متضمناً عنوان IP والموقع الجغرافي. تم
                            أيضاً دمج كتلة ipInfo ذات المستوى الأعلى في هذا
                            الكائن.
                          properties:
                            ip_address:
                              type: string
                              description: >-
                                عنوان IP الخاص بالعميل. الاسم البديل بنمط
                                CamelCase هو: ip.
                            ip_country_code:
                              type: string
                              description: >-
                                دولة عنوان IP المحددة جغرافياً (ISO 3166-1
                                alpha-3). الاسم البديل بأسلوب CamelCase:
                                countryCode3.
                            latitude:
                              type: number
                              description: >-
                                خط العرض الجغرافي لعنوان IP. الاسم البديل بنمط
                                CamelCase هو: lat.
                            longitude:
                              type: number
                              description: >-
                                خط الطول الجغرافي لعنوان IP. الاسم البديل بنمط
                                CamelCase هو: lon.
                    payment_method:
                      type: object
                      description: >-
                        طريقة الدفع المستخدمة من قبل الطرف المقابل. في معاملات
                        travelRule، يُصرّح `method_type: "unhosted_wallet"` بأن
                        محفظة الطرف المقابل ذاتية الاستضافة: يتخطى التحويل توجيه
                        VASP للطرف المقابل، ويتم إنشاؤه مباشرة في
                        `UNCONFIRMED_OWNERSHIP`، و(عند تمكين
                        `auto_wallet_verification`) يتم إنشاء جلسة أداة ملكية
                        المحفظة تلقائياً وإرجاعها في كتلة `action_required`
                        الخاصة بالمعاملة.
                      properties:
                        method_type:
                          type: string
                          description: >-
                            نوع طريقة الدفع: `bank_card`، `bank_account`،
                            `crypto_wallet`، `ewallet`، `unhosted_wallet`،
                            `other`. استخدم `unhosted_wallet` للإقرار بمحفظة
                            ذاتية الاستضافة وفقاً لـ Travel Rule.
                        account_id:
                          type: string
                          description: >-
                            معرّف الحساب (مثل IBAN أو عنوان). في التحويلات
                            المشفرة عبر bitcoin أو Lightning، قد يكون طلب دفع
                            Lightning (فاتورة BOLT11 أو عرض BOLT12 أو LNURL) أو
                            Lightning Address: تخزن Didit المستفيد الذي تحدده
                            كحساب ("" عندما لا تحدد أحداً) وما ينص عليه الطلب في
                            `chain_details.lightning` الخاص بتحويل Travel Rule.
                            بحد أقصى 255 حرفاً بمجرد تخزينه. في التحويلات
                            المشفرة عبر bitcoin أو Lightning، قد يكون طلب دفع
                            Lightning (فاتورة BOLT11 أو عرض BOLT12 أو LNURL) أو
                            Lightning Address: تخزن Didit المستفيد الذي تحدده
                            كحساب ("" عندما لا تحدد أحداً) وما ينص عليه الطلب في
                            `chain_details.lightning` الخاص بتحويل Travel Rule.
                            بحد أقصى 255 حرفاً بمجرد تخزينه.
                        memo:
                          type: string
                          maxLength: 256
                          description: >-
                            علامة الوجهة (destination tag) أو المذكرة (memo)
                            التي تشكل جزءًا من المحفظة على شبكة تستخدم المذكرات
                            (XRP وXLM وEOS وATOM وHBAR). في عنوان منصة التداول
                            المشترك الواحد، تكون كل مذكرة طريقة دفع مستقلة
                            بذاتها. XRP: علامة وجهة، وهي عدد صحيح من 0 إلى
                            4294967295 (يُقبل رقم JSON). XLM: مذكرة نصية يصل
                            حجمها إلى 28 بايت، أو معرّف 64-بت أو تجزئة 32-بايت
                            بالنظام الست عشري (hex). EOS: ما يصل إلى 256 بايت.
                            ATOM: ما يصل إلى 256 حرفًا. HBAR: ما يصل إلى 100
                            بايت. لا تقبل محافظ Bitcoin وEVM وSolana وTron
                            وLitecoin وBitcoin Cash وDogecoin وLightning أي
                            مذكرات: ووجود واحدة ينتج عنه `400`. الاسم البديل:
                            `destinationTag` أو `destination_tag`.
                        issuing_country:
                          type: string
                custom_properties:
                  type: object
                  description: >-
                    أزواج مفتاح-قيمة عشوائية مرفقة بالمعاملة. يمكن الإشارة إلى
                    كل مفتاح في شروط القواعد باستخدام مسار الحقل
                    `custom_values.<key>`.
                  additionalProperties: true
                  example:
                    merchant_id: test
                    bank_name: test_2
                travel_rule_details:
                  type: object
                  description: >-
                    بيانات Travel Rule. عند تفعيل Travel Rule وتعيين
                    transaction_category إلى travel_rule، تدير Didit عملية
                    التبادل بنفسها: فهي تتجاهل status وprotocol وrequired
                    وobligations_count، وتستخدم originator_data
                    وbeneficiary_data وmetadata. بخلاف ذلك، تخزن Didit هذه القيم
                    كسجل سلبي لـ Travel Rule. أثناء تفعيل Travel Rule، يجب أن
                    يحمل التحويل الصادر الذي يصل إلى الحد الخاص بك أو يتجاوزه ما
                    يتطلبه نظامه (EU TFR أو توصية FATF رقم 16)، مع التحقق من
                    الأطراف التي ترسلها: يؤدي وجود حقل مفقود إلى استجابة 400 ضمن
                    `travel_rule_details.originator_data` أو
                    `travel_rule_details.beneficiary_data`، على سبيل المثال
                    "تتطلب EU TFR اسم المُرسِل."
                  required:
                    - status
                  properties:
                    status:
                      type: string
                      description: >-
                        مطلوب عندما ترسل travel_rule_details. إحدى حالات تحويل
                        Travel Rule (على سبيل المثال AWAITING_COUNTERPARTY أو
                        COMPLETED أو NOT_APPLICABLE)؛ وتُقبل أيضاً وتُربط
                        التهجئات بالأحرف الصغيرة وبصيغة camelCase والقيم القديمة
                        UNKNOWN وCOMPLIANT وPENDING_ACTION وPENDING_COUNTERPARTY
                        وFAILED وEXEMPT. أي قيمة أخرى ترجع 400.
                    protocol:
                      type: string
                    required:
                      type: boolean
                    obligations_count:
                      type: integer
                    originator_data:
                      type: object
                      description: >-
                        جهة المُرسِل، كحقول مسطحة أو شخص واحد وفق معيار IVMS
                        101. بالنسبة للمستخدم الخاص بك الذي لديه عملية تحقق KYC
                        مقبولة، يستبدل Didit الحقول التي تحتويها عملية التحقق
                        بالقيم التي تم التحقق منها (راجع
                        `metadata.originator_provenance`). يجب أن يكون كائناً:
                        أي شيء آخر يؤدي إلى خطأ `400`. في شبكة تعتمد على
                        المذكرات، يحدد مفتاح `memo` مذكرة أو وسم محفظة المُرسِل.
                    beneficiary_data:
                      type: object
                      description: >-
                        طرف المستفيد، إما كحقول مسطحة أو كشخص واحد وفق معيار
                        IVMS 101. يجب أن يكون كائناً: وأي شيء غير ذلك يُرجع
                        `400`. لتوجيه التحويل، تقرأ Didit كلاً من
                        `wallet_address` (يتم ملء القيمة الفارغة من
                        `counterparty.payment_method.account_id`)، و`chain` (يتم
                        ملؤها من
                        `transaction_details.crypto_params.crypto_chain` أو
                        `currency` إذا كانت تحدد شبكة مدعومة)، و`name` (مع
                        الرجوع إلى `counterparty.full_name`)، و`travel_address`،
                        و`counterparty_vasp_name`، و`counterparty_vasp_lei`،
                        و`counterparty_vasp_email`. في الشبكات التي تستخدم memo،
                        يحدد `memo` المذكرة أو الوسم الخاص بمحفظة المستفيد؛
                        ويكون لـ `wallet_address` و`memo` الأولوية على طريقة دفع
                        الطرف المقابل.
                    metadata:
                      type: object
                    utxo:
                      allOf:
                        - $ref: '#/components/schemas/TravelRuleUtxo'
                      description: >-
                        اختياري، لسلاسل UTXO فقط (BTC و LTC و BCH و DOGE).
                        مدخلات المعاملة ومخرجاتها، والتي تستنتج منها Didit محفظة
                        المُرسِل ومخرج المستفيد عندما لا تحددهما.
                    originator:
                      type: object
                      description: >-
                        كتلة المُرسِل وفق IVMS 101: `originatorPersons` (شخص
                        واحد إما `naturalPerson` أو `legalPerson`؛ والشخص
                        الاعتباري يجعل الطرف شركة) و `accountNumber` (عناوين
                        المحافظ). يُستخدم لـ `originator_data` عندما يكون هذا
                        الكائن فارغاً. تُرجع الكتلة المشوهة استجابة 400 محددة
                        بمسارها، على سبيل المثال `originator.originatorPersons`.
                    beneficiary:
                      type: object
                      description: >-
                        كتلة المستفيد وفق IVMS 101: `beneficiaryPersons` (شخص
                        واحد إما `naturalPerson` أو `legalPerson`؛ والشخص
                        الاعتباري يجعل الطرف شركة) و `accountNumber` (عناوين
                        المحافظ). يُستخدم لـ `beneficiary_data` عندما يكون هذا
                        الكائن فارغاً. تُرجع الكتلة المشوهة استجابة 400 محددة
                        بمسارها، على سبيل المثال
                        `beneficiary.beneficiaryPersons`.
                    ivms101:
                      type: object
                      description: >-
                        كتلتا `originator` و`beneficiary` مغلفتان في كائن IVMS
                        101 واحد (يُقبل `IVMS101` أيضاً). تكون الأولوية للكتل
                        ذات المستوى الأعلى على كتل الغلاف.
                network_snapshot:
                  type: object
                  description: لقطة مخطط شبكة محسوبة مسبقاً.
                  properties:
                    nodes:
                      type: array
                      items:
                        type: object
                    edges:
                      type: array
                      items:
                        type: object
                    metrics:
                      type: object
                include_crypto_screening:
                  type: boolean
                  nullable: true
                  description: >-
                    تجاوز لكل معاملة لفحص تحليلات البلوكتشين للعملات المشفرة.
                    عندما تكون القيمة `true`، يتم إجراء فحص العملات المشفرة بصرف
                    النظر عن الإعداد الافتراضي للتطبيق. وعندما تكون `false`، يتم
                    تخطي فحص العملات المشفرة حتى لو كان مفعلاً في إعدادات
                    التطبيق. وعند إغفاله أو تعيينه كـ `null`، يتم استخدام
                    الإعداد الافتراضي على مستوى التطبيق والمُهيأ في لوحة التحكم
                    Console. يتطلب فحص العملات المشفرة
                    `transaction_details.direction`، و`currency_kind: "crypto"`،
                    وسلسلة/عملة، وعنوان المحفظة المحدد بواسطة الاتجاه: يستخدم
                    الفحص السابق للتحويل الوارد
                    `counterparty.payment_method.account_id`، ويستخدم فحص تجزئة
                    المعاملة الواردة `subject.payment_method.account_id`، بينما
                    يستخدم الفحص الصادر
                    `counterparty.payment_method.account_id`. عندما يحتوي
                    `transaction_details.payment_reference_id` على تجزئة معاملة
                    على البلوكتشين، تُجري Didit فحص المعاملة وتُرجع إثراء ملخص
                    المعاملة عند توفره.
              required:
                - transaction_id
                - transaction_category
                - transaction_details
                - subject
            examples:
              Minimal fiat withdrawal:
                summary: أصغر payload مقبول لتحويل عملة ورقية (fiat) صادر
                value:
                  transaction_id: your-txn-2026-05-17-001
                  transaction_category: finance
                  transaction_details:
                    direction: outbound
                    amount: 1500
                    currency: EUR
                    action_type: withdrawal
                  subject:
                    entity_type: individual
                    vendor_data: user-12345
                    full_name: Maria Garcia
              Crypto outbound with screening:
                summary: سحب عملات مشفرة صادر إلى محفظة ذاتية الاستضافة، مع فحص اختياري
                value:
                  transaction_id: your-txn-2026-05-17-002
                  transaction_category: finance
                  include_crypto_screening: true
                  transaction_details:
                    direction: outbound
                    amount: 0.5
                    currency: BTC
                    currency_kind: crypto
                    amount_in_default_currency: 32500
                    default_currency: USD
                    action_type: withdrawal
                  subject:
                    entity_type: individual
                    vendor_data: user-12345
                    full_name: Maria Garcia
                    payment_method:
                      method_type: crypto_wallet
                      account_id: bc1qexampleexchangewalletaddressxyz
                      issuing_country: ESP
                  counterparty:
                    entity_type: individual
                    payment_method:
                      method_type: unhosted_wallet
                      account_id: bc1qexampleexternalwalletaddressabc
              Travel Rule transfer:
                summary: >-
                  تحويل عملات مشفرة صادر مع بيانات المُرسِل/المستفيد وفقاً لـ
                  Travel Rule
                value:
                  transaction_id: your-txn-2026-05-17-003
                  transaction_category: travel_rule
                  transaction_details:
                    direction: outbound
                    amount: 25000
                    currency: USDT
                    currency_kind: crypto
                    action_type: transfer
                  subject:
                    entity_type: individual
                    vendor_data: user-12345
                    full_name: Maria Garcia
                    date_of_birth: '1992-03-14'
                    address:
                      country: ESP
                      town: Madrid
                      street: Calle Mayor 1
                      post_code: '28013'
                  counterparty:
                    entity_type: individual
                    full_name: John Beneficiary
                    institution_details:
                      name: Beneficiary VASP, Inc.
                      code: BVASP-US
                  travel_rule_details:
                    status: AWAITING_COUNTERPARTY
                    protocol: IVMS101
                    required: true
                    originator_data:
                      name: Maria Garcia
                    beneficiary_data:
                      name: John Beneficiary
      responses:
        '201':
          description: >-
            تم إرسال المعاملة وتتم مراقبتها. يحتوي نص الاستجابة على تفاصيل
            المعاملة الكاملة (بنفس شكل `GET
            /v3/transactions/{transaction_id}/`)، بما يعكس أي نتائج قواعد تم
            تطبيقها بالفعل.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TransactionDetail'
              examples:
                Approved with no rule hits:
                  value:
                    uuid: abcdef12-3456-4890-abcd-ef1234567890
                    environment: live
                    transaction_number: 4123
                    txn_id: your-txn-2026-05-17-001
                    txn_date: '2026-05-17T08:42:00Z'
                    zone_id: Europe/Madrid
                    transaction_type: finance
                    action_type: withdrawal
                    direction: OUTBOUND
                    status: APPROVED
                    source: LIVE
                    amount: '1500'
                    currency: EUR
                    currency_type: fiat
                    amount_in_default_currency: '1620.45'
                    default_currency_code: USD
                    preferred_currency_amount: '1620.45'
                    preferred_currency_code: USD
                    payment_details: Withdrawal to crypto wallet
                    payment_txn_id: null
                    score: 0
                    severity: null
                    decision_reason_code: null
                    decision_reason_label: null
                    vendor_data: user-12345
                    metadata:
                      subject:
                        entity_type: individual
                        vendor_data: user-12345
                        full_name: Maria Garcia
                        address: {}
                        institution_details: {}
                        device_context: {}
                      counterparty: {}
                    props: {}
                    tags: []
                    parties:
                      - uuid: b1111111-2222-4333-8444-555555555555
                        role: APPLICANT
                        entity_type: individual
                        kind: USER
                        vendor_data: user-12345
                        full_name: Maria Garcia
                        first_name: null
                        last_name: null
                        country_code: null
                        dob: null
                        address: {}
                        institution_info: {}
                        device: {}
                        external_party_snapshot: null
                    payment_methods: []
                    documents: []
                    activities:
                      - uuid: d4e5f6a7-8901-4bcd-9ef0-123456789abc
                        activity_type: TRANSACTION_CREATED
                        source: TRANSACTION
                        status: APPROVED
                        title: withdrawal
                        description: Transaction recorded.
                        metadata: {}
                        occurred_at: '2026-05-17T08:42:11Z'
                    alerts: []
                    rule_runs: []
                    provider_results: []
                    travel_rule: null
                    network_snapshot: null
                    remediation: null
                    action_required: null
                    cost_breakdown: null
                Flagged for review:
                  value:
                    uuid: abcdef12-3456-4890-abcd-ef1234567891
                    environment: live
                    transaction_number: 4124
                    txn_id: your-txn-2026-05-17-002
                    txn_date: '2026-05-17T08:42:00Z'
                    zone_id: Europe/Madrid
                    transaction_type: finance
                    action_type: withdrawal
                    direction: OUTBOUND
                    status: IN_REVIEW
                    source: LIVE
                    amount: '0.5'
                    currency: BTC
                    currency_type: crypto
                    amount_in_default_currency: '32500'
                    default_currency_code: USD
                    preferred_currency_amount: '32500'
                    preferred_currency_code: USD
                    payment_details: Withdrawal to crypto wallet
                    payment_txn_id: null
                    score: 78
                    severity: HIGH
                    decision_reason_code: WALLET_HIGH_RISK
                    decision_reason_label: Destination wallet flagged as high risk
                    vendor_data: user-12345
                    metadata:
                      subject:
                        entity_type: individual
                        vendor_data: user-12345
                        full_name: Maria Garcia
                        address: {}
                        institution_details: {}
                        device_context: {}
                      counterparty: {}
                    props:
                      order_id: ord-9988
                    tags: []
                    parties:
                      - uuid: b1111111-2222-4333-8444-555555555555
                        role: APPLICANT
                        entity_type: individual
                        kind: USER
                        vendor_data: user-12345
                        full_name: Maria Garcia
                        first_name: null
                        last_name: null
                        country_code: null
                        dob: null
                        address: {}
                        institution_info: {}
                        device: {}
                        external_party_snapshot: null
                    payment_methods: []
                    documents: []
                    activities: []
                    alerts:
                      - uuid: a7b8c9d0-1234-4abc-9def-567890abcdef
                        title: Destination wallet flagged as high risk
                        description: Provider risk score exceeded the configured threshold.
                        severity: HIGH
                        status: OPEN
                        source: RULE
                        metadata: {}
                        created_at: '2026-05-17T08:42:12Z'
                        due_at: null
                    rule_runs:
                      - uuid: e5f6a7b8-9012-4cde-af01-23456789abcd
                        rule: f6a7b8c9-0123-4def-b012-3456789abcde
                        rule_title: High-risk wallet screening
                        rule_description: null
                        rule_category: crypto
                        matched: true
                        is_test: false
                        mode: ACTIVE
                        severity: HIGH
                        score_delta: 78
                        status_target: IN_REVIEW
                        action_summary: score +78; change_status:IN_REVIEW
                        metadata: {}
                        created_at: '2026-05-17T08:42:12Z'
                    provider_results: []
                    travel_rule: null
                    network_snapshot: null
                    remediation: null
                    action_required: null
                    cost_breakdown: null
        '400':
          description: >-
            فشل التحقق (حقول مطلوبة مفقودة، أو تكرار لـ `transaction_id`، أو
            قيمة enum غير معروفة، أو عملة غير صالحة، وما إلى ذلك).
          content:
            application/json:
              examples:
                Missing required field:
                  value:
                    transaction_details:
                      amount:
                        - This field is required.
                Duplicate transaction_id:
                  value:
                    transaction_id:
                      - A transaction with this transaction_id already exists.
                Invalid category:
                  value:
                    non_field_errors:
                      - Unsupported transaction category.
                Missing subject identity:
                  value:
                    subject:
                      - subject.vendor_data and subject.full_name are required.
                Blocklisted participant:
                  value:
                    vendor_data:
                      - >-
                        The individual 'user-12345' is in the blocklist and
                        cannot participate in transactions.
        '403':
          description: >-
            مفتاح API مفقود أو غير صالح أو ملغى، أو لا يمكن للمفتاح إرسال
            معاملات لهذا التطبيق. يعيد المفتاح المفقود `403`؛ بينما يعيد المفتاح
            الخاطئ أو الملغى أو منتهي الصلاحية `401`.
          content:
            application/json:
              examples:
                Forbidden:
                  value:
                    detail: You do not have permission to perform this action.
        '409':
          description: >-
            أنشأ طلب آخر يحمل نفس `transaction_id` المعاملة أثناء معالجة هذا
            الطلب، لذا ينجح إرسال واحد فقط من عمليتي إرسال متزامنتين. اقرأ
            المعاملة الحالية بدلاً من إعادة الإرسال.
          content:
            application/json:
              examples:
                Concurrent duplicate:
                  value:
                    detail: A transaction with this transaction_id already exists.
        '429':
          description: >-
            تم تجاوز حد المعدل: تتشارك عمليات إنشاء المعاملات واستيعاب الأحداث
            (`POST /v3/transactions/`، `POST /v3/events/`، `POST
            /v3/events/batch/`) رصيداً قدره 600 طلب في الدقيقة لكل مفتاح API،
            وهو منفصل عن رصيد الـ 300 المشترك بين سائر طلبات الكتابة الأخرى.
            انتظر لعدد الثواني المحدد في `Retry-After`، ثم أعد المحاولة.
          headers:
            Retry-After:
              description: >-
                عدد الثواني التي يجب انتظارها قبل إعادة المحاولة، مقربة للأعلى
                لتقع إعادة المحاولة في النافذة التالية.
              schema:
                type: integer
                minimum: 1
                example: 30
          content:
            application/json:
              examples:
                Throttled:
                  value:
                    detail: >-
                      Ingestion rate limit exceeded. You can make up to 600
                      requests per minute.
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: |-
            curl -X POST 'https://verification.didit.me/v3/transactions/' \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -d '{
                "transaction_id": "your-txn-2026-05-17-001",
                "transaction_category": "finance",
                "transaction_details": {
                  "direction": "outbound",
                  "amount": 1500,
                  "currency": "EUR",
                  "action_type": "withdrawal"
                },
                "subject": {
                  "entity_type": "individual",
                  "vendor_data": "user-12345",
                  "full_name": "Maria Garcia"
                }
              }'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.transactions.create(
                transaction_id="your-txn-2026-05-17-001",
                transaction_category="finance",
                transaction_details={
                    "direction": "outbound",
                    "amount": 1500.0,
                    "currency": "EUR",
                    "action_type": "withdrawal",
                },
                subject={
                    "entity_type": "individual",
                    "vendor_data": "user-12345",
                    "full_name": "Maria Garcia",
                },
            )
            print(result)
        - lang: javascript
          label: Node.js
          source: |-
            import Didit from "@didit-protocol/sdk-node";

            // Reads DIDIT_API_KEY.
            const didit = new Didit();

            const result = await didit.transactions.create({
              transaction_id: "your-txn-2026-05-17-001",
              transaction_category: "finance",
              transaction_details: {
                direction: "outbound",
                amount: 1500.0,
                currency: "EUR",
                action_type: "withdrawal",
              },
              subject: {
                entity_type: "individual",
                vendor_data: "user-12345",
                full_name: "Maria Garcia",
              },
            });
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Transactions.Create(ctx, didit.TransactionsCreateParams{\n\tTransactionID:       \"your-txn-2026-05-17-001\",\n\tTransactionCategory: \"finance\",\n\tTransactionDetails: didit.TransactionsCreateParamsTransactionDetails{\n\t\tDirection:  \"outbound\",\n\t\tAmount:     1500.0,\n\t\tCurrency:   \"EUR\",\n\t\tActionType: didit.String(\"withdrawal\"),\n\t},\n\tSubject: didit.TransactionsCreateParamsSubject{\n\t\tEntityType: didit.String(\"individual\"),\n\t\tVendorData: \"user-12345\",\n\t\tFullName:   \"Maria Garcia\",\n\t},\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: >-
            import me.didit.Didit;

            import me.didit.types.TransactionsCreateParams;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.transactions().create(TransactionsCreateParams.builder()
                    .transactionId("your-txn-2026-05-17-001")
                    .transactionCategory(TransactionsCreateParams.TransactionCategory.of("finance"))
                    .transactionDetails(TransactionsCreateParams.TransactionDetails.builder()
                            .direction(TransactionsCreateParams.TransactionDetails.Direction.of("outbound"))
                            .amount(1500.0)
                            .currency("EUR")
                            .actionType("withdrawal")
                            .build())
                    .subject(TransactionsCreateParams.Subject.builder()
                            .entityType("individual")
                            .vendorData("user-12345")
                            .fullName("Maria Garcia")
                            .build())
                    .build());
            System.out.println(result);
        - lang: php
          label: PHP
          source: |-
            <?php

            require 'vendor/autoload.php';

            use Didit\DiditClient;

            // Reads DIDIT_API_KEY.
            $didit = new DiditClient();

            $result = $didit->transactions->create([
                'transaction_id' => 'your-txn-2026-05-17-001',
                'transaction_category' => 'finance',
                'transaction_details' => [
                    'direction' => 'outbound',
                    'amount' => 1500.0,
                    'currency' => 'EUR',
                    'action_type' => 'withdrawal',
                ],
                'subject' => [
                    'entity_type' => 'individual',
                    'vendor_data' => 'user-12345',
                    'full_name' => 'Maria Garcia',
                ],
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

            # Reads DIDIT_API_KEY.
            didit = Didit::Client.new

            result = didit.transactions.create(
              transaction_id: "your-txn-2026-05-17-001",
              transaction_category: "finance",
              transaction_details: {
                direction: "outbound",
                amount: 1500.0,
                currency: "EUR",
                action_type: "withdrawal",
              },
              subject: {
                entity_type: "individual",
                vendor_data: "user-12345",
                full_name: "Maria Garcia",
              }
            )
            puts result.to_h
        - lang: csharp
          label: .NET
          source: >-
            using System;

            using System.Text.Json;

            using Didit;


            // Reads DIDIT_API_KEY.

            using var client = new DiditClient();


            var result = await client.Transactions.CreateAsync(new
            TransactionsCreateParams

            {
                TransactionId = "your-txn-2026-05-17-001",
                TransactionCategory = "finance",
                TransactionDetails = new()
                {
                    Direction = "outbound",
                    Amount = 1500.0,
                    Currency = "EUR",
                    ActionType = "withdrawal",
                },
                Subject = new()
                {
                    EntityType = "individual",
                    VendorData = "user-12345",
                    FullName = "Maria Garcia",
                },
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    TravelRuleUtxo:
      type: object
      description: >-
        مدخلات ومخرجات تحويل UTXO (BTC، LTC، BCH، DOGE). تُقبل فقط على تلك
        السلاسل: يُرجع رمز `400` على أي سلسلة أخرى. يستنتج Didit منها محفظة
        المُرسِل (المعلنة، وإلا فعنوان المدخلات الأكثر مساهمة) ومخرج المستفيد
        (المعلن، وإلا فالمخرج الوحيد الذي لا يعيد الدفع إلى عنوان مدخل كفكة،
        وإلا فالمخرج الفردي الذي يدفع مبلغ التحويل). تظهر النتيجة في
        `chain_details` الخاصة بالتحويل.
      required:
        - outputs
      properties:
        inputs:
          type: array
          maxItems: 1000
          items:
            $ref: '#/components/schemas/TravelRuleUtxoEntry'
          description: >-
            اختياري. بدون مدخلات، لا يتم استنتاج أي مُرسِل ولا يتم التعرف على أي
            مخرج فكة.
        outputs:
          type: array
          minItems: 1
          maxItems: 1000
          items:
            $ref: '#/components/schemas/TravelRuleUtxoEntry'
    TransactionDetail:
      type: object
      description: >-
        سجل المراقبة الكامل لمعاملة واحدة، كما يتم إرجاعه بواسطة `GET
        /v3/transactions/{transaction_id}/` و`POST /v3/transactions/`.
      properties:
        uuid:
          type: string
          format: uuid
          description: >-
            معرّف المعاملة الثابت من Didit. يُستخدم كـ `{transaction_id}`
            لعمليات الاستدعاء اللاحقة.
        environment:
          type: string
          enum:
            - live
            - sandbox
          description: >-
            بيئة التطبيق الذي يملك المعاملة. يتم تخزين معاملة `sandbox` ولكن لا
            يتم تقييمها أو فحصها أو إرسال إشعارات بشأنها أو فوترتها مطلقاً، لذا
            فإن القيمة الفارغة لـ `rule_runs` تعني "لم يتم التقييم".
        transaction_number:
          type: integer
          description: >-
            رقم المعاملة التسلسلي بنطاق التطبيق المعروض في وحدة التحكم (مثل
            `4123`).
        txn_id:
          type: string
          description: >-
            معرّف `transaction_id` الذي أدخلته وقت الإنشاء (بحد أقصى 128 حرفاً).
            فريد لكل تطبيق.
        txn_date:
          type: string
          format: date-time
          description: >-
            وقت حدوث المعاملة (من `transaction_at`؛ القيمة الافتراضية هي وقت
            الإرسال).
        zone_id:
          type: string
          nullable: true
          description: معرّف المنطقة الزمنية لـ IANA المقدم في وقت الإنشاء.
        transaction_type:
          type: string
          description: >-
            الفئة ذات المستوى الأعلى كما تم تخزينها: `finance`، `kyc`،
            `travelRule`، `userPlatformEvent`، `gamblingBet`،
            `gamblingLimitChange`، `gamblingBonusChange`، `auditTrailEvent`.
            يُرجى ملاحظة أن القيم المتعددة الكلمات يتم إرجاعها بصيغة camelCase
            حتى لو تم إرسالها بصيغة snake_case.
        action_type:
          type: string
          description: >-
            النوع الفرعي ضمن الفئة (مثل `deposit`، `withdrawal`، `transfer`).
            يتم تعيينه افتراضياً إلى الفئة عند عدم تقديمه.
        direction:
          type: string
          enum:
            - INBOUND
            - OUTBOUND
          description: >-
            الاتجاه بالنسبة إلى الشخص المعني. يُخزّن بأحرف كبيرة بصرف النظر عن
            حالة الأحرف المُرسلة (يُقبل `in`/`out`/`inbound`/`outbound` في
            المدخلات).
        status:
          type: string
          enum:
            - APPROVED
            - IN_REVIEW
            - DECLINED
            - AWAITING_USER
          description: >-
            قرار المراقبة الحالي. يتم إنشاء المعاملات بالحالة `APPROVED`؛ وقد
            تغيرها القواعد إلى `IN_REVIEW`/`DECLINED` بشكل متزامن.
        source:
          type: string
          enum:
            - LIVE
            - IMPORTED
          description: >-
            مصدر نشأة السجل: `LIVE` للمعاملات المرسلة عبر API أو SDK،
            و`IMPORTED` للمعاملات المحملة عبر الاستيراد من لوحة التحكم.
        amount:
          type: string
          description: >-
            مبلغ المعاملة كسلسلة عشرية مع تجريد الأصفار اللاحقة (على سبيل المثال
            `"1500"`، `"0.5"`، `"0.123456789012345678"`). حتى 18 منزلة عشرية.
        currency:
          type: string
          description: >-
            رمز العملة الخاص بـ `amount`. يُقبل أي رمز أبجدي وفق معيار ISO 4217
            (مثل `EUR`، و`USD`، و`NGN`)، وكذلك يُقبل رمز أصل مشفر (مثل `BTC`).
            يُفضل استخدام رمز متداول حالياً. ليس لكل رمز مقبول سعر صرف: عندما لا
            يتوفر سعر صرف للرمز (على سبيل المثال وحدة المحاسبة `XSU` وفق ISO، أو
            رمز عملة مشفرة لا تحدد Didit سعراً له)، يفشل التحويل التلقائي ويتم
            إرجاع `preferred_currency_amount` بقيمة فارغة (null) ما لم يقدّم
            الطلب قيمة محولة مسبقاً في `amount_in_default_currency`.
        currency_type:
          type: string
          nullable: true
          description: '`fiat` أو `crypto`، كما تم إرسالها في `currency_kind`.'
        amount_in_default_currency:
          type: string
          nullable: true
          description: >-
            المبلغ المحوّل مسبقاً الذي قدّمته، كسلسلة نصية عشرية مع إزالة
            الأصفار اللاحقة.
        default_currency_code:
          type: string
          nullable: true
        preferred_currency_amount:
          type: string
          nullable: true
          description: '`amount` محولاً إلى العملة المفضلة للتطبيق، عندما يكون متاحًا.'
        preferred_currency_code:
          type: string
          nullable: true
        payment_details:
          type: string
          nullable: true
          description: مرجع الدفع أو الملاحظة بنص حر من الإرسال.
        payment_txn_id:
          type: string
          nullable: true
          description: >-
            مرجع نظام الدفع الخارجي (مثل تجزئة معاملة البلوكتشين) من
            `payment_reference_id`.
        score:
          type: integer
          description: >-
            درجة المخاطر التراكمية الناتجة عن القواعد (عادة من 0 إلى 100).
            القيمة الأعلى = مخاطر أكبر.
        severity:
          type: string
          nullable: true
          enum:
            - UNKNOWN
            - LOW
            - MEDIUM
            - HIGH
            - CRITICAL
          description: >-
            شدة المخاطر المصنفة المحددة بواسطة القواعد/المزودين (`UNKNOWN`،
            `LOW`، `MEDIUM`، `HIGH`، `CRITICAL`). تكون `null` حتى يحددها إجراء
            ما.
        decision_reason_code:
          type: string
          nullable: true
          description: السبب المقروء آلياً للحالة الحالية `status`.
        decision_reason_label:
          type: string
          nullable: true
          description: تسمية سهلة القراءة لـ `decision_reason_code`.
        vendor_data:
          type: string
          nullable: true
          description: نسخة ميسّرة من `vendor_data` الخاصة بمقدم الطلب.
        metadata:
          type: object
          description: >-
            لقطة من payload لـ `subject` و`counterparty` كما تم إرسالها في وقت
            الإنشاء.
        props:
          type: object
          description: >-
            الخصائص `custom_properties` التي قدمتها وقت الإنشاء. يمكن الوصول إلى
            كل مفتاح في شروط القواعد عبر `custom_values.<key>`.
        tags:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              name:
                type: string
              color:
                type: string
              description:
                type: string
                nullable: true
              source:
                type: string
                enum:
                  - didit
                  - custom
                description: ما إذا كان الوسم إعداداً مسبقاً من Didit أو وسماً مخصصاً.
          description: العلامات المرفقة بالمعاملة (يدوياً أو عبر القواعد).
        parties:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              role:
                type: string
                enum:
                  - APPLICANT
                  - REMITTER
                  - BENEFICIARY
                  - COUNTERPARTY
                description: >-
                  دور الطرف. يُعيّن endpoint الإنشاء كلاً من `APPLICANT`
                  (الموضوع) و`COUNTERPARTY`.
              entity_type:
                type: string
                enum:
                  - individual
                  - company
                  - external
                  - unhostedWallet
              kind:
                type: string
                enum:
                  - USER
                  - BUSINESS
                  - EXTERNAL
                description: >-
                  ترتبط أطراف `USER`/`BUSINESS` بكيان مملوك لـ Didit عبر
                  `vendor_data`. أما أطراف `EXTERNAL` فلا يوجد كيان Didit خلفها.
              vendor_data:
                type: string
                nullable: true
                description: معرّفك الداخلي للمستخدم/الشركة.
              full_name:
                type: string
                nullable: true
              first_name:
                type: string
                nullable: true
              last_name:
                type: string
                nullable: true
              country_code:
                type: string
                nullable: true
                description: >-
                  رمز الدولة من `address.country` المُرسل (عادة ISO 3166-1
                  alpha-3).
              dob:
                type: string
                format: date
                nullable: true
                description: تاريخ الميلاد من `date_of_birth` المُرسل.
              address:
                type: object
                description: كائن العنوان كما تم إرساله. يكون `{}` عند حذفه.
              institution_info:
                type: object
                description: تفاصيل المؤسسة كما تم إرسالها. `{}` عند عدم تقديمها.
              device:
                type: object
                description: >-
                  سياق الجهاز المعياري، بما في ذلك إثراء عنوان IP من جانب الخادم
                  ضمن network_context (الموقع الجغرافي، وإشارات VPN/مركز
                  البيانات) عند تقديم عنوان IP.
                properties:
                  fingerprint:
                    type: string
                    description: بصمة جهاز فريدة.
                  persistent_device_id:
                    type: string
                    description: معرّف جهاز ثابت عبر الجلسات (مخطط البصمة v2).
                  user_agent:
                    type: string
                    description: سلسلة وكيل المستخدم (user agent) للمتصفح أو التطبيق.
                  browser_family:
                    type: string
                    description: عائلة المتصفح (مثل Chrome، وFirefox، وSafari).
                  browser_version:
                    type: string
                    description: سلسلة إصدار المتصفح.
                  platform:
                    type: string
                    description: معرّف المنصة (web، ios، android، macos، windows، linux).
                  os_family:
                    type: string
                    description: عائلة نظام التشغيل (مثل iOS وAndroid وWindows).
                  os_version:
                    type: string
                    description: سلسلة إصدار نظام التشغيل.
                  accept_language:
                    type: string
                    description: قيمة ترويسة Accept-Language.
                  session_id:
                    type: string
                    description: معرّف الجلسة (المخزّن في البيانات الوصفية).
                  session_age_ms:
                    type: number
                    description: عمر الجلسة بالمللي ثانية.
                  network_context:
                    type: object
                    description: سياق الشبكة متضمناً عنوان IP والموقع الجغرافي.
                    properties:
                      ip_address:
                        type: string
                        description: عنوان IP الخاص بالعميل.
                      ip_country_code:
                        type: string
                        description: دولة عنوان IP المحددة جغرافياً (ISO 3166-1 alpha-3).
                      latitude:
                        type: number
                        description: خط العرض الجغرافي لعنوان IP.
                      longitude:
                        type: number
                        description: خط الطول الجغرافي لعنوان IP.
              external_party_snapshot:
                type: object
                nullable: true
                description: >-
                  نسخة مجمّدة من بيانات الطرف للأطراف من نوع `EXTERNAL`. تكون
                  `null` طالما أن الطرف مرتبط بمستخدم أو شركة في Didit.
          description: أطراف المعاملة (مقدم الطلب، الطرف المقابل).
        payment_methods:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              payment_method_type:
                type: string
                enum:
                  - bank_card
                  - bank_account
                  - e_wallet
                  - crypto_wallet
                  - unhosted_wallet
                  - other
              label:
                type: string
                nullable: true
              fingerprint:
                type: string
                nullable: true
                description: >-
                  تشفير SHA-256 لـ `type:account_id:issuing_country` — معرّف
                  ثابت لربط تكرار استخدام الأداة نفسها.
              account_id:
                type: string
                nullable: true
                description: معرّف الحساب (IBAN، عنوان، token البطاقة، …).
              issuing_country:
                type: string
                nullable: true
              owner_kind:
                type: string
                enum:
                  - USER
                  - BUSINESS
                  - EXTERNAL
              vendor_data:
                type: string
                nullable: true
                description: المعرّف الخاص بك للمستخدم/الشركة المالكة.
              owner_name:
                type: string
                nullable: true
              institution_info:
                type: object
              details:
                type: object
                description: كائن `payment_method` الخام كما تم إرساله.
              external_owner_snapshot:
                type: object
                nullable: true
              role:
                type: string
                enum:
                  - SOURCE
                  - DESTINATION
                  - FUNDING
                  - BENEFICIARY
                description: >-
                  كيفية استخدام هذه الطريقة في المعاملة. يحدد endpoint الإنشاء
                  القيمة `SOURCE`/`DESTINATION` بناءً على الاتجاه (الصادر:
                  الموضوع = SOURCE؛ الوارد: الموضوع = DESTINATION).
          description: طرق الدفع المرتبطة بالمعاملة.
        documents:
          type: array
          description: >-
            الملفات المرفقة بالمعاملة من لوحة التحكم. `[]` في حال عدم وجود أي
            ملفات.
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              label:
                type: string
                nullable: true
              note:
                type: string
                nullable: true
              uploaded_by:
                type: string
                nullable: true
              created_at:
                type: string
                format: date-time
              files:
                type: array
                items:
                  type: object
                  properties:
                    uuid:
                      type: string
                      format: uuid
                    file_url:
                      type: string
                      format: uri
                      nullable: true
                      description: >-
                        رابط URL موقّع قصير الأجل للتنزيل؛ اطلبه عند الحاجة
                        بدلاً من تخزينه.
                    original_filename:
                      type: string
                      nullable: true
                    file_size:
                      type: integer
                      nullable: true
        activities:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              activity_type:
                type: string
                description: >-
                  على سبيل المثال `TRANSACTION_CREATED`، أو
                  `TRANSACTION_NOTE_ADDED`، أو `TRANSACTION_STATUS_CHANGED`.
              source:
                type: string
              status:
                type: string
                nullable: true
              title:
                type: string
                nullable: true
              description:
                type: string
                nullable: true
              metadata:
                type: object
              occurred_at:
                type: string
                format: date-time
          description: >-
            مدخلات سجل الأنشطة (الإنشاء، الملاحظات، المراجعات اليدوية، تغييرات
            الحالة).
        alerts:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              title:
                type: string
              description:
                type: string
                nullable: true
              severity:
                type: string
                enum:
                  - UNKNOWN
                  - LOW
                  - MEDIUM
                  - HIGH
                  - CRITICAL
              status:
                type: string
                enum:
                  - OPEN
                  - INVESTIGATING
                  - AWAITING_USER
                  - PENDING_SAR
                  - SAR_FILED
                  - RESOLVED
                  - DISMISSED
              source:
                type: string
                enum:
                  - RULE
                  - PROVIDER
                  - MANUAL
              metadata:
                type: object
              created_at:
                type: string
                format: date-time
              due_at:
                type: string
                format: date-time
                nullable: true
          description: >-
            فارغ دائماً اليوم. التنبيه المفتوح هو معاملة بالحالة `IN_REVIEW` أو
            `AWAITING_USER`.
        rule_runs:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              rule:
                type: string
                format: uuid
                description: معرّف UUID للقاعدة التي تم تشغيلها.
              rule_title:
                type: string
              rule_description:
                type: string
                nullable: true
              rule_category:
                type: string
              matched:
                type: boolean
                description: >-
                  ما إذا كانت شروط القاعدة تطابقت مع هذه المعاملة. يتم تسجيل
                  التشغيل فقط للقواعد المتطابقة، لذلك تحمل التقييمات الحية
                  دائماً القيمة `true`.
              is_test:
                type: boolean
                description: >-
                  تكون القيمة True عندما تعمل القاعدة في وضع الاختبار TEST (دون
                  أي تأثير على الحالة/الدرجة).
              mode:
                type: string
                enum:
                  - ACTIVE
                  - DISABLED
                  - TEST
              severity:
                type: string
                nullable: true
              score_delta:
                type: integer
                description: الدرجة المضافة بواسطة إجراءات `add_score` الخاصة بهذه القاعدة.
              status_target:
                type: string
                nullable: true
                description: الحالة المحددة بواسطة إجراء `change_status`، إن وُجدت.
              action_summary:
                type: string
                nullable: true
                description: >-
                  ملخص للإجراءات التي نفذتها القاعدة، مفصولة بـ `; ` (مثل `score
                  +30; change_status:IN_REVIEW; add_tag:high_risk_country`).
                  الأجزاء: `score +N`، و`change_status:<STATUS>`،
                  و`add_tag:<name>`، و`add_note`، و`add_to_list`، و`open_case`.
                  تكون القيمة `null` عندما لا تنفذ القاعدة أي إجراء.
              metadata:
                type: object
                description: >-
                  تفاصيل التقييم: `scope_match`، و`conditions[]`،
                  و`aggregations[]`. يحمل كل إدخال شرط `field`، و`operator`،
                  و`expected_value`، و`current_value` المقروءة من المعاملة،
                  و`matched`، و`group_index`، و`group_logic`. ويحمل كل إدخال
                  تجميع (السرعة / العدد / المجموع) `metric`، و`field`،
                  و`operator`، و`expected_value`، و`computed_value`، أي القيمة
                  التي انتهى إليها التجميع، و`window`، و`filters`، و`matched`،
                  و`sample_references`؛ وتحتوي التجميعات غير المتزامنة المؤجلة
                  على `computed_value: null` و`deferred: true`. مجموعة الشروط
                  المتداخلة هي إدخال `conditions[]` واحد مع `operator` بقيمة
                  `any_of` أو `all_of`، و`field` بقيمة null، ونتائج أعضائها تحت
                  `conditions` الخاصة بها.
              created_at:
                type: string
                format: date-time
          description: >-
            نتائج التنفيذ لكل قاعدة — أي القواعد تم تشغيلها، وما هو تأثيرها على
            درجة المخاطر.
        provider_results:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              provider:
                type: string
              result_type:
                type: string
                enum:
                  - FIAT_MONITORING
                  - WALLET_SCREENING
                  - TRANSACTION_SCREENING
                  - TRAVEL_RULE
                  - NETWORK_GRAPH
                  - CUSTOM
              status:
                type: string
              severity:
                type: string
                nullable: true
              score:
                type: integer
              summary:
                type: string
                nullable: true
              payload:
                type: object
                description: payload استجابة المزود الخام.
              created_at:
                type: string
                format: date-time
          description: بيانات payload الخام من المزود (فحص AML، تحليلات البلوكتشين، إلخ).
        travel_rule:
          nullable: true
          allOf:
            - $ref: '#/components/schemas/TransactionTravelRule'
          description: >-
            تحويل أو فحص Travel Rule. تتم تعبئته عند إرسال
            `travel_rule_details`، وكذلك عند تفعيل Travel Rule وإنشاء المعاملة
            مع `transaction_category: travelRule` (تبدأ Didit التبادل بنفسها،
            حتى بدون `travel_rule_details`). وتكون القيمة `null` في حال عدم وجود
            تحويل أو فحص. في التحويل الوارد، تظل بيانات `originator_data`
            و`beneficiary_data` الخاصة بالطرف المقابل محجوبة (`data_masked:
            true`) حتى يتم تأكيد ملكية المحفظة.
        network_snapshot:
          type: object
          nullable: true
          description: >-
            لقطة المخطط للمعاملات/الأطراف ذات الصلة المستخدمة بواسطة محرك
            القواعد. إما `network_snapshot` المُرسلة مع المعاملة أو المخطط الذي
            تُنشئه Didit من فحص AML ناجح للمحفظة (والذي يحل محل المخطط
            المُرسَل). وتكون `null` عندما لا يوجد أي منهما.
          properties:
            uuid:
              type: string
              format: uuid
            nodes:
              type: array
              items:
                type: object
            edges:
              type: array
              items:
                type: object
            metrics:
              type: object
        remediation:
          type: object
          nullable: true
          description: >-
            جلسة معالجة معروضة على المستخدم عندما تكون إعادة التحقق مطلوبة. حلت
            محلها `action_required`، وهي الكتلة القياسية؛ تم الإبقاء عليها
            للتوافق مع الإصدارات السابقة.
          properties:
            session_id:
              type: string
            session_token:
              type: string
            url:
              type: string
              format: uri
            status:
              type: string
        action_required:
          type: object
          nullable: true
          description: >-
            الإجراء المعلّق المطلوب من المستخدم النهائي لإكمال هذه المعاملة، أو
            null في حال عدم وجود أي إجراء. تشغّل حزم Didit SDK الإجراء تلقائياً
            بشكل افتراضي وتحدّث المعاملة عند انتهائه. نوعان، يتم التمييز بينهما
            بواسطة `type`: `verification_session` (جلسة تحقق مستضافة تم إنشاؤها
            بواسطة إجراء قاعدة) و`wallet_ownership` (جلسة أداة ملكية المحفظة
            التي تم إنشاؤها تلقائياً لتحويل Travel Rule الذي يتطلب إثبات التحكم
            في المحفظة، مقيد بإعداد Travel Rule المسمى
            `auto_wallet_verification`). عند إمكانية تطبيق كليهما، تكون الأولوية
            لـ `wallet_ownership` لأنه يعطل تبادل Travel Rule.
          oneOf:
            - $ref: '#/components/schemas/TransactionVerificationSessionAction'
            - $ref: '#/components/schemas/TransactionWalletOwnershipAction'
          discriminator:
            propertyName: type
            mapping:
              verification_session: '#/components/schemas/TransactionVerificationSessionAction'
              wallet_ownership: '#/components/schemas/TransactionWalletOwnershipAction'
        cost_breakdown:
          type: object
          nullable: true
          description: >-
            تكلفة هذه المعاملة: `total_price` و `items`، عنصر واحد لكل رسم،
            ويتضمن كل منها `usage_type` و `price` و `details` و `created_at`.
            إعادة فحص المعاملة نفسها تُعد عنصراً جديداً.
    TravelRuleUtxoEntry:
      type: object
      description: مدخل أو مخرج واحد لمعاملة UTXO، كما سجلتها السلسلة.
      required:
        - address
      properties:
        address:
          type: string
          maxLength: 128
        amount:
          type: string
          nullable: true
          description: >-
            سلسلة نصية عشرية بالوحدة الخاصة بالعملة (BTC وليس بالساتوشي).
            اختياري.
          example: '0.0125'
        txid:
          type: string
          maxLength: 128
          description: اختياري. المعاملة التي ينفقها مدخل ما.
        vout:
          type: integer
          nullable: true
          minimum: 0
          description: اختياري. فهرس المخرج الذي ينفقه مدخل ما.
    TransactionTravelRule:
      type: object
      description: >-
        تحويل Travel Rule الخاص بالمعاملة، كما تُرجعه `GET
        /v3/transactions/{transaction_id}/`، والرمز `201` لـ `POST
        /v3/transactions/` وكل صف في `GET /v3/transactions/`. تتخذ الحقول
        `direction` و `rail` و `counterparty_vasp` و `delivery` و `discovery` و
        `reason` و `next_actions` الهيكل نفسه الموجود في `PATCH
        /v3/transactions/{transaction_id}/travel-rule/`، لذا فإن قراءة واحدة
        للمعاملة توضح سبب تعثر تحويلها وما الذي يدفعه للمضي قدماً.
      properties:
        uuid:
          type: string
          format: uuid
        status:
          type: string
        protocol:
          type: string
          nullable: true
        required:
          type: boolean
        obligations_count:
          type: integer
        originator_data:
          type: object
          description: >-
            جهة المُرسِل. بالنسبة للتحويلات الواردة، يتم حجب قيم الطرف المقابل
            حتى يتم تأكيد الملكية.
        beneficiary_data:
          type: object
          description: >-
            طرف المستفيد. بالنسبة للتحويلات الواردة، يتم حجب قيم الطرف المقابل
            حتى يتم تأكيد الملكية.
        name_match:
          type: object
          nullable: true
          description: >-
            مقارنة الاسم التي حسمت التحويل (الدرجة والصرامة). تظل Null حتى يتم
            تشغيل مقارنة واحدة. يتم إخفاء الأسماء المقارنة مع الأطراف.
        data_match:
          $ref: '#/components/schemas/TravelRuleDataMatch'
        mismatched_fields:
          type: array
          items:
            type: string
          description: >-
            اختصار لـ `data_match.mismatched_fields`. يكون فارغاً عندما لا يختلف
            أي شيء.
        data_unmasked:
          $ref: '#/components/schemas/TravelRuleDataUnmasked'
        data_masked:
          type: boolean
          description: >-
            صحيح طالما أن البيانات الشخصية للطرف المقابل محجوبة في هذه
            الاستجابة.
        metadata:
          type: object
        direction:
          type: string
          enum:
            - INBOUND
            - OUTBOUND
          description: أي طرف في التبادل يمثله هذا التحويل.
        rail:
          type: string
          nullable: true
          description: >-
            المسار الذي تم التحويل عبره: `INTERNAL`، أو `TRP`، أو `GTR`، أو
            `TRUST`، أو `VERIFYVASP`، أو `SYGNA`، أو `EMAIL` (`TEST_VASP` في
            تطبيق يعمل في البيئة التجريبية، عندما يجيب Didit Test VASP)، أو
            `null` حتى يتم اختيار مسار.
        counterparty_vasp:
          type: object
          nullable: true
          properties:
            name:
              type: string
            lei:
              type: string
            dd_score:
              type: integer
              description: >-
                درجة العناية الواجبة من 0 إلى 100، حيث تكون القيمة الأعلى أفضل.
                نفس المقياس المعتمد في دليل VASP.
            dd_score_breakdown:
              type: object
              description: >-
                مساهمات كل مكون في dd_score، كائن واحد لكل مكون كما هو موضح في
                دليل VASP (الاختصاص القضائي، التحقق، البروتوكول، معرّف الكيان
                القانوني LEI، السجل، الأساسيات، الاستجابة)، كل منها يحتوي على
                {points, max, reason, detail}. تكون القيمة {} حتى يتم تقييم
                الطرف المقابل.
              additionalProperties:
                type: object
                properties:
                  points:
                    type: number
                    description: النقاط الممنوحة لهذا المكوّن.
                  max:
                    type: integer
                    description: الحد الأقصى للنقاط التي يمكن لهذا المكوّن منحها.
                  reason:
                    type: string
                    description: رمز مقروء آلياً لقرار المكوّن.
                  detail:
                    type: string
                    description: سبب مقروء للبشر للنقاط الممنوحة.
            dd_assessed_at:
              type: string
              format: date-time
              nullable: true
              description: >-
                وقت آخر تشغيل لتقييم العناية الواجبة. القيمة Null حتى يتم تقييم
                الطرف المقابل.
          description: إدخال الدليل للطرف المقابل، أو `null` إذا لم يربط التحويل أي إدخال.
        delivery:
          nullable: true
          allOf:
            - $ref: '#/components/schemas/TravelRuleDelivery'
          description: >-
            أحدث رسالة تدين بها عملية التحويل لطرف آخر. تكون `null` عندما لا
            تدين بأي رسالة، على سبيل المثال عند كون القيمة أقل من
            `threshold_amount` أو في حالة محفظة ذاتية الاستضافة مصرّح بها.
        discovery:
          type: array
          description: >-
            كيف بحثت Didit عن الطرف المقابل، إدخال واحد لكل خطوة تم تشغيلها.
            يكون فارغاً عند عدم تشغيل أي عملية اكتشاف، على سبيل المثال في
            المعاملات الواردة.
          items:
            $ref: '#/components/schemas/TravelRuleDiscoveryStep'
        reason:
          type: string
          description: >-
            سبب تعثر معاملة بحالة `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` عندما لا يُقدم التتبع أي سبب آخر.
            تؤدي إعادة الإرسال إلى تحريك المعاملة، وبالتالي يتم مسح السبب. راجع
            [سبب تعثر
            المعاملة](/ar/transaction-monitoring/travel-rule#لماذا-يتوقف-التحويل).
        next_actions:
          type: array
          description: >-
            ما يتيح متابعة التحويل؛ `[]` لأي حالة باستثناء
            `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`.
          items:
            $ref: '#/components/schemas/TravelRuleNextAction'
        chain_details:
          $ref: '#/components/schemas/TravelRuleChainDetails'
    TransactionVerificationSessionAction:
      title: Verification session
      type: object
      properties:
        type:
          type: string
          enum:
            - verification_session
        url:
          type: string
          format: uri
          description: رابط التحقق المستضاف لفتحه للمستخدم النهائي.
        session_id:
          type: string
          format: uuid
          description: معرّف جلسة التحقق.
        session_token:
          type: string
          description: >-
            token الجلسة، يُستخدم بواسطة حزم SDK للأجهزة المحمولة لتشغيل سير
            العمل محليًا.
        status:
          type: string
          description: حالة جلسة التحقق.
      required:
        - type
        - url
    TransactionWalletOwnershipAction:
      title: Wallet ownership
      type: object
      properties:
        type:
          type: string
          enum:
            - wallet_ownership
        url:
          type: string
          format: uri
          description: >-
            رابط أداة إثبات ملكية المحفظة المستضافة. افتحه في متصفح حقيقي - على
            الأجهزة المحمولة استخدم SFSafariViewController أو Chrome Custom Tab،
            ولا تستخدم أبداً عرض ويب مضمّناً.
        widget_session_id:
          type: string
          format: uuid
          description: معرّف جلسة أداة إثبات ملكية المحفظة.
        expires_at:
          type: string
          format: date-time
          description: وقت انتهاء صلاحية جلسة الأداة.
      required:
        - type
        - url
    TravelRuleDataMatch:
      type: object
      nullable: true
      description: >-
        مقارنة حقلاً بحقل لبيانات طرف التحويل مع ما يعرفه الطرف الآخر عن صاحب
        المحفظة. تذكر أسماء الحقول والنتائج، ولا تذكر القيم مطلقاً، بحيث تظل
        قابلة للقراءة مع حجب بيانات الطرف المقابل. تكون Null حتى يتم إجراء
        المقارنة.
      properties:
        matched:
          type: boolean
          description: تكون القيمة True عندما لا يختلف أي حقل تمت مقارنته.
        mismatched_fields:
          type: array
          items:
            type: string
            enum:
              - name
              - date_of_birth
              - address
              - account
          description: الحقول التي تختلف.
        fields:
          type: object
          description: >-
            إدخال واحد لكل حقل خضع للمقارنة لنوع كيان الطرف (`name`، أو
            `date_of_birth`، أو `address`، أو `account`؛ لا تمتلك الشركة حقل
            `date_of_birth`).
          additionalProperties:
            type: object
            properties:
              result:
                type: string
                enum:
                  - matched
                  - mismatched
                  - not_compared
                description: >-
                  `not_compared` عندما تكون القاعدة `NONE` أو لا يمتلك أي من
                  الطرفين قيمة للحقل.
              strictness:
                type: string
                enum:
                  - NONE
                  - STRICT
                  - CONTAINS
                  - DEFAULT
                  - FUZZY
    TravelRuleDataUnmasked:
      type: object
      nullable: true
      description: >-
        سجل تدقيق للحظة التي تم فيها كشف بيانات الطرف المقابل. تكون القيمة فارغة
        (Null) طالما بقيت البيانات محجوبة، وكذلك للتحويلات الصادرة.
      properties:
        at:
          type: string
          format: date-time
        reason:
          type: string
          enum:
            - ownership_confirmed
            - wallet_proof
            - address_book_match
            - own_verified_wallet
            - inquiry_approved
            - known_payment_method
            - travel_address
          description: >-
            ما أكّد الملكية: ownership_confirmed (تأكيدك من خلال لوحة التحكم أو
            API)، أو wallet_proof (إثبات المحفظة في الأداة، أو تحويل وارد داخلي
            INTERNAL، يُعيّن عند إنشائه)، أو address_book_match (محفظة تم التحقق
            منها في دفتر العناوين)، أو own_verified_wallet (المحفظة الخاصة
            بمستخدمك والتي تم التحقق منها)، أو inquiry_approved (موافقتك على
            استفسار TRP وارد أو رسالة GTR أو Sygna)، أو known_payment_method
            (محفظة دفع بها مستخدمك بالفعل)، أو travel_address (عنوان Travel
            Address الخاص بكل محفظة الذي يحمل اسم المحفظة).
        actor:
          type: string
          description: >-
            من أكده: البريد الإلكتروني لمستخدم لوحة التحكم أو تسمية مفتاح API.
            فارغ في حالة القرار التلقائي.
    TravelRuleDelivery:
      type: object
      description: >-
        حالة آخر رسالة يتعين على التحويل إرسالها إلى الطرف المقابل. تتواصل Didit
        مع الطرف المقابل بعد عودة استجابة الطلب الذي أنشأ التحويل أو عدّله، لذا
        يوضح هذا الكائن ما إذا كانت تلك الرسالة قد وصلت: في قائمة الانتظار
        (queued)، أو قيد الإرسال (being sent)، أو في انتظار إعادة المحاولة بعد
        حدوث خطأ (waiting to be retried after an error)، أو تم تسليمها
        (delivered)، أو فشلت (failed). عند حدوث فشل قد تتعافى منه الشبكة لاحقاً
        (عدم وجود رد في الوقت المحدد، أو فشل الاتصال، أو رموز HTTP `408` أو
        `429` أو `5xx`)، تتم إعادة المحاولة بعد 30 ثانية، ودقيقتين، و10 دقائق،
        و30 دقيقة، وساعة واحدة. عندما تفشل الرسالة الأولى (`kind: SEND`)
        نهائياً، إما لأن الشبكة رفضتها أو لأن المحاولة السادسة فشلت أيضاً، ينتقل
        التحويل إلى `COUNTERPARTY_VASP_NOT_REACHABLE` مع تسجيل `last_error` في
        `timeline` الخاص به؛ وأي رسالة أخرى تفشل نهائياً يتم تدوينها في
        `timeline`. وتظل `status` الخاصة بالتحويل هي المصدر الموثوق للمعلومة
        بخصوص عملية التبادل نفسها.
      required:
        - kind
        - status
        - rail
        - attempts
        - last_error
        - next_attempt_at
        - delivered_at
      properties:
        kind:
          type: string
          enum:
            - SEND
            - ANSWER
            - TXID
            - CANCEL
            - POLL
          description: >-
            ما تحمله الرسالة. `SEND`: أول رسالة للتحويل تُرسل إلى الطرف المقابل
            (صادرة؛ يتم اختيار المسار عند إرسالها). `ANSWER`: قبولك أو رفضك،
            المرسل إلى الشبكة التي قدمت الطلب (واردة). `TXID`: تجزئة المعاملة
            على السلسلة، بعد إنهاء التحويل. `CANCEL`: الإلغاء، بعد إلغائه.
            `POLL`: استعلام عن الحالة إلى شبكة تتيح ذلك، ويتكرر كل 5 دقائق أثناء
            انتظار التحويل للطرف المقابل.
        status:
          type: string
          enum:
            - QUEUED
            - SENDING
            - RETRYING
            - DELIVERED
            - FAILED
          description: >-
            `QUEUED`: في انتظار الإرسال. `SENDING`: هناك محاولة قيد التشغيل.
            `RETRYING`: فشلت محاولة وستعمل المحاولة التالية في
            `next_attempt_at`. `DELIVERED`: استلم الطرف الآخر الرسالة. `FAILED`:
            رفضها الطرف الآخر، أو فشلت المحاولة الأخيرة.
        rail:
          type: string
          enum:
            - INTERNAL
            - TRP
            - GTR
            - TRUST
            - VERIFYVASP
            - SYGNA
            - EMAIL
            - ''
          description: >-
            المسار الذي ينقل الرسالة. يكون فارغاً حتى تختار Didit مساراً للرسالة
            الأولى.
        attempts:
          type: integer
          minimum: 0
          description: >-
            المحاولات التي تمت حتى الآن لهذه الرسالة. تتم محاولة إرسال الرسالة
            التي لا تُعد استطلاعاً للحالة 6 مرات على الأكثر.
        last_error:
          type: string
          description: >-
            نوع الفشل الذي واجهته المحاولة الأخيرة، أو `""` في حال عدم وجود فشل:
            على سبيل المثال `email undeliverable` أو `trp identity endpoint
            unreachable` أو `trp transfer inquiry delivery failed`. ولا يحمل
            أبداً إجابة الطرف المقابل نفسها، والتي تبقى في `timeline` الخاص
            بالتحويل.

            عندما يستجيب GTR بخطأ، يتم تضمين رمز الحالة ورسالته الخاصة. لا يتم
            تضمين أجسام الاستجابة أبداً.
          example: email undeliverable
        next_attempt_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            متى يتم تشغيل المحاولة التالية بينما تكون الرسالة بحالة `QUEUED` أو
            `RETRYING`.
        delivered_at:
          type: string
          format: date-time
          nullable: true
          description: متى استلم الطرف الآخر الرسالة.
    TravelRuleDiscoveryStep:
      type: object
      description: >-
        خطوة واحدة من عملية اكتشاف الطرف المقابل التي أجراها Didit لتحويل صادر،
        بالترتيب الذي تم تنفيذها به. تنتهي السلسلة بأول خطوة تحدد VASP له مسار.
      properties:
        step:
          type: string
          enum:
            - internal_address_book
            - wallet_attribution
            - network_lookup
            - customer_hint
            - end_user
          description: >-
            `internal_address_book`: عميل آخر لـ Didit أثبت تحكمه في محفظة
            الوجهة. `wallet_attribution`: إسناد تحليلات البلوكتشين إلى المحفظة.
            `network_lookup`: شبكة يمكنها تحديد أي VASP يحتفظ بالعنوان.
            `customer_hint`: اسم VASP أو معرّف الكيان القانوني (LEI) أو الولاية
            القضائية التي أرسلتها في `beneficiary_data`. `end_user`: الطرف
            المقابل الذي اختاره المستخدم النهائي (أو أنت)، أو طلب اختياره.
        outcome:
          type: string
          enum:
            - match
            - miss
            - skipped
          description: >-
            `match`: حددت الخطوة طرفاً مقابلاً. `miss`: تم تشغيلها ولم تعثر على
            أي طرف. `skipped`: تعذر تشغيلها، ويوضح `reason` السبب.
        reason:
          type: string
          description: >-
            سبب مقروء آلياً، ويكون `""` عند وجود تطابق:
            `no_proven_internal_wallet`، أو `attribution_disabled`، أو
            `already_attributed`، أو `no_attributed_entity`، أو
            `directory_match_no_route`، أو
            `gtr_address_lookup_runs_on_dispatch`، أو `no_membership`، أو
            `network_switched_off`، أو `no_network_address_lookup`، أو
            `no_directory_match`، أو `awaiting_end_user`، أو
            `picked_member_without_proven_wallet`.
        vasp:
          type: string
          format: uuid
          nullable: true
          description: الـ VASP الموجود في الدليل الذي حددته الخطوة، إذا حددت واحداً.
        rail:
          type: string
          nullable: true
          description: المسار الذي يصل إلى ذلك الطرف المقابل، عندما تعثر الخطوة على مسار.
        at:
          type: string
          format: date-time
    TravelRuleNextAction:
      type: object
      description: >-
        إجراء واحد ينقل تحويلاً بحالة `COUNTERPARTY_VASP_NOT_FOUND` أو
        `COUNTERPARTY_VASP_NOT_REACHABLE` إلى المرحلة التالية. راجع [أسباب تعثر
        التحويل](/ar/transaction-monitoring/travel-rule#لماذا-يتوقف-التحويل).
      properties:
        action:
          type: string
          enum:
            - select_counterparty_vasp
            - declare_self_hosted
            - add_vasp_hint
            - update_compliance_email
            - resend
          description: >-
            `select_counterparty_vasp`: يختار المستخدم النهائي VASP الوجهة في
            أداة إثبات ملكية المحفظة، أو تقوم بتنفيذ PATCH مع
            `action=beneficiary_vasp`. `declare_self_hosted`: يصرّح المستخدم
            النهائي بأن المحفظة ذاتية الاستضافة في الأداة. `add_vasp_hint`: أبلغ
            Didit بهوية الطرف المقابل، باستخدام اسم VASP، أو LEI، أو Travel
            Address (على سبيل المثال `travel_address` في إدخال دفتر العناوين
            الخاص بمحفظة الوجهة)، ثم أعد الإرسال. `update_compliance_email`
            و`resend` هما قيمتان للمعامل `action` في `PATCH
            /v3/transactions/{transaction_id}/travel-rule/`: أرسل البريد
            الإلكتروني للامتثال الخاص بالطرف المقابل مجدداً، وأعد تشغيل التوجيه.
        url:
          type: string
          format: uri
          description: >-
            رابط أداة ملكية المحفظة، في `select_counterparty_vasp`
            و`declare_self_hosted` أثناء وجود جلسة أداة مفتوحة للتحويل.
      required:
        - action
    TravelRuleChainDetails:
      type: object
      description: >-
        كيفية تسمية سلسلة التحويل لمحفظتيه، وذلك عندما يكون هناك أكثر من عنوان
        يدفع لآخر. يكون فارغاً (`{}`) لتحويلات سلاسل الحسابات (EVM، Solana،
        Tron)، حيث يكون العنوانان هما المحفظتان. تقرأ المطابقة والتوجيه ودفتر
        العناوين المحافظ من هنا أولاً.
      properties:
        chain:
          type: string
          description: >-
            السلسلة القياسية، مثل `BTC` أو `XRP` أو `LIGHTNING` لتحويل
            Lightning.
        shape:
          type: string
          enum:
            - utxo
            - memo
            - lightning
        originator:
          $ref: '#/components/schemas/TravelRuleChainSide'
        beneficiary:
          $ref: '#/components/schemas/TravelRuleChainSide'
        utxo:
          type: object
          description: >-
            في تحويل UTXO: المدخلات والمخرجات كما تم تخزينها (المبالغ كنصوص
            عشرية) وما الذي قرأته Didit في كل مخرج.
          properties:
            inputs:
              type: array
              items:
                $ref: '#/components/schemas/TravelRuleUtxoEntry'
            outputs:
              type: array
              items:
                $ref: '#/components/schemas/TravelRuleUtxoEntry'
            change_output_indexes:
              type: array
              items:
                type: integer
              description: المخرجات التي تُعيد الدفع إلى عنوان إدخال.
            beneficiary_output_index:
              type: integer
              nullable: true
              description: >-
                المُخرج الذي يدفع للمستفيد؛ وتكون null عندما يتعذر تمييز أي
                منها.
        lightning:
          type: object
          description: >-
            في تحويل Lightning: ما ينص عليه طلب الدفع. دائماً `kind` (`bolt11`،
            أو `bolt12_offer`، أو `bolt12_invoice`، أو `bolt12_invoice_request`،
            أو `lnurl`، أو `lightning_address`، أو `node_id`، أو `unknown`)؛
            تضيف فاتورة BOLT11 كلاً من `network`، و`payee_node_id`،
            و`payment_hash`، و`amount_msat`، و`created_at`، و`expires_at`؛ ويضيف
            نص BOLT12 كلاً من `blinded_paths` و`payee_node_id`؛ ويضيف LNURL أو
            Lightning Address حقله `domain`. لا يتم حل أي شيء عبر الشبكة: يتم فك
            ترميز الطلب فقط.
          additionalProperties: true
        warnings:
          type: array
          items:
            type: string
            enum:
              - declared_originator_not_an_input
              - declared_beneficiary_not_an_output
              - beneficiary_output_ambiguous
              - beneficiary_output_amount_differs
          description: >-
            تناقضات UTXO التي تستحق المراجعة: المُرسِل المُعلَن ليس مدخلاً، أو
            المستفيد المُعلَن ليس مخرجاً، أو لم يتم التمكن من تمييز مخرج مستفيد
            واحد، أو أن مخرج المستفيد يدفع مبلغاً مختلفاً عما تنص عليه المعاملة.
        not_applicable_reason:
          type: string
          enum:
            - LIGHTNING_NO_PAYEE_IDENTIFIER
            - LIGHTNING_BOLT12_BLINDED_PAYEE
            - LIGHTNING_LNURL_NAMES_NO_PAYEE
          description: >-
            في تحويل Lightning الصادر الذي لا يحدد طلب الدفع الخاص به أي مستفيد:
            سبب كون التحويل `NOT_APPLICABLE`. كود
            `LIGHTNING_NO_PAYEE_IDENTIFIER` (الطلب لا يحدد عقدة المستفيد، أو
            تعذر فك تشفيره)، أو `LIGHTNING_BOLT12_BLINDED_PAYEE` (العرض يخفي
            المستفيد خلف مسارات معماة)، أو `LIGHTNING_LNURL_NAMES_NO_PAYEE`
            (يحدد LNURL خدمة وليس مستفيداً). يفتح الكود نفسه آخر إدخال
            `timeline` للتحويل.
    TravelRuleChainSide:
      type: object
      description: محفظة أحد الطرفين كما حددها Didit من بيانات السلسلة.
      properties:
        address:
          type: string
          description: >-
            المحفظة. في شبكة memo، العنوان الكلاسيكي (يتم تقسيم عنوان XRP
            X-address إلى عنوانه الكلاسيكي ووسمه)؛ وفي Lightning، معرّف عقدة
            المدفوع له أو Lightning Address.
        memo:
          type: string
          description: >-
            علامة الوجهة (destination tag) أو المذكرة (memo) التي تشكل جزءًا من
            المحفظة؛ القيمة `""` في حال عدم وجود أي منها.
        source:
          type: string
          enum:
            - declared
            - x_address
            - largest_input
            - only_non_change_output
            - amount_match
            - invoice_payee
            - updated
          description: >-
            مصدر المحفظة: `declared` (طلبك)، `x_address` (مفصولة من عنوان XRP
            X-address)، `largest_input` (عنوان مدخلات UTXO الذي ساهم بأكبر قدر)،
            `only_non_change_output` (مخرج UTXO الوحيد الذي ليس فكة)،
            `amount_match` (مخرج UTXO الفردي الذي يدفع مبلغ التحويل)،
            `invoice_payee` (المستفيد المحدد في طلب دفع Lightning)، `updated`
            (تُعيّن لاحقاً باستخدام `action: update_originator_wallet`).
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        مفتاح API الخاص بتطبيقك، من Developers -> API keys في Business Console.
        يمتلك المفتاح الأساسي وصولاً كاملاً. يمكن تحديد نطاق المفتاح المسمى: لا
        شيء، أو قراءة، أو كتابة لكل مورد، ومحدوداً ببعض مسارات العمل أو بالجلسات
        المقبولة، وبقائمة من عناوين IP، وبتاريخ انتهاء الصلاحية. يشير 401 إلى أن
        المفتاح غير صحيح أو ملغى أو منتهي الصلاحية؛ ويشير 403 إلى أنه لم يتم
        إرسال أي مفتاح، أو أن المفتاح ليس لديه حق الوصول إلى هذا المورد أو
        الإجراء، أو أن الطلب جاء من عنوان خارج قائمة عناوين IP الخاصة به؛ ويشير
        404 في مسار جلسة إلى أن الجلسة خارج مسارات العمل أو الحالات الخاصة
        بالمفتاح. يتلقى المفتاح الذي لا يمتلك حق الوصول إلى الوسائط عناوين URL
        للصور ومقاطع الفيديو وملفات PDF كـ null، ويتلقى المفتاح الذي لا يمتلك
        إذن كتابة للجلسات روابط الجلسة وtoken كـ null. راجع
        https://docs.didit.me/console/api-keys.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.