> ## 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: تسجيل التحويل الوارد عبر Sunrise API

> سجّل بيانات قاعدة السفر لإيداع عملات مشفرة تمت تسويته على البلوكتشين قبل أي تبادل، عبر تدفق Sunrise بعد الإيداع في Didit.



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



      
      

\<pre>

\`Register Travel Rule data for a crypto deposit that settled on-chain BEFORE any exchange took place - because the sending VASP was unreachable at the time (the sunrise problem), or when backfilling historical deposits.

Endpoint:
POST https://verification.didit.me/v3/travel-rule/inbound/

Authentication:
Use the x-api-key header with my Didit API key. You are the beneficiary VASP.

Request body (application/json):
\{
"chain": "ETH",                        // required; stored lowercased and matched case-insensitively against your address-book entries' chain
"txid": "0x5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060",   // dedupe key: same txid + wallet_address returns the existing transfer
"wallet_address": "0x8ba1f109551bD432803012645Ac136ddd64DBA72",   // an XRP X-address is split into its classic address and tag
"memo": "",                              // optional destination tag or memo: on a shared deposit address it names your customer
"amount": "500.00",
"currency": "USDC",
"originator_data": { "name": "Origin CASP SL" },      // flat originator details from the sender, if known (name or full_name, first_name, last_name, vendor_data)
"beneficiary_data": { "name": "Ana Diaz" },           // flat beneficiary details (your customer); name is matched against the entry's holder_name
"originating_vasp": { "name": "Origin CASP SL", "lei": "984500ABCDEF12345634", "travel_address": "taHg7hkTmJ4mTpdQxn61H9cyx6RreB2jrDHeB3pkioRRBgKQaSAGUzp73FVsmEXXJVxdAuCCWiBEFMkcB4MCtcyjnpbyEbTeSHwym394NMS7ev" },  // optional sender identity
"utxo": { "inputs": [ { "address": "bc1q...", "amount": "0.5" } ], "outputs": [ { "address": "bc1q...", "amount": "0.25" } ] }  // optional, BTC/LTC/BCH/DOGE only
}

Behavior:
\- Creates an inbound travelRule transaction (or reuses an unclaimed recorded deposit) and resolves it against your wallet address book, by the address and its memo (an entry with exactly that memo first, else one for the whole address; a deposit without a memo never reaches an entry that has one):
\- no matching entry -> ON_HOLD
\- entry exists, ownership unproven -> UNCONFIRMED_OWNERSHIP
\- name does not match the entry's holder_name -> COUNTERPARTY_MISMATCHED_DATA
\- verified entry + name match -> COMPLETED then immediately FINISHED (the deposit already settled).
\- The address-book match is chain-scoped: an entry matches when its chain equals the request chain (case-insensitive) or the entry's chain is blank, and "ethereum" does not match "ETH".
\- Resolve ON_HOLD (and UNCONFIRMED_OWNERSHIP) with POST /v3/transactions/{transaction_id}/travel-rule/ownership/.
\{"confirmed": true} registers or verifies the wallet entry and runs the name match; {"confirmed": false} declines the transfer.
ON_HOLD does not change the transaction status by itself; only a rule that acts on the Travel Rule status changes it (for example the opt-in library preset travel-rule-pending-action sets AWAITING_USER).
\- Naming originating_vasp keeps the sender's identity on this transfer (metadata.originating_vasp, and the transfer's originator VASP in GET /v3/travel-rule/transfers/); it never creates or changes a shared VASP directory entry.
originating_vasp.lei must be a valid 20-character LEI (ISO 17442) or blank, and originating_vasp.travel_address must be a valid travel address or blank.
An inbound TRP inquiry does not create or change its sender's directory entry either.
\- Webhooks: when a new transaction was created, transaction.created is sent first and travel_rule.status.updated follows for each status transition.
Each webhook is delivered and retried on its own, so do not rely on arrival order; key on transaction_id.
\- Billing: there is no base fee.
A newly created deposit is screened and charged the Wallet Verification & Screening rate only when crypto monitoring is enabled and chain is one Didit can screen (btc, eth, sol, trx, matic, bnb, ltc, xrp, bch, doge, or their full names such as bitcoin or ethereum).
Sandbox applications are never charged.
\- utxo: the sender's wallet is originator_data.wallet_address when you declare it, else the input address that contributed the most. The result is on travel_rule.chain_details.

What to read from the response:
\- transaction_id - the Didit transaction uuid, used in /v3/transactions/{transaction_id}/ calls.
\- txn_id - tr-in-{first 80 characters of txid}-{12 hex characters} for a new transaction, or the existing txn_id of a reused recorded deposit.
\- created - true (201) when this call registered the deposit, false (200) when the same txid + wallet_address was already registered.
\- travel_rule - the full transfer object: uuid, status, direction, rail, protocol, ivms_version, required, ownership_confirmed, deadline_at, timeline, counterparty_vasp, originator_data, beneficiary_data, delivery, discovery, reason, next_actions, created_at.
beneficiary_data includes the wallet_address and the lowercased chain.
originator_data and beneficiary_data stay masked in the response (data_masked: true) until wallet ownership is confirmed.
\- travel_rule.status - the resolved state (see above).

Failure modes:
\- 400 - a missing required field (chain, txid, wallet_address, amount, currency), an invalid originating_vasp.lei, or an invalid travel address ("Invalid travel address.").
\- 403 - missing x-api-key (a wrong, revoked or expired key gets 401).

Full guide: /transaction-monitoring/travel-rule#after-deposit-sunrise-registration.`

