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

# 거래 생성 API: KYT 제출

> Didit KYT에 거래를 제출해 위험 점수 산정, 스크리닝, 트래블 룰 처리를 진행합니다. 월 1,000건 포함, 이후 건당 $0.001.



거래 생성 API 프롬프트
        프롬프트를 클립보드에 복사



      
      

\<pre>

\`Submit a transaction for Didit monitoring through the Management API.

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

Authentication:
Use the x-api-key header with my Didit API key.

Goal:
\- Submit a transaction for KYT (transaction monitoring). Didit runs the configured rules engine, blockchain analytics, and AML screening synchronously and returns the verdict in the response. The full detail (parties, rule runs, provider results, remediation links) is also returned.
\- A Travel Rule transfer is stored in the same call, but Didit contacts the counterparty after the response: travel_rule.status comes back AWAITING_COUNTERPARTY (or NOT_APPLICABLE, UNCONFIRMED_OWNERSHIP, or COMPLETED for your own verified wallet) with travel_rule.protocol null, and every later status change, including COUNTERPARTY_VASP_NOT_FOUND, arrives as a travel_rule.status.updated webhook. Your rules run again when the rail or the status changes.

When to call:
\- At payment authorization, before fanning out funds, to decide allow / hold / decline based on status, score, severity.
\- On post-trade events (gambling bets, audit-trail events, KYC events) for long-running monitoring without a per-transaction decision.
\- On crypto deposits / withdrawals — set transaction_details.currency_kind = "crypto" and provide the relevant wallet address in payment_method.account_id.
\- For Travel Rule, set transaction_category = "travel_rule" and include travel_rule_details (alias travelRule).
travel_rule_details.status is required (400 if missing); when Travel Rule is enabled, Didit runs the exchange and ignores the status you send, and otherwise Didit records the transfer passively with that status.
When the subject is a user with an approved Didit KYC verification and Travel Rule is on, Didit replaces the originator_data fields the verification holds with the verified values (metadata.originator_provenance says which); otherwise it sends originator_data as you provide it, so build it from the identity you verified.
beneficiary_data carries the beneficiary (name, wallet_address, chain) and any routing hints (travel_address, counterparty_vasp_lei, counterparty_vasp_name, counterparty_vasp_email).
If beneficiary_data.chain is empty, Didit takes transaction_details.crypto_params.crypto_chain, else custom_properties.crypto_chain, else the currency, uppercases it, and sets it only when it is a chain Didit recognises (for example ETH or BTC).
\- Chain shapes: on XRP, XLM, EOS, ATOM and HBAR send the destination tag or memo as payment_method.memo (or beneficiary_data.memo); on BTC, LTC, BCH and DOGE send the transaction's inputs and outputs as travel_rule_details.utxo; on bitcoin or Lightning, payment_method.account_id may be a Lightning payment request or Lightning Address. What Didit resolved is on travel_rule.chain_details (see /transaction-monitoring/travel-rule#chain-shapes).

Identifiers:
\- transaction_id (alias txnId) is YOUR identifier (max 128 chars), unique per application.
It becomes txn_id on subsequent calls.
Reusing a transaction_id that already exists returns 400 {"transaction_id": ["A transaction with this transaction_id already exists."]}, and when two identical requests race each other the loser gets 409.
Neither response returns the existing transaction, so to retry safely, treat a 400 or 409 for a duplicate id as already created and look the transaction up instead of resubmitting: GET /v3/transactions/{uuid}/ with the Didit uuid from the first response, or with the transaction_id (the Didit uuid) that the transaction.created webhook carries next to your txn_id.
GET does not accept your txn_id. Sandbox applications do not receive transaction.created or transaction.status.updated, so save the Didit uuid from the create response. Sandbox Travel Rule exchanges do emit travel_rule.status.updated with environment: sandbox.
\- The returned uuid is Didit's stable identifier — use it in GET /v3/transactions/{transaction_id}/.

Linking to entities:
\- subject.vendor_data (and optionally counterparty.vendor_data) are your internal user/business identifiers. They link the transaction to the long-lived User / Business entity assembled from prior verification sessions. Use the SAME vendor_data you supplied when creating the KYC session.

Minimum request body (application/json):
\{
"transaction_id": "your-txn-2026-05-17-001",
"transaction_category": "finance",   // finance | kyc | travel_rule | user_event | audit_trail_event | gambling_bet | gambling_limit_change | gambling_bonus_change
"transaction_details": {
"direction": "outbound",            // "inbound" | "outbound"
"amount": 1500,                     // number or decimal string, up to 18 decimal places (string for exact precision); never negative, because direction carries the sign
"currency": "EUR",                  // any ISO 4217 code (EUR, USD, NGN, ...) or a crypto symbol
"currency_kind": "fiat",            // "fiat" | "crypto" (optional)
"action_type": "withdrawal"         // optional, e.g. deposit/withdrawal/transfer
},
"subject": {                          // APPLICANT party
"entity_type": "individual",        // "individual" | "company"
"vendor_data": "user-12345",        // required
"full_name": "Maria Garcia",        // required
"address": { "country": "ESP" }     // optional
},
"counterparty": { ... },              // optional COUNTERPARTY party (same shape as subject)
"transaction_at": "2026-05-17T08:42:00Z",  // optional, defaults to now
"travel_rule_details": { "status": "AWAITING_COUNTERPARTY", ... }   // optional, for crypto Travel Rule; status is required inside it
}

Currency codes:
\- currency has no enum. Any ISO 4217 alphabetic code (EUR, USD, NGN, ...) and any crypto asset symbol (BTC, ETH, ...) are accepted and stored exactly as you send them, up to 10 characters.
\- Prefer a currently-circulating code. Not every accepted code has an exchange rate: withdrawn currencies and accounting units such as XDR are often still quoted, but when Didit has no rate for the code you send (for example the ISO accounting unit XSU, or a crypto symbol Didit does not price), automatic conversion to your base currency fails and preferred_currency_amount comes back null. A pre-converted amount_in_default_currency is always used as sent when present, so supply it for any code you are not sure has a rate.
\- Set currency_kind = "crypto" for on-chain amounts. The kind gates the transaction's own crypto AML screening: without currency_kind = "crypto" that regular screening step is skipped and no screening fee is estimated or charged for it, even with monitoring enabled or include_crypto_screening = true. Travel Rule attribution is a separate path: on a production application with Travel Rule and VASP attribution enabled, an outbound transaction_category = "travel_rule" request whose beneficiary wallet and chain cannot be reached over any rail triggers a VASP attribution wallet screening, and that screening is billed at the wallet screening price whatever currency_kind is or is not set. The kind does not change the stored decimal scale: up to 18 decimal places are kept either way, but only when amount arrives as a decimal string ("0.123456789012345678"). A JSON number is parsed as a binary float first, so anything beyond about 15 significant digits is rounded before it is stored (0.123456789012345678 is stored as 0.12345678901234568). The kind also decides how the amount is rendered in the transaction PDF. Crypto amounts render with up to 8 decimal places, fiat amounts with their ISO 4217 minor unit (2 for most currencies). Without the kind, RON, MNT and GEL are rendered as fiat because each is both a token and an ISO 4217 currency, so a small token amount can show as 0 in the report.
The VASP attribution screening is skipped when the transaction's own crypto screening already screened that wallet: Didit reuses that result and charges nothing extra.

Example call:
curl -X POST "https://verification.didit.me/v3/transactions/" \
-H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" \
-d '{
"transaction_id": "your-txn-2026-05-17-001",
"transaction_category": "finance",
"transaction_details": {"direction":"outbound","amount":1500,"currency":"EUR","action_type":"withdrawal"},
"subject": {"entity_type":"individual","vendor_data":"user-12345","full_name":"Maria Garcia"}
}'

What to read from the response:
\- uuid — Didit transaction id, use for GET /v3/transactions/{transaction_id}/.
\- status - APPROVED | IN_REVIEW | DECLINED | AWAITING_USER (live verdict; at creation, AWAITING_USER comes from a rule action).
\- score (0–100, higher = riskier) and severity (LOW | MEDIUM | HIGH | CRITICAL).
\- decision_reason_code / decision_reason_label — machine + human verdict reason.
\- parties (role APPLICANT for the subject, COUNTERPARTY for the counterparty; kind USER, BUSINESS or EXTERNAL), cost_breakdown, rule_runs, provider_results (crypto screening results) and network_snapshot.
\- travel_rule - the Travel Rule transfer (status, protocol, required, originator_data, beneficiary_data, direction, rail, counterparty_vasp, delivery, discovery, reason, next_actions), or null; action_required - a pending wallet-ownership or verification step, or null.
reason and next_actions say why a COUNTERPARTY_VASP_NOT_FOUND or COUNTERPARTY_VASP_NOT_REACHABLE transfer is stuck and what moves it on (for example email_undeliverable: update_compliance_email, then resend); they are "" and [] for any other status.

Webhooks:
\- transaction.created fires after this call succeeds.
\- For a travel_rule transaction, travel_rule.status.updated fires for each Travel Rule transition, after transaction.created. Each webhook is delivered and retried on its own, so key on transaction_id rather than on arrival order.
\- transaction.status.updated fires whenever the verdict changes (manual review, async screening, rule re-runs). Subscribe a destination via POST /v3/webhook/destinations/.

Failure modes:
\- 400 - duplicate transaction_id, missing required field (including travel_rule_details.status), an unknown travel_rule_details.status ("Invalid travel rule status: ..."), invalid direction/category enum, or malformed party object.
\- 409 - a concurrent request with the same transaction_id was created first.
\- 403 - missing x-api-key (a wrong, revoked or expired key gets 401), or a key without permission for this action; the body is a { "detail": "..." } envelope.
\- 403 - the organization's balance cannot cover the fees this request would charge: { "detail": "...", "code": "insufficient_credits" }, and nothing is created.
\- 429 - more than 600 ingestion requests per minute for this API key (transaction and event ingestion share this budget, apart from the 300 of every other write); wait Retry-After seconds and retry.

Side effects:
\- Creates the transaction record and runs the synchronous rules + screening pipeline.
\- Links the transaction to the User / Business entity that shares the subject.vendor_data.
\- An outbound travel_rule transaction is billed once, at creation, on one line. It pays the Travel Rule fee ($0.02) when Travel Rule is on and Didit starts an exchange for it (amount at or above threshold_amount, including a transfer to a self-hosted wallet or to the user's own verified wallet). Otherwise it is billed as transaction monitoring (included in the plan's monthly transaction allowance, $0.001 each beyond it): below threshold_amount, a Lightning payment the Travel Rule does not apply to, or data recorded while Travel Rule is disabled. A resend never charges again.
\- An inbound travel_rule transaction pays no base fee, an application that joined Travel Rule free pays none on outbound transactions until it turns outbound billing on, and sandbox applications are never charged.
\- Crypto screening, when it runs, adds the Wallet Verification & Screening charge.

For the full integration shape, see /integration/integration-prompt.`

