> ## Documentation Index
> Fetch the complete documentation index at: https://docs.didit.me/llms.txt
> Use this file to discover all available pages before exploring further.

# 从 SDK 提交交易：客户端交易监控（KYT）

> Didit 支持使用限定范围的 SDK token 从终端用户设备提交受监控交易，自动进行设备智能分析，并在钱包所有权需要确认时返回 action_required。



提交交易（SDK token）API 提示词
        将提示词复制到剪贴板



      
      

\<pre>

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

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

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

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

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

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

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

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

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

\</pre>



      
      

粘贴到



## OpenAPI

````yaml zh/openapi-25.json POST /v1/transactions/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: 身份证件验证 API。使用 x-api-key 请求头进行身份验证。
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v1/transactions/:
    post:
      tags:
        - Transactions
      summary: 从 SDK 提交交易
      description: >-
        面向设备的 endpoint，Didit SDK 调用它直接从终端用户的设备提交交易。身份验证使用的是来自 `POST
        /v3/transactions/sdk-token/` 的作用域受限的 token，并在 `X-Transaction-Token`
        请求头中发送，而非使用 API 密钥；该 endpoint 已启用 CORS，因此浏览器可以跨域调用。payload 使用下方所示的
        camelCase 格式字段别名（SDK 的 `submitTransaction` 方法会自动为您构建）。服务端提供三项保证：应用始终取自
        token；主体身份（`externalUserId`）始终根据 token 的 `vendor_data` 强制确定，从而忽略伪造的
        payload 值；以及设备情报（SDK 设备指纹加上服务端派生的 IP 和 user agent）会自动附加到主体上。
      operationId: submitTransactionFromSdk
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                txnId:
                  type: string
                  description: 您对此交易的唯一标识符（映射到 `transaction_id`，最多 128 个字符）。
                  example: wd-2026-07-07-0042
                txnDate:
                  type: string
                  format: date-time
                  description: 交易发生的时间（映射到 `transaction_at`）。如果省略，则默认为当前时间。
                zoneId:
                  type: string
                  description: IANA 时区标识符（映射至 `time_zone`），例如 `Europe/Madrid`。
                type:
                  type: string
                  description: >-
                    交易类别（映射到 `transaction_category`），例如
                    `finance`、`kyc`、`travelRule`、`userPlatformEvent`、`gamblingBet`。
                  example: travelRule
                info:
                  type: object
                  description: 交易的核心财务详情（映射至 `transaction_details`）。
                  required:
                    - direction
                    - amount
                    - currency
                  properties:
                    direction:
                      type: string
                      description: >-
                        相对于主体的方向。不区分大小写；接受 `in`/`out`
                        作为别名。以大写形式返回（`INBOUND`/`OUTBOUND`）。
                      example: out
                    amount:
                      type: number
                      description: >-
                        交易金额（最多 18 位小数）。也接受十进制字符串，这也是保留超过约 15 位有效数字的唯一方法：JSON
                        数字会先解析为二进制浮点数，因此 `0.123456789012345678` 会存储为
                        `0.12345678901234568`。
                      example: 0.25
                    currency:
                      type: string
                      description: >-
                        货币代码。接受任何 ISO 4217 字母代码（例如 `EUR`、`USD`、`NGN`）以及加密资产符号（例如
                        `BTC`）。建议使用当前流通的代码。并非每个接受的代码都有汇率：当该代码没有可用汇率时（例如 ISO 会计单位
                        `XSU`，或 Didit 未定价的加密资产符号），自动换算将失败，并且
                        `preferred_currency_amount` 将返回 null，除非请求提供了预先换算的
                        `amountInDefaultCurrency`。
                      example: ETH
                    currencyType:
                      type: string
                      description: 币种是 `fiat` 还是 `crypto`（映射到 `currency_kind`）。
                    amountInDefaultCurrency:
                      type: number
                      nullable: true
                      description: >-
                        以默认币种计的预先换算金额（映射至
                        `amount_in_default_currency`）。若省略，将尝试自动进行外汇换算。
                    defaultCurrencyCode:
                      type: string
                      description: 转换金额的默认货币代码（映射到 `default_currency`）。任何当前流通的 ISO 4217 代码。
                    paymentDetails:
                      type: string
                      nullable: true
                      description: 自由文本付款参考号或附言（映射至 `payment_details`）。
                    paymentTxnId:
                      type: string
                      nullable: true
                      description: 外部支付参考标识（映射到 `payment_reference_id`）；对于加密货币交易，则为链上交易哈希。
                    type:
                      type: string
                      nullable: true
                      description: >-
                        交易的子类型（映射到 `action_type`），例如
                        `deposit`、`withdrawal`、`transfer`。
                    cryptoParams:
                      type: object
                      description: '加密货币特定参数，例如 `{"crypto_chain": "ETH"}`。'
                subject:
                  type: object
                  description: >-
                    交易的主体（申请人）。此处忽略 `externalUserId`：主体身份始终强制使用 token 的
                    `vendor_data`。
                  required:
                    - fullName
                  properties:
                    type:
                      type: string
                      description: 主体类型（映射到 `entity_type`）：`individual`（默认）或 `company`。
                    externalUserId:
                      type: string
                      description: 对主体忽略 - 在服务端根据 token 的 `vendor_data` 强制执行。
                    fullName:
                      type: string
                      example: Jane Doe
                    firstName:
                      type: string
                    lastName:
                      type: string
                    dob:
                      type: string
                      format: date
                      description: 出生日期（YYYY-MM-DD；映射至 `date_of_birth`）。
                    address:
                      type: object
                      description: >-
                        包含 `country`（ISO 3166-1
                        alpha-3）、`town`、`state`、`street`、`post_code` 的地址对象。
                    institutionInfo:
                      type: object
                      description: 机构参与者的机构详情（映射到 `institution_details`）。
                    device:
                      type: object
                      description: 可选的显式设备上下文。会与自动采集的设备情报进行合并；发生冲突时以服务端派生的字段为准。
                    paymentMethod:
                      type: object
                      description: 主体使用的支付方式（映射至 `payment_method`）。
                      properties:
                        type:
                          type: string
                          description: >-
                            支付方式类型（映射至 `method_type`），例如
                            `bank_card`、`bank_account`、`crypto_wallet`、`ewallet`、`unhosted_wallet`、`other`。
                        accountId:
                          type: string
                          description: 账户标识符（映射到 `account_id`）：IBAN、银行卡指纹或地址。
                        issuingCountry:
                          type: string
                          description: >-
                            签发方的 ISO 3166-1 alpha-3 国家/地区代码（映射至
                            `issuing_country`）。
                counterparty:
                  type: object
                  description: 交易对手（可选）。结构与 `subject` 相同；此处 `externalUserId` 有意义。
                  properties:
                    type:
                      type: string
                      description: 主体类型（映射到 `entity_type`）：`individual` 或 `company`。
                    externalUserId:
                      type: string
                      description: 您为交易对手指定的内部标识符（映射到 `vendor_data`）。
                    fullName:
                      type: string
                    firstName:
                      type: string
                    lastName:
                      type: string
                    dob:
                      type: string
                      format: date
                    address:
                      type: object
                    institutionInfo:
                      type: object
                    device:
                      type: object
                    paymentMethod:
                      type: object
                      description: >-
                        交易对手使用的支付方式（映射至 `payment_method`）。在 travelRule
                        交易中，`type: "unhosted_wallet"` 将交易对手钱包声明为自托管钱包：转账将跳过交易对手
                        VASP 路由，直接以 `UNCONFIRMED_OWNERSHIP` 状态创建，并且（当启用
                        `auto_wallet_verification` 时）会自动生成钱包所有权微件会话并在
                        `action_required` 中返回，以便 SDK 可以启动它。
                      properties:
                        type:
                          type: string
                          description: >-
                            支付方式类型（映射至 `method_type`），例如
                            `bank_card`、`bank_account`、`crypto_wallet`、`ewallet`、`unhosted_wallet`、`other`。使用
                            `unhosted_wallet` 可声明 Travel Rule 的自托管钱包。
                        accountId:
                          type: string
                          description: 账户标识符（映射到 `account_id`）：IBAN、银行卡指纹或地址。
                        issuingCountry:
                          type: string
                props:
                  type: object
                  additionalProperties: true
                  description: >-
                    自定义键值对（映射到 `custom_properties`）。每个键都可以在规则条件中作为
                    `custom_values.<key>` 引用。
                travelRule:
                  type: object
                  description: >-
                    Travel Rule 详情（映射到 `travel_rule_details`）。当为应用启用 Travel Rule
                    时，Didit 会忽略您发送的任何 `status` 并自行驱动信息交换。
                  required:
                    - status
                  properties:
                    status:
                      type: string
                    protocol:
                      type: string
                    required:
                      type: boolean
                    obligationsCount:
                      type: integer
                    originatorData:
                      type: object
                    beneficiaryData:
                      type: object
                    metadata:
                      type: object
                includeCryptoScreening:
                  type: boolean
                  nullable: true
                  description: 用于加密货币区块链分析筛查的逐笔交易覆盖项（映射到 `include_crypto_screening`）。
                fingerprint_v2:
                  type: object
                  description: '`didit-fp-v2` 设备指纹 payload。由 SDK 自动注入；仅在直接调用 wire API 时才相关。'
              required:
                - txnId
                - type
                - info
                - subject
            example:
              txnId: wd-2026-07-07-0042
              type: travelRule
              info:
                direction: out
                amount: '0.25'
                currency: ETH
                currencyType: crypto
                cryptoParams:
                  crypto_chain: ETH
              subject:
                fullName: Jane Doe
              counterparty:
                fullName: Ana Diaz
                paymentMethod:
                  type: unhosted_wallet
                  accountId: 0xBeneficiaryWallet01
              travelRule:
                status: AWAITING_COUNTERPARTY
                beneficiaryData:
                  wallet_address: 0xBeneficiaryWallet01
                  name: Ana Diaz
              includeCryptoScreening: true
      responses:
        '201':
          description: >-
            交易已提交并受监控。详情结构与 `GET /v3/transactions/{transaction_id}/`
            相同，包括终端用户必须完成后续操作时的 `action_required` 块（各 SDK 默认自动启动该操作）。
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TransactionDetail'
              examples:
                Wallet ownership required:
                  value:
                    uuid: 22222222-3333-4444-5555-666666666666
                    txn_id: wd-2026-07-07-0042
                    transaction_type: travelRule
                    direction: OUTBOUND
                    status: APPROVED
                    amount: '0.25'
                    currency: ETH
                    travel_rule:
                      uuid: 33333333-4444-5555-6666-777777777777
                      status: UNCONFIRMED_OWNERSHIP
                      required: true
                    action_required:
                      type: wallet_ownership
                      url: https://verify.didit.me/wallet-ownership/3s9x...urlsafe
                      widget_session_id: 77777777-8888-9999-aaaa-bbbbbbbbbbbb
                      expires_at: '2026-07-07T13:00:00Z'
        '400':
          description: 验证失败（缺少必填字段、重复的 `txnId`、未知类别）。
          content:
            application/json:
              examples:
                Missing fields:
                  value:
                    transaction_details:
                      currency:
                        - This field is required.
                Duplicate txnId:
                  value:
                    transaction_id:
                      - A transaction with this transaction_id already exists.
        '401':
          description: >-
            交易 token 被拒绝：缺失、未知、已撤回、超出 `max_uses` 或已过期。过期 token 的响应在详情中始终包含单词
            `expired`，SDK 据此区分 `expired_token` 与 `invalid_token` 错误。
          content:
            application/json:
              examples:
                Invalid token:
                  value:
                    detail: Invalid transaction token.
                Expired token:
                  value:
                    detail: Transaction token expired.
        '409':
          description: >-
            在处理当前请求时，另一个具有相同 `txnId`
            的请求创建了交易，因此两个同时发起的提交中只有一个会成功。请读取现有交易，而不是重新提交。
          content:
            application/json:
              examples:
                Concurrent duplicate:
                  value:
                    detail: A transaction with this transaction_id already exists.
      security:
        - TransactionTokenAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: |-
            curl -X POST https://verification.didit.me/v1/transactions/ \
              -H 'X-Transaction-Token: SDK_TOKEN' -H 'Content-Type: application/json' \
              -d '{"txnId": "wd-2026-07-07-0042", "type": "travelRule", "info": {"direction": "out", "amount": "0.25", "currency": "ETH", "currencyType": "crypto"}, "subject": {"fullName": "Jane Doe"}, "counterparty": {"fullName": "Ana Diaz", "paymentMethod": {"type": "unhosted_wallet", "accountId": "0xBeneficiaryWallet01"}}, "travelRule": {"status": "AWAITING_COUNTERPARTY", "beneficiaryData": {"wallet_address": "0xBeneficiaryWallet01", "name": "Ana Diaz"}}, "includeCryptoScreening": true}'
        - lang: javascript
          label: Web SDK
          source: |-
            import { DiditSdk } from '@didit-protocol/sdk-web';

            const result = await DiditSdk.shared.submitTransaction({
              transactionToken: sdkToken,
              transaction: {
                txnId: 'wd-2026-07-07-0042',
                category: 'travelRule',
                details: { direction: 'out', amount: '0.25', currency: 'ETH', currencyType: 'crypto' },
                subject: { fullName: 'Jane Doe' },
                counterparty: { fullName: 'Ana Diaz', paymentMethod: { type: 'unhosted_wallet', accountId: '0xBeneficiaryWallet01' } },
                travelRule: { status: 'AWAITING_COUNTERPARTY', beneficiaryData: { wallet_address: '0xBeneficiaryWallet01', name: 'Ana Diaz' } },
                includeCryptoScreening: true
              },
              onActionCompleted: (refreshed) => console.log(refreshed.status)
            });
