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

# SDK에서 거래 제출하기: 클라이언트 측 KYT

> Didit의 범위 제한 SDK 토큰으로 최종 사용자 기기에서 모니터링 거래를 제출합니다. 기기 인텔리전스가 자동 수집되며, 지갑 소유권 확인에는 action_required가 사용됩니다.



거래 제출(SDK 토큰) API 프롬프트
        프롬프트를 클립보드에 복사



      
      

\<pre>

\`Submit a monitored transaction from an end-user device using a scoped SDK token instead of an API key. This is the wire endpoint behind the Didit SDKs' submitTransaction methods - call it directly only when not using an SDK.

Endpoint:
POST https://verification.didit.me/v1/transactions/

Authentication:
X-Transaction-Token header carrying an sdk_token minted by your backend via POST /v3/transactions/sdk-token/. No API key on the device, ever.

Payload (camelCase wire shape - each field maps onto its POST /v3/transactions/ equivalent):
\{
"txnId": "wd-2026-07-07-0042",              // -> transaction_id (required)
"type": "travelRule",                        // -> transaction_category (required)
"info": {                                    // -> transaction_details (required)
"direction": "out", "amount": "0.25", "currency": "ETH",
"currencyType": "crypto", "cryptoParams": {"crypto_chain": "ETH"}   // -> currency_kind, crypto_params
},
"subject": { "fullName": "Jane Doe" },       // externalUserId is IGNORED - identity comes from the token
"counterparty": {
"fullName": "Ana Diaz",
"paymentMethod": {"type": "unhosted_wallet", "accountId": "0x8ba1f109551bD432803012645Ac136ddd64DBA72"}  // type -> method_type; declares a self-hosted wallet
},
"travelRule": {                              // -> travel_rule_details
"status": "AWAITING_COUNTERPARTY",         // required (400 if missing); ignored when Travel Rule is enabled
"beneficiaryData": {"wallet_address": "0x8ba1f109551bD432803012645Ac136ddd64DBA72", "name": "Ana Diaz"}
},
"props": { "channel": "mobile_app" },        // -> custom_properties
"includeCryptoScreening": true
}

Three things are always decided by the token, never the payload:
\- the application the transaction is created under
\- the subject identity (token's vendor_data)
\- server-derived device context (IP, user agent) - it wins on conflict.

What to read from the response (same snake_case detail as /v3/, plus):
\- status - APPROVED | IN_REVIEW | DECLINED | AWAITING_USER.
\- travel_rule.status - the Travel Rule exchange state, when applicable.
\- action_required - when the end user must act: type "wallet_ownership" (open the url in a real browser, never a webview) or "verification_session" (launch with your Didit verification integration). null when nothing is pending.

Failure modes:
\- 401 - token missing, unknown, revoked, over max_uses, or expired ("expired" appears in the detail for expired tokens).
\- 400 - validation errors, with per-field details keyed by the canonical field names (a missing info.currency is reported as {"transaction_details": {"currency": [...]}}), including a txnId that already exists.
\- 409 - a concurrent request with the same txnId was created first.

Afterwards:
\- Re-read with GET /v1/transactions/{transaction_id}/ (same token) after the user completes an action.
\- Your backend also receives transaction.created / transaction.status.updated webhooks with the same action_required block.

Full guide: /transaction-monitoring/sdk-transaction-submission.`

\</pre>



      
      

붙여넣을 곳



## OpenAPI