\</pre>



      
      

붙여넣을 곳



## OpenAPI

````yaml ko/openapi-25.json POST /v3/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:
  /v3/transactions/:
    post:
      tags:
        - Transactions
      summary: 거래 생성
      description: >-
        동기식 AML/위험 모니터링을 위해 거래를 제출합니다. 거래는 `APPROVED` 상태로 생성된 후 귀하의 규칙(및 해당하는 경우
        암호화폐 스크리닝)이 인라인으로 실행되어 반환되는 `status`를 `IN_REVIEW` 또는 `DECLINED`로 변경할 수
        있습니다. **`transaction_id`는 멱등성 키입니다**(최대 128자, 앱당 고유). 이를 재사용하면 400이
        반환됩니다. 프로덕션 애플리케이션의 경우 성공 시 `transaction.created` webhook이 전송됩니다. 샌드박스
        애플리케이션에는 요금이 청구되지 않으며 `transaction.created` 또는
        `transaction.status.updated` webhook을 발송하지 않습니다. 샌드박스 Travel Rule 정보 교환은
        `environment: sandbox`가 포함된 `travel_rule.status.updated` webhook을 발송합니다.
        Travel Rule 전송은 거래 상대방에게 연락하기 전에 저장 및 반환됩니다. `travel_rule.status`는
        `AWAITING_COUNTERPARTY`(귀하의 임계값 미만인 경우 `NOT_APPLICABLE`, 신고된 자체 보관 지갑의
        경우 `UNCONFIRMED_OWNERSHIP`, 상대 지갑이 귀하의 자체 검증 지갑인 경우 `COMPLETED`)로 반환되며
        `travel_rule.protocol`은 null입니다. 그런 다음 Didit이 레일을 선택하고 교환을 전송하며, 거래
        상대방에게 도달할 수 있는 레일이 없을 때의 `COUNTERPARTY_VASP_NOT_FOUND`를 포함하여 전송의 모든 후속
        상태 변경이 `travel_rule.status.updated` webhook으로 전달됩니다. 레일이나 상태가 변경되면 귀하의
        규칙이 다시 실행됩니다.
      operationId: createTransaction
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                transaction_id:
                  type: string
                  description: 귀하가 지정한 해당 거래의 고유 식별자입니다(최대 128자).
                  example: your-txn-2026-05-17-001
                transaction_at:
                  type: string
                  format: date-time
                  description: 거래가 발생한 시점입니다. 생략 시 현재 시간으로 기본 설정됩니다.
                time_zone:
                  type: string
                  description: 'IANA 표준 시간대 식별자(예: `Europe/Madrid`)입니다.'
                transaction_category:
                  type: string
                  description: >-
                    거래의 카테고리. CamelCase 별칭(`travelRule`, `userPlatformEvent`,
                    `gamblingBet` 등)도 허용되며, 여러 단어로 이루어진 카테고리의 경우 저장/반영되는 값은
                    camelCase입니다.
                  example: finance
                  enum:
                    - finance
                    - kyc
                    - travel_rule
                    - user_event
                    - audit_trail_event
                    - gambling_bet
                    - gambling_limit_change
                    - gambling_bonus_change
                    - travelRule
                transaction_details:
                  type: object
                  description: 거래의 핵심 금융 세부 정보입니다.
                  required:
                    - direction
                    - amount
                    - currency
                  properties:
                    direction:
                      type: string
                      description: >-
                        주체 기준의 거래 방향입니다. 대소문자를 구분하지 않으며, `in`/`out`을 별칭으로 사용할 수
                        있습니다. 대문자(`INBOUND`/`OUTBOUND`)로 에코되어 반환됩니다.
                      example: outbound
                      enum:
                        - inbound
                        - outbound
                        - in
                        - out
                    amount:
                      type: number
                      description: >-
                        거래 금액(소수점 이하 최대 18자리)입니다. 정확한 정밀도가 중요한 경우 십진수 문자열(예:
                        `"0.123456789012345678"`)로 전송하십시오. JSON 숫자는 먼저 바이너리
                        부동소수점으로 파싱되므로 약 15자리를 초과하는 유효 숫자는 금액이 저장되기 전에 반올림됩니다. 0
                        이상이어야 합니다. 거래 방향이 부호를 결정하므로 음수 금액을 전달하면 `400`이 반환됩니다.
                      example: 1500
                    currency:
                      type: string
                      description: >-
                        통화 코드입니다. 암호화폐 자산 심볼(예: `BTC`)뿐만 아니라 모든 ISO 4217 알파벳
                        코드(예: `EUR`, `USD`, `NGN`)를 사용할 수 있습니다. 현재 유통 중인 코드를
                        사용하는 것이 좋습니다. 지원되는 모든 코드에 환율이 제공되는 것은 아닙니다. 해당 코드의 환율을
                        사용할 수 없는 경우(예: ISO 회계 단위 `XSU` 또는 Didit에서 가격을 책정하지 않는
                        암호화폐 심볼), 자동 변환이 실패하며 요청에 사전 변환된
                        `amount_in_default_currency`가 제공되지 않는 한
                        `preferred_currency_amount`는 null로 반환됩니다.
                      example: EUR
                    currency_kind:
                      type: string
                      description: 통화가 `fiat`인지 `crypto`인지 여부입니다.
                    amount_in_default_currency:
                      type: number
                      nullable: true
                      description: 기본 통화로 사전 환산된 금액입니다. 생략하면 자동 환율 변환이 시도됩니다. 0 이상이어야 합니다.
                    default_currency:
                      type: string
                      description: 환산 금액의 기본 통화 코드입니다. 현재 유통되는 ISO 4217 코드 중 하나입니다.
                    payment_details:
                      type: string
                      nullable: true
                      description: 자유 형식 결제 참조 또는 메모입니다.
                    payment_reference_id:
                      type: string
                      nullable: true
                      description: >-
                        외부 결제 시스템 참조입니다. 크립토 AML 거래 해시 스크리닝의 경우 블록체인 거래 해시를 전송하고
                        관련 주소와 함께 `subject.payment_method.account_id`도 제공해야 합니다.
                    action_type:
                      type: string
                      nullable: true
                      description: '거래의 하위 유형입니다(예: `deposit`, `withdrawal`, `transfer`).'
                    crypto_params:
                      type: object
                      description: >-
                        통화(자산 심볼)와 별도로 선택하는 암호화폐 네트워크입니다. 커스텀 token 심볼을 기록한다고 해서
                        해당 컨트랙트의 거래 해시 지원이 보장되지는 않습니다.
                      properties:
                        crypto_chain:
                          type: string
                          description: >-
                            스크리닝에 사용된 실제 네트워크입니다. 관리형 스크리닝은 BTC, ETH, LTC, XRP,
                            BCH, DOGE, TRX, SOL, MATIC, BNB, BASE (Base), OP
                            (Optimism), ARB (Arbitrum One), AVAX (Avalanche
                            C-Chain), ADA (Cardano), XLM (Stellar), HBAR
                            (Hedera)를 지원합니다. MATIC의 경우 POLYGON 또는 POL, BNB의 경우
                            BSC, TRX의 경우 TRON과 같은 일반적인 네트워크 이름도 허용됩니다. 멀티 네트워크
                            토큰의 경우 항상 이를 지정해야 합니다. 0x 거래 해시와 함께 전송된 USDT, USDC
                            또는 ETH에 이 값이 누락된 경우, Didit은 Ethereum, BNB Chain,
                            Polygon, Base, Arbitrum, Optimism에서 해당 해시를 조회하여 발견된
                            네트워크에서 스크리닝합니다. 어떤 네트워크에도 존재하지 않는 경우 해당 거래는 스크리닝되지
                            않으며, custom_values.aml_screening_status는 FAILED가 되고
                            custom_values.aml_screening_error에 이유가 표시됩니다. 지갑으로
                            스크리닝할 때(거래 해시 없음) USDT 또는 USDC에 이 값이 누락된 경우, Tron
                            주소는 Tron에서, Solana 주소는 Solana에서 스크리닝되며, 0x 주소는 거래를
                            전송했거나 해당 토큰을 보유하고 있는 6개 네트워크 중 첫 번째 네트워크에서 스크리닝되거나,
                            어느 네트워크에서도 활동이 없는 경우 Ethereum에서 스크리닝됩니다. 연동된 제공업체의
                            지원 범위는 상이하며, LIGHTNING은 지원되는 연동 제공업체가 필요합니다.
                          example: BASE
                subject:
                  type: object
                  description: 거래의 주체(신청자)입니다.
                  required:
                    - vendor_data
                    - full_name
                  properties:
                    entity_type:
                      type: string
                      description: '엔티티 유형: `individual` 또는 `company`.'
                    vendor_data:
                      type: string
                      description: 귀하의 내부 사용자/기업 식별자입니다.
                      example: user-12345
                    full_name:
                      type: string
                      description: 대상자의 성명입니다.
                      example: Maria Garcia
                    first_name:
                      type: string
                      description: 대상자의 이름입니다.
                    last_name:
                      type: string
                      description: 대상자의 성입니다.
                    date_of_birth:
                      type: string
                      format: date
                      description: 생년월일(YYYY-MM-DD)입니다.
                    address:
                      type: object
                      description: 주소 객체입니다.
                      properties:
                        country:
                          type: string
                          description: >-
                            국가 코드입니다(ISO 3166-1 alpha-3 권장). 당사자의
                            `country_code`로 복사됩니다.
                        town:
                          type: string
                        state:
                          type: string
                        street:
                          type: string
                        post_code:
                          type: string
                    institution_details:
                      type: object
                      description: 기관 세부 정보(기관 대상 전용).
                      properties:
                        name:
                          type: string
                        code:
                          type: string
                        address:
                          type: object
                    device_context:
                      type: object
                      description: >-
                        거래 시점에 캡처된 기기 컨텍스트입니다. browser_family 및 platform은 명시적인
                        최상위 키로 전송되어야 하며 user_agent에서 파생되지 않습니다. 요청 시 camelCase
                        별칭인 device도 허용됩니다.
                      properties:
                        fingerprint:
                          type: string
                          description: 고유 기기 핑거프린트입니다.
                        persistent_device_id:
                          type: string
                          description: 세션 간 유지되는 고유 기기 식별자(v2 핑거프린트 스키마)입니다.
                        user_agent:
                          type: string
                          description: '브라우저 또는 앱 사용자 에이전트 문자열입니다. CamelCase 별칭: userAgent.'
                        browser_family:
                          type: string
                          description: >-
                            브라우저 계열(예: Chrome, Firefox, Safari)입니다. 명시적으로 전송해야
                            하며, user_agent에서 파생되지 않습니다. CamelCase 별칭:
                            browserFamily.
                        browser_version:
                          type: string
                          description: >-
                            브라우저 버전 문자열입니다. 명시적으로 전송해야 합니다. CamelCase 별칭:
                            browserVersion.
                        platform:
                          type: string
                          description: >-
                            플랫폼 식별자(web, ios, android, macos, windows,
                            linux)입니다. user_agent에서 파생되지 않으므로 반드시 명시적으로 전송해야
                            합니다.
                        os_family:
                          type: string
                          description: >-
                            운영체제 제품군(예: iOS, Android, Windows). CamelCase 별칭:
                            osFamily.
                        os_version:
                          type: string
                          description: '운영체제 버전 문자열입니다. CamelCase 별칭: osVersion.'
                        accept_language:
                          type: string
                          description: 'Accept-Language 헤더 값입니다. 카멜 표기법 별칭: acceptLang.'
                        session_id:
                          type: string
                          description: >-
                            사용자의 현재 세션의 세션 식별자입니다. 메타데이터에 저장됩니다. CamelCase 별칭:
                            sessionId.
                        session_age_ms:
                          type: number
                          description: >-
                            거래 시점의 사용자 세션 경과 시간(밀리초)입니다. CamelCase 별칭:
                            sessionAgeMs.
                        network_context:
                          type: object
                          description: >-
                            IP 주소 및 지리적 위치가 포함된 네트워크 컨텍스트입니다. 최상위 ipInfo 블록도 이
                            객체에 병합됩니다.
                          properties:
                            ip_address:
                              type: string
                              description: '클라이언트 IP 주소입니다. CamelCase 별칭: ip.'
                            ip_country_code:
                              type: string
                              description: >-
                                IP의 지리적 위치로 확인된 국가(ISO 3166-1 alpha-3)입니다.
                                CamelCase 별칭: countryCode3.
                            latitude:
                              type: number
                              description: 'IP의 지리적 위도입니다. CamelCase 별칭: lat.'
                            longitude:
                              type: number
                              description: 'IP의 지리적 경도입니다. CamelCase 별칭: lon.'
                    payment_method:
                      type: object
                      description: 주체가 사용하는 결제 수단입니다.
                      properties:
                        method_type:
                          type: string
                          description: >-
                            결제 수단 유형: `bank_card`, `bank_account`,
                            `crypto_wallet`, `ewallet`, `unhosted_wallet`,
                            `other`.
                        account_id:
                          type: string
                          description: >-
                            계정 식별자(예: IBAN, 지갑 주소). 가상자산 스크리닝의 경우 이 참여자의 지갑 주소가
                            포함되어야 합니다. 인바운드 트랜잭션 해시 스크리닝에는 대상자의 서비스/고객 입금 주소가
                            필요합니다. 아웃바운드 스크리닝은 거래 상대방의 대상 지갑을 사용합니다. 비트코인 또는
                            Lightning에서의 가상자산 전송 시 Lightning 결제 요청(BOLT11 인보이스,
                            BOLT12 오퍼, LNURL) 또는 Lightning Address일 수 있습니다.
                            Didit은 지정된 수취인을 계정으로 저장하고(지정되지 않은 경우 "") 요청 내용을
                            Travel Rule 전송의 `chain_details.lightning`에 저장합니다. 저장
                            시 최대 255자입니다. 비트코인 또는 Lightning에서의 가상자산 전송 시
                            Lightning 결제 요청(BOLT11 인보이스, BOLT12 오퍼, LNURL) 또는
                            Lightning Address일 수 있습니다. Didit은 지정된 수취인을 계정으로
                            저장하고(지정되지 않은 경우 "") 요청 내용을 Travel Rule 전송의
                            `chain_details.lightning`에 저장합니다. 저장 시 최대 255자입니다.
                        memo:
                          type: string
                          maxLength: 256
                          description: >-
                            메모 네트워크(XRP, XLM, EOS, ATOM, HBAR)에서 지갑의 일부인 대상 태그
                            또는 메모입니다. 하나의 공유 거래소 주소에서 각 메모는 고유한 결제 수단입니다. XRP:
                            대상 태그, 0부터 4294967295까지의 정수(JSON 숫자 허용). XLM: 최대
                            28바이트의 텍스트 메모, 64비트 id 또는 16진수 32바이트 해시. EOS: 최대
                            256바이트. ATOM: 최대 256자. HBAR: 최대 100바이트. Bitcoin,
                            EVM, Solana, Tron, Litecoin, Bitcoin Cash, Dogecoin
                            및 Lightning 지갑은 메모를 지원하지 않으며, 입력 시 `400`이 반환됩니다. 별칭:
                            `destinationTag` 또는 `destination_tag`.
                        issuing_country:
                          type: string
                          description: 발급처의 ISO 3166-1 alpha-3 국가 코드입니다.
                counterparty:
                  type: object
                  description: 거래의 거래 상대방(선택 사항)입니다.
                  properties:
                    entity_type:
                      type: string
                      description: '엔티티 유형: `individual` 또는 `company`.'
                    vendor_data:
                      type: string
                      description: 거래 상대방에 대한 귀하의 내부 식별자입니다.
                    full_name:
                      type: string
                      description: 거래 상대방의 성명입니다.
                    first_name:
                      type: string
                    last_name:
                      type: string
                    date_of_birth:
                      type: string
                      format: date
                    address:
                      type: object
                      description: '`country`(ISO 3166-1 alpha-3)를 포함하는 주소 객체입니다.'
                    institution_details:
                      type: object
                    device_context:
                      type: object
                      description: >-
                        거래 상대방의 기기 컨텍스트입니다. browser_family 및 platform은 명시적인 최상위
                        키로 전송해야 하며, user_agent에서 파생되지 않습니다.
                      properties:
                        fingerprint:
                          type: string
                          description: 고유 기기 핑거프린트입니다.
                        persistent_device_id:
                          type: string
                          description: 세션 간 유지되는 고유 기기 식별자(v2 핑거프린트 스키마)입니다.
                        user_agent:
                          type: string
                          description: '브라우저 또는 앱 사용자 에이전트 문자열입니다. CamelCase 별칭: userAgent.'
                        browser_family:
                          type: string
                          description: >-
                            브라우저 계열(예: Chrome, Firefox, Safari)입니다. 명시적으로 전송해야
                            하며, user_agent에서 파생되지 않습니다. CamelCase 별칭:
                            browserFamily.
                        browser_version:
                          type: string
                          description: >-
                            브라우저 버전 문자열입니다. 명시적으로 전송해야 합니다. CamelCase 별칭:
                            browserVersion.
                        platform:
                          type: string
                          description: >-
                            플랫폼 식별자(web, ios, android, macos, windows,
                            linux)입니다. user_agent에서 파생되지 않으므로 반드시 명시적으로 전송해야
                            합니다.
                        os_family:
                          type: string
                          description: >-
                            운영체제 제품군(예: iOS, Android, Windows). CamelCase 별칭:
                            osFamily.
                        os_version:
                          type: string
                          description: '운영체제 버전 문자열입니다. CamelCase 별칭: osVersion.'
                        accept_language:
                          type: string
                          description: 'Accept-Language 헤더 값입니다. 카멜 표기법 별칭: acceptLang.'
                        session_id:
                          type: string
                          description: >-
                            거래 상대방 세션의 세션 식별자입니다. 메타데이터에 저장됩니다. CamelCase 별칭:
                            sessionId.
                        session_age_ms:
                          type: number
                          description: >-
                            거래 시점의 사용자 세션 경과 시간(밀리초)입니다. CamelCase 별칭:
                            sessionAgeMs.
                        network_context:
                          type: object
                          description: >-
                            IP 주소 및 지리적 위치가 포함된 네트워크 컨텍스트입니다. 최상위 ipInfo 블록도 이
                            객체에 병합됩니다.
                          properties:
                            ip_address:
                              type: string
                              description: '클라이언트 IP 주소입니다. CamelCase 별칭: ip.'
                            ip_country_code:
                              type: string
                              description: >-
                                IP의 지리적 위치로 확인된 국가(ISO 3166-1 alpha-3)입니다.
                                CamelCase 별칭: countryCode3.
                            latitude:
                              type: number
                              description: 'IP의 지리적 위도입니다. CamelCase 별칭: lat.'
                            longitude:
                              type: number
                              description: 'IP의 지리적 경도입니다. CamelCase 별칭: lon.'
                    payment_method:
                      type: object
                      description: >-
                        거래 상대방이 사용하는 결제 수단입니다. travelRule 거래에서 `method_type:
                        "unhosted_wallet"`은 거래 상대방 지갑을 자체 보관 지갑으로 신고합니다. 이체는 거래
                        상대방 VASP 라우팅을 건너뛰고 `UNCONFIRMED_OWNERSHIP` 상태로 직접 생성되며,
                        (`auto_wallet_verification`이 활성화된 경우) 지갑 소유권 위젯 세션이 자동으로
                        생성되어 거래의 `action_required` 블록에 반환됩니다.
                      properties:
                        method_type:
                          type: string
                          description: >-
                            결제 수단 유형: `bank_card`, `bank_account`,
                            `crypto_wallet`, `ewallet`, `unhosted_wallet`,
                            `other`. Travel Rule에 자체 보관 지갑을 선언하려면
                            `unhosted_wallet`을 사용하십시오.
                        account_id:
                          type: string
                          description: >-
                            계정 식별자(예: IBAN 또는 지갑 주소). 비트코인 또는 Lightning에서의 가상자산
                            전송 시 Lightning 결제 요청(BOLT11 인보이스, BOLT12 오퍼, LNURL)
                            또는 Lightning Address일 수 있습니다. Didit은 지정된 수취인을 계정으로
                            저장하고(지정되지 않은 경우 "") 요청 내용을 Travel Rule 전송의
                            `chain_details.lightning`에 저장합니다. 저장 시 최대 255자입니다.
                            비트코인 또는 Lightning에서의 가상자산 전송 시 Lightning 결제
                            요청(BOLT11 인보이스, BOLT12 오퍼, LNURL) 또는 Lightning
                            Address일 수 있습니다. Didit은 지정된 수취인을 계정으로 저장하고(지정되지 않은
                            경우 "") 요청 내용을 Travel Rule 전송의
                            `chain_details.lightning`에 저장합니다. 저장 시 최대 255자입니다.
                        memo:
                          type: string
                          maxLength: 256
                          description: >-
                            메모 네트워크(XRP, XLM, EOS, ATOM, HBAR)에서 지갑의 일부인 대상 태그
                            또는 메모입니다. 하나의 공유 거래소 주소에서 각 메모는 고유한 결제 수단입니다. XRP:
                            대상 태그, 0부터 4294967295까지의 정수(JSON 숫자 허용). XLM: 최대
                            28바이트의 텍스트 메모, 64비트 id 또는 16진수 32바이트 해시. EOS: 최대
                            256바이트. ATOM: 최대 256자. HBAR: 최대 100바이트. Bitcoin,
                            EVM, Solana, Tron, Litecoin, Bitcoin Cash, Dogecoin
                            및 Lightning 지갑은 메모를 지원하지 않으며, 입력 시 `400`이 반환됩니다. 별칭:
                            `destinationTag` 또는 `destination_tag`.
                        issuing_country:
                          type: string
                custom_properties:
                  type: object
                  description: >-
                    거래에 연결된 임의의 키-값 쌍입니다. 각 키는 `custom_values.<key>` 필드 경로를 통해
                    규칙 조건에서 참조할 수 있습니다.
                  additionalProperties: true
                  example:
                    merchant_id: test
                    bank_name: test_2
                travel_rule_details:
                  type: object
                  description: >-
                    Travel Rule 데이터입니다. Travel Rule이 활성화되어 있고
                    transaction_category가 travel_rule인 경우 Didit이 직접 정보 교환을
                    실행합니다. status, protocol, required, obligations_count는 무시되며
                    originator_data, beneficiary_data, metadata가 사용됩니다. 그렇지 않은
                    경우 Didit은 이 값들을 수동적 Travel Rule 기록으로 저장합니다. Travel Rule이 켜져
                    있는 동안 임계값 이상의 아웃바운드 이체는 해당 규제 체계(EU TFR 또는 FATF 권고안 16)에서
                    요구하는 내용을 포함해야 하며, 전송하는 측에서 확인됩니다. 누락된 필드가 있는 경우
                    `travel_rule_details.originator_data` 또는
                    `travel_rule_details.beneficiary_data` 아래에 400 응답이 반환됩니다(예:
                    "EU TFR requires the originator name.").
                  required:
                    - status
                  properties:
                    status:
                      type: string
                      description: >-
                        travel_rule_details를 보낼 때마다 필수입니다. Travel Rule 전송 상태 중
                        하나(예: AWAITING_COUNTERPARTY, COMPLETED,
                        NOT_APPLICABLE)여야 합니다. 소문자 및 camelCase 표기와 레거시 값인
                        UNKNOWN, COMPLIANT, PENDING_ACTION,
                        PENDING_COUNTERPARTY, FAILED, EXEMPT도 허용되며 매핑됩니다. 그 외의
                        값은 400을 반환합니다.
                    protocol:
                      type: string
                    required:
                      type: boolean
                    obligations_count:
                      type: integer
                    originator_data:
                      type: object
                      description: >-
                        송금인 당사자 정보로, 평면 필드 또는 하나의 IVMS 101 개인 객체입니다. 승인된 KYC 인증을
                        보유한 사용자의 경우, Didit은 인증이 보유한 필드를 검증된 값으로
                        대체합니다(`metadata.originator_provenance` 참조). 객체여야 하며, 그
                        외의 모든 것은 `400`을 반환합니다. 메모 네트워크에서는 `memo` 키가 송금인 지갑의 메모
                        또는 태그를 지정합니다.
                    beneficiary_data:
                      type: object
                      description: >-
                        단일 계층 필드 또는 단일 IVMS 101 개인 형태의 수취인 당사자 정보입니다. 반드시 객체여야
                        하며, 그렇지 않으면 `400` 오류가 발생합니다. Didit은 전송 경로를 지정하기 위해
                        `wallet_address`(비어 있는 경우
                        `counterparty.payment_method.account_id`의 값으로 채워짐),
                        `chain`(`transaction_details.crypto_params.crypto_chain`
                        또는 지원되는 네트워크를 나타내는 `currency` 값으로 채워짐),
                        `name`(`counterparty.full_name`으로 대체됨),
                        `travel_address`, `counterparty_vasp_name`,
                        `counterparty_vasp_lei`, `counterparty_vasp_email`을
                        읽습니다. 메모 네트워크에서는 `memo`가 수취인 지갑의 메모 또는 태그를 지정하며,
                        `wallet_address` 및 `memo`가 거래 상대방의 결제 수단보다 우선합니다.
                    metadata:
                      type: object
                    utxo:
                      allOf:
                        - $ref: '#/components/schemas/TravelRuleUtxo'
                      description: >-
                        선택 사항이며 UTXO 체인 전용입니다(BTC, LTC, BCH, DOGE). 사용자가 직접 선언하지
                        않은 경우 Didit이 송금인 지갑과 수취인 출력을 유추하는 트랜잭션의 입력과 출력입니다.
                    originator:
                      type: object
                      description: >-
                        IVMS 101 송금인 블록: `originatorPersons`(`naturalPerson` 또는
                        `legalPerson` 하나. 법인의 경우 거래 당사자가 기업이 됨) 및
                        `accountNumber`(지갑 주소). 해당 객체가 비어 있을 때
                        `originator_data`에 사용됩니다. 형식이 잘못된 블록은 해당 경로(예:
                        `originator.originatorPersons`)를 키로 하여 400 응답을 반환합니다.
                    beneficiary:
                      type: object
                      description: >-
                        IVMS 101 수취인 블록: `beneficiaryPersons`(`naturalPerson` 또는
                        `legalPerson` 하나. 법인의 경우 거래 당사자가 기업이 됨) 및
                        `accountNumber`(지갑 주소). 해당 객체가 비어 있을 때
                        `beneficiary_data`에 사용됩니다. 형식이 잘못된 블록은 해당 경로(예:
                        `beneficiary.beneficiaryPersons`)를 키로 하여 400 응답을 반환합니다.
                    ivms101:
                      type: object
                      description: >-
                        하나의 IVMS 101 객체로 래핑된 `originator` 및 `beneficiary`
                        블록입니다(`IVMS101`도 허용됨). 최상위 블록이 래퍼의 블록보다 우선합니다.
                network_snapshot:
                  type: object
                  description: 미리 계산된 네트워크 그래프 스냅샷입니다.
                  properties:
                    nodes:
                      type: array
                      items:
                        type: object
                    edges:
                      type: array
                      items:
                        type: object
                    metrics:
                      type: object
                include_crypto_screening:
                  type: boolean
                  nullable: true
                  description: >-
                    암호화폐 블록체인 분석 스크리닝에 대한 거래별 재정의입니다. `true`인 경우 애플리케이션 기본값과
                    관계없이 암호화폐 스크리닝이 수행됩니다. `false`인 경우 애플리케이션 설정에서 활성화되어 있더라도
                    암호화폐 스크리닝을 건너뜁니다. 생략되거나 `null`인 경우 Console에 구성된 애플리케이션 수준
                    기본값이 사용됩니다. 암호화폐 스크리닝에는 `transaction_details.direction`,
                    `currency_kind: "crypto"`, 체인/통화, 그리고 방향에 따라 선택된 지갑 주소가
                    필요합니다. 인바운드 전송 전 스크리닝은
                    `counterparty.payment_method.account_id`를 사용하고, 인바운드 트랜잭션 해시
                    스크리닝은 `subject.payment_method.account_id`를 사용하며, 아웃바운드 스크리닝은
                    `counterparty.payment_method.account_id`를 사용합니다.
                    `transaction_details.payment_reference_id`에 블록체인 트랜잭션 해시가
                    포함되어 있으면 Didit은 트랜잭션 스크리닝을 수행하고 가능한 경우 트랜잭션 요약 강화 정보를 반환합니다.
              required:
                - transaction_id
                - transaction_category
                - transaction_details
                - subject
            examples:
              Minimal fiat withdrawal:
                summary: 법정화폐 외부 송금에 허용되는 최소 payload
                value:
                  transaction_id: your-txn-2026-05-17-001
                  transaction_category: finance
                  transaction_details:
                    direction: outbound
                    amount: 1500
                    currency: EUR
                    action_type: withdrawal
                  subject:
                    entity_type: individual
                    vendor_data: user-12345
                    full_name: Maria Garcia
              Crypto outbound with screening:
                summary: 자체 보관 지갑으로의 아웃바운드 가상자산 출금, 옵트인 스크리닝
                value:
                  transaction_id: your-txn-2026-05-17-002
                  transaction_category: finance
                  include_crypto_screening: true
                  transaction_details:
                    direction: outbound
                    amount: 0.5
                    currency: BTC
                    currency_kind: crypto
                    amount_in_default_currency: 32500
                    default_currency: USD
                    action_type: withdrawal
                  subject:
                    entity_type: individual
                    vendor_data: user-12345
                    full_name: Maria Garcia
                    payment_method:
                      method_type: crypto_wallet
                      account_id: bc1qexampleexchangewalletaddressxyz
                      issuing_country: ESP
                  counterparty:
                    entity_type: individual
                    payment_method:
                      method_type: unhosted_wallet
                      account_id: bc1qexampleexternalwalletaddressabc
              Travel Rule transfer:
                summary: Travel Rule 송금인/수취인 데이터가 포함된 아웃바운드 가상자산 전송
                value:
                  transaction_id: your-txn-2026-05-17-003
                  transaction_category: travel_rule
                  transaction_details:
                    direction: outbound
                    amount: 25000
                    currency: USDT
                    currency_kind: crypto
                    action_type: transfer
                  subject:
                    entity_type: individual
                    vendor_data: user-12345
                    full_name: Maria Garcia
                    date_of_birth: '1992-03-14'
                    address:
                      country: ESP
                      town: Madrid
                      street: Calle Mayor 1
                      post_code: '28013'
                  counterparty:
                    entity_type: individual
                    full_name: John Beneficiary
                    institution_details:
                      name: Beneficiary VASP, Inc.
                      code: BVASP-US
                  travel_rule_details:
                    status: AWAITING_COUNTERPARTY
                    protocol: IVMS101
                    required: true
                    originator_data:
                      name: Maria Garcia
                    beneficiary_data:
                      name: John Beneficiary
      responses:
        '201':
          description: >-
            거래가 제출되고 모니터링되었습니다. 본문은 이미 적용된 모든 규칙 결과를 반영한 전체 거래 세부 정보(`GET
            /v3/transactions/{transaction_id}/`와 동일한 형태)입니다.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TransactionDetail'
              examples:
                Approved with no rule hits:
                  value:
                    uuid: abcdef12-3456-4890-abcd-ef1234567890
                    environment: live
                    transaction_number: 4123
                    txn_id: your-txn-2026-05-17-001
                    txn_date: '2026-05-17T08:42:00Z'
                    zone_id: Europe/Madrid
                    transaction_type: finance
                    action_type: withdrawal
                    direction: OUTBOUND
                    status: APPROVED
                    source: LIVE
                    amount: '1500'
                    currency: EUR
                    currency_type: fiat
                    amount_in_default_currency: '1620.45'
                    default_currency_code: USD
                    preferred_currency_amount: '1620.45'
                    preferred_currency_code: USD
                    payment_details: Withdrawal to crypto wallet
                    payment_txn_id: null
                    score: 0
                    severity: null
                    decision_reason_code: null
                    decision_reason_label: null
                    vendor_data: user-12345
                    metadata:
                      subject:
                        entity_type: individual
                        vendor_data: user-12345
                        full_name: Maria Garcia
                        address: {}
                        institution_details: {}
                        device_context: {}
                      counterparty: {}
                    props: {}
                    tags: []
                    parties:
                      - uuid: b1111111-2222-4333-8444-555555555555
                        role: APPLICANT
                        entity_type: individual
                        kind: USER
                        vendor_data: user-12345
                        full_name: Maria Garcia
                        first_name: null
                        last_name: null
                        country_code: null
                        dob: null
                        address: {}
                        institution_info: {}
                        device: {}
                        external_party_snapshot: null
                    payment_methods: []
                    documents: []
                    activities:
                      - uuid: d4e5f6a7-8901-4bcd-9ef0-123456789abc
                        activity_type: TRANSACTION_CREATED
                        source: TRANSACTION
                        status: APPROVED
                        title: withdrawal
                        description: Transaction recorded.
                        metadata: {}
                        occurred_at: '2026-05-17T08:42:11Z'
                    alerts: []
                    rule_runs: []
                    provider_results: []
                    travel_rule: null
                    network_snapshot: null
                    remediation: null
                    action_required: null
                    cost_breakdown: null
                Flagged for review:
                  value:
                    uuid: abcdef12-3456-4890-abcd-ef1234567891
                    environment: live
                    transaction_number: 4124
                    txn_id: your-txn-2026-05-17-002
                    txn_date: '2026-05-17T08:42:00Z'
                    zone_id: Europe/Madrid
                    transaction_type: finance
                    action_type: withdrawal
                    direction: OUTBOUND
                    status: IN_REVIEW
                    source: LIVE
                    amount: '0.5'
                    currency: BTC
                    currency_type: crypto
                    amount_in_default_currency: '32500'
                    default_currency_code: USD
                    preferred_currency_amount: '32500'
                    preferred_currency_code: USD
                    payment_details: Withdrawal to crypto wallet
                    payment_txn_id: null
                    score: 78
                    severity: HIGH
                    decision_reason_code: WALLET_HIGH_RISK
                    decision_reason_label: Destination wallet flagged as high risk
                    vendor_data: user-12345
                    metadata:
                      subject:
                        entity_type: individual
                        vendor_data: user-12345
                        full_name: Maria Garcia
                        address: {}
                        institution_details: {}
                        device_context: {}
                      counterparty: {}
                    props:
                      order_id: ord-9988
                    tags: []
                    parties:
                      - uuid: b1111111-2222-4333-8444-555555555555
                        role: APPLICANT
                        entity_type: individual
                        kind: USER
                        vendor_data: user-12345
                        full_name: Maria Garcia
                        first_name: null
                        last_name: null
                        country_code: null
                        dob: null
                        address: {}
                        institution_info: {}
                        device: {}
                        external_party_snapshot: null
                    payment_methods: []
                    documents: []
                    activities: []
                    alerts:
                      - uuid: a7b8c9d0-1234-4abc-9def-567890abcdef
                        title: Destination wallet flagged as high risk
                        description: Provider risk score exceeded the configured threshold.
                        severity: HIGH
                        status: OPEN
                        source: RULE
                        metadata: {}
                        created_at: '2026-05-17T08:42:12Z'
                        due_at: null
                    rule_runs:
                      - uuid: e5f6a7b8-9012-4cde-af01-23456789abcd
                        rule: f6a7b8c9-0123-4def-b012-3456789abcde
                        rule_title: High-risk wallet screening
                        rule_description: null
                        rule_category: crypto
                        matched: true
                        is_test: false
                        mode: ACTIVE
                        severity: HIGH
                        score_delta: 78
                        status_target: IN_REVIEW
                        action_summary: score +78; change_status:IN_REVIEW
                        metadata: {}
                        created_at: '2026-05-17T08:42:12Z'
                    provider_results: []
                    travel_rule: null
                    network_snapshot: null
                    remediation: null
                    action_required: null
                    cost_breakdown: null
        '400':
          description: >-
            검증 실패(필수 필드 누락, 중복된 `transaction_id`, 알 수 없는 열거형(enum) 값, 유효하지 않은 통화
            등).
          content:
            application/json:
              examples:
                Missing required field:
                  value:
                    transaction_details:
                      amount:
                        - This field is required.
                Duplicate transaction_id:
                  value:
                    transaction_id:
                      - A transaction with this transaction_id already exists.
                Invalid category:
                  value:
                    non_field_errors:
                      - Unsupported transaction category.
                Missing subject identity:
                  value:
                    subject:
                      - subject.vendor_data and subject.full_name are required.
                Blocklisted participant:
                  value:
                    vendor_data:
                      - >-
                        The individual 'user-12345' is in the blocklist and
                        cannot participate in transactions.
        '403':
          description: >-
            API 키가 누락되었거나 유효하지 않거나 폐기되었거나, 해당 키에 이 애플리케이션에 거래를 제출할 수 있는 권한이
            없습니다. 누락된 키는 `403`을 반환하며, 잘못되었거나 폐기되었거나 만료된 키는 `401`을 반환합니다.
          content:
            application/json:
              examples:
                Forbidden:
                  value:
                    detail: You do not have permission to perform this action.
        '409':
          description: >-
            이 요청이 처리되는 동안 동일한 `transaction_id`를 가진 다른 요청이 거래를 생성했으므로 두 개의 동시 제출
            중 하나만 성공합니다. 다시 제출하는 대신 기존 거래를 조회하십시오.
          content:
            application/json:
              examples:
                Concurrent duplicate:
                  value:
                    detail: A transaction with this transaction_id already exists.
        '429':
          description: >-
            속도 제한 초과: 거래 생성 및 이벤트 수집(`POST /v3/transactions/`, `POST
            /v3/events/`, `POST /v3/events/batch/`)은 다른 모든 쓰기 요청이 공유하는 300개와
            별도로, API 키당 분당 600개의 요청 한도를 공유합니다. `Retry-After`초 동안 대기한 후 재시도하세요.
          headers:
            Retry-After:
              description: 재시도가 다음 기간에 이루어지도록 올림 처리한 재시도 대기 시간(초).
              schema:
                type: integer
                minimum: 1
                example: 30
          content:
            application/json:
              examples:
                Throttled:
                  value:
                    detail: >-
                      Ingestion rate limit exceeded. You can make up to 600
                      requests per minute.
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: |-
            curl -X POST 'https://verification.didit.me/v3/transactions/' \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -d '{
                "transaction_id": "your-txn-2026-05-17-001",
                "transaction_category": "finance",
                "transaction_details": {
                  "direction": "outbound",
                  "amount": 1500,
                  "currency": "EUR",
                  "action_type": "withdrawal"
                },
                "subject": {
                  "entity_type": "individual",
                  "vendor_data": "user-12345",
                  "full_name": "Maria Garcia"
                }
              }'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.transactions.create(
                transaction_id="your-txn-2026-05-17-001",
                transaction_category="finance",
                transaction_details={
                    "direction": "outbound",
                    "amount": 1500.0,
                    "currency": "EUR",
                    "action_type": "withdrawal",
                },
                subject={
                    "entity_type": "individual",
                    "vendor_data": "user-12345",
                    "full_name": "Maria Garcia",
                },
            )
            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.create({
              transaction_id: "your-txn-2026-05-17-001",
              transaction_category: "finance",
              transaction_details: {
                direction: "outbound",
                amount: 1500.0,
                currency: "EUR",
                action_type: "withdrawal",
              },
              subject: {
                entity_type: "individual",
                vendor_data: "user-12345",
                full_name: "Maria Garcia",
              },
            });
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Transactions.Create(ctx, didit.TransactionsCreateParams{\n\tTransactionID:       \"your-txn-2026-05-17-001\",\n\tTransactionCategory: \"finance\",\n\tTransactionDetails: didit.TransactionsCreateParamsTransactionDetails{\n\t\tDirection:  \"outbound\",\n\t\tAmount:     1500.0,\n\t\tCurrency:   \"EUR\",\n\t\tActionType: didit.String(\"withdrawal\"),\n\t},\n\tSubject: didit.TransactionsCreateParamsSubject{\n\t\tEntityType: didit.String(\"individual\"),\n\t\tVendorData: \"user-12345\",\n\t\tFullName:   \"Maria Garcia\",\n\t},\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.TransactionsCreateParams;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.transactions().create(TransactionsCreateParams.builder()
                    .transactionId("your-txn-2026-05-17-001")
                    .transactionCategory(TransactionsCreateParams.TransactionCategory.of("finance"))
                    .transactionDetails(TransactionsCreateParams.TransactionDetails.builder()
                            .direction(TransactionsCreateParams.TransactionDetails.Direction.of("outbound"))
                            .amount(1500.0)
                            .currency("EUR")
                            .actionType("withdrawal")
                            .build())
                    .subject(TransactionsCreateParams.Subject.builder()
                            .entityType("individual")
                            .vendorData("user-12345")
                            .fullName("Maria Garcia")
                            .build())
                    .build());
            System.out.println(result);
        - lang: php
          label: PHP
          source: |-
            <?php

            require 'vendor/autoload.php';

            use Didit\DiditClient;

            // Reads DIDIT_API_KEY.
            $didit = new DiditClient();

            $result = $didit->transactions->create([
                'transaction_id' => 'your-txn-2026-05-17-001',
                'transaction_category' => 'finance',
                'transaction_details' => [
                    'direction' => 'outbound',
                    'amount' => 1500.0,
                    'currency' => 'EUR',
                    'action_type' => 'withdrawal',
                ],
                'subject' => [
                    'entity_type' => 'individual',
                    'vendor_data' => 'user-12345',
                    'full_name' => 'Maria Garcia',
                ],
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

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

            result = didit.transactions.create(
              transaction_id: "your-txn-2026-05-17-001",
              transaction_category: "finance",
              transaction_details: {
                direction: "outbound",
                amount: 1500.0,
                currency: "EUR",
                action_type: "withdrawal",
              },
              subject: {
                entity_type: "individual",
                vendor_data: "user-12345",
                full_name: "Maria Garcia",
              }
            )
            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.CreateAsync(new
            TransactionsCreateParams

            {
                TransactionId = "your-txn-2026-05-17-001",
                TransactionCategory = "finance",
                TransactionDetails = new()
                {
                    Direction = "outbound",
                    Amount = 1500.0,
                    Currency = "EUR",
                    ActionType = "withdrawal",
                },
                Subject = new()
                {
                    EntityType = "individual",
                    VendorData = "user-12345",
                    FullName = "Maria Garcia",
                },
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    TravelRuleUtxo:
      type: object
      description: >-
        UTXO 전송(BTC, LTC, BCH, DOGE)의 입력 및 출력입니다. 해당 체인에서만 허용되며, 다른 체인에서는 `400`이
        반환됩니다. Didit은 이를 통해 송금인 지갑(신고된 지갑, 없을 경우 가장 많이 기여한 입력 주소)과 수취인 출력(신고된
        출력, 없을 경우 입력 주소로 거스름돈을 반환하지 않는 유일한 출력, 그것도 없을 경우 전송 금액을 지급하는 하나의 출력)을
        추론합니다. 결과는 전송의 `chain_details`에 포함됩니다.
      required:
        - outputs
      properties:
        inputs:
          type: array
          maxItems: 1000
          items:
            $ref: '#/components/schemas/TravelRuleUtxoEntry'
          description: >-
            선택 사항입니다. 입력(inputs)이 없으면 송금인이 추론되지 않으며 잔돈 출력(change output)도 인식되지
            않습니다.
        outputs:
          type: array
          minItems: 1
          maxItems: 1000
          items:
            $ref: '#/components/schemas/TravelRuleUtxoEntry'
    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`로 구성됩니다. 동일한 거래를 다시 스크리닝하면 새 항목이 생성됩니다.
    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)입니다.
    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`으로 추후 설정됨).
  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.