> ## 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: 메시지 연결

> 송금인 데이터를 기다리는 인바운드 입금을 발신 VASP가 보낸 Travel Rule 메시지와 연결해, 입금이 송금인 데이터를 받도록 합니다. Didit에서 제공합니다.



매칭되지 않은 Travel Rule 입금 매칭 API 프롬프트
        프롬프트를 클립보드에 복사



      
      

\<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/ko/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`로 실패하며, 아무것도 변경되지 않습니다.
- 어느 한쪽에서든 콘솔에서 삭제된 거래가 있으면 `404`를 반환합니다.## 관련 문서- [매칭되지 않은 입금 목록 조회](https://docs.didit.me/ko/management-api/travel-rule/list-unmatched-deposits.md)
- [Travel Rule 전송 목록 조회](https://docs.didit.me/ko/management-api/travel-rule/list-transfers.md)
- [Travel Rule](https://docs.didit.me/ko/transaction-monitoring/travel-rule.md)


## OpenAPI

````yaml ko/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: >-
        송금인 데이터가 아직 도착하기를 기다리는 인바운드 입금을 송신 VASP가 해당 입금에 대해 전송한 Travel Rule 메시지와
        연결합니다. 입금 건은 메시지의 송금인 데이터, 거래 상대방 VASP 및 레일을 가져오며, 두 전송 건 모두 타임라인에 일치
        결과를 기록합니다. `transaction_uuid`는 `GET /v3/travel-rule/unmatched/`에서 조회한
        입금의 `transaction_id`입니다. 본문의 `transaction_id`는 `GET
        /v3/travel-rule/transfers/?kind=message`의 행에서 가져온 수신 메시지의
        `transaction_id`이며, 전송 자체의 `id`로는 조회되지 않습니다. 메시지는 입금과 동일한 자산에 대한 것이어야
        합니다. Console에서 삭제된 입금 또는 메시지는 `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: '수신된 Travel Rule 메시지(`kind: message` 행)의 `transaction_id`입니다.'
    TravelRuleManualMatchResponse:
      type: object
      required:
        - deposit
        - message
      properties:
        deposit:
          $ref: '#/components/schemas/TravelRuleTransferRow'
        message:
          $ref: '#/components/schemas/TravelRuleTransferRow'
    TravelRuleTransferRow:
      type: object
      description: >-
        전송 목록에 표시되는 Travel Rule 전송 건 1개입니다. VASP 이름, 지갑 및 메모만 포함되며 송금인 또는 수취인 개인
        데이터는 절대 포함되지 않습니다.
      properties:
        id:
          type: string
          format: uuid
          description: 전송의 id입니다.
        transaction_id:
          type: string
          format: uuid
          description: 이체가 속한 Didit 거래입니다.
        txn_id:
          type: string
          nullable: true
          description: >-
            거래에 대한 귀하 고유의 ID입니다. Didit Test VASP 인바운드 전송과 같이 Didit이 대신 기록하는 전송에는
            생성된 ID가 포함됩니다.
        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`과 동일한 값이므로 각 전송을 열어보지 않고도 목록에서 반송된
            컴플라이언스 이메일인지 경로가 없는 거래 상대방인지 확인할 수 있습니다. 다른 모든 상태의 경우 `""`입니다. [전송이
            지연되는 이유](/ko/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: 메모 또는 목적지 태그이며, 없는 체인에서는 비어 있습니다.
        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/`로 생성하는 모든 이체에 설정됩니다. 임계값 미만인 경우, Travel
            Rule이 적용되지 않는 Lightning 결제인 경우, 그리고 거래 상대방이 도달할 때 Didit이 생성하는 수신
            이체(수신 TRP 문의, 네트워크 메시지 또는 INTERNAL 수신 레그)의 경우 null입니다.
        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: >-
        Business Console의 Developers -> API keys에서 발급받은 귀하 애플리케이션의 API 키입니다. 기본
        키는 전체 접근 권한을 갖습니다. 이름이 지정된 키는 리소스별 none, read, write 범위로 권한을 제한할 수 있으며
        특정 워크플로나 승인된 세션, IP 주소 목록, 만료일 등으로 제한할 수도 있습니다. 401은 키가 잘못되었거나 폐기되었거나
        만료되었음을 의미합니다. 403은 키가 전송되지 않았거나, 키에 해당 리소스나 작업에 대한 접근 권한이 없거나, 요청이 허용된
        IP 목록 외부 주소에서 발생했음을 의미합니다. 세션 경로에서의 404는 해당 세션이 키의 허용 워크플로 또는 상태 범위를
        벗어났음을 의미합니다. 미디어 접근 권한이 없는 키는 이미지, 비디오, PDF URL을 null로 수신하며, 세션 write
        권한이 없는 키는 세션 링크와 token을 null로 수신합니다.
        https://docs.didit.me/console/api-keys 를 참고하십시오.

````

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