> ## 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 عبر API: ربط الإيداع برسالة

> في Didit، اربط إيداعاً وارداً ينتظر بيانات المُرسِل برسالة Travel Rule التي أرسلها VASP المُرسِل، ليأخذ الإيداع بيانات المُرسِل.



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



      
      

\<pre>

\`Pair an inbound deposit that still waits for originator data with the Travel Rule message the originating VASP sent for it.

Endpoint:
POST https://verification.didit.me/v3/travel-rule/unmatched/{transaction_uuid}/match/

Authentication:
Use the x-api-key header with my Didit API key. A scoped API key needs the transactions privilege.

Path parameter:
\- transaction_uuid - the transaction_id of the unmatched deposit, from GET /v3/travel-rule/unmatched/.

Request body (JSON, required):
\- transaction_id (UUID) - the transaction_id of the received Travel Rule message: a row with kind "message" from GET /v3/travel-rule/transfers/?kind=message. The transfer's own id is not found.

curl example:
curl -X POST "https://verification.didit.me/v3/travel-rule/unmatched/<DEPOSIT_TRANSACTION_ID>/match/" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"transaction_id": "<MESSAGE_TRANSACTION_ID>"}'

Response 200:
\- deposit - the deposit row after the match: it now carries the message's originator data, counterparty VASP and rail, and matched_transaction_id points to the message.
\- message - the message row, with matched_transaction_id pointing to the deposit.

Failure modes:
\- 400 - transaction_id is missing, is the deposit itself, is not a received Travel Rule message, or is for a different asset than the deposit; or the transaction in the path is not an inbound deposit.
\- 401 - invalid API key.
\- 403 - the key lacks the transactions privilege.
\- 404 - the deposit or the message does not exist or was deleted.
\- 409 - the deposit no longer waits for originator data, or the message is already matched to a deposit. Nothing changes.

Full guide: /transaction-monitoring/travel-rule.`

\</pre>



      
      

الصق في

