> ## 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 evidència de titularitat de cartera - Travel Rule

> Envia la signatura, l'ID de transacció de prova o una captura per provar la titularitat de la cartera a Didit. Un intent fallit retorna un codi.



Indicació de l'API per enviar l'evidència probatòria del widget
        Copia el prompt al porta-retalls



      
      

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



      
      

Enganxa a



## OpenAPI

````yaml ca/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ó d'identitat. Autentica't amb la capçalera 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: Envia la prova de titularitat de la cartera
      description: >-
        Endpoint públic identificat pel token de sessió del widget, sense
        necessitat de cap clau d'API. Envia les proves que requereix el mètode
        de comprovació: signatura per a MESSAGE_SIGNING, txid per a SATOSHI_TEST
        (JSON), o un fitxer per a SCREENSHOT (multipart). Cada enviament compta
        com un intent. Una signatura que no es verifiqui, o un dipòsit que no
        coincideixi, respon 400 amb un codi i deixa la prova en PENDING perquè
        l'usuari final ho pugui tornar a intentar. Un dipòsit detectat però
        encara no confirmat respon 200 amb l'estat PENDING i es torna a
        comprovar automàticament fins que es tanca la finestra. Una captura de
        pantalla respon 200 amb l'estat PENDING i espera a la teva cua de
        revisió (GET /v3/travel-rule/wallet-proofs/). Una prova en EXPIRED o
        REJECTED mai no es verifica posteriorment: inicia'n una de nova. Formats
        de signatura verificats per família de cadenes: les cadenes EVM accepten
        una signatura personal_sign (EIP-191), codificada en hexadecimal;
        Bitcoin accepta una signatura signmessage BIP-137 (adreces P2PKH,
        P2SH-P2WPKH i P2WPKH) o una signatura simple BIP-322 (adreces P2WPKH i
        P2TR), codificada en base64; Solana accepta una signatura Ed25519 sobre
        el repte, codificada en base58; Tron accepta una signatura signMessageV2
        (TIP-191), codificada en hexadecimal. Una signatura BIP-322 completa o
        de comprovant de fons, o una adreça multisig, falla amb
        SIGNATURE_UNSUPPORTED_SCHEME.
      operationId: verifyTravelRuleWidgetProof
      parameters:
        - name: token
          in: path
          required: true
          description: Token de sessió opac retornat quan s'ha creat la sessió del widget.
          schema:
            type: string
        - name: proof_id
          in: path
          required: true
          description: proof_id retornat quan s'ha iniciat la prova.
          schema:
            type: string
            format: uuid
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                signature:
                  type: string
                  description: >-
                    MESSAGE_SIGNING: la signatura de la cartera sobre el repte
                    de la prova.
                txid:
                  type: string
                  description: >-
                    SATOSHI_TEST: l'identificador de transacció del dipòsit de
                    prova.
          multipart/form-data:
            schema:
              type: object
              required:
                - file
              properties:
                file:
                  type: string
                  format: binary
                  description: >-
                    SCREENSHOT: una imatge que mostra la cartera a l'aplicació
                    de cartera de l'usuari final.
      responses:
        '200':
          description: >-
            VERIFIED, o encara PENDING (una captura de pantalla pendent de
            revisió, un dipòsit no indexat o encara no confirmat, amb el codi
            DEPOSIT_NOT_FOUND o DEPOSIT_UNCONFIRMED).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofVerifyResult'
        '400':
          description: >-
            Falten proves; un intent fallit que manté la prova en PENDING perquè
            l'usuari final pugui tornar-ho a provar (codi SIGNATURE_INVALID,
            SIGNATURE_UNSUPPORTED_SCHEME o DEPOSIT_LOOKUP_FAILED); o un dipòsit
            de prova que rebutja la prova (codi DEPOSIT_MISMATCH, DEPOSIT_STALE
            o TXID_REUSED, estat REJECTED, amb el recompte d'intents de la
            sessió): seleccionar un mètode de nou inicia una nova prova mentre
            attempts_remaining sigui superior a 0.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofError'
        '404':
          description: Token desconegut o no hi ha aquesta prova en aquesta sessió.
        '409':
          description: >-
            codi OWNERSHIP_CHANGED (la prova es tanca amb aquest codi); una
            prova tancada (REJECTED o EXPIRED), amb el seu estat, el codi amb
            què s'ha tancat i el recompte d'intents de la sessió: tria un altre
            cop un mètode per iniciar una nova prova; o una prova
            SELF_DECLARATION, que es verifica en iniciar-se.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofError'
        '410':
          description: >-
            La sessió ha caducat, o té el codi WINDOW_EXPIRED quan s'ha tancat
            la finestra de prova de satoshi.
          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: >-
            Present quan la prova és VERIFIED: l'entrada de la llibreta
            d'adreces ara té la titularitat verificada.
        transfer_status:
          type: string
          nullable: true
          description: >-
            Present quan la prova és VERIFIED: l'estat de la transferència
            vinculada, null si no n'hi ha cap.
        detail:
          type: string
          description: >-
            Present mentre la prova roman PENDING: una captura de pantalla
            enviada pendent de revisió, o un dipòsit de prova que encara no s'ha
            confirmat.
        code:
          allOf:
            - $ref: '#/components/schemas/TravelRuleWalletProofFailureReason'
          description: >-
            Present en un dipòsit de prova pendent: el motiu pel qual encara no
            està confirmat.
    TravelRuleWidgetProofError:
      type: object
      properties:
        detail:
          type: string
          description: Missatge fàcil de llegir en anglès.
        code:
          allOf:
            - $ref: '#/components/schemas/TravelRuleWalletProofFailureReason'
          description: >-
            Motiu llegible per màquina, perquè un client pugui mostrar el seu
            propi missatge traduït.
        status:
          type: string
          enum:
            - PENDING
            - VERIFIED
            - REJECTED
            - EXPIRED
          description: >-
            Present quan la prova està tancada: REJECTED pel dipòsit que s'acaba
            d'enviar (400), o REJECTED o EXPIRED quan s'envien evidències a una
            prova que ja està tancada (409).
        proof_id:
          type: string
          format: uuid
          description: 'Present amb estat: la prova tancada.'
        method:
          type: string
          enum:
            - MESSAGE_SIGNING
            - SATOSHI_TEST
            - SCREENSHOT
            - SELF_DECLARATION
          description: 'Present amb estat: el mètode de la prova tancada.'
        max_attempts:
          type: integer
          description: >-
            Present amb estat: proves de cartera rebutjades que permet aquesta
            sessió.
        attempts_used:
          type: integer
          description: 'Present amb estat: proves rebutjades fins ara.'
        attempts_remaining:
          type: integer
          description: >-
            Present amb estat: quan és 0, iniciar una altra prova respon 409 i
            es genera una nova sessió 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: >-
        Per què una prova de titularitat de la cartera, o el seu últim intent,
        no ha arribat a VERIFIED. Buit si no ha fallat res. Una prova PENDING en
        pot contenir un: l'últim intent ha fallat i l'usuari final pot tornar-ho
        a provar. DEPOSIT_MISMATCH, DEPOSIT_STALE, TXID_REUSED i REVIEW_REJECTED
        tanquen la prova com a REJECTED. SIGNATURE_INVALID: la signatura no
        coincideix amb la cartera i el repte. SIGNATURE_UNSUPPORTED_SCHEME: la
        cartera ha signat en un format que Didit no verifica. DEPOSIT_NOT_FOUND,
        DEPOSIT_UNCONFIRMED, DEPOSIT_LOOKUP_FAILED: el dipòsit de prova no es
        pot llegir o encara no està confirmat; Didit continua comprovant-lo fins
        que es tanca la finestra de prova. DEPOSIT_MISMATCH: la transacció no
        envia l'import esperat des de la cartera a l'adreça de dipòsit.
        DEPOSIT_STALE: la transacció és anterior al repte. TXID_REUSED: la
        transacció ja ha provat una altra cartera. CHAIN_UNSUPPORTED: el mètode
        no està disponible en aquesta cadena. WINDOW_EXPIRED: la finestra de
        prova s'ha tancat. OWNERSHIP_CHANGED: el titular de la cartera ha
        canviat, o la cartera s'ha suprimit de la teva llibreta d'adreces,
        després que s'hagués generat la sessió del widget. METHOD_SWITCHED:
        l'usuari final ha triat un altre mètode abans d'acabar aquest.
        REVIEW_REJECTED: el teu revisor ha rebutjat la captura de pantalla.
        ABANDONED: la sessió del widget ha caducat abans que l'usuari final
        acabés.

````

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