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

# Enviar prueba de propiedad de wallet - API Travel Rule

> Envía a Didit firma, txid de depósito de prueba o captura como prueba de propiedad de wallet. Un fallo da un código; un depósito erróneo la rechaza.



Prompt de la API para enviar evidencias de prueba del widget
        Copiar el prompt al portapapeles



      
      

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



      
      

Pegar en



## OpenAPI

````yaml es/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 de verificación de identidad. Autentícate con el encabezado 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: Enviar la evidencia de prueba de propiedad de la wallet
      description: >-
        Endpoint público identificado por el token de sesión del widget; no
        requiere clave de API. Envía la evidencia que necesita el método de la
        prueba: signature para MESSAGE_SIGNING, txid para SATOSHI_TEST (JSON) o
        un archivo para SCREENSHOT (multipart). Cada envío cuenta como un
        intento. Si la firma no se verifica o el depósito no coincide, la
        respuesta es 400 con un código y la prueba queda en PENDING para que el
        usuario final pueda volver a intentarlo. Si el depósito se detecta pero
        aún no está confirmado, la respuesta es 200 con status PENDING y se
        vuelve a comprobar automáticamente hasta que se cierra la ventana. Una
        captura de pantalla devuelve 200 con status PENDING y espera en tu cola
        de revisión (GET /v3/travel-rule/wallet-proofs/). Una prueba EXPIRED o
        REJECTED nunca se verifica más tarde: inicia una nueva. Formatos de
        firma verificados por familia de cadenas: las cadenas EVM aceptan una
        firma personal_sign (EIP-191), codificada en hexadecimal; Bitcoin acepta
        una firma signmessage BIP-137 (direcciones P2PKH, P2SH-P2WPKH y P2WPKH)
        o una firma simple BIP-322 (direcciones P2WPKH y P2TR), codificada en
        base64; Solana acepta una firma Ed25519 sobre el desafío, codificada en
        base58; Tron acepta una firma signMessageV2 (TIP-191), codificada en
        hexadecimal. Una firma BIP-322 completa o de prueba de fondos, o una
        dirección multisig, falla con SIGNATURE_UNSUPPORTED_SCHEME.
      operationId: verifyTravelRuleWidgetProof
      parameters:
        - name: token
          in: path
          required: true
          description: >-
            Token de sesión opaco devuelto cuando se generó la sesión del
            widget.
          schema:
            type: string
        - name: proof_id
          in: path
          required: true
          description: proof_id devuelto al iniciar la prueba.
          schema:
            type: string
            format: uuid
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                signature:
                  type: string
                  description: >-
                    MESSAGE_SIGNING: la firma de la wallet sobre el desafío de
                    la prueba.
                txid:
                  type: string
                  description: >-
                    SATOSHI_TEST: el id de la transacción del depósito de
                    prueba.
          multipart/form-data:
            schema:
              type: object
              required:
                - file
              properties:
                file:
                  type: string
                  format: binary
                  description: >-
                    SCREENSHOT: una imagen que muestra la wallet en la app de
                    wallet del usuario final.
      responses:
        '200':
          description: >-
            VERIFIED, o todavía PENDING (una captura de pantalla pendiente de
            revisión, o un depósito aún no indexado o aún no confirmado, con el
            código DEPOSIT_NOT_FOUND o DEPOSIT_UNCONFIRMED).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofVerifyResult'
        '400':
          description: >-
            Falta la evidencia; un intento fallido que mantiene la prueba en
            PENDING para que el usuario final pueda volver a intentarlo (código
            SIGNATURE_INVALID, SIGNATURE_UNSUPPORTED_SCHEME o
            DEPOSIT_LOOKUP_FAILED); o un depósito de prueba que rechaza la
            prueba (código DEPOSIT_MISMATCH, DEPOSIT_STALE o TXID_REUSED, estado
            REJECTED, con los recuentos de intentos de la sesión): volver a
            elegir un método inicia una nueva prueba mientras attempts_remaining
            sea mayor que 0.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofError'
        '404':
          description: Token desconocido, o no existe esa prueba en esta sesión.
        '409':
          description: >-
            código OWNERSHIP_CHANGED (la prueba se cierra con él); una prueba
            cerrada (REJECTED o EXPIRED), con su estado, el código con el que se
            cerró y los recuentos de intentos de la sesión: elige de nuevo un
            método para iniciar una nueva prueba; o una prueba SELF_DECLARATION,
            que queda verificada al iniciarse.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofError'
        '410':
          description: >-
            La sesión expiró, o el código WINDOW_EXPIRED cuando se cerró la
            ventana de la prueba de satoshis.
          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: >-
            Presente cuando la prueba está VERIFIED: la entrada de la libreta de
            direcciones tiene ahora la propiedad verificada.
        transfer_status:
          type: string
          nullable: true
          description: >-
            Presente cuando la prueba está VERIFIED: el estado de la
            transferencia vinculada, null si no hay ninguna.
        detail:
          type: string
          description: >-
            Presente mientras la prueba sigue en PENDING: una captura de
            pantalla enviada a la espera de revisión, o un depósito de prueba
            que aún no está confirmado.
        code:
          allOf:
            - $ref: '#/components/schemas/TravelRuleWalletProofFailureReason'
          description: >-
            Presente en un depósito de prueba pendiente: indica por qué aún no
            está confirmado.
    TravelRuleWidgetProofError:
      type: object
      properties:
        detail:
          type: string
          description: Mensaje legible en inglés.
        code:
          allOf:
            - $ref: '#/components/schemas/TravelRuleWalletProofFailureReason'
          description: >-
            Motivo legible por máquina, para que un cliente pueda mostrar su
            propio mensaje traducido.
        status:
          type: string
          enum:
            - PENDING
            - VERIFIED
            - REJECTED
            - EXPIRED
          description: >-
            Presente cuando la prueba está cerrada: REJECTED por el depósito que
            se acaba de enviar (400), o REJECTED o EXPIRED cuando se envía
            evidencia a una prueba que ya está cerrada (409).
        proof_id:
          type: string
          format: uuid
          description: 'Presente con status: la prueba cerrada.'
        method:
          type: string
          enum:
            - MESSAGE_SIGNING
            - SATOSHI_TEST
            - SCREENSHOT
            - SELF_DECLARATION
          description: 'Presente con status: el método de la prueba cerrada.'
        max_attempts:
          type: integer
          description: >-
            Presente con status: pruebas de wallet rechazadas que permite esta
            sesión.
        attempts_used:
          type: integer
          description: 'Presente con status: pruebas rechazadas hasta el momento.'
        attempts_remaining:
          type: integer
          description: >-
            Presente con status: cuando es 0, iniciar otra prueba responde 409 y
            debes crear una nueva sesión del widget.
    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: >-
        Por qué una prueba de propiedad de wallet, o su último intento, no llegó
        a VERIFIED. Vacío cuando nada falló. Una prueba PENDING puede tener uno:
        el último intento falló y el usuario final puede volver a intentarlo.
        DEPOSIT_MISMATCH, DEPOSIT_STALE, TXID_REUSED y REVIEW_REJECTED cierran
        la prueba como REJECTED. SIGNATURE_INVALID: la firma no coincide con la
        wallet y el desafío. SIGNATURE_UNSUPPORTED_SCHEME: la wallet firmó en un
        formato que Didit no verifica. DEPOSIT_NOT_FOUND, DEPOSIT_UNCONFIRMED,
        DEPOSIT_LOOKUP_FAILED: el depósito de prueba no se puede leer o aún no
        está confirmado; Didit sigue comprobándolo hasta que se cierra la
        ventana de prueba. DEPOSIT_MISMATCH: la transacción no envía el importe
        esperado desde la wallet a la dirección de depósito. DEPOSIT_STALE: la
        transacción es anterior al desafío. TXID_REUSED: la transacción ya
        sirvió como prueba de otra wallet. CHAIN_UNSUPPORTED: el método no está
        disponible en esta cadena. WINDOW_EXPIRED: se cerró la ventana de
        prueba. OWNERSHIP_CHANGED: el titular de la wallet cambió, o la wallet
        se eliminó de tu libreta de direcciones, después de que se generara la
        sesión del widget. METHOD_SWITCHED: el usuario final eligió otro método
        antes de terminar este. REVIEW_REJECTED: tu revisor rechazó la captura
        de pantalla. ABANDONED: la sesión del widget caducó antes de que el
        usuario final terminara.

````

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