````yaml ko/openapi-25.json POST /v1/transactions/
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:
  /v1/transactions/:
    post:
      tags:
        - Transactions
      summary: SDK에서 거래 제출
      description: >-
        최종 사용자의 기기에서 Didit SDK가 직접 거래를 제출하기 위해 호출하는 디바이스용 endpoint입니다. 인증은 API 키
        대신 `X-Transaction-Token` 헤더로 전송되는 `POST /v3/transactions/sdk-token/`의 범위
        지정 token을 사용하며, 브라우저가 cross-origin으로 호출할 수 있도록 endpoint에 CORS가 활성화되어
        있습니다. payload는 아래에 표시된 camelCase 와이어 별칭을 사용합니다(SDK의 `submitTransaction`
        메서드가 이를 자동으로 구성합니다). 세 가지 서버 측 보장 사항: 애플리케이션은 항상 token에서 가져옵니다. 주체
        식별자(`externalUserId`)는 항상 token의 `vendor_data`에서 강제 적용되므로 스푸핑된 payload
        값은 무시됩니다. 그리고 기기 인텔리전스(SDK 기기 핑거프린트와 서버에서 파생된 IP 및 사용자 에이전트)가 주체에 자동으로
        첨부됩니다.
      operationId: submitTransactionFromSdk
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                txnId:
                  type: string
                  description: 귀하가 지정한 해당 거래의 고유 식별자입니다(`transaction_id`에 매핑되며, 최대 128자).
                  example: wd-2026-07-07-0042
                txnDate:
                  type: string
                  format: date-time
                  description: 거래가 발생한 시점입니다(`transaction_at`에 매핑됨). 생략 시 현재 시간으로 기본 설정됩니다.
                zoneId:
                  type: string
                  description: 'IANA 표준 시간대 식별자(`time_zone`에 매핑됨, 예: `Europe/Madrid`)입니다.'
                type:
                  type: string
                  description: >-
                    거래 카테고리(`transaction_category`에 매핑됨)입니다. 예: `finance`,
                    `kyc`, `travelRule`, `userPlatformEvent`, `gamblingBet`.
                  example: travelRule
                info:
                  type: object
                  description: 거래의 핵심 금융 세부 정보(`transaction_details`에 매핑됨).
                  required:
                    - direction
                    - amount
                    - currency
                  properties:
                    direction:
                      type: string
                      description: >-
                        주체 기준의 방향입니다. 대소문자를 구분하지 않으며, `in`/`out`을 별칭으로 사용할 수
                        있습니다. 대문자(`INBOUND`/`OUTBOUND`)로 에코되어 반환됩니다.
                      example: out
                    amount:
                      type: number
                      description: >-
                        거래 금액(소수점 이하 최대 18자리)입니다. 십진수 문자열도 허용되며 약 15자리를 초과하는 유효
                        숫자를 보존할 수 있는 유일한 방법입니다. JSON 숫자는 먼저 바이너리 부동소수점으로 파싱되므로
                        `0.123456789012345678`은 `0.12345678901234568`로 저장됩니다.
                      example: 0.25
                    currency:
                      type: string
                      description: >-
                        통화 코드입니다. 암호화폐 자산 심볼(예: `BTC`)뿐만 아니라 모든 ISO 4217 알파벳
                        코드(예: `EUR`, `USD`, `NGN`)를 사용할 수 있습니다. 현재 유통 중인 코드를
                        사용하는 것이 좋습니다. 지원되는 모든 코드에 환율이 제공되는 것은 아닙니다. 해당 코드의 환율을
                        사용할 수 없는 경우(예: ISO 회계 단위 `XSU` 또는 Didit에서 가격을 책정하지 않는
                        암호화폐 심볼), 자동 변환이 실패하며 요청에 사전 변환된
                        `amountInDefaultCurrency`가 제공되지 않는 한
                        `preferred_currency_amount`는 null로 반환됩니다.
                      example: ETH
                    currencyType:
                      type: string
                      description: 통화가 `fiat`인지 `crypto`인지 여부(`currency_kind`에 매핑됨)입니다.
                    amountInDefaultCurrency:
                      type: number
                      nullable: true
                      description: >-
                        기본 통화로 사전 환산된 금액입니다(`amount_in_default_currency`에 매핑됨).
                        생략하면 자동 환율 변환이 시도됩니다.
                    defaultCurrencyCode:
                      type: string
                      description: >-
                        환산 금액의 기본 통화 코드(`default_currency`에 매핑됨)입니다. 현재 유통되는 ISO
                        4217 코드 중 하나입니다.
                    paymentDetails:
                      type: string
                      nullable: true
                      description: 자유 형식 결제 참조 또는 메모입니다(`payment_details`에 매핑됨).
                    paymentTxnId:
                      type: string
                      nullable: true
                      description: >-
                        외부 결제 참조(`payment_reference_id`에 매핑됨). 크립토 거래의 경우 온체인 거래
                        해시입니다.
                    type:
                      type: string
                      nullable: true
                      description: >-
                        거래의 하위 유형(`action_type`에 매핑됨)입니다(예: `deposit`,
                        `withdrawal`, `transfer`).
                    cryptoParams:
                      type: object
                      description: '암호화폐 관련 파라미터(예: `{"crypto_chain": "ETH"}`)입니다.'
                subject:
                  type: object
                  description: >-
                    거래의 주체(신청자)입니다. 여기서는 `externalUserId`가 무시되며, 주체의 신원은 항상 토큰의
                    `vendor_data`를 통해 적용됩니다.
                  required:
                    - fullName
                  properties:
                    type:
                      type: string
                      description: >-
                        엔티티 유형(`entity_type`에 매핑됨): `individual`(기본값) 또는
                        `company`.
                    externalUserId:
                      type: string
                      description: >-
                        대상(subject)에서는 무시됨 - token의 `vendor_data`를 기반으로 서버 측에서
                        강제 적용됩니다.
                    fullName:
                      type: string
                      example: Jane Doe
                    firstName:
                      type: string
                    lastName:
                      type: string
                    dob:
                      type: string
                      format: date
                      description: 생년월일(YYYY-MM-DD, `date_of_birth`에 매핑됨).
                    address:
                      type: object
                      description: >-
                        `country`(ISO 3166-1 alpha-3), `town`, `state`,
                        `street`, `post_code`를 포함하는 주소 객체입니다.
                    institutionInfo:
                      type: object
                      description: 기관 참여자의 기관 세부 정보(`institution_details`에 매핑됨).
                    device:
                      type: object
                      description: >-
                        선택적 명시적 기기 컨텍스트입니다. 자동으로 캡처된 기기 인텔리전스와 병합되며, 충돌 시 서버에서
                        파생된 필드가 우선합니다.
                    paymentMethod:
                      type: object
                      description: 주체가 사용하는 결제 수단(`payment_method`에 매핑됨)입니다.
                      properties:
                        type:
                          type: string
                          description: >-
                            결제 수단 종류(`method_type`에 매핑됨)입니다(예: `bank_card`,
                            `bank_account`, `crypto_wallet`, `ewallet`,
                            `unhosted_wallet`, `other`).
                        accountId:
                          type: string
                          description: '계정 식별자(`account_id`에 매핑됨): IBAN, 카드 지문 또는 지갑 주소.'
                        issuingCountry:
                          type: string
                          description: >-
                            발급처의 ISO 3166-1 alpha-3 국가 코드입니다(`issuing_country`에
                            매핑됨).
                counterparty:
                  type: object
                  description: >-
                    거래의 거래 상대방(선택 사항)입니다. `subject`와 동일한 형태이며, 여기서는
                    `externalUserId`가 의미를 갖습니다.
                  properties:
                    type:
                      type: string
                      description: '엔티티 유형(`entity_type`에 매핑됨): `individual` 또는 `company`.'
                    externalUserId:
                      type: string
                      description: 거래 상대방에 대한 귀하의 내부 식별자입니다(`vendor_data`에 매핑됨).
                    fullName:
                      type: string
                    firstName:
                      type: string
                    lastName:
                      type: string
                    dob:
                      type: string
                      format: date
                    address:
                      type: object
                    institutionInfo:
                      type: object
                    device:
                      type: object
                    paymentMethod:
                      type: object
                      description: >-
                        거래 상대방이 사용하는 결제 수단(`payment_method`에 매핑됨)입니다. travelRule
                        거래에서 `type: "unhosted_wallet"`은 거래 상대방 지갑을 자체 보관 지갑으로
                        신고합니다. 이체는 거래 상대방 VASP 라우팅을 건너뛰고 `UNCONFIRMED_OWNERSHIP`
                        상태로 직접 생성되며, (`auto_wallet_verification`이 활성화된 경우) 지갑
                        소유권 위젯 세션이 자동으로 생성되어 SDK가 실행할 수 있도록 `action_required`에
                        반환됩니다.
                      properties:
                        type:
                          type: string
                          description: >-
                            결제 수단 종류(`method_type`에 매핑됨)입니다(예: `bank_card`,
                            `bank_account`, `crypto_wallet`, `ewallet`,
                            `unhosted_wallet`, `other`). Travel Rule을 위한 자체 보관
                            지갑을 신고하려면 `unhosted_wallet`을 사용하세요.
                        accountId:
                          type: string
                          description: '계정 식별자(`account_id`에 매핑됨): IBAN, 카드 지문 또는 지갑 주소.'
                        issuingCountry:
                          type: string
                props:
                  type: object
                  additionalProperties: true
                  description: >-
                    커스텀 키-값 쌍(`custom_properties`에 매핑됨)입니다. 각 키는 규칙 조건에서
                    `custom_values.<key>`로 참조할 수 있습니다.
                travelRule:
                  type: object
                  description: >-
                    Travel Rule 세부 정보(`travel_rule_details`에 매핑됨). 애플리케이션에
                    Travel Rule이 활성화되어 있으면 Didit은 전송된 `status`를 무시하고 직접 정보 교환을
                    진행합니다.
                  required:
                    - status
                  properties:
                    status:
                      type: string
                    protocol:
                      type: string
                    required:
                      type: boolean
                    obligationsCount:
                      type: integer
                    originatorData:
                      type: object
                    beneficiaryData:
                      type: object
                    metadata:
                      type: object
                includeCryptoScreening:
                  type: boolean
                  nullable: true
                  description: >-
                    암호화폐 블록체인 분석 스크리닝에 대한 거래별 재정의입니다(`include_crypto_screening`에
                    매핑됨).
                fingerprint_v2:
                  type: object
                  description: >-
                    `didit-fp-v2` 기기 지문 payload입니다. SDK에 의해 자동으로 주입되며, wire API를
                    직접 호출할 때만 관련이 있습니다.
              required:
                - txnId
                - type
                - info
                - subject
            example:
              txnId: wd-2026-07-07-0042
              type: travelRule
              info:
                direction: out
                amount: '0.25'
                currency: ETH
                currencyType: crypto
                cryptoParams:
                  crypto_chain: ETH
              subject:
                fullName: Jane Doe
              counterparty:
                fullName: Ana Diaz
                paymentMethod:
                  type: unhosted_wallet
                  accountId: 0xBeneficiaryWallet01
              travelRule:
                status: AWAITING_COUNTERPARTY
                beneficiaryData:
                  wallet_address: 0xBeneficiaryWallet01
                  name: Ana Diaz
              includeCryptoScreening: true
      responses:
        '201':
          description: >-
            거래가 제출되고 모니터링되었습니다. 최종 사용자가 후속 작업을 완료해야 할 때 포함되는 `action_required`
            블록을 포함하여 `GET /v3/transactions/{transaction_id}/`와 동일한 세부 정보
            형태입니다(SDK는 기본적으로 이를 자동으로 실행합니다).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TransactionDetail'
              examples:
                Wallet ownership required:
                  value:
                    uuid: 22222222-3333-4444-5555-666666666666
                    txn_id: wd-2026-07-07-0042
                    transaction_type: travelRule
                    direction: OUTBOUND
                    status: APPROVED
                    amount: '0.25'
                    currency: ETH
                    travel_rule:
                      uuid: 33333333-4444-5555-6666-777777777777
                      status: UNCONFIRMED_OWNERSHIP
                      required: true
                    action_required:
                      type: wallet_ownership
                      url: https://verify.didit.me/wallet-ownership/3s9x...urlsafe
                      widget_session_id: 77777777-8888-9999-aaaa-bbbbbbbbbbbb
                      expires_at: '2026-07-07T13:00:00Z'
        '400':
          description: 검증 실패(필수 필드 누락, 중복된 `txnId`, 알 수 없는 카테고리).
          content:
            application/json:
              examples:
                Missing fields:
                  value:
                    transaction_details:
                      currency:
                        - This field is required.
                Duplicate txnId:
                  value:
                    transaction_id:
                      - A transaction with this transaction_id already exists.
        '401':
          description: >-
            거래 토큰이 거부되었습니다: 누락되었거나, 알 수 없거나, 폐기되었거나, `max_uses`를 초과했거나, 만료되었습니다.
            만료된 토큰 응답은 세부 정보에 항상 `expired`라는 단어를 포함하며, SDK는 이를 통해
            `expired_token`과 `invalid_token` 오류를 구분합니다.
          content:
            application/json:
              examples:
                Invalid token:
                  value:
                    detail: Invalid transaction token.
                Expired token:
                  value:
                    detail: Transaction token expired.
        '409':
          description: >-
            이 요청이 처리되는 동안 동일한 `txnId`를 가진 다른 요청이 거래를 생성했으므로 두 개의 동시 제출 중 하나만
            성공합니다. 다시 제출하는 대신 기존 거래를 조회하십시오.
          content:
            application/json:
              examples:
                Concurrent duplicate:
                  value:
                    detail: A transaction with this transaction_id already exists.
      security:
        - TransactionTokenAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: |-
            curl -X POST https://verification.didit.me/v1/transactions/ \
              -H 'X-Transaction-Token: SDK_TOKEN' -H 'Content-Type: application/json' \
              -d '{"txnId": "wd-2026-07-07-0042", "type": "travelRule", "info": {"direction": "out", "amount": "0.25", "currency": "ETH", "currencyType": "crypto"}, "subject": {"fullName": "Jane Doe"}, "counterparty": {"fullName": "Ana Diaz", "paymentMethod": {"type": "unhosted_wallet", "accountId": "0xBeneficiaryWallet01"}}, "travelRule": {"status": "AWAITING_COUNTERPARTY", "beneficiaryData": {"wallet_address": "0xBeneficiaryWallet01", "name": "Ana Diaz"}}, "includeCryptoScreening": true}'
        - lang: javascript
          label: Web SDK
          source: |-
            import { DiditSdk } from '@didit-protocol/sdk-web';

            const result = await DiditSdk.shared.submitTransaction({
              transactionToken: sdkToken,
              transaction: {
                txnId: 'wd-2026-07-07-0042',
                category: 'travelRule',
                details: { direction: 'out', amount: '0.25', currency: 'ETH', currencyType: 'crypto' },
                subject: { fullName: 'Jane Doe' },
                counterparty: { fullName: 'Ana Diaz', paymentMethod: { type: 'unhosted_wallet', accountId: '0xBeneficiaryWallet01' } },
                travelRule: { status: 'AWAITING_COUNTERPARTY', beneficiaryData: { wallet_address: '0xBeneficiaryWallet01', name: 'Ana Diaz' } },
                includeCryptoScreening: true
              },
              onActionCompleted: (refreshed) => console.log(refreshed.status)
            });
