> ## 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 - Travel Rule

> 通过 Didit 提交钱包所有权证明的签名、测试存款交易 ID 或截图。失败的尝试会返回代码；存款有误则会拒绝该证明。



提交 Widget 证明材料 API 提示词
        将提示词复制到剪贴板



      
      

\<pre>

\`Submit the evidence for a wallet-ownership proof started from a widget session. The hosted widget makes this call; use it only if I build my own widget UI.

Endpoint:
POST https://verification.didit.me/v3/travel-rule/widget/{token}/proofs/{proof_id}/verify/

Authentication:
None - the widget token in the URL path is the credential. Treat the token as a secret.

Body, by method:
\- MESSAGE_SIGNING - JSON {"signature": "..."}: the wallet's signature over the proof's challenge.
\- SATOSHI_TEST - JSON {"txid": "..."}: the test deposit's transaction id.
\- SCREENSHOT - multipart form with a file field.

Behavior:
\- 200 with status VERIFIED, is_ownership_verified and transfer_status once ownership is proven.
\- 200 with status PENDING for a screenshot (it waits for the customer's review) or a deposit not indexed or confirmed yet, with code DEPOSIT_NOT_FOUND or DEPOSIT_UNCONFIRMED (Didit rechecks it until the window closes; no resubmission needed).
\- Every submission counts in attempts.

Failure modes (errors carry a code to translate):
\- 400 - SIGNATURE_INVALID, SIGNATURE_UNSUPPORTED_SCHEME or DEPOSIT_LOOKUP_FAILED. The proof stays PENDING: let the end user try again.
\- 400 - DEPOSIT_MISMATCH, DEPOSIT_STALE or TXID_REUSED with status REJECTED: the deposit is genuinely wrong (another sender, not the expected amount to the deposit address, older than the challenge, or already used to prove another wallet). The proof is closed and uses one of the session's attempts; the body carries max_attempts, attempts_used and attempts_remaining. Pick a method again to start a new proof.
\- 409 - code OWNERSHIP_CHANGED, or a closed proof (REJECTED or EXPIRED; the body carries status, the code it closed with and the attempt counts): start a new proof.
\- 410 - the session expired, or code WINDOW_EXPIRED when the Satoshi test window closed.
\- 404 - unknown token or proof.

Full guide: /transaction-monitoring/wallet-ownership-widget#satoshi-test-verify-contract.`

\</pre>



      
      

粘贴到



## OpenAPI

````yaml zh/openapi-25.json POST /v3/travel-rule/widget/{token}/proofs/{proof_id}/verify/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: 身份证件验证 API。使用 x-api-key 请求头进行身份验证。
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/travel-rule/widget/{token}/proofs/{proof_id}/verify/:
    post:
      tags:
        - Travel Rule
      summary: 提交钱包所有权证明材料
      description: >-
        基于小部件会话 token 的公开 endpoint，无需 API 密钥。发送该证明方法所需的凭据：MESSAGE_SIGNING
        需提供签名，SATOSHI_TEST 需提供 txid（JSON），SCREENSHOT
        需提供文件（multipart）。每次提交均计为一次尝试。验证失败的签名或不匹配的充值将返回 400 状态码及错误代码，并使证明保持
        PENDING 状态，以便终端用户重试。已检测到但尚未确认的充值将返回 200 及状态
        PENDING，并在时间窗口关闭前自动重新检查。屏幕截图将返回 200 及状态 PENDING，并在您的审核队列中等待处理（GET
        /v3/travel-rule/wallet-proofs/）。EXPIRED 或 REJECTED
        状态的证明后续绝不会通过验证：请发起新的证明。各链族验证的签名格式：EVM 链采用十六进制编码的 personal_sign (EIP-191)
        签名；比特币采用 Base64 编码的 BIP-137 signmessage 签名（P2PKH、P2SH-P2WPKH 和 P2WPKH
        地址）或 BIP-322 simple 签名（P2WPKH 和 P2TR 地址）；Solana 采用对 challenge 进行签名且以
        Base58 编码的 Ed25519 签名；Tron 采用十六进制编码的 signMessageV2 (TIP-191) 签名。BIP-322
        full 签名、资金证明签名或多签地址将因 SIGNATURE_UNSUPPORTED_SCHEME 而失败。
      operationId: verifyTravelRuleWidgetProof
      parameters:
        - name: token
          in: path
          required: true
          description: 生成 widget 会话时返回的不透明会话 token。
          schema:
            type: string
        - name: proof_id
          in: path
          required: true
          description: 启动证明时返回的 proof_id。
          schema:
            type: string
            format: uuid
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                signature:
                  type: string
                  description: MESSAGE_SIGNING：钱包对证明挑战的签名。
                txid:
                  type: string
                  description: SATOSHI_TEST：测试存款的交易 ID。
          multipart/form-data:
            schema:
              type: object
              required:
                - file
              properties:
                file:
                  type: string
                  format: binary
                  description: SCREENSHOT：显示终端用户钱包应用中钱包的图片。
      responses:
        '200':
          description: >-
            VERIFIED，或仍为 PENDING（待审核的截图、尚未索引或尚未确认的存款，错误代码为 DEPOSIT_NOT_FOUND 或
            DEPOSIT_UNCONFIRMED）。
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofVerifyResult'
        '400':
          description: >-
            缺少证明材料；失败的尝试使证明保持 PENDING 状态以便终端用户重试（错误代码
            SIGNATURE_INVALID、SIGNATURE_UNSUPPORTED_SCHEME 或
            DEPOSIT_LOOKUP_FAILED）；或者测试充值导致证明被拒绝（错误代码
            DEPOSIT_MISMATCH、DEPOSIT_STALE 或 TXID_REUSED，状态
            REJECTED，并附带该会话的尝试次数）：在 attempts_remaining 大于 0 时，重新选择方式将启动新的证明。
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofError'
        '404':
          description: 未知的 token，或此会话没有此类证明。
        '409':
          description: >-
            代码 OWNERSHIP_CHANGED（证明以此代码关闭）；已关闭的证明（REJECTED 或
            EXPIRED），包含其状态、关闭时的代码以及会话的尝试次数：重新选择一种方式以发起新的证明；或 SELF_DECLARATION
            证明，在发起时即已验证。
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofError'
        '410':
          description: 会话已过期，或在中本聪测试窗口关闭时返回代码 WINDOW_EXPIRED。
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofError'
      security:
        - {}
      x-codeSamples:
        - lang: curl
          label: curl
          source: >-
            curl -X POST
            https://verification.didit.me/v3/travel-rule/widget/{token}/proofs/{proof_id}/verify/
            \
              -H 'Content-Type: application/json' \
              -d '{"signature": "0x..."}'
components:
  schemas:
    TravelRuleWidgetProofVerifyResult:
      type: object
      properties:
        proof_id:
          type: string
          format: uuid
        method:
          type: string
          enum:
            - MESSAGE_SIGNING
            - SATOSHI_TEST
            - SCREENSHOT
            - SELF_DECLARATION
        status:
          type: string
          enum:
            - PENDING
            - VERIFIED
            - REJECTED
            - EXPIRED
        is_ownership_verified:
          type: boolean
          description: 在证明为 VERIFIED 时存在：地址簿条目现已通过所有权核验。
        transfer_status:
          type: string
          nullable: true
          description: 在证明为 VERIFIED 时存在：关联转账的状态，若无关联转账则为 null。
        detail:
          type: string
          description: 在证明保持为 PENDING 期间存在：等待审核的已提交截图，或尚未确认的测试充值。
        code:
          allOf:
            - $ref: '#/components/schemas/TravelRuleWalletProofFailureReason'
          description: 在待处理的测试充值中存在：说明尚未确认的原因。
    TravelRuleWidgetProofError:
      type: object
      properties:
        detail:
          type: string
          description: 便于人类阅读的英文消息。
        code:
          allOf:
            - $ref: '#/components/schemas/TravelRuleWalletProofFailureReason'
          description: 机器可读的原因，以便客户端展示其自有的翻译消息。
        status:
          type: string
          enum:
            - PENDING
            - VERIFIED
            - REJECTED
            - EXPIRED
          description: >-
            在证明已关闭时存在：因刚提交的充值而变为 REJECTED（400），或在向已关闭的证明发送证据时为 REJECTED 或
            EXPIRED（409）。
        proof_id:
          type: string
          format: uuid
          description: 与状态一起提供：已关闭的证明。
        method:
          type: string
          enum:
            - MESSAGE_SIGNING
            - SATOSHI_TEST
            - SCREENSHOT
            - SELF_DECLARATION
          description: 与状态一起提供：已关闭证明的方式。
        max_attempts:
          type: integer
          description: 随状态存在：该会话允许的被拒绝钱包证明。
        attempts_used:
          type: integer
          description: 与状态一起提供：截至目前被拒绝的证明。
        attempts_remaining:
          type: integer
          description: 与状态一起提供：当其值为 0 时，启动另一个证明将返回 409，您需要生成新的小部件会话。
    TravelRuleWalletProofFailureReason:
      type: string
      enum:
        - ''
        - SIGNATURE_INVALID
        - SIGNATURE_UNSUPPORTED_SCHEME
        - DEPOSIT_NOT_FOUND
        - DEPOSIT_UNCONFIRMED
        - DEPOSIT_LOOKUP_FAILED
        - DEPOSIT_MISMATCH
        - DEPOSIT_STALE
        - TXID_REUSED
        - CHAIN_UNSUPPORTED
        - WINDOW_EXPIRED
        - OWNERSHIP_CHANGED
        - METHOD_SWITCHED
        - REVIEW_REJECTED
        - ABANDONED
      description: >-
        钱包所有权证明（或其最近一次尝试）未能达到 VERIFIED 的原因。未出现失败时为空。处于 PENDING
        状态的证明可能会包含此项：最近一次尝试失败，终端用户可以重试。DEPOSIT_MISMATCH、DEPOSIT_STALE、TXID_REUSED
        和 REVIEW_REJECTED 会将证明关闭为
        REJECTED。SIGNATURE_INVALID：签名与钱包和挑战值不匹配。SIGNATURE_UNSUPPORTED_SCHEME：钱包签名的格式
        Didit
        无法验证。DEPOSIT_NOT_FOUND、DEPOSIT_UNCONFIRMED、DEPOSIT_LOOKUP_FAILED：测试存款不可读取或尚未确认；Didit
        会持续检查，直至测试窗口关闭。DEPOSIT_MISMATCH：交易未从该钱包向存款地址发送预期金额。DEPOSIT_STALE：交易早于挑战值发生。TXID_REUSED：该交易已用于证明另一个钱包。CHAIN_UNSUPPORTED：该方法在此链上不可用。WINDOW_EXPIRED：测试窗口已关闭。OWNERSHIP_CHANGED：在小组件会话生成后，钱包持有者发生变更，或钱包已从您的地址簿中删除。METHOD_SWITCHED：终端用户在完成该方法之前选择了另一种方法。REVIEW_REJECTED：您的审核员拒绝了该截图。ABANDONED：小组件会话在终端用户完成之前已失效。

````

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