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

# Travel Rule: iniciar prova de titularitat de cartera

> Inicia una prova de titularitat de cartera amb Didit des d'un token de sessió del widget. Triar de nou un mètode la reprèn.

Prompt de l'API per iniciar Widget Proof
Copia el prompt al porta-retalls

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

Enganxa a


## OpenAPI

````yaml ca/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ó 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/:
    post:
      tags:
        - Travel Rule
      summary: Inicia una prova de titularitat de cartera
      description: >-
        Endpoint públic identificat pel token de sessió del widget, sense
        necessitat de cap clau d'API: el widget allotjat el crida quan l'usuari
        final tria un mètode de comprovació. Una prova només existeix, i compta
        al teu embut de proves, a partir d'aquesta crida. Tornar a triar el
        mateix mètode retorna la prova ja oberta (200, mateix repte o import del
        dipòsit) en lloc d'iniciar-ne una de segona; triar un altre mètode tanca
        la prova inacabada com a METHOD_SWITCHED, tret d'una captura de pantalla
        enviada o un dipòsit de prova que encara s'estigui comprovant.
        MESSAGE_SIGNING retorna el repte que cal signar; SATOSHI_TEST l'adreça
        de dipòsit, l'import exacte i la finestra temporal; SELF_DECLARATION es
        verifica a l'instant (estat VERIFIED). 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: createTravelRuleWidgetProof
      parameters:
        - name: token
          in: path
          required: true
          description: Token de sessió opac retornat quan s'ha creat la sessió del widget.
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TravelRuleWidgetProofCreate'
      responses:
        '200':
          description: La prova que ja estava oberta per a aquest mètode, represa.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofSummary'
        '201':
          description: Una nova prova PENDING (VERIFIED per a SELF_DECLARATION).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofSummary'
        '400':
          description: >-
            Cos no vàlid, una cartera que no coincideix amb la transferència,
            SCREENSHOT no permès o el codi CHAIN_UNSUPPORTED quan el mètode no
            està disponible a la blockchain.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofError'
        '403':
          description: SELF_DECLARATION no està permès per a aquesta aplicació.
        '404':
          description: Token desconegut.
        '409':
          description: >-
            codi OWNERSHIP_CHANGED: el titular de la cartera ha canviat o la
            cartera s'ha suprimit després de generar la sessió; genera una nova
            sessió per al titular actual. També es retorna per a SATOSHI_TEST
            quan la sessió no té satoshi_deposit_address, i quan a la sessió no
            li queden intents (sense codi; el cos conté max_attempts,
            attempts_used i attempts_remaining 0): genera una nova sessió.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofError'
        '410':
          description: La sessió ha caducat.
      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ètode de prova que ha triat l'usuari final. Ha de ser un dels
            allowed_methods del context.
        wallet_address:
          type: string
          maxLength: 128
          description: >-
            Per defecte, el wallet_address de la sessió. Ha de coincidir amb la
            cartera de la transferència quan la sessió està vinculada a una
            transferència.
        chain:
          type: string
          maxLength: 32
          description: Per defecte, la cadena de la sessió.
    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: l'usuari final ha triat aquest mètode i la prova encara no
            s'ha decidit. Una signatura fallida o un dipòsit de prova que encara
            no es pot llegir o confirmar manté la prova com a PENDING amb un
            failure_reason, de manera que l'usuari final pot tornar-ho a provar;
            un dipòsit SATOSHI_TEST enviat es torna a comprovar automàticament
            fins que es tanca la seva finestra temporal, i un SCREENSHOT enviat
            queda a l'espera de la teva revisió. VERIFIED: la titularitat està
            demostrada. REJECTED: el dipòsit de prova és realment incorrecte (un
            altre remitent, un import diferent de l'esperat a l'adreça de
            dipòsit, anterior al repte o una transacció que ja ha demostrat una
            altra cartera) o el teu revisor ha rebutjat la captura de pantalla;
            failure_reason indica quin ha estat el motiu. Una prova rebutjada és
            definitiva i consumeix un dels intents de la sessió. EXPIRED: la
            prova ja no es pot decidir (la finestra s'ha tancat, l'usuari final
            ha canviat de mètode, la sessió del widget ha caducat o el titular
            de la cartera ha canviat); failure_reason indica quin ha estat el
            motiu.
        wallet_address:
          type: string
        chain:
          type: string
          description: >-
            Identificador canònic de la cadena de l'entrada de la llibreta
            d'adreces a la qual correspon el comprovant, p. ex. ETH, BTC, SOL,
            TRX.
        deposit_address:
          type: string
          nullable: true
          description: >-
            Adreça de dipòsit a la qual el client ha d'enviar l'import de la
            prova Satoshi. Només present en una prova SATOSHI_TEST.
        expected_amount:
          type: string
          nullable: true
          description: >-
            Quantitat on-chain exacta, en la moneda nativa del dipòsit, amb la
            qual ha de coincidir el dipòsit de prova de Satoshi. Present només
            en una prova SATOSHI_TEST.
        expires_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            Data límit per a la finestra pròpia de la prova de Satoshi d'aquest
            comprovant. Present només en un comprovant SATOSHI_TEST; el camp
            expires_at de la sessió del widget s'amplia per cobrir-lo quan
            s'ofereix SATOSHI_TEST.
        challenge:
          type: string
          nullable: true
          description: >-
            Missatge emès per Didit que el client signa amb la seva cartera.
            Present només en una prova de MESSAGE_SIGNING.
        rejection_reason:
          type: string
          description: >-
            Per què s'ha rebutjat la prova, com a frase en anglès per a l'usuari
            final. Només present quan `status` és REJECTED; buit quan el teu
            revisor ha rebutjat una captura de pantalla (la teva nota es queda
            amb tu).
        created_at:
          type: string
          format: date-time
        attempts:
          type: integer
          description: >-
            Quants cops s'han enviat proves per a aquest comprovant (signatures,
            identificadors de transacció, fitxers pujats).
        failure_reason:
          allOf:
            - $ref: '#/components/schemas/TravelRuleWalletProofFailureReason'
          description: >-
            Per què l'últim intent no va reeixir, o per què es va tancar la
            prova. Buit quan res no ha fallat.
    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.