components:
  schemas:
    TransactionDetail:
      type: object
      description: >-
        `GET /v3/transactions/{transaction_id}/` 및 `POST /v3/transactions/`에서
        반환되는 단일 거래에 대한 전체 모니터링 기록입니다.
      properties:
        uuid:
          type: string
          format: uuid
          description: Didit 고유 거래 식별자입니다. 후속 호출 시 `{transaction_id}`로 사용합니다.
        environment:
          type: string
          enum:
            - live
            - sandbox
          description: >-
            거래를 소유한 애플리케이션의 환경. `sandbox` 거래는 저장되지만 평가, 스크리닝, 알림 또는 결제가 이루어지지
            않으므로, 비어 있는 `rule_runs`는 "평가되지 않음"을 의미합니다.
        transaction_number:
          type: integer
          description: 'Console에 표시되는 애플리케이션별 순차 거래 번호(예: `4123`)입니다.'
        txn_id:
          type: string
          description: 생성 시 제공한 `transaction_id`입니다(최대 128자). 애플리케이션별로 고유합니다.
        txn_date:
          type: string
          format: date-time
          description: 거래가 발생한 시점입니다(`transaction_at` 기준, 기본값은 제출 시간).
        zone_id:
          type: string
          nullable: true
          description: 생성 시 제공된 IANA 표준 시간대 식별자입니다.
        transaction_type:
          type: string
          description: >-
            저장된 최상위 카테고리: `finance`, `kyc`, `travelRule`, `userPlatformEvent`,
            `gamblingBet`, `gamblingLimitChange`, `gamblingBonusChange`,
            `auditTrailEvent`. 여러 단어로 된 값은 snake_case로 제출하더라도 camelCase로 반환됩니다.
        action_type:
          type: string
          description: >-
            카테고리 내 하위 유형입니다(예: `deposit`, `withdrawal`, `transfer`). 제공되지 않은 경우
            카테고리로 기본 설정됩니다.
        direction:
          type: string
          enum:
            - INBOUND
            - OUTBOUND
          description: >-
            주체 기준의 방향입니다. 제출된 대소문자에 관계없이 대문자로 저장됩니다(입력 시
            `in`/`out`/`inbound`/`outbound` 허용).
        status:
          type: string
          enum:
            - APPROVED
            - IN_REVIEW
            - DECLINED
            - AWAITING_USER
          description: >-
            현재 모니터링 판정 결과입니다. 거래는 `APPROVED` 상태로 생성되며, 규칙에 따라 동기식으로
            `IN_REVIEW`/`DECLINED` 상태로 변경될 수 있습니다.
        source:
          type: string
          enum:
            - LIVE
            - IMPORTED
          description: >-
            기록이 생성된 방식입니다. API 또는 SDK를 통해 제출된 거래는 `LIVE`, 콘솔 가져오기를 통해 로드된 거래는
            `IMPORTED`입니다.
        amount:
          type: string
          description: >-
            끝자리의 0이 제거된 십진수 문자열 형태의 거래 금액(예: `"1500"`, `"0.5"`,
            `"0.123456789012345678"`)입니다. 소수점 이하 최대 18자리입니다.
        currency:
          type: string
          description: >-
            `amount`의 통화 코드입니다. 암호화폐 자산 심볼(예: `BTC`)뿐만 아니라 모든 ISO 4217 알파벳 코드(예:
            `EUR`, `USD`, `NGN`)를 사용할 수 있습니다. 현재 유통 중인 코드를 사용하는 것이 좋습니다. 지원되는 모든
            코드에 환율이 제공되는 것은 아닙니다. 해당 코드의 환율을 사용할 수 없는 경우(예: ISO 회계 단위 `XSU` 또는
            Didit에서 가격을 책정하지 않는 암호화폐 심볼), 자동 변환이 실패하며 요청에 사전 변환된
            `amount_in_default_currency`가 제공되지 않는 한 `preferred_currency_amount`는
            null로 반환됩니다.
        currency_type:
          type: string
          nullable: true
          description: '`currency_kind`로 제출된 `fiat` 또는 `crypto`.'
        amount_in_default_currency:
          type: string
          nullable: true
          description: 사용자가 제공한 사전 환산 금액으로, 뒤따르는 0이 제거된 십진수 문자열입니다.
        default_currency_code:
          type: string
          nullable: true
        preferred_currency_amount:
          type: string
          nullable: true
          description: 제공되는 경우 애플리케이션의 선호 통화로 변환된 `amount`입니다.
        preferred_currency_code:
          type: string
          nullable: true
        payment_details:
          type: string
          nullable: true
          description: 제출된 자유 형식 결제 참조 또는 메모입니다.
        payment_txn_id:
          type: string
          nullable: true
          description: '`payment_reference_id`에서 가져온 외부 결제 시스템 참조(예: 블록체인 거래 해시)입니다.'
        score:
          type: integer
          description: 규칙에 의해 누적된 위험 점수(일반적으로 0–100). 높을수록 위험합니다.
        severity:
          type: string
          nullable: true
          enum:
            - UNKNOWN
            - LOW
            - MEDIUM
            - HIGH
            - CRITICAL
          description: >-
            규칙/제공업체에서 설정한 범주형 위험 심각도(`UNKNOWN`, `LOW`, `MEDIUM`, `HIGH`,
            `CRITICAL`). 설정되기 전까지는 `null`입니다.
        decision_reason_code:
          type: string
          nullable: true
          description: 현재 `status`에 대한 기계 판독 가능한 사유.
        decision_reason_label:
          type: string
          nullable: true
          description: '`decision_reason_code`에 대한 사람이 읽기 쉬운 라벨입니다.'
        vendor_data:
          type: string
          nullable: true
          description: 신청자의 `vendor_data`에 대한 편의 사본입니다.
        metadata:
          type: object
          description: 생성 시점에 제출된 `subject` 및 `counterparty` payload의 스냅샷입니다.
        props:
          type: object
          description: >-
            생성 시 제공한 `custom_properties`입니다. 각 키는 규칙 조건에서 `custom_values.<key>`로
            참조할 수 있습니다.
        tags:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              name:
                type: string
              color:
                type: string
              description:
                type: string
                nullable: true
              source:
                type: string
                enum:
                  - didit
                  - custom
                description: 태그가 Didit 프리셋인지 커스텀 태그인지 여부입니다.
          description: 거래에 연결된 태그(수동 또는 규칙에 의해)입니다.
        parties:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              role:
                type: string
                enum:
                  - APPLICANT
                  - REMITTER
                  - BENEFICIARY
                  - COUNTERPARTY
                description: >-
                  당사자 역할입니다. 생성 endpoint는 `APPLICANT`(대상자) 및 `COUNTERPARTY`를
                  할당합니다.
              entity_type:
                type: string
                enum:
                  - individual
                  - company
                  - external
                  - unhostedWallet
              kind:
                type: string
                enum:
                  - USER
                  - BUSINESS
                  - EXTERNAL
                description: >-
                  `USER`/`BUSINESS` 당사자는 `vendor_data`를 통해 Didit 소유 엔티티로 다시
                  연결됩니다. `EXTERNAL` 당사자는 연결된 Didit 엔티티가 없습니다.
              vendor_data:
                type: string
                nullable: true
                description: 귀하의 내부 사용자/기업 식별자입니다.
              full_name:
                type: string
                nullable: true
              first_name:
                type: string
                nullable: true
              last_name:
                type: string
                nullable: true
              country_code:
                type: string
                nullable: true
                description: 제출된 `address.country`의 국가 코드입니다(일반적으로 ISO 3166-1 alpha-3).
              dob:
                type: string
                format: date
                nullable: true
                description: 제출된 `date_of_birth`에서 가져온 생년월일입니다.
              address:
                type: object
                description: 제출된 주소 객체입니다. 생략된 경우 `{}`입니다.
              institution_info:
                type: object
                description: 제출된 기관 세부 정보입니다. 생략 시 `{}`입니다.
              device:
                type: object
                description: >-
                  IP가 제공된 경우 network_context 하위의 서버 측 IP 보강(지리적 위치, VPN/데이터 센터
                  플래그)을 포함한 정규화된 기기 컨텍스트입니다.
                properties:
                  fingerprint:
                    type: string
                    description: 고유 기기 핑거프린트입니다.
                  persistent_device_id:
                    type: string
                    description: 세션 간 유지되는 고유 기기 식별자(v2 핑거프린트 스키마)입니다.
                  user_agent:
                    type: string
                    description: 브라우저 또는 앱 사용자 에이전트 문자열입니다.
                  browser_family:
                    type: string
                    description: '브라우저 계열(예: Chrome, Firefox, Safari)입니다.'
                  browser_version:
                    type: string
                    description: 브라우저 버전 문자열입니다.
                  platform:
                    type: string
                    description: 플랫폼 식별자(web, ios, android, macos, windows, linux)입니다.
                  os_family:
                    type: string
                    description: '운영체제 제품군(예: iOS, Android, Windows).'
                  os_version:
                    type: string
                    description: 운영체제 버전 문자열입니다.
                  accept_language:
                    type: string
                    description: Accept-Language 헤더 값입니다.
                  session_id:
                    type: string
                    description: 세션 식별자(메타데이터에 저장됨)입니다.
                  session_age_ms:
                    type: number
                    description: 밀리초 단위의 세션 경과 시간입니다.
                  network_context:
                    type: object
                    description: IP 주소 및 지리적 위치가 포함된 네트워크 컨텍스트입니다.
                    properties:
                      ip_address:
                        type: string
                        description: 클라이언트 IP 주소입니다.
                      ip_country_code:
                        type: string
                        description: IP의 지리적 위치로 확인된 국가(ISO 3166-1 alpha-3)입니다.
                      latitude:
                        type: number
                        description: IP의 지리적 위도입니다.
                      longitude:
                        type: number
                        description: IP의 지리적 경도입니다.
              external_party_snapshot:
                type: object
                nullable: true
                description: >-
                  `EXTERNAL` 당사자에 대한 당사자 데이터의 동결 사본입니다. 당사자가 Didit 사용자 또는 기업에
                  연결되어 있는 동안에는 `null`입니다.
          description: 거래 당사자(신청인, 거래 상대방)입니다.
        payment_methods:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              payment_method_type:
                type: string
                enum:
                  - bank_card
                  - bank_account
                  - e_wallet
                  - crypto_wallet
                  - unhosted_wallet
                  - other
              label:
                type: string
                nullable: true
              fingerprint:
                type: string
                nullable: true
                description: >-
                  `type:account_id:issuing_country`에 대한 SHA-256 — 동일한 수단의 재사용을
                  연계하기 위한 안정적인 식별자입니다.
              account_id:
                type: string
                nullable: true
                description: 계정 식별자(IBAN, 지갑 주소, 카드 token 등).
              issuing_country:
                type: string
                nullable: true
              owner_kind:
                type: string
                enum:
                  - USER
                  - BUSINESS
                  - EXTERNAL
              vendor_data:
                type: string
                nullable: true
                description: 소유한 사용자/기업에 대한 귀하의 식별자입니다.
              owner_name:
                type: string
                nullable: true
              institution_info:
                type: object
              details:
                type: object
                description: 제출된 원시 `payment_method` 객체입니다.
              external_owner_snapshot:
                type: object
                nullable: true
              role:
                type: string
                enum:
                  - SOURCE
                  - DESTINATION
                  - FUNDING
                  - BENEFICIARY
                description: >-
                  거래에서 이 방법이 사용된 방식입니다. 생성 endpoint는 방향에 따라
                  `SOURCE`/`DESTINATION`을 할당합니다(발신: 주체 = SOURCE, 수신: 주체 =
                  DESTINATION).
          description: 거래에 연결된 결제 수단입니다.
        documents:
          type: array
          description: 콘솔에서 거래에 첨부된 파일입니다. 없는 경우 `[]`입니다.
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              label:
                type: string
                nullable: true
              note:
                type: string
                nullable: true
              uploaded_by:
                type: string
                nullable: true
              created_at:
                type: string
                format: date-time
              files:
                type: array
                items:
                  type: object
                  properties:
                    uuid:
                      type: string
                      format: uuid
                    file_url:
                      type: string
                      format: uri
                      nullable: true
                      description: 유효 기간이 짧은 서명된 다운로드 URL입니다. 저장하지 말고 필요할 때 가져오세요.
                    original_filename:
                      type: string
                      nullable: true
                    file_size:
                      type: integer
                      nullable: true
        activities:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              activity_type:
                type: string
                description: >-
                  예: `TRANSACTION_CREATED`, `TRANSACTION_NOTE_ADDED`,
                  `TRANSACTION_STATUS_CHANGED`.
              source:
                type: string
              status:
                type: string
                nullable: true
              title:
                type: string
                nullable: true
              description:
                type: string
                nullable: true
              metadata:
                type: object
              occurred_at:
                type: string
                format: date-time
          description: 활동 로그 항목입니다(생성, 메모, 수동 검토, 상태 변경).
        alerts:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              title:
                type: string
              description:
                type: string
                nullable: true
              severity:
                type: string
                enum:
                  - UNKNOWN
                  - LOW
                  - MEDIUM
                  - HIGH
                  - CRITICAL
              status:
                type: string
                enum:
                  - OPEN
                  - INVESTIGATING
                  - AWAITING_USER
                  - PENDING_SAR
                  - SAR_FILED
                  - RESOLVED
                  - DISMISSED
              source:
                type: string
                enum:
                  - RULE
                  - PROVIDER
                  - MANUAL
              metadata:
                type: object
              created_at:
                type: string
                format: date-time
              due_at:
                type: string
                format: date-time
                nullable: true
          description: 현재는 항상 비어 있습니다. 미해결 알림은 상태가 `IN_REVIEW` 또는 `AWAITING_USER`인 거래입니다.
        rule_runs:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              rule:
                type: string
                format: uuid
                description: 실행된 규칙의 UUID입니다.
              rule_title:
                type: string
              rule_description:
                type: string
                nullable: true
              rule_category:
                type: string
              matched:
                type: boolean
                description: >-
                  규칙의 조건이 이 거래와 일치했는지 여부입니다. 일치하는 규칙에 대해서만 실행이 기록되므로, 실시간 평가에서는
                  항상 `true`를 갖습니다.
              is_test:
                type: boolean
                description: 규칙이 TEST 모드에서 실행된 경우 true입니다(상태/점수에 영향 없음).
              mode:
                type: string
                enum:
                  - ACTIVE
                  - DISABLED
                  - TEST
              severity:
                type: string
                nullable: true
              score_delta:
                type: integer
                description: 이 규칙의 `add_score` 작업으로 추가된 점수입니다.
              status_target:
                type: string
                nullable: true
                description: '`change_status` 작업에 의해 설정된 상태(있는 경우)입니다.'
              action_summary:
                type: string
                nullable: true
                description: >-
                  규칙이 실행한 작업의 요약으로, `; `로 연결됩니다(예: `score +30;
                  change_status:IN_REVIEW; add_tag:high_risk_country`). 구성 요소:
                  `score +N`, `change_status:<STATUS>`, `add_tag:<name>`,
                  `add_note`, `add_to_list`, `open_case`. 규칙이 아무런 작업도 실행하지 않은 경우
                  `null`입니다.
              metadata:
                type: object
                description: >-
                  평가 세부 정보: `scope_match`, `conditions[]` 및 `aggregations[]`. 각
                  조건 항목은 `field`, `operator`, `expected_value`, 거래에서 읽은
                  `current_value`, `matched`, `group_index` 및 `group_logic`을
                  포함합니다. 각 집계 항목(속도 / 건수 / 합계)은 `metric`, `field`, `operator`,
                  `expected_value`, 집계 결과인 `computed_value`, `window`,
                  `filters`, `matched` 및 `sample_references`를 포함합니다. 지연된 비동기 집계는
                  `computed_value: null` 및 `deferred: true`를 가집니다. 중첩 조건 그룹은
                  `operator`가 `any_of` 또는 `all_of`이고, `field`가 null이며, 해당 멤버들의
                  결과가 자체 `conditions` 아래에 있는 하나의 `conditions[]` 항목입니다.
              created_at:
                type: string
                format: date-time
          description: 규칙별 실행 결과 — 어떤 규칙이 실행되었는지와 점수에 미친 영향입니다.
        provider_results:
          type: array
          items:
            type: object
            properties:
              uuid:
                type: string
                format: uuid
              provider:
                type: string
              result_type:
                type: string
                enum:
                  - FIAT_MONITORING
                  - WALLET_SCREENING
                  - TRANSACTION_SCREENING
                  - TRAVEL_RULE
                  - NETWORK_GRAPH
                  - CUSTOM
              status:
                type: string
              severity:
                type: string
                nullable: true
              score:
                type: integer
              summary:
                type: string
                nullable: true
              payload:
                type: object
                description: 원시 제공자 응답 payload입니다.
              created_at:
                type: string
                format: date-time
          description: 원시 제공자 payload(AML 스크리닝, 블록체인 분석 등)입니다.
        travel_rule:
          nullable: true
          allOf:
            - $ref: '#/components/schemas/TransactionTravelRule'
          description: >-
            Travel Rule 이체 또는 확인입니다. `travel_rule_details`가 제출되었을 때, 그리고 Travel
            Rule이 활성화되어 있고 `transaction_category: travelRule`로 거래가 생성되었을 때
            채워집니다(Didit은 `travel_rule_details` 없이도 정보 교환을 직접 시작합니다). 이체 또는 확인이
            존재하지 않는 경우 `null`입니다. 인바운드 이체에서는 지갑 소유권이 확인될 때까지 거래 상대방의
            `originator_data` 및 `beneficiary_data`가 마스킹된 상태(`data_masked:
            true`)로 유지됩니다.
        network_snapshot:
          type: object
          nullable: true
          description: >-
            규칙 엔진에서 사용하는 관련 거래/당사자의 그래프 스냅샷입니다. 거래와 함께 제출된 `network_snapshot` 또는
            Didit이 성공한 AML 지갑 스크리닝에서 빌드하는 그래프(제출된 그래프를 대체함) 중 하나입니다. 둘 다 존재하지 않는
            경우 `null`입니다.
          properties:
            uuid:
              type: string
              format: uuid
            nodes:
              type: array
              items:
                type: object
            edges:
              type: array
              items:
                type: object
            metrics:
              type: object
        remediation:
          type: object
          nullable: true
          description: >-
            재인증이 필요할 때 사용자에게 제공되는 개선 세션입니다. 표준 블록인 `action_required`로 대체되었으며, 이전
            버전과의 호환성을 위해 유지됩니다.
          properties:
            session_id:
              type: string
            session_token:
              type: string
            url:
              type: string
              format: uri
            status:
              type: string
        action_required:
          type: object
          nullable: true
          description: >-
            이 거래를 완료하는 데 필요한 대기 중인 최종 사용자 작업이며, 없는 경우 null입니다. Didit SDK는 기본적으로
            작업을 자동으로 실행하고 완료 시 거래를 새로고침합니다. `type`으로 구분되는 두 가지 변형이 있습니다.
            `verification_session`(규칙 작업에 의해 생성된 호스팅 인증 세션)과
            `wallet_ownership`(지갑 제어 증명이 필요한 Travel Rule 이체에 대해 자동 생성되는 지갑 소유권
            위젯 세션으로, `auto_wallet_verification` Travel Rule 설정에 따라 제어됨)입니다. 둘 다
            적용될 수 있는 경우 Travel Rule 교환을 차단하므로 `wallet_ownership`이 우선 적용됩니다.
          oneOf:
            - $ref: '#/components/schemas/TransactionVerificationSessionAction'
            - $ref: '#/components/schemas/TransactionWalletOwnershipAction'
          discriminator:
            propertyName: type
            mapping:
              verification_session: '#/components/schemas/TransactionVerificationSessionAction'
              wallet_ownership: '#/components/schemas/TransactionWalletOwnershipAction'
        cost_breakdown:
          type: object
          nullable: true
          description: >-
            이 거래의 비용입니다. `total_price`와 청구 항목별 `usage_type`, `price`, `details`,
            `created_at`이 포함된 `items`로 구성됩니다. 동일한 거래를 다시 스크리닝하면 새 항목이 생성됩니다.
    TransactionTravelRule:
      type: object
      description: >-
        `GET /v3/transactions/{transaction_id}/`, `POST /v3/transactions/`의
        `201`, `GET /v3/transactions/`의 각 행에서 반환하는 거래의 Travel Rule 이체입니다.
        `direction`, `rail`, `counterparty_vasp`, `delivery`, `discovery`,
        `reason`, `next_actions`는 `PATCH
        /v3/transactions/{transaction_id}/travel-rule/`와 형식이 동일하므로, 거래를 한 번만
        조회해도 이체가 중단된 이유와 진행 방법을 확인할 수 있습니다.
      properties:
        uuid:
          type: string
          format: uuid
        status:
          type: string
        protocol:
          type: string
          nullable: true
        required:
          type: boolean
        obligations_count:
          type: integer
        originator_data:
          type: object
          description: 송금인 당사자 정보입니다. 인바운드 전송의 경우 소유 구조가 확인될 때까지 거래 상대방의 값이 마스킹됩니다.
        beneficiary_data:
          type: object
          description: 수취인 당사자 정보입니다. 입금 거래의 경우 소유 구조가 확인될 때까지 거래 상대방의 값이 마스킹됩니다.
        name_match:
          type: object
          nullable: true
          description: >-
            이체를 결정한 이름 비교(점수 및 엄격도)입니다. 실행되기 전까지는 null입니다. 비교된 이름은 당사자와 함께
            마스킹됩니다.
        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입니다.
        metadata:
          type: object
        direction:
          type: string
          enum:
            - INBOUND
            - OUTBOUND
          description: 이 전송이 거래소의 어느 쪽에 해당하는지입니다.
        rail:
          type: string
          nullable: true
          description: >-
            이체가 진행된 레일(`INTERNAL`, `TRP`, `GTR`, `TRUST`, `VERIFYVASP`, `SYGNA`
            또는 `EMAIL`(Didit Test VASP가 응답한 샌드박스 애플리케이션의 경우 `TEST_VASP`)) 또는 레일이
            선택될 때까지 `null`입니다.
        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입니다.
          description: 거래 상대방의 디렉터리 항목이며, 전송이 연결되지 않은 경우 `null`입니다.
        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'
    TransactionVerificationSessionAction:
      title: Verification session
      type: object
      properties:
        type:
          type: string
          enum:
            - verification_session
        url:
          type: string
          format: uri
          description: 최종 사용자에게 열어줄 호스팅 인증 URL입니다.
        session_id:
          type: string
          format: uuid
          description: 인증 세션 ID입니다.
        session_token:
          type: string
          description: 모바일 SDK에서 플로우를 네이티브로 실행하는 데 사용되는 세션 token입니다.
        status:
          type: string
          description: 인증 세션 상태입니다.
      required:
        - type
        - url
    TransactionWalletOwnershipAction:
      title: Wallet ownership
      type: object
      properties:
        type:
          type: string
          enum:
            - wallet_ownership
        url:
          type: string
          format: uri
          description: >-
            호스팅 지갑 소유권 위젯 URL입니다. 실제 브라우저 환경에서 여십시오. 모바일에서는 임베디드 웹뷰를 사용하지 말고
            SFSafariViewController 또는 Chrome Custom Tab을 사용하십시오.
        widget_session_id:
          type: string
          format: uuid
          description: 지갑 소유권 위젯 세션 ID입니다.
        expires_at:
          type: string
          format: date-time
          description: 위젯 세션이 만료되는 시점입니다.
      required:
        - type
        - url
    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:
    TransactionTokenAuth:
      type: apiKey
      in: header
      name: X-Transaction-Token
      description: >-
        백엔드에서 POST /v3/transactions/sdk-token/을 통해 발행한 유효 기간이 짧은 범위 지정 token입니다.
        디바이스용 /v1/transactions/ endpoints에서 Didit SDK가 사용합니다.

````

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