> ## 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.

# إجراءات تحويل Travel Rule: إنهاء وإعادة إرسال وتحديث

> أغلِق تحويل Travel Rule بهاش المعاملة على السلسلة، أو ألغِه أو أعِد إرساله، أو سجّل المحفظة التي خرجت منها الأموال فعلياً في Didit.



موجه واجهة برمجة التطبيقات لإجراءات تحويل Travel Rule
        نسخ الموجّه إلى الحافظة



      
      

\<pre>

\`Act on an existing Travel Rule transfer: report the on-chain hash to finish it, cancel it, re-run counterparty routing, replace a refused compliance email, or record the wallet the funds left from.

Endpoint:
PATCH https://verification.didit.me/v3/transactions/{transaction_id}/travel-rule/

Authentication:
Use the x-api-key header with my Didit API key. {transaction_id} is the Didit transaction uuid.

Four mutually exclusive bodies:

1\. Finish (close out after broadcasting on-chain):
\{"payment_txn_id": "0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060"}
\- Requires an OUTBOUND transfer in COMPLETED status - otherwise 409.
\- Moves the transfer (and its INTERNAL-rail counterpart, if any) to FINISHED and stores the hash on the transaction.
\- Over GTR, VerifyVASP or Sygna Bridge, the network learns the hash after the response, with retries (see delivery below).
\- On the TRP rail, Didit also posts the hash to the counterparty's confirmation callback.

2\. Cancel:
\{"action": "cancel"}
\- Allowed from any non-terminal status; moves the transfer (and its INTERNAL-rail counterpart, if any) to CANCELLED.
\- From a terminal status (FINISHED, CANCELLED, EXPIRED) it returns 409.
\- On an outbound TRP transfer, Didit also sends a cancellation to the counterparty.
\- Over GTR, VerifyVASP or Sygna Bridge, the network is told after the response, with retries.

3\. Resend (re-run the routing ladder):
\{"action": "resend"}
\- Allowed only on an OUTBOUND transfer in COUNTERPARTY_VASP_NOT_FOUND, COUNTERPARTY_VASP_NOT_REACHABLE, or NOT_ENOUGH_COUNTERPARTY_DATA - otherwise 409.
\- Resets the deadline and re-runs routing; a transfer whose destination wallet was declared unhosted moves to UNCONFIRMED_OWNERSHIP.
\- First give Didit a route, for example by registering the destination wallet in your address book (same chain as the transfer, or a blank chain) with the counterparty's travel_address (TRP carries BTC, ETH, and USDC on a named network), or by adding a compliance contact for the counterparty's directory entry with POST /v3/travel-rule/counterparty-contacts/, then resend.
\- Resend reuses the transfer's beneficiary_data, which you cannot change after creation except for the compliance email (body 4), so submit a new transaction to send different beneficiary data.
\- A previously recorded blockchain-analytics attribution is reused - no new lookup, no new charge.
\- Discovery runs again from the first step (internal address book, wallet attribution, network lookup, your VASP hint, then the end user); the transfer's "discovery" list shows what each step found.
\- Queued, not run inside the request: the response shows the transfer back in AWAITING_COUNTERPARTY with a "resend queued" timeline entry, and the outcome arrives as a travel_rule.status.updated webhook. A resend sent while an earlier attempt is still running is sent once that attempt settles.
\- If routing still resolves nothing, the transfer lands back in COUNTERPARTY_VASP_NOT_FOUND.

4\. Update the compliance email (the fix for reason email_undeliverable):
\{"action": "update_compliance_email", "compliance_email": "desk@bene-casp.example"}
\- Allowed only on an OUTBOUND transfer in COUNTERPARTY_VASP_NOT_FOUND, COUNTERPARTY_VASP_NOT_REACHABLE, or NOT_ENOUGH_COUNTERPARTY_DATA - otherwise 409.
\- A missing or malformed compliance_email returns 400.
\- Stores the address as this transfer's beneficiary_data.counterparty_vasp_email; it belongs to this transfer only and joins no directory entry or contact list.
\- The status does not change and the timeline gains "compliance email updated". The transfer keeps reason email_undeliverable until you send {"action": "resend"}, which sends the request to the new address.

4\. Update the originator wallet (the wallet the funds actually left from):
\{"action": "update_originator_wallet", "wallet_address": "bc1q...", "memo": ""}
\- Outbound transfers only (an inbound transfer -> 409), and never a CANCELLED or EXPIRED one (-> 409).
\- Use it when a withdrawal is broadcast from another address than the one declared, typically a UTXO withdrawal spending whichever addresses held the coins. When the transfer's UTXO inputs are known, wallet_address must be one of them (-> 400 otherwise).
\- Changes the record only: nothing is sent to the counterparty again and the status stays. chain_details.originator becomes the new wallet with source "updated", the timeline records the previous and the new wallet, and the INTERNAL-rail counterpart is updated the same way.

5\. Name the counterparty (when discovery could not):
\{"action": "beneficiary_vasp", "beneficiary_vasp": "<directory VASP id>"}
\- The id comes from GET /v3/travel-rule/vasps/.
\- Allowed only for an outbound transfer in COUNTERPARTY_VASP_NOT_FOUND, COUNTERPARTY_VASP_NOT_REACHABLE, or NOT_ENOUGH_COUNTERPARTY_DATA - otherwise 409.
\- Routes the transfer to that VASP and sends it again; automatic discovery never overrides your choice.
\- 400 if beneficiary_vasp is missing or not a valid id, 404 if no directory entry has that id.

What to read from the response:
\- The full transfer object: status, rail, direction, ownership_confirmed, deadline_at, timeline, counterparty_vasp, delivery, discovery, reason, next_actions.
\- delivery: the latest message the transfer owes the other side - kind (SEND, ANSWER, TXID, CANCEL, POLL), status (QUEUED, SENDING, RETRYING, DELIVERED, FAILED), rail, attempts, last_error, next_attempt_at, delivered_at. Failures a network may recover from are retried after 30 s, 2, 10, 30 and 60 minutes; when a first message fails for good the transfer moves to COUNTERPARTY_VASP_NOT_REACHABLE. null when the transfer never owed a message.
\- reason and next_actions say why a COUNTERPARTY_VASP_NOT_FOUND or COUNTERPARTY_VASP_NOT_REACHABLE transfer is stuck and what moves it on: email_undeliverable offers update_compliance_email then resend, delivery_failed offers resend, and a discovery reason offers select_counterparty_vasp, declare_self_hosted, add_vasp_hint and resend. Both are empty for any other status, so they clear once a resend moves the transfer on.

Order of operations for outbound transfers:
submit transaction -> wait for travel_rule.status == "COMPLETED" -> broadcast on-chain -> PATCH with payment_txn_id -> FINISHED.
Never broadcast before COMPLETED.
A transfer sent over TRUST cannot reach COMPLETED, because TRUST sends back nothing Didit can read; it stays AWAITING_COUNTERPARTY until it expires. Over GTR, VerifyVASP and Sygna Bridge, Didit reads the counterparty's answer from the network.
If the message cannot be delivered, the transfer moves to COUNTERPARTY_VASP_NOT_REACHABLE instead.

Failure modes:
\- 400 - the body has none of payment_txn_id or a supported action, update_compliance_email has a missing or malformed compliance_email, or a wallet_address or memo the transfer's chain cannot carry.
\- 409 - action not allowed from the transfer's current status or direction (see the per-action rules above).
\- 400 - action=beneficiary_vasp without a valid beneficiary_vasp.
\- 404 - unknown transaction, no Travel Rule transfer attached, or (action=beneficiary_vasp) no directory entry has that id.

Full guide: /transaction-monitoring/travel-rule#sending-a-transfer and /transaction-monitoring/travel-rule#why-a-transfer-is-stuck.`