components:
  schemas:
    TransactionDetail:
      type: object
      description: >-
        单个交易的完整监控记录，由 `GET /v3/transactions/{transaction_id}/` 和 `POST
        /v3/transactions/` 返回。
      properties:
        uuid:
          type: string
          format: uuid
          description: Didit 稳定的交易标识符。用作后续调用的 `{transaction_id}`。
        environment:
          type: string
          enum:
            - live
            - sandbox
          description: >-
            拥有该交易的应用的环境。`sandbox` 交易会被存储，但绝不会被评估、筛查、通知或计费，因此其空的 `rule_runs`
            表示“未评估”。
        transaction_number:
          type: integer
          description: 控制台中显示的应用范围内连续交易序号（例如 `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: >-
            作为十进制字符串的交易金额，已去除末尾零（例如
            `"1500"`、`"0.5"`、`"0.123456789012345678"`）。最多 18 位小数。
        currency:
          type: string
          description: >-
            `amount` 的货币代码。接受任何 ISO 4217 字母代码（例如 `EUR`、`USD`、`NGN`）以及加密资产符号（例如
            `BTC`）。建议使用当前流通的代码。并非每个接受的代码都有汇率：当该代码没有可用汇率时（例如 ISO 会计单位 `XSU`，或
            Didit 未定价的加密资产符号），自动换算将失败，并且 `preferred_currency_amount` 将返回
            null，除非请求提供了预先换算的 `amount_in_default_currency`。
        currency_type:
          type: string
          nullable: true
          description: '`fiat` 或 `crypto`，与在 `currency_kind` 中提交的内容一致。'
        amount_in_default_currency:
          type: string
          nullable: true
          description: 您提供的预先换算金额，为去除了末尾零的十进制数字符串。
        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: 浏览器或应用的 user agent 字符串。
                  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`。嵌套条件组是一个 `conditions[]` 条目，其 `operator` 为
                  `any_of` 或 `all_of`，`field` 为 null，且其成员的结果位于其自身的 `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` 时填充（即使没有
            `travel_rule_details`，Didit 也会自行发起信息交换）。不存在转账或核验时为
            `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
            设置管控）。当两者均适用时，`wallet_ownership` 具有更高优先级，因为它会阻断 Travel Rule 交互。
          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` 和 `items`，每项收费一条记录，均包含
            `usage_type`、`price`、`details` 和 `created_at`。对同一笔交易重新筛查会产生一个新条目。
    TransactionTravelRule:
      type: object
      description: >-
        交易的 Travel Rule 转账，正如 `GET /v3/transactions/{transaction_id}/`、`POST
        /v3/transactions/` 的 `201` 以及 `GET /v3/transactions/`
        的每行所返回的内容。`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，但该 VASP
            没有可用路由）、`picked_member_without_proven_wallet`（终端用户选择的 Didit
            客户尚未证明对该钱包的控制权），或者在追踪记录未提供其他原因时的
            `no_directory_match`。重新发送后转账会继续推进，因此该原因将被清除。参见[转账受阻的原因](/zh/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: 会话 token，移动端 SDK 用于原生启动流程。
        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，切勿使用嵌入式 webview。
        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: >-
            针对该参与方实体类型所比对的每个字段对应一个条目（`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
        会在创建或修改转账的请求返回后联系交易对手，因此该对象显示该消息是否成功送达：已排队（queued）、正在发送（being
        sent）、出错后等待重试（waiting to be retried after an
        error）、已投递（delivered）或已失败（failed）。网络仍可能恢复的故障（超时未响应、连接失败、HTTP `408`、`429`
        或 `5xx`）会在 30 秒、2 分钟、10 分钟、30 分钟和 1 小时后再次重试。当首条消息（`kind:
        SEND`）彻底失败（因为网络拒绝或第 6 次尝试也失败）时，转账状态将变为
        `COUNTERPARTY_VASP_NOT_REACHABLE`，并在其 `timeline` 中记录
        `last_error`；任何其他彻底失败的消息也会在 `timeline` 中标明。转账的 `status` 始终是交易本身的真实事实来源。
      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 回复错误时，会包含其自身的状态码和消息。绝不包含响应体。
          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`
        状态的转账继续进行的一项操作。请参阅[转账卡住的原因](/zh/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，或者您通过 PATCH 传入
            `action=beneficiary_vasp`。`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`。
        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
            不一致性：声明的汇款人不是输入、声明的收款人不是输出、无法区分出单一的收款人输出，或收款人输出支付的金额与交易声明的不一致。
        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: >-
            钱包。在 memo 网络上为经典地址（XRP X-address 会被拆分为其经典地址和标签）；在闪电网络上为收款人节点 ID
            或闪电网络地址。
        memo:
          type: string
          description: 作为钱包一部分的目标标签或 memo；无则为 `""`。
        source:
          type: string
          enum:
            - declared
            - x_address
            - largest_input
            - only_non_change_output
            - amount_match
            - invoice_payee
            - updated
          description: >-
            钱包来源：`declared`（您的请求）、`x_address`（从 XRP X-address
            拆分）、`largest_input`（贡献最大的 UTXO 输入地址）、`only_non_change_output`（唯一的非找零
            UTXO 输出）、`amount_match`（支付转账金额的那个 UTXO
            输出）、`invoice_payee`（闪电网络付款请求中指定的收款人）、`updated`（稍后通过 `action:
            update_originator_wallet` 设置）。
    TravelRuleUtxoEntry:
      type: object
      description: UTXO 交易的一个输入或输出，与区块链上记录的一致。
      required:
        - address
      properties:
        address:
          type: string
          maxLength: 128
        amount:
          type: string
          nullable: true
          description: 以代币自身为单位的十进制字符串（BTC，而非聪）。可选。
          example: '0.0125'
        txid:
          type: string
          maxLength: 128
          description: 可选。输入所花费的交易。
        vout:
          type: integer
          nullable: true
          minimum: 0
          description: 可选。输入所花费的输出索引。
  securitySchemes:
    TransactionTokenAuth:
      type: apiKey
      in: header
      name: X-Transaction-Token
      description: >-
        由您的后端通过 POST /v3/transactions/sdk-token/ 生成的短期限定范围 token。供 Didit SDK
        在面向设备的 /v1/transactions/ endpoint 上使用。

````

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