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

# Iniciar prueba de propiedad de wallet - Travel Rule

> Inicia en Didit la prueba de propiedad de wallet con token del widget: firma, test Satoshi, captura o autodeclaración. Repetir el método la reanuda.

Prompt para la API Start Widget Proof
Copiar el prompt al portapapeles

<pre>
  \`Start a wallet-ownership proof for a widget session. This is the call the hosted widget makes when the end user picks a proof method; use it only if I build my own widget UI.

  Endpoint:
  POST [https://verification.didit.me/v3/travel-rule/widget/\{token}/proofs/](https://verification.didit.me/v3/travel-rule/widget/\{token}/proofs/)

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

  Body:

  * method - one of the context's allowed\_methods: MESSAGE\_SIGNING, SATOSHI\_TEST, SCREENSHOT or SELF\_DECLARATION.
  * wallet\_address, chain - optional, default to the session's.

  Behavior:

  * 201 with a new PENDING proof. MESSAGE\_SIGNING returns the challenge to sign; SATOSHI\_TEST returns deposit\_address, expected\_amount and expires\_at; SELF\_DECLARATION is verified at once.
  * 200 with the proof already open when the same method is picked again (same challenge or amount): resume it, do not treat it as an error.
  * Picking another method closes the unfinished proof as METHOD\_SWITCHED, except a submitted screenshot or a test deposit still being checked.
  * After a REJECTED proof, picking a method starts a new one (201). A session takes a limited number of rejected proofs: the context reports max\_attempts, attempts\_used and attempts\_remaining.
  * Message signing works on EVM chains (Ethereum, BNB Chain, Polygon, Arbitrum, Base, Optimism, Avalanche, Linea and others), Bitcoin (BIP-137 and BIP-322 simple), Solana and Tron.

  Failure modes (errors carry a code to translate):

  * 400 - code CHAIN\_UNSUPPORTED when the method is not available on the chain; also an invalid body or a wallet that does not match the transfer.
  * 403 - SELF\_DECLARATION not allowed for the application.
  * 409 - code OWNERSHIP\_CHANGED: mint a new session for the current holder.
  * 409 - no attempts left (no code; the body carries attempts\_remaining 0): mint a new session.
  * 404 - unknown token. 410 - the session expired.

  Full guide: /transaction-monitoring/wallet-ownership-widget#what-it-proves.\`
</pre>

Pegar en


## OpenAPI

````yaml es/openapi-25.json POST /v3/travel-rule/widget/{token}/proofs/
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/:
    post:
      tags:
        - Travel Rule
      summary: Iniciar una prueba de propiedad de wallet
      description: >-
        Endpoint público identificado por el token de sesión del widget; no
        requiere clave de API: el widget alojado lo llama cuando el usuario
        final elige un método de prueba. Una prueba existe, y cuenta en tu
        embudo de pruebas, solo a partir de esta llamada. Elegir de nuevo el
        mismo método devuelve la prueba ya abierta (200, el mismo desafío o
        importe de depósito) en lugar de iniciar una segunda; elegir otro método
        cierra la que está sin terminar como METHOD_SWITCHED, salvo una captura
        de pantalla ya enviada o un depósito de prueba que todavía se está
        comprobando. MESSAGE_SIGNING devuelve el desafío que hay que firmar;
        SATOSHI_TEST, la dirección de depósito, el importe exacto y la ventana;
        SELF_DECLARATION se verifica al instante (status VERIFIED). 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: createTravelRuleWidgetProof
      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
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TravelRuleWidgetProofCreate'
      responses:
        '200':
          description: La prueba ya abierta para este método, reanudada.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofSummary'
        '201':
          description: Una nueva prueba en estado PENDING (VERIFIED para SELF_DECLARATION).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofSummary'
        '400':
          description: >-
            Cuerpo no válido, una wallet que no coincide con la transferencia,
            SCREENSHOT no permitido o el código CHAIN_UNSUPPORTED cuando el
            método no está disponible en la cadena.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofError'
        '403':
          description: SELF_DECLARATION no está permitido para esta aplicación.
        '404':
          description: Token desconocido.
        '409':
          description: >-
            código OWNERSHIP_CHANGED: el titular de la wallet cambió o la wallet
            se eliminó después de generar la sesión; genera una nueva sesión
            para el titular actual. También se devuelve para SATOSHI_TEST cuando
            la sesión no tiene satoshi_deposit_address, y cuando a la sesión no
            le quedan intentos (sin código; el cuerpo incluye max_attempts,
            attempts_used y attempts_remaining 0): genera una nueva sesión.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofError'
        '410':
          description: La sesión expiró.
      security:
        - {}
      x-codeSamples:
        - lang: curl
          label: curl
          source: >-
            curl -X POST
            https://verification.didit.me/v3/travel-rule/widget/{token}/proofs/
            \
              -H 'Content-Type: application/json' \
              -d '{"method": "MESSAGE_SIGNING"}'
components:
  schemas:
    TravelRuleWidgetProofCreate:
      type: object
      required:
        - method
      properties:
        method:
          type: string
          enum:
            - MESSAGE_SIGNING
            - SATOSHI_TEST
            - SCREENSHOT
            - SELF_DECLARATION
          description: >-
            El método de prueba que eligió el usuario final. Debe ser uno de los
            allowed_methods del contexto.
        wallet_address:
          type: string
          maxLength: 128
          description: >-
            Por defecto, el wallet_address de la sesión. Debe coincidir con la
            wallet de la transferencia cuando la sesión está vinculada a una
            transferencia.
        chain:
          type: string
          maxLength: 32
          description: Por defecto, la blockchain de la sesión.
    TravelRuleWidgetProofSummary:
      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
          description: >-
            PENDING: el usuario final eligió este método y la prueba aún no se
            ha decidido. Una firma fallida o un depósito de prueba que todavía
            no se puede leer o no está confirmado mantiene la prueba en PENDING
            con un failure_reason, para que el usuario final pueda volver a
            intentarlo; un depósito SATOSHI_TEST enviado se vuelve a comprobar
            automáticamente hasta que se cierra su ventana, y una SCREENSHOT
            enviada queda a la espera de tu revisión. VERIFIED: la propiedad
            está demostrada. REJECTED: el depósito de prueba es realmente
            incorrecto (otro remitente, un importe distinto del esperado a la
            dirección de depósito, anterior al desafío o una transacción que ya
            demostró otra wallet) o tu revisor rechazó la captura de pantalla;
            failure_reason indica el motivo. Una prueba rechazada es definitiva
            y consume uno de los intentos de la sesión. EXPIRED: la prueba ya no
            se puede decidir (su ventana se cerró, el usuario final cambió de
            método, la sesión del widget caducó o cambió el titular de la
            wallet); failure_reason indica el motivo.
        wallet_address:
          type: string
        chain:
          type: string
          description: >-
            Identificador canónico de la cadena de la entrada de la libreta de
            direcciones a la que corresponde la prueba, p. ej., ETH, BTC, SOL,
            TRX.
        deposit_address:
          type: string
          nullable: true
          description: >-
            Dirección de depósito a la que el cliente debe enviar el importe de
            la prueba Satoshi. Solo está presente en una prueba SATOSHI_TEST.
        expected_amount:
          type: string
          nullable: true
          description: >-
            Importe on-chain exacto, en la moneda nativa del depósito, con el
            que debe coincidir el depósito de prueba de Satoshi. Solo está
            presente en una prueba SATOSHI_TEST.
        expires_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            Fecha límite de la ventana de prueba Satoshi propia de esta prueba.
            Solo está presente en una prueba SATOSHI_TEST; el expires_at propio
            de la sesión del widget se amplía para cubrirla cuando se ofrece
            SATOSHI_TEST.
        challenge:
          type: string
          nullable: true
          description: >-
            Mensaje emitido por Didit que el cliente firma con su wallet. Solo
            está presente en una prueba MESSAGE_SIGNING.
        rejection_reason:
          type: string
          description: >-
            Por qué se rechazó la prueba, como una frase en inglés para el
            usuario final. Solo está presente cuando `status` es REJECTED; vacío
            cuando tu revisor rechazó una captura de pantalla (tu nota se queda
            contigo).
        created_at:
          type: string
          format: date-time
        attempts:
          type: integer
          description: >-
            Cuántas veces se envió evidencia para esta prueba (firmas, ids de
            transacción, archivos subidos).
        failure_reason:
          allOf:
            - $ref: '#/components/schemas/TravelRuleWalletProofFailureReason'
          description: >-
            Por qué el último intento no fue suficiente, o por qué se cerró la
            prueba. Vacío cuando nada falló.
    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.