\</pre>



      
      

الصق في



## OpenAPI

````yaml ar/openapi-25.json PATCH /v3/transactions/{transaction_id}/travel-rule/
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/{transaction_id}/travel-rule/:
    patch:
      tags:
        - Travel Rule
      summary: إنهاء أو إلغاء أو إعادة إرسال أو تحديث محفظة المُرسِل لتحويل Travel Rule
      description: >-
        قدّم `payment_txn_id` للإبلاغ عن الهاش على السلسلة ونقل تحويل صادر بحالة
        COMPLETED إلى FINISHED (ينتقل نظيره عبر مسار INTERNAL أيضاً إلى
        FINISHED)، أو `{"action": "cancel"}` لإلغاء تحويل غير نهائي، أو
        `{"action": "resend"}` لإعادة توجيه تحويل صادر عالق في
        COUNTERPARTY_VASP_NOT_FOUND أو COUNTERPARTY_VASP_NOT_REACHABLE أو
        NOT_ENOUGH_COUNTERPARTY_DATA مجدداً (قم بتحسين بيانات الطرف المقابل
        أولاً، مثل إضافة travel_address إلى إدخال محفظة الوجهة). ينطبق resend
        على التحويلات الصادرة فقط. يستبدل `{"action": "update_compliance_email",
        "compliance_email": "desk@example.com"}` بريد الامتثال الإلكتروني لتحويل
        صادر في إحدى تلك الحالات الثلاث، وهو الحل لـ `reason:
        email_undeliverable`: لا تتغير الحالة، وترسل عملية `resend` التالية
        الطلب إلى ذلك العنوان. تتم إضافة إعادة الإرسال إلى قائمة الانتظار، ولا
        يتم تشغيلها داخل الطلب: تُظهر الاستجابة عودة التحويل إلى
        AWAITING_COUNTERPARTY مع إدخال `resend queued` في المخطط الزمني وعملية
        `delivery` في قائمة الانتظار، وتصل الوجهة التي أُرسل إليها في حدث
        webhook من نوع `travel_rule.status.updated`. عندما يتم التحويل عبر GTR
        أو VerifyVASP أو Sygna Bridge، تتعرف الشبكة على الهاش على السلسلة أو
        الإلغاء بعد الاستجابة، مع عمليات إعادة المحاولة؛ وتوضح `delivery` حالة
        تلك الرسالة. يسجل `{"action": "update_originator_wallet",
        "wallet_address": "..."}` المحفظة التي خرجت منها الأموال بالفعل في تحويل
        صادر، على سبيل المثال العنوان الذي تم بث سحب UTXO منه بدلاً من المحفظة
        الرئيسية التي صرحت بها. يغير هذا السجل فقط: لا يتم إرسال أي شيء إلى
        الطرف المقابل مجدداً وتبقى الحالة كما هي. يصبح المُرسِل
        `chain_details.originator` مع `source: updated`، ويُضاف التغيير إلى
        `timeline` مع المحفظة السابقة والجديدة، ويتم تحديث نظير التحويل عبر مسار
        INTERNAL بالطريقة نفسها. يحدد `{"action": "beneficiary_vasp",
        "beneficiary_vasp": "<directory VASP id>"}` الطرف المقابل بنفسك عندما
        يتعذر الاكتشاف، وذلك لتحويل صادر في COUNTERPARTY_VASP_NOT_FOUND أو
        COUNTERPARTY_VASP_NOT_REACHABLE أو NOT_ENOUGH_COUNTERPARTY_DATA: يتم
        توجيه التحويل إلى VASP هذا وإرساله مجدداً.
      operationId: patchTravelRuleTransfer
      parameters:
        - name: transaction_id
          in: path
          required: true
          description: معرّف UUID الثابت للمعاملة من Didit التي تملك التحويل.
          schema:
            type: string
            format: uuid
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TravelRuleTransferPatchRequest'
            examples:
              Finish:
                value:
                  payment_txn_id: 0xchainhash
              Cancel:
                value:
                  action: cancel
              Resend:
                value:
                  action: resend
              Update compliance email:
                value:
                  action: update_compliance_email
                  compliance_email: desk@example.com
              Update originator wallet:
                value:
                  action: update_originator_wallet
                  wallet_address: bc1qOriginatorInputAddress01
              Name the counterparty:
                value:
                  action: beneficiary_vasp
                  beneficiary_vasp: 9f1c2b34-5d6e-4f70-8a91-b2c3d4e5f607
      responses:
        '200':
          description: >-
            التحويل المحدث. بعد `update_compliance_email` تبقى حالته دون تغيير
            ويحتفظ بـ `reason: email_undeliverable` حتى عملية `resend` التالية.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleTransferDetail'
        '400':
          description: >-
            لم يتم تقديم payment_txn_id ولا إجراء مدعوم، أو أن
            `compliance_email` مفقود أو ليس عنوان بريد إلكتروني صالحاً في
            `update_compliance_email`، أو بالنسبة لـ `update_originator_wallet`،
            لا يوجد wallet_address، أو توجد محفظة أو مذكرة لا يمكن لسلسلة
            التحويل حملها، أو محفظة ليست ضمن مدخلات UTXO الخاصة بالتحويل، أو أن
            `beneficiary_vasp` مفقود أو ليس معرّف VASP صالحاً في الدليل.
          content:
            application/json:
              examples:
                No action:
                  value:
                    detail:
                      - >-
                        Provide payment_txn_id, action=cancel, action=resend,
                        action=beneficiary_vasp, action=update_originator_wallet
                        or action=update_compliance_email.
                Invalid compliance email:
                  value:
                    compliance_email:
                      - Enter a valid email address.
        '404':
          description: >-
            معاملة غير معروفة، أو لا تحتوي المعاملة على تحويل Travel Rule، أو
            (الإجراء `beneficiary_vasp`) لا يوجد إدخال في الدليل يحمل هذا
            المعرّف.
        '409':
          description: >-
            التحويل ليس في حالة تسمح بهذه العملية (مثل ألا يكون COMPLETED/صادراً
            للإنهاء، أو نهائياً بالفعل للإلغاء، أو ليس تحويلاً صادراً في حالة
            قابلة لإعادة الإرسال من أجل إعادة الإرسال). يُجيب
            `update_compliance_email` بـ `409` للتحويل الوارد، وللتحويل الصادر
            خارج حالات COUNTERPARTY_VASP_NOT_FOUND
            وCOUNTERPARTY_VASP_NOT_REACHABLE وNOT_ENOUGH_COUNTERPARTY_DATA.
            يُجيب `update_originator_wallet` بـ `409` للتحويل الوارد أو الملغى
            أو منتهي الصلاحية. يُجيب `beneficiary_vasp` بـ `409` ما لم يكن
            التحويل صادراً وفي إحدى الحالات COUNTERPARTY_VASP_NOT_FOUND أو
            COUNTERPARTY_VASP_NOT_REACHABLE أو NOT_ENOUGH_COUNTERPARTY_DATA.
          content:
            application/json:
              examples:
                Cancel from a terminal status:
                  value:
                    detail: Transfer is already in a terminal state.
                Resend not allowed:
                  value:
                    detail: Transfer cannot be resent from its current state.
                Finish not allowed:
                  value:
                    detail: >-
                      Transfer must be an outbound transfer in COMPLETED status
                      to finish.
                Compliance email cannot change:
                  value:
                    detail: >-
                      The compliance email of this transfer cannot change from
                      its current state.
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: >-
            curl -X PATCH
            https://verification.didit.me/v3/transactions/{transaction_id}/travel-rule/
            \
              -H 'x-api-key: YOUR_API_KEY' -H 'Content-Type: application/json' \
              -d '{"payment_txn_id": "0xchainhash"}'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.transactions.travel_rule.update_transfer(
                "11111111-2222-3333-4444-555555555555",
                payment_txn_id="0xchainhash",
            )
            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.travelRule.updateTransfer("11111111-2222-3333-4444-555555555555",
            {
              payment_txn_id: "0xchainhash",
            });

            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Transactions.TravelRule.UpdateTransfer(ctx, \"11111111-2222-3333-4444-555555555555\", didit.TravelRuleTransferPatchRequest{\n\tPaymentTxnID: didit.String(\"0xchainhash\"),\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.TravelRuleTransferPatchRequest;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.transactions().travelRule().updateTransfer("11111111-2222-3333-4444-555555555555",
            TravelRuleTransferPatchRequest.builder()
                    .paymentTxnId("0xchainhash")
                    .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->travelRule->updateTransfer('11111111-2222-3333-4444-555555555555',
            [
                'payment_txn_id' => '0xchainhash',
            ]);

            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

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

            result = didit.transactions.travel_rule.update_transfer(
              "11111111-2222-3333-4444-555555555555",
              payment_txn_id: "0xchainhash"
            )
            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.TravelRule.UpdateTransferAsync("11111111-2222-3333-4444-555555555555",
            new TravelRuleTransferPatchRequest

            {
                PaymentTxnId = "0xchainhash",
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    TravelRuleTransferPatchRequest:
      type: object
      description: >-
        قدّم واحداً فقط مما يلي: payment_txn_id (إنهاء)، أو action=cancel، أو
        action=resend، أو action=update_compliance_email مع compliance_email، أو
        action=update_originator_wallet مع wallet_address، أو
        action=beneficiary_vasp مع beneficiary_vasp.
      properties:
        payment_txn_id:
          type: string
          description: >-
            تجزئة المعاملة على السلسلة. تتطلب أن تكون عملية التحويل صادرة وبحالة
            COMPLETED.
        action:
          type: string
          enum:
            - cancel
            - resend
            - update_compliance_email
            - update_originator_wallet
            - beneficiary_vasp
          description: >-
            يقوم "cancel" بإلغاء معاملة تحويل غير نهائية. ويعيد "resend" تشغيل
            التوجيه لتحويل صادر عالق في الحالات COUNTERPARTY_VASP_NOT_FOUND أو
            COUNTERPARTY_VASP_NOT_REACHABLE أو NOT_ENOUGH_COUNTERPARTY_DATA.
            ويستبدل "update_compliance_email" البريد الإلكتروني للامتثال الذي
            يُرسل إليه الطلب، وذلك في تحويل صادر بإحدى هذه الحالات الثلاث؛ أرسل
            "resend" بعد ذلك. ويسجل "update_originator_wallet" المحفظة التي خرجت
            منها الأموال بالفعل (`wallet_address`، `memo`). ويحدد
            "beneficiary_vasp" الـ VASP للطرف المقابل بنفسك (يتطلب
            `beneficiary_vasp`) لتحويل صادر بإحدى هذه الحالات: حيث يتم توجيهه
            إلى ذلك الـ VASP وإعادة إرساله.
        compliance_email:
          type: string
          format: email
          maxLength: 254
          description: >-
            مطلوب مع `action: update_compliance_email`. يُحفظ كـ
            `beneficiary_data.counterparty_vasp_email` لهذا التحويل: ينتمي إلى
            هذا التحويل فقط ولا ينضم إلى أي مدخل في الدليل ولا إلى أي قائمة جهات
            اتصال.
        wallet_address:
          type: string
          maxLength: 128
          description: >-
            مع `action: update_originator_wallet`: المحفظة التي خرجت منها
            الأموال. عندما تكون مدخلات UTXO للتحويل معروفة، يجب أن تكون واحدة
            منها.
        memo:
          type: string
          maxLength: 256
          description: >-
            مع `action: update_originator_wallet`: مذكرة المحفظة (memo) أو الوسم
            الخاص بها على شبكة تدعم المذكرات. اختياري.
        beneficiary_vasp:
          type: string
          format: uuid
          description: >-
            مطلوب مع action=beneficiary_vasp: الـ `id` الخاص بـ VASP في الدليل،
            من `GET /v3/travel-rule/vasps/`. خيارك يتجاوز كل خطوة اكتشاف تلقائي،
            ولا يتم تجاوزه أبداً بواسطتها.
    TravelRuleTransferDetail:
      type: object
      description: >-
        كائن التحويل الكامل الذي يتم إرجاعه بواسطة endpoints الخاصة بتأكيد
        الملكية والإنهاء/الإلغاء. طالما أن ملكية المحفظة لتحويل وارد غير مؤكدة،
        يتم إرجاع `originator_data` و`beneficiary_data` للطرف المقابل محجوبة
        (يتم الاحتفاظ بالحرف الأول من كل كلمة؛ بينما تظل المحفظة، والبلوكتشين،
        وتوجيه VASP قابلة للقراءة) وتكون قيمة `data_masked` هي true.
      properties:
        uuid:
          type: string
          format: uuid
        status:
          type: string
          enum:
            - AWAITING_COUNTERPARTY
            - ON_HOLD
            - COMPLETED
            - FINISHED
            - CANCELLED
            - EXPIRED
            - COUNTERPARTY_MISMATCHED_DATA
            - COUNTERPARTY_VASP_NOT_FOUND
            - COUNTERPARTY_VASP_NOT_REACHABLE
            - UNCONFIRMED_OWNERSHIP
            - COUNTERPARTY_VASP_GENERAL_DECLINE
            - NOT_ENOUGH_COUNTERPARTY_DATA
            - NOT_APPLICABLE
        direction:
          type: string
          enum:
            - INBOUND
            - OUTBOUND
        rail:
          type: string
          nullable: true
          enum:
            - INTERNAL
            - TRP
            - GTR
            - TRUST
            - VERIFYVASP
            - SYGNA
            - EMAIL
            - TEST_VASP
            - null
          description: >-
            المسار الذي تم توجيه التحويل عبره، أو null عند عدم تحديد أي مسار
            (على سبيل المثال أقل من الحد، أو محفظة طرف مقابل ذاتية الاستضافة، أو
            تسجيل بعد الإيداع، أو عدم وجود طرف مقابل يمكن الوصول إليه). تعني
            INTERNAL أن كلا الجانبين هما تطبيقا Didit؛ وتعني EMAIL أنه تم الوصول
            إلى الطرف المقابل عبر رابط استلام تم إرساله بالبريد الإلكتروني. تعني
            TEST_VASP أن Didit Test VASP استجاب للتحويل في البيئة التجريبية. عبر
            GTR وVERIFYVASP وSYGNA، تقرأ Didit إجابة الطرف المقابل من استجابة
            الشبكة أو عبر استقصائها كل 5 دقائق. تقوم TRUST بالإرسال فقط، لذا يظل
            تحويل TRUST في حالة AWAITING_COUNTERPARTY حتى تنتهي صلاحيته. لا
            يُستخدم مسار الشبكة إلا عندما تكون قد ربطت عضويتك الخاصة بتلك
            الشبكة. ويتم اختياره بعد اكتمال إنشاء المعاملة، لذا يكون null في تلك
            الاستجابة.
        protocol:
          type: string
          nullable: true
        ivms_version:
          type: string
          example: ivms101.2023
        required:
          type: boolean
        ownership_confirmed:
          type: boolean
          nullable: true
        deadline_at:
          type: string
          format: date-time
          nullable: true
        timeline:
          type: array
          items:
            type: object
            properties:
              status:
                type: string
              at:
                type: string
                format: date-time
              detail:
                type: string
              name_match:
                allOf:
                  - $ref: '#/components/schemas/TravelRuleNameMatch'
                nullable: true
                description: >-
                  مقارنة الاسم التي حسمها هذا الإدخال، بجوار `detail`. غير
                  موجودة في الإدخالات التي لم تقارن أي اسم.
              reason:
                type: string
                description: >-
                  موجود فقط في إدخال انتقال ناتج عن فشل التسليم:
                  `email_undeliverable` أو `delivery_failed`، وهي القيمة التي
                  يُبلغ عنها `reason` الخاص بالتحويل.
        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 حتى يتم تقييم
                الطرف المقابل.
        originator_data:
          type: object
          description: >-
            جهة المُرسِل. بالنسبة للتحويلات الواردة، يتم حجب قيم الطرف المقابل
            حتى يتم تأكيد الملكية.
        beneficiary_data:
          type: object
          description: >-
            طرف المستفيد. بالنسبة للتحويلات الواردة، يتم حجب قيم الطرف المقابل
            حتى يتم تأكيد الملكية.
        name_match:
          allOf:
            - $ref: '#/components/schemas/TravelRuleNameMatch'
          nullable: true
          description: >-
            مقارنة الاسم التي حسمت التحويل، أو null حتى يتم تشغيل مقارنة واحدة.
            عندما تكون الأطراف مقنّعة، وفي نسخة العميل الآخر من تبادل INTERNAL،
            يتم إخفاء `transfer_name` و`compared_name` و`matched_names`
            و`mismatched_names`. قد تختلف قيمة `score` عن `matched`: تتبع
            `matched` مستوى الصرامة، بينما تمثل `score` مدى التشابه بين الاسمين
            الكاملين.
        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: >-
            صحيح طالما أن البيانات الشخصية للطرف المقابل محجوبة في هذه
            الاستجابة.
        created_at:
          type: string
          format: date-time
        delivery:
          nullable: true
          allOf:
            - $ref: '#/components/schemas/TravelRuleDelivery'
          description: >-
            حالة آخر رسالة يتعين على هذا التحويل إرسالها إلى الطرف الآخر. تكون
            القيمة Null عندما لا يتعين على التحويل إرسال أي رسالة على الإطلاق
            (على سبيل المثال، إذا كان أقل من `threshold_amount`، أو محفظة ذاتية
            الاستضافة مُعلنة، أو تسجيل sunrise).
        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'
    TravelRuleNameMatch:
      type: object
      nullable: true
      description: >-
        مقارنة الاسم التي حسمت التحويل، أو null حتى يتم تشغيل مقارنة واحدة.
        عندما تكون الأطراف مقنّعة، وفي نسخة العميل الآخر من تبادل INTERNAL، يتم
        إخفاء `transfer_name` و`compared_name` و`matched_names`
        و`mismatched_names`. قد تختلف قيمة `score` عن `matched`: تتبع `matched`
        مستوى الصرامة، بينما تمثل `score` مدى التشابه بين الاسمين الكاملين.
      properties:
        score:
          type: integer
          minimum: 0
          maximum: 100
          description: >-
            درجة التشابه بين الاسمين الكاملين، من 0 إلى 100. تكون 0 إذا كان أي
            من الاسمين فارغاً.
        matched:
          type: boolean
          description: >-
            ما إذا كانت الأسماء تستوفي `strictness`. تتبع نتيجة التحويل
            `data_match`، الذي يقارن كل حقل، لذلك يمكن أن يكون التحويل
            COUNTERPARTY_MISMATCHED_DATA بينما تكون هذه القيمة true.
        method:
          type: string
          enum:
            - none
            - exact_token
            - token_subset
            - token_containment
            - sequence_ratio
          description: >-
            كيفية تحديد `matched`: لا يوجد (`NONE`)، أو exact_token (`STRICT`)،
            أو token_subset (`DEFAULT`)، أو token_containment (`CONTAINS`)، أو
            sequence_ratio (`FUZZY`).
        strictness:
          type: string
          enum:
            - NONE
            - STRICT
            - CONTAINS
            - DEFAULT
            - FUZZY
        compared_with:
          type: string
          enum:
            - wallet_holder
            - counterparty_vasp
          description: >-
            wallet_holder: الحائز المسجل للمحفظة. counterparty_vasp: الاسم الذي
            أجاب به الطرف المقابل في صفحة الاستجابة عبر البريد الإلكتروني، أو
            إجابة Didit Test VASP في البيئة التجريبية.
        transfer_name:
          type: string
          description: الاسم المدوّن على التحويل.
        compared_name:
          type: string
          description: الاسم الذي تمّت المقارنة معه.
        matched_names:
          type: array
          items:
            type: string
          description: كلمات `transfer_name` الموجودة في `compared_name`.
        mismatched_names:
          type: array
          items:
            type: string
          description: >-
            كلمات `transfer_name` غير الموجودة في `compared_name`، ثم كلمات
            `compared_name` غير الموجودة في `transfer_name`.
    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`).
    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: اختياري. فهرس المخرج الذي ينفقه مدخل ما.
  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.