\</pre>



      
      

الصق في



## OpenAPI

````yaml ar/openapi-25.json POST /v3/travel-rule/inbound/
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/travel-rule/inbound/:
    post:
      tags:
        - Travel Rule
      summary: تسجيل تحويل وارد بعد الإيداع (sunrise)
      description: >-
        تسجيل بيانات Travel Rule لإيداع تشفير تمت تسويته بالفعل على السلسلة قبل
        حدوث أي تبادل. ينشئ معاملة travelRule واردة (أو يعيد استخدام إيداع لم
        تتم المطالبة به) ويطابق التحويل مع دفتر عناوين محفظتك. بالنسبة لمعاملة
        تم إنشاؤها حديثاً، ترسل Didit إشعار webhook بحدث transaction.created
        أولاً وتتبعه إشعارات travel_rule.status.updated.
      operationId: registerTravelRuleInbound
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TravelRuleInboundRequest'
            example:
              chain: ETH
              txid: 0xdeposit-hash
              wallet_address: 0xYourDepositWallet
              amount: '500.00'
              currency: USDC
              originator_data:
                name: Origin CASP SL
              beneficiary_data:
                name: Ana Diaz
              originating_vasp:
                name: Origin CASP SL
                lei: ''
                travel_address: >-
                  ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC
      responses:
        '200':
          description: >-
            تم تسجيل تحويل مسبقاً لـ txid و wallet_address هذين؛ يتم إرجاع
            التحويل الحالي دون تغيير (created بقيمة false).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleInboundResponse'
        '201':
          description: >-
            تم تسجيل تحويل Travel Rule جديد، لمعاملة واردة جديدة أو لإيداع حالي
            لم تتم المطالبة به (قيمة created هي true).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleInboundResponse'
        '400':
          description: >-
            حقل مطلوب (`chain`، `txid`، `wallet_address`، `amount`، `currency`)
            مفقود، أو `originating_vasp.lei` ليس LEI صالحاً، أو
            `originating_vasp.travel_address` ليس Travel Address صالحاً، أو
            مذكرة (memo) أو X-address أو `utxo` لا يمكن للشبكة حمله، أو
            `originator_data` / `beneficiary_data` ليس كائناً.
          content:
            application/json:
              examples:
                Missing field:
                  value:
                    txid:
                      - This field is required.
                Invalid LEI:
                  value:
                    originating_vasp:
                      lei:
                        - >-
                          Invalid LEI: expected 20 alphanumeric characters (ISO
                          17442).
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: |-
            curl -X POST https://verification.didit.me/v3/travel-rule/inbound/ \
              -H 'x-api-key: YOUR_API_KEY' -H 'Content-Type: application/json' \
              -d '{"chain":"ETH","txid":"0xdeposit-hash","wallet_address":"0xYourDepositWallet","amount":"500.00","currency":"USDC"}'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.travel_rule.register_inbound(
                chain="ETH",
                txid="0xdeposit-hash",
                wallet_address="0xYourDepositWallet",
                amount="500.00",
                currency="USDC",
                originator_data={"name": "Origin CASP SL"},
                beneficiary_data={"name": "Ana Diaz"},
                originating_vasp={
                    "name": "Origin CASP SL",
                    "lei": "",
                    "travel_address": "ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC",
                },
            )
            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.travelRule.registerInbound({
              chain: "ETH",
              txid: "0xdeposit-hash",
              wallet_address: "0xYourDepositWallet",
              amount: "500.00",
              currency: "USDC",
              originator_data: { name: "Origin CASP SL" },
              beneficiary_data: { name: "Ana Diaz" },
              originating_vasp: {
                name: "Origin CASP SL",
                lei: "",
                travel_address: "ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC",
              },
            });
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.RegisterInbound(ctx, didit.TravelRuleInboundRequest{\n\tChain:           \"ETH\",\n\tTxid:            \"0xdeposit-hash\",\n\tWalletAddress:   \"0xYourDepositWallet\",\n\tAmount:          \"500.00\",\n\tCurrency:        \"USDC\",\n\tOriginatorData:  didit.Some(map[string]any{\"name\": \"Origin CASP SL\"}),\n\tBeneficiaryData: didit.Some(map[string]any{\"name\": \"Ana Diaz\"}),\n\tOriginatingVASP: didit.Some(didit.TravelRuleInboundRequestOriginatingVASP{\n\t\tName:          didit.String(\"Origin CASP SL\"),\n\t\tLei:           didit.String(\"\"),\n\t\tTravelAddress: didit.String(\"ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC\"),\n\t}),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: >-
            import java.util.Map;

            import me.didit.Didit;

            import me.didit.types.TravelRuleInboundRequest;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.travelRule().registerInbound(TravelRuleInboundRequest.builder()
                    .chain("ETH")
                    .txid("0xdeposit-hash")
                    .walletAddress("0xYourDepositWallet")
                    .amount("500.00")
                    .currency("USDC")
                    .originatorData(Map.of("name", "Origin CASP SL"))
                    .beneficiaryData(Map.of("name", "Ana Diaz"))
                    .originatingVasp(TravelRuleInboundRequest.OriginatingVasp.builder()
                            .name("Origin CASP SL")
                            .lei("")
                            .travelAddress("ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC")
                            .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->travelRule->registerInbound([
                'chain' => 'ETH',
                'txid' => '0xdeposit-hash',
                'wallet_address' => '0xYourDepositWallet',
                'amount' => '500.00',
                'currency' => 'USDC',
                'originator_data' => ['name' => 'Origin CASP SL'],
                'beneficiary_data' => ['name' => 'Ana Diaz'],
                'originating_vasp' => [
                    'name' => 'Origin CASP SL',
                    'lei' => '',
                    'travel_address' => 'ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC',
                ],
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

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

            result = didit.travel_rule.register_inbound(
              chain: "ETH",
              txid: "0xdeposit-hash",
              wallet_address: "0xYourDepositWallet",
              amount: "500.00",
              currency: "USDC",
              originator_data: { name: "Origin CASP SL" },
              beneficiary_data: { name: "Ana Diaz" },
              originating_vasp: {
                name: "Origin CASP SL",
                lei: "",
                travel_address: "ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC",
              }
            )
            puts result.to_h
        - lang: csharp
          label: .NET
          source: >-
            using System;

            using System.Collections.Generic;

            using System.Text.Json;

            using Didit;


            // Reads DIDIT_API_KEY.

            using var client = new DiditClient();


            var result = await client.TravelRule.RegisterInboundAsync(new
            TravelRuleInboundRequest

            {
                Chain = "ETH",
                Txid = "0xdeposit-hash",
                WalletAddress = "0xYourDepositWallet",
                Amount = "500.00",
                Currency = "USDC",
                OriginatorData = new Dictionary<string, object> { ["name"] = "Origin CASP SL" },
                BeneficiaryData = new Dictionary<string, object> { ["name"] = "Ana Diaz" },
                OriginatingVasp = new TravelRuleInboundRequestOriginatingVasp
                {
                    Name = "Origin CASP SL",
                    Lei = "",
                    TravelAddress = "ta9JbXbsBSuS5ozArJRFVgvBHMVnDGUnrPPChSZYQsuZTn3kPrJXUQ7RSLUEJ5KjyPvr8C9sAxmPtZfGsQVKCi4n8ShxP9BkbDdbtjtA9aumNybAZ1BxC",
                },
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    TravelRuleInboundRequest:
      type: object
      required:
        - chain
        - txid
        - wallet_address
        - amount
        - currency
      properties:
        chain:
          type: string
          description: >-
            الشبكة التي تم تسوية الإيداع عليها، مثل `ETH`. يتم تخزينها بأحرف
            صغيرة وتتم مقارنتها بدون حساسية لحالة الأحرف مع مدخلات دفتر عناوين
            المحفظة لديك، لذا استخدم رمز الشبكة نفسه هناك.
          maxLength: 32
        txid:
          type: string
          description: تجزئة المعاملة على السلسلة. تمت إزالة التكرار مع wallet_address.
          maxLength: 128
        wallet_address:
          type: string
          description: >-
            محفظة الوجهة التي استلمت الإيداع عليها. يتم تقسيم عنوان XRP من نوع
            X-address إلى عنوانه الكلاسيكي ووسمه.
          maxLength: 128
        amount:
          type: string
          description: مبلغ الإيداع كسلسلة عشرية، صفر أو أكثر، بما يصل إلى 18 منزلة عشرية.
        currency:
          type: string
          description: أصل الإيداع، مثل "USDC".
          maxLength: 16
        originator_data:
          type: object
          description: >-
            تفاصيل المُرسِل من VASP المرسل، إن كانت معروفة، ككائن مسطح مثل
            `{"name": "..."}`. يقرأ Didit الاسم (أو full_name) وfirst_name
            وlast_name وvendor_data منه.
          additionalProperties: true
        beneficiary_data:
          type: object
          description: >-
            تفاصيل المستفيد (عميلك)، ككائن مسطح مثل `{"name": "..."}`. تطابق
            Didit الاسم مع holder_name لمدخل دفتر العناوين المطابق، وتُحدد
            wallet_address وchain من الطلب.
          additionalProperties: true
        originating_vasp:
          type: object
          description: >-
            وصف اختياري لـ VASP المُرسِل. يقتصر على هذه المعاملة فقط
            (`metadata.originating_vasp`، وVASP المُرسِل للمعاملة في GET
            /v3/travel-rule/transfers/)؛ ولا يُنشئ أبداً إدخالاً مشتركاً في دليل
            VASP أو يعدله أو يربطه.
          properties:
            name:
              type: string
              maxLength: 255
            lei:
              type: string
              maxLength: 20
              description: >-
                اختياري. معرّف LEI صالح وفق معيار ISO 17442 من 20 حرفاً، أو
                فارغ.
            travel_address:
              type: string
              description: Travel Address الخاص بالمُرسِل، المسجل في هذا التحويل.
              maxLength: 512
        memo:
          type: string
          maxLength: 256
          description: >-
            اختياري. علامة الوجهة (destination tag) للإيداع أو المذكرة (memo)
            على شبكة تستخدم المذكرات: في عنوان الإيداع المشترك، هي ما يميّز
            عملاءك عن بعضهم، وتتم مطابقة مدخل دفتر العناوين الخاص بتلك المذكرة.
            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`.
        utxo:
          allOf:
            - $ref: '#/components/schemas/TravelRuleUtxo'
          description: >-
            اختياري، لسلاسل UTXO فقط. مدخلات معاملة الإيداع ومخرجاتها: محفظة
            المرسل هي `originator_data.wallet_address` المحددة، وإلا فأكبر مدخل.
    TravelRuleInboundResponse:
      type: object
      properties:
        transaction_id:
          type: string
          format: uuid
          description: معرّف UUID لمعاملة Didit للإيداع الوارد.
        txn_id:
          type: string
          description: >-
            txn_id للمعاملة الواردة: منشأ بواسطة Didit عندما أنشأت Didit
            المعاملة، أو المعرّف الخاص بك عند إعادة استخدام إيداع لم تتم
            المطالبة به.
        created:
          type: boolean
          description: >-
            true عندما يسجل هذا الاستدعاء التحويل (HTTP 201)؛ وfalse عند وجود
            تحويل مسبق لنفس txid وwallet_address بالفعل (HTTP 200).
        travel_rule:
          $ref: '#/components/schemas/TravelRuleTransferDetail'
    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'
    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'
    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: اختياري. فهرس المخرج الذي ينفقه مدخل ما.
    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`).
  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.