## متى تستخدمهاستخدمه عندما يكون لإيداع من [عرض الإيداعات غير المطابقة](https://docs.didit.me/ar/management-api/travel-rule/list-unmatched-deposits.md) رسالة Travel Rule مستلمة تخصه، ولم يقم Didit بمطابقة الاثنين تلقائياً.
يأخذ الإيداع بيانات المُرسِل وVASP الطرف المقابل وقناة الدفع من الرسالة، ويسجّل كلا التحويلين المطابقة في الجدول الزمني الخاص بكل منهما.## الطلب```bash theme={null}
curl -X POST "https://verification.didit.me/v3/travel-rule/unmatched/DEPOSIT_TRANSACTION_ID/match/" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"transaction_id": "MESSAGE_TRANSACTION_ID"}'
```## ملاحظات- `transaction_uuid` في المسار هو الإيداع. `transaction_id` في نص الطلب هو الرسالة.
- يجب أن تكون الرسالة للأصل نفسه المرتبط بالإيداع.
- يفشل الاستدعاء بالرمز `409` إذا كان أحد الطرفين قد تجاوز هذه المرحلة، ولا يُجري أي تغيير.
- تُرجع المعاملة المحذوفة من Console الرمز `404` على أيٍّ من الطرفين.## ذات صلة- [عرض الإيداعات غير المطابقة](https://docs.didit.me/ar/management-api/travel-rule/list-unmatched-deposits.md)
- [عرض تحويلات Travel Rule](https://docs.didit.me/ar/management-api/travel-rule/list-transfers.md)
- [Travel Rule](https://docs.didit.me/ar/transaction-monitoring/travel-rule.md)


## OpenAPI

````yaml ar/openapi-25.json POST /v3/travel-rule/unmatched/{transaction_uuid}/match/
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/unmatched/{transaction_uuid}/match/:
    post:
      tags:
        - Travel Rule
      summary: مطابقة إيداع Travel Rule مع رسالة مستلمة
      description: >-
        ربط إيداع وارد لا يزال بانتظار بيانات المُرسِل برسالة Travel Rule التي
        أرسلها VASP المُرسِل بشأنه. يأخذ الإيداع بيانات المُرسِل والطرف المقابل
        VASP وقناة التحويل من الرسالة، وتسجل عمليتا التحويل كلتاهما التطابق في
        خطّيهما الزمنيين. `transaction_uuid` هو `transaction_id` الخاص بالإيداع
        من `GET /v3/travel-rule/unmatched/`. حقل `transaction_id` في النص هو
        `transaction_id` الخاص بالرسالة المستلمة، من صف في `GET
        /v3/travel-rule/transfers/?kind=message`؛ لا يتم العثور على `id` الخاص
        بالتحويل نفسه. يجب أن تكون الرسالة لنفس الأصل الخاص بالإيداع. يعيد
        الإيداع أو الرسالة المحذوفة من لوحة التحكم رمز `404`؛ أما الذي انتقل
        بالفعل إلى مرحلة أخرى (تمت مطابقته، أو لم يعد في حالة انتظار) فيعيد رمز
        `409`.
      operationId: matchUnmatchedTravelRuleDeposit
      parameters:
        - name: transaction_uuid
          in: path
          required: true
          description: معرّف `transaction_id` للإيداع غير المطابق.
          schema:
            type: string
            format: uuid
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TravelRuleManualMatchRequest'
            example:
              transaction_id: e90a4d7b-1c2f-4b83-a6d5-8f0e3c1b7a24
      responses:
        '200':
          description: كلا التحويلين بعد المطابقة.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleManualMatchResponse'
              example:
                deposit:
                  id: 7d3a1c55-0b9e-4d52-8a3c-1f6e2b9d4a08
                  transaction_id: c41f9b2e-5a8d-4e0c-9f17-3b6d8a2e5c91
                  txn_id: dep-2026-10-20-0007
                  txn_date: '2026-10-19T08:41:12Z'
                  kind: deposit
                  direction: INBOUND
                  status: AWAITING_COUNTERPARTY
                  rail: TRP
                  asset: ETH
                  amount: '1.25'
                  originator_vasp: Example Counterparty VASP
                  beneficiary_vasp: Example Counterparty VASP
                  originator_wallet: '0x77ccff0cc624a53cd8b8d8703ced826710211ec7'
                  beneficiary_wallet: '0xede2d7e4f5b097e6391ab6bbcf2f47a53f4778cb'
                  originator_memo: ''
                  beneficiary_memo: ''
                  originator_wallet_type: vasp
                  beneficiary_wallet_type: vasp
                  matched_transaction_id: e90a4d7b-1c2f-4b83-a6d5-8f0e3c1b7a24
                  deadline_at: null
                  created_at: '2026-10-19T08:41:13Z'
                message:
                  id: 2b8e6f10-9c3a-47d1-b5e2-0a4c7d9f3e66
                  transaction_id: e90a4d7b-1c2f-4b83-a6d5-8f0e3c1b7a24
                  txn_id: msg-2026-10-20-0003
                  txn_date: '2026-10-19T08:41:12Z'
                  kind: message
                  direction: INBOUND
                  status: COMPLETED
                  rail: TRP
                  asset: ETH
                  amount: '1.25'
                  originator_vasp: Origin CASP SL
                  beneficiary_vasp: Example Counterparty VASP
                  originator_wallet: '0x77ccff0cc624a53cd8b8d8703ced826710211ec7'
                  beneficiary_wallet: '0xede2d7e4f5b097e6391ab6bbcf2f47a53f4778cb'
                  originator_memo: ''
                  beneficiary_memo: ''
                  originator_wallet_type: vasp
                  beneficiary_wallet_type: vasp
                  matched_transaction_id: null
                  deadline_at: '2026-10-21T08:41:13Z'
                  created_at: '2026-10-19T08:41:13Z'
        '400':
          description: >-
            خطأ في التحقق: `transaction_id` مفقود، أو هو الإيداع نفسه، أو ليس
            رسالة Travel Rule مستلمة، أو يخص أصلاً مختلفاً عن الإيداع؛ أو أن
            المعاملة الموجودة في المسار ليست إيداعاً وارداً.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
              examples:
                Error:
                  value:
                    transaction_id:
                      - >-
                        The travel rule message is for a different asset than
                        the deposit.
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          description: إيداع أو رسالة غير معروفة، أو تم حذف أحدهما.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
              example:
                detail: No TravelRuleTransfer matches the given query.
        '409':
          description: >-
            لم يعد الإيداع بانتظار بيانات المُرسِل، أو تمت مطابقة الرسالة بالفعل
            مع إيداع.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
              examples:
                Error:
                  value:
                    detail: This deposit is no longer waiting for originator data.
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.travel_rule.unmatched_deposits.match(
                "11111111-2222-3333-4444-555555555555",
                transaction_id="e90a4d7b-1c2f-4b83-a6d5-8f0e3c1b7a24",
            )
            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.unmatchedDeposits.match("11111111-2222-3333-4444-555555555555",
            {
              transaction_id: "e90a4d7b-1c2f-4b83-a6d5-8f0e3c1b7a24",
            });

            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.UnmatchedDeposits.Match(ctx, \"11111111-2222-3333-4444-555555555555\", didit.TravelRuleManualMatchRequest{\n\tTransactionID: \"e90a4d7b-1c2f-4b83-a6d5-8f0e3c1b7a24\",\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.TravelRuleManualMatchRequest;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.travelRule().unmatchedDeposits().match("11111111-2222-3333-4444-555555555555",
            TravelRuleManualMatchRequest.builder()
                    .transactionId("e90a4d7b-1c2f-4b83-a6d5-8f0e3c1b7a24")
                    .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->unmatchedDeposits->match('11111111-2222-3333-4444-555555555555',
            [
                'transaction_id' => 'e90a4d7b-1c2f-4b83-a6d5-8f0e3c1b7a24',
            ]);

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

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

            result = didit.travel_rule.unmatched_deposits.match(
              "11111111-2222-3333-4444-555555555555",
              transaction_id: "e90a4d7b-1c2f-4b83-a6d5-8f0e3c1b7a24"
            )
            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.TravelRule.UnmatchedDeposits.MatchAsync("11111111-2222-3333-4444-555555555555",
            new TravelRuleManualMatchRequest

            {
                TransactionId = "e90a4d7b-1c2f-4b83-a6d5-8f0e3c1b7a24",
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    TravelRuleManualMatchRequest:
      type: object
      required:
        - transaction_id
      properties:
        transaction_id:
          type: string
          format: uuid
          description: >-
            معرّف `transaction_id` الخاص برسالة Travel Rule المستلمة (صف يحتوي
            على `kind: message`).
    TravelRuleManualMatchResponse:
      type: object
      required:
        - deposit
        - message
      properties:
        deposit:
          $ref: '#/components/schemas/TravelRuleTransferRow'
        message:
          $ref: '#/components/schemas/TravelRuleTransferRow'
    TravelRuleTransferRow:
      type: object
      description: >-
        تحويل Travel Rule واحد كما تعرضه قائمة التحويلات: أسماء VASP والمحافظ
        والملاحظات فقط، دون بيانات المُرسِل أو المستفيد الشخصية على الإطلاق.
      properties:
        id:
          type: string
          format: uuid
          description: معرّف التحويل.
        transaction_id:
          type: string
          format: uuid
          description: معاملة Didit التي تنتمي إليها عملية التحويل.
        txn_id:
          type: string
          nullable: true
          description: >-
            المعرّف الخاص بك للمعاملة. التحويلات التي تسجلها Didit نيابة عنك،
            مثل التحويل الوارد لـ Didit Test VASP، تحمل معرّفاً تم إنشاؤه.
        txn_date:
          type: string
          format: date-time
        kind:
          type: string
          enum:
            - withdrawal
            - deposit
            - message
          description: >-
            withdrawal: صادر. message: تحويل وارد أنشأه مسار من رسالة طرف مقابل
            (استعلام TRP، أو المسار الوارد INTERNAL، أو رسالة من GTR أو
            VerifyVASP أو Sygna Bridge). deposit: أي تحويل وارد آخر.
        direction:
          type: string
          enum:
            - INBOUND
            - OUTBOUND
        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
        reason:
          type: string
          description: >-
            سبب تعثر معاملة بحالة `COUNTERPARTY_VASP_NOT_FOUND` أو
            `COUNTERPARTY_VASP_NOT_REACHABLE`، وهي نفس قيمة `reason` الخاصة
            بالمعاملة نفسها، بحيث تُميّز القائمة بين رسالة الامتثال الإلكترونية
            المرتدة من طرف مقابل ليس لديه مسار دون فتح كل معاملة. وتكون `""` لأي
            حالة أخرى. راجع [سبب تعثر
            المعاملة](/ar/transaction-monitoring/travel-rule#لماذا-يتوقف-التحويل).
        rail:
          type: string
          nullable: true
          enum:
            - INTERNAL
            - TRP
            - GTR
            - TRUST
            - VERIFYVASP
            - SYGNA
            - EMAIL
            - TEST_VASP
            - null
        asset:
          type: string
          description: عملة المعاملة.
        amount:
          type: string
          description: المبلغ كرقم عشري عادي، على سبيل المثال "1.25".
        originator_vasp:
          type: string
          description: >-
            الصادر: الاسم القانوني لـ VASP الخاص بك. الوارد: اسم الطرف المقابل،
            من مدخل الدليل الخاص به، أو العضو في شبكة Didit، أو مُرسِل TRP، أو
            Didit Test VASP، أو الاسم المعلن في التحويل. فارغ عند عدم معرفة أي
            منها.
        beneficiary_vasp:
          type: string
          description: >-
            الصادر: اسم الطرف المقابل، ومُحدَّد بالطريقة نفسها. الوارد: الاسم
            القانوني لـ VASP الخاص بك.
        originator_wallet:
          type: string
        beneficiary_wallet:
          type: string
        originator_memo:
          type: string
          description: >-
            الملاحظة (Memo) أو وسم الوجهة (destination tag)، ويكون فارغاً على
            سلاسل البلوكتشين التي لا تتضمن ذلك.
        beneficiary_memo:
          type: string
        originator_wallet_type:
          type: string
          enum:
            - vasp
            - self_hosted
            - own
          description: >-
            vasp، أو self_hosted (معلن كمحفظة غير مستضافة) أو own (محفظة يسجلها
            دفتر عناوينك كملكية لك). يكون طرفك دائماً vasp.
        beneficiary_wallet_type:
          type: string
          enum:
            - vasp
            - self_hosted
            - own
        matched_transaction_id:
          type: string
          format: uuid
          nullable: true
          description: الجانب الآخر من إيداع قمت بمطابقته يدوياً مع تحويل معلن.
        deadline_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            وقت انتهاء صلاحية التحويل إذا كان لا يزال بانتظار الطرف المقابل.
            يُعيَّن لكل تحويل تُنشئه عبر `POST /v3/transactions/` يتطلب تبادلاً،
            سواء كان صادراً أو وارداً. يكون Null إذا كان أقل من الحد، أو في
            مدفوعات Lightning التي لا تنطبق عليها Travel Rule، وفي التحويلات
            الواردة التي تنشئها Didit عندما يتواصل معك طرف مقابل (استفسار TRP
            وارد، أو رسالة شبكة، أو مسار INTERNAL الوارد).
        created_at:
          type: string
          format: date-time
  responses:
    Unauthorized:
      description: غير مصرح به
      content:
        application/json:
          examples:
            Invalid API Key:
              summary: مفتاح API غير صالح
              value:
                detail: Invalid API Key.
    Forbidden:
      description: محظور
      content:
        application/json:
          examples:
            No Permission:
              summary: لا يوجد إذن
              value:
                detail: You do not have permission to perform this action.
            Not Enough Credits:
              summary: الرصيد غير كافٍ
              value:
                error: >-
                  You don't have enough credits to perform this request. Please
                  top up at https://business.didit.me
  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.