> ## 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 테스트 VASP 인바운드 전송 트리거 API

> 샌드박스 전용: Didit 테스트 VASP가 귀사의 애플리케이션으로 Travel Rule 인바운드 전송을 보내도록 하여 귀사의 결정, 수신함, 소유권 흐름을 확인합니다.



VASP 인바운드 전송 API 테스트 트리거 프롬프트
        프롬프트를 클립보드에 복사



      
      

\<pre>

\`Make the Didit Test VASP send my sandbox application an inbound Travel Rule transfer, to exercise the receiving side of an exchange before going live.

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

Authentication:
Use the x-api-key header with my SANDBOX application's API key. A live application receives 400.

Request body (application/json):
\{
"beneficiary_wallet_address": "0xYourSandboxWallet",  // required: the destination wallet address
"scenario": "accept",                                // optional: accept (default) or name_mismatch
"chain": "ETH",                                      // optional
"amount": "1",                                       // optional, decimal string
"currency": "ETH",                                   // optional
"reference": "demo-001"                              // optional: repeat calls with it return the first transfer
}

Behavior:
\- The transfer is decided by the same logic a real inbound transfer runs, against my wallet address book: a verified wallet with the holder's name completes, an unverified wallet waits for ownership, a wallet with no matching address book entry is booked ON_HOLD, and name_mismatch ends as COUNTERPARTY_MISMATCHED_DATA.
\- Nothing leaves Didit. travel_rule.status.updated webhooks fire with environment "sandbox", test_vasp true and the scenario name.

What to read from the response:
\- transaction_id, txn_id - the booked inbound transaction.
\- travel_rule_status and detail - how my application decided it.
\- travel_rule - the full transfer.

Full guide: /transaction-monitoring/travel-rule#testing-without-network-credentials.`

\</pre>



      
      

붙여넣을 곳



## OpenAPI

````yaml ko/openapi-25.json POST /v3/travel-rule/test-vasp/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/test-vasp/inbound/:
    post:
      tags:
        - Travel Rule
      summary: Didit Test VASP에서 인바운드 이체 트리거(샌드박스)
      description: >-
        샌드박스 애플리케이션 전용입니다. 프로덕션 환경으로 전환하기 전에 거래소의 수신 측을 엔드투엔드로 테스트할 수 있도록 Didit
        Test VASP가 애플리케이션에 인바운드 Travel Rule 전송을 보냅니다. 전송은 실제 네트워크의 인바운드 전송이 지갑
        주소록을 대상으로 실행하는 것과 동일한 로직으로 예약되고 결정되므로, 수신함, 결정 및 지갑 소유 구조 절차가 프로덕션 환경과
        동일하게 작동합니다. Didit 외부로 아무것도 나가지 않습니다. 프로덕션 환경 애플리케이션은 400을 수신합니다. 두 번째
        전송을 생성하는 대신 첫 번째 호출이 예약한 전송을 가져오려면 동일한 `reference`를 다시 보내십시오.
      operationId: triggerTravelRuleTestVaspInbound
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TravelRuleTestVaspInboundRequest'
            example:
              beneficiary_wallet_address: 0xYourSandboxWallet
              scenario: accept
              amount: '1'
              reference: demo-001
      responses:
        '201':
          description: 인바운드 전송이 기록되고 결정되었습니다. 동일한 `reference`로 반복 요청하면 동일한 body가 반환됩니다.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleTestVaspInboundResponse'
        '400':
          description: >-
            유효하지 않은 본문, 알 수 없거나 지원되지 않는 `scenario`, 또는 해당 애플리케이션이 프로덕션 애플리케이션인
            경우입니다.
          content:
            application/json:
              schema:
                type: object
        '409':
          description: 예를 들어 애플리케이션에 Travel Rule이 활성화되어 있지 않아 전송을 기록할 수 없습니다.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: >-
            curl -X POST
            https://verification.didit.me/v3/travel-rule/test-vasp/inbound/ \
              -H 'x-api-key: YOUR_SANDBOX_API_KEY' -H 'Content-Type: application/json' \
              -d '{"beneficiary_wallet_address":"0xYourSandboxWallet","scenario":"accept","reference":"demo-001"}'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.transactions.travel_rule.trigger_test_vasp_inbound(
                beneficiary_wallet_address="0xYourSandboxWallet",
                scenario="accept",
                amount="1",
                reference="demo-001",
            )
            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.triggerTestVaspInbound({
              beneficiary_wallet_address: "0xYourSandboxWallet",
              scenario: "accept",
              amount: "1",
              reference: "demo-001",
            });

            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.TriggerTestVASPInbound(ctx, didit.TravelRuleTestVASPInboundRequest{\n\tBeneficiaryWalletAddress: \"0xYourSandboxWallet\",\n\tScenario:                 didit.Some(didit.TravelRuleTestVASPInboundRequestScenario(\"accept\")),\n\tAmount:                   didit.String(\"1\"),\n\tReference:                didit.String(\"demo-001\"),\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.TravelRuleTestVaspInboundRequest;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.transactions().travelRule().triggerTestVaspInbound(TravelRuleTestVaspInboundRequest.builder()
                    .beneficiaryWalletAddress("0xYourSandboxWallet")
                    .scenario(TravelRuleTestVaspInboundRequest.Scenario.of("accept"))
                    .amount("1")
                    .reference("demo-001")
                    .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->triggerTestVaspInbound([
                'beneficiary_wallet_address' => '0xYourSandboxWallet',
                'scenario' => 'accept',
                'amount' => '1',
                'reference' => 'demo-001',
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

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

            result = didit.transactions.travel_rule.trigger_test_vasp_inbound(
              beneficiary_wallet_address: "0xYourSandboxWallet",
              scenario: "accept",
              amount: "1",
              reference: "demo-001"
            )
            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.TriggerTestVaspInboundAsync(new
            TravelRuleTestVaspInboundRequest

            {
                BeneficiaryWalletAddress = "0xYourSandboxWallet",
                Scenario = new TravelRuleTestVaspInboundRequestScenario("accept"),
                Amount = "1",
                Reference = "demo-001",
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    TravelRuleTestVaspInboundRequest:
      type: object
      required:
        - beneficiary_wallet_address
      properties:
        beneficiary_wallet_address:
          type: string
          description: >-
            대상 지갑 주소입니다. Didit Test VASP가 해당 자산의 블록체인상에 있는 회원님의 지갑 주소록과 대조하여 이
            주소로 전송합니다. 일치하는 항목이 없는 지갑은 허용되며 수신 거래는 ON_HOLD로 처리됩니다.
        scenario:
          type: string
          enum:
            - accept
            - name_mismatch
          default: accept
          description: >-
            Didit Test VASP가 수취인으로 신고하는 내용입니다. `accept`는 소유자 본인의 이름을 신고하며,
            `name_mismatch`는 어떤 소유자도 동의하지 않는 이름을 신고합니다. 결정 자체는 항상 귀하의 몫입니다.
        chain:
          type: string
          default: ETH
          description: 자산의 체인.
        amount:
          type: string
          default: '1'
          description: 십진수 문자열 형태의 금액입니다.
        currency:
          type: string
          default: ETH
          description: 자산 코드입니다.
        reference:
          type: string
          description: 선택적 멱등성 키입니다. 동일한 값으로 반복 호출하면 첫 번째 호출에서 예약한 이체를 반환합니다.
    TravelRuleTestVaspInboundResponse:
      type: object
      properties:
        transaction_id:
          type: string
          format: uuid
          description: 인바운드 이체에 대한 Didit 거래 UUID입니다.
        txn_id:
          type: string
          description: Didit에서 생성된 txn_id입니다.
        scenario:
          type: string
          description: 실행된 시나리오입니다.
        travel_rule_status:
          type: string
          description: 애플리케이션 자체의 결정으로 확정된 상태입니다.
        detail:
          type: string
          description: 전송이 해당 상태로 처리된 이유입니다.
        test_vasp:
          type: boolean
          description: 항상 true입니다. 발신자는 Didit Test VASP였습니다.
        travel_rule:
          $ref: '#/components/schemas/TravelRuleTransferDetail'
    TravelRuleTransferDetail:
      type: object
      description: >-
        소유권 확인 및 완료/취소 endpoint에서 반환되는 전체 전송 객체입니다. 인바운드 전송의 지갑 소유권이 확인되지 않은
        동안에는 상대방의 `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 디렉터리와 같이 구성 요소(jurisdiction,
                verification, protocol, lei, history, essentials,
                responsiveness)당 하나의 객체이며 각각 {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: 이 응답에서 거래 상대방의 개인 데이터가 마스킹되어 있는 동안 true입니다.
        created_at:
          type: string
          format: date-time
        delivery:
          nullable: true
          allOf:
            - $ref: '#/components/schemas/TravelRuleDelivery'
          description: >-
            이 이체가 상대방에게 보내야 하는 최신 메시지의 현재 상태입니다. 이체에서 메시지를 보낼 필요가 없었던 경우(예:
            `threshold_amount` 미만, 신고된 자체 보관 지갑, 선라이즈 등록)에는 null입니다.
        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`. 재전송하면 전송이
            진행되므로 이유가 초기화됩니다. [전송이 지연되는
            이유](/ko/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`를
            따르므로, 이 값이 true인 상태에서도 전송이 COUNTERPARTY_MISMATCHED_DATA가 될 수 있습니다.
        method:
          type: string
          enum:
            - none
            - exact_token
            - token_subset
            - token_containment
            - sequence_ratio
          description: >-
            `matched`가 결정된 방식입니다. none (`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: '`compared_name`에서 발견된 `transfer_name`의 단어들입니다.'
        mismatched_names:
          type: array
          items:
            type: string
          description: >-
            `compared_name`에 없는 `transfer_name`의 단어들이 먼저 나오고, 그 뒤에
            `transfer_name`에 없는 `compared_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: >-
            당사자의 엔티티 유형에 따라 비교된 필드당 항목 1개(`name`, `date_of_birth`, `address`,
            `account`, 기업의 경우 `date_of_birth`가 없음)입니다.
          additionalProperties:
            type: object
            properties:
              result:
                type: string
                enum:
                  - matched
                  - mismatched
                  - not_compared
                description: >-
                  규칙이 `NONE`이거나 양쪽 중 어느 한쪽이라도 해당 필드에 대한 값이 없는 경우
                  `not_compared`입니다.
              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은 이체를 생성하거나 변경한 요청이 반환된 후 거래
        상대방에게 연락하므로, 이 객체는 해당 메시지가 전달되었는지 여부(대기열 등록됨, 전송 중, 오류 후 재시도 대기 중, 전달됨
        또는 실패함)를 나타냅니다. 네트워크가 복구될 가능성이 있는 실패(시간 내 응답 없음, 연결 실패, HTTP `408`,
        `429` 또는 `5xx`)는 30초, 2분, 10분, 30분, 1시간 후에 다시 시도됩니다. 네트워크가 거부했거나 6번째
        시도마저 실패하여 첫 번째 메시지(`kind: SEND`)가 완전히 실패하면, 이체는 `timeline`에
        `last_error`와 함께 `COUNTERPARTY_VASP_NOT_REACHABLE`로 이동합니다. 완전히 실패한 다른 모든
        메시지는 `timeline`에 기록됩니다. 이체의 `status`는 교환 자체에 대한 기준(source of truth)으로
        유지됩니다.
      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이 오류로 응답하는 경우 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`: `beneficiary_data`에 전송한
            VASP 이름, LEI 또는 관할 구역입니다. `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` 상태의
        전송을 진행시키는 요소 하나입니다. [전송이 중단되는
        이유](/ko/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를 선택하거나, 귀하가
            `action=beneficiary_vasp`로 PATCH 요청을 보냅니다. `declare_self_hosted`: 최종
            사용자가 위젯에서 자체 보관 지갑임을 선언합니다. `add_vasp_hint`: VASP 이름, LEI 또는 Travel
            Address(예: 수취 지갑의 주소록 항목에 있는 `travel_address`)를 통해 Didit에 거래 상대방 정보를
            제공한 후 재전송합니다. `update_compliance_email` 및 `resend`는 `PATCH
            /v3/transactions/{transaction_id}/travel-rule/`의 `action` 값입니다. 거래
            상대방의 컴플라이언스 이메일을 다시 입력하고 라우팅을 재실행합니다.
        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 불일치 사항: 신고된 송금인이 입력(input)에 없음, 신고된 수취인이 출력(output)에
            없음, 단일 수취인 출력을 구별할 수 없음, 또는 수취인 출력이 거래에 명시된 금액과 다른 금액을 지급함.
        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: >-
            지갑입니다. 메모 네트워크에서는 클래식 주소(XRP X-address는 클래식 주소와 태그로 분할됨),
            Lightning에서는 수취인 노드 ID 또는 Lightning Address입니다.
        memo:
          type: string
          description: 지갑의 일부인 대상 태그 또는 메모입니다. 없는 경우 `""`입니다.
        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`(라이트닝 결제 요청에 지정된 수취인),
            `updated`(`action: update_originator_wallet`으로 추후 설정됨).
    TravelRuleUtxoEntry:
      type: object
      description: 체인에 기록된 UTXO 거래의 입력 또는 출력 1개입니다.
      required:
        - address
      properties:
        address:
          type: string
          maxLength: 128
        amount:
          type: string
          nullable: true
          description: 해당 코인 자체의 단위(사토시가 아닌 BTC)로 표시된 십진수 문자열입니다. 선택 사항입니다.
          example: '0.0125'
        txid:
          type: string
          maxLength: 128
          description: 선택 사항입니다. 입력(input)이 사용하는 거래입니다.
        vout:
          type: integer
          nullable: true
          minimum: 0
          description: 선택 사항입니다. 입력(input)이 사용하는 출력 인덱스(output index)입니다.
  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.