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

> Отправьте подпись, ID тестовой транзакции или скриншот для подтверждения владения кошельком в Didit. Ошибка возвращает код, неверный депозит отклоняет попытку.



Промпт 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 ru/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: >-
        Публичный endpoint с доступом по токену сессии виджета, API-ключ не
        требуется. Отправьте подтверждение, необходимое для выбранного метода:
        подпись для MESSAGE_SIGNING, txid для SATOSHI_TEST (JSON) или файл для
        SCREENSHOT (multipart). Каждая отправка считается попыткой. Подпись, не
        прошедшая проверку, или депозит, не соответствующий ожидаемому,
        возвращают 400 с кодом ошибки и оставляют подтверждение в статусе
        PENDING, чтобы конечный пользователь мог повторить попытку.
        Обнаруженный, но еще не подтвержденный депозит возвращает 200 со
        статусом PENDING и перепроверяется автоматически до закрытия окна.
        Скриншот возвращает 200 со статусом PENDING и ожидает в вашей очереди на
        проверку (GET /v3/travel-rule/wallet-proofs/). Подтверждение со статусом
        EXPIRED или REJECTED больше никогда не станет проверенным: создайте
        новое. Форматы подписей проверяются в зависимости от семейства сетей:
        для EVM-сетей требуется подпись personal_sign (EIP-191) в hex-кодировке;
        для Bitcoin требуется подпись signmessage по стандарту BIP-137 (адреса
        P2PKH, P2SH-P2WPKH и P2WPKH) или простая подпись BIP-322 (адреса P2WPKH
        и P2TR) в кодировке base64; для Solana требуется подпись Ed25519 для
        челленджа в кодировке base58; для Tron требуется подпись signMessageV2
        (TIP-191) в hex-кодировке. Полная подпись BIP-322, подпись подтверждения
        наличия средств или мультисиг-адрес завершаются ошибкой с кодом
        SIGNATURE_UNSUPPORTED_SCHEME.
      operationId: verifyTravelRuleWidgetProof
      parameters:
        - name: token
          in: path
          required: true
          description: Непрозрачный токен сессии, возвращённый при создании сессии виджета.
          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: подпись кошелька для challenge
                    доказательства.
                txid:
                  type: string
                  description: 'SATOSHI_TEST: идентификатор транзакции тестового депозита.'
          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.