> ## 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 prova de propriedade de carteira - Travel Rule

> Inicie na Didit a prova de propriedade da carteira com um token de sessão do widget: assinatura, teste Satoshi, captura ou autodeclaração.

Prompt da API Start Widget Proof
Copiar o prompt para a área de transferência

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

Colar em


## OpenAPI

````yaml pt/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 Verificação de identidade. Autentique-se com o cabeçalho x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/travel-rule/widget/{token}/proofs/:
    post:
      tags:
        - Travel Rule
      summary: Iniciar uma prova de propriedade da carteira
      description: >-
        Endpoint público associado ao token de sessão do widget, sem necessidade
        de chave de API: o widget alojado chama-o quando o utilizador final
        escolhe um método de prova. Uma prova só existe, e só conta no seu funil
        de provas, a partir desta chamada. Escolher novamente o mesmo método
        devolve a prova já aberta (200, mesmo desafio ou montante de depósito)
        em vez de iniciar uma segunda; escolher outro método fecha a prova não
        finalizada como METHOD_SWITCHED, exceto uma captura de ecrã enviada ou
        um depósito de teste ainda em verificação. MESSAGE_SIGNING devolve o
        desafio a assinar; SATOSHI_TEST o endereço de depósito, o montante exato
        e a janela; SELF_DECLARATION é verificada de imediato (estado VERIFIED).
        Formatos de assinatura verificados por família de blockchain: cadeias
        EVM aceitam uma assinatura personal_sign (EIP-191), codificada em hex;
        Bitcoin aceita uma assinatura signmessage BIP-137 (endereços P2PKH,
        P2SH-P2WPKH e P2WPKH) ou uma assinatura simples BIP-322 (endereços
        P2WPKH e P2TR), codificada em base64; Solana aceita uma assinatura
        Ed25519 sobre o desafio, codificada em base58; Tron aceita uma
        assinatura signMessageV2 (TIP-191), codificada em hex. Uma assinatura
        completa ou de comprovativo de fundos BIP-322, ou um endereço multisig,
        falha com SIGNATURE_UNSUPPORTED_SCHEME.
      operationId: createTravelRuleWidgetProof
      parameters:
        - name: token
          in: path
          required: true
          description: >-
            Token de sessão opaco devolvido quando a sessão do widget foi
            gerada.
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TravelRuleWidgetProofCreate'
      responses:
        '200':
          description: O comprovativo já aberto para este método, retomado.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofSummary'
        '201':
          description: Uma nova prova PENDING (VERIFIED para SELF_DECLARATION).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofSummary'
        '400':
          description: >-
            Corpo inválido, uma carteira que não coincide com a transferência,
            SCREENSHOT não permitido ou código CHAIN_UNSUPPORTED quando o método
            não está disponível na blockchain.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofError'
        '403':
          description: SELF_DECLARATION não é permitida para esta aplicação.
        '404':
          description: Token desconhecido.
        '409':
          description: >-
            código OWNERSHIP_CHANGED: o titular da carteira mudou ou a carteira
            foi eliminada após a sessão ter sido criada; crie uma nova sessão
            para o titular atual. Também devolvido para SATOSHI_TEST quando a
            sessão não tem satoshi_deposit_address e quando a sessão não tem
            tentativas restantes (sem código; o corpo inclui max_attempts,
            attempts_used e attempts_remaining 0): crie uma nova sessão.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofError'
        '410':
          description: A sessão expirou.
      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: >-
            O método de comprovativo escolhido pelo utilizador final. Deve ser
            um dos allowed_methods do contexto.
        wallet_address:
          type: string
          maxLength: 128
          description: >-
            Assume por predefinição o wallet_address da sessão. Tem de
            corresponder à carteira da transferência quando a sessão estiver
            associada a uma transferência.
        chain:
          type: string
          maxLength: 32
          description: Assume por predefinição a blockchain da sessão.
    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: o utilizador final escolheu este método e a prova ainda não
            foi decidida. Uma assinatura com falha ou um depósito de teste que
            ainda não seja legível ou confirmado mantém a prova PENDING com um
            failure_reason, para que o utilizador final possa tentar novamente;
            um depósito SATOSHI_TEST submetido é verificado novamente de forma
            automática até que a respetiva janela termine, e uma SCREENSHOT
            submetida aguarda a sua revisão. VERIFIED: a propriedade está
            comprovada. REJECTED: o depósito de teste está comprovadamente
            incorreto (outro ordenante, valor diferente do esperado para o
            endereço de depósito, mais antigo do que o desafio ou uma transação
            que já provou outra carteira) ou o seu revisor rejeitou a captura de
            ecrã; failure_reason indica o motivo. Uma prova rejeitada é
            definitiva e consome uma das tentativas da sessão. EXPIRED: a prova
            já não pode ser decidida (a janela fechou, o utilizador final mudou
            de método, a sessão do widget expirou ou o titular da carteira
            mudou); failure_reason indica o motivo.
        wallet_address:
          type: string
        chain:
          type: string
          description: >-
            Identificador canónico da blockchain da entrada do livro de
            endereços a que a prova se refere, por exemplo, ETH, BTC, SOL, TRX.
        deposit_address:
          type: string
          nullable: true
          description: >-
            Endereço de depósito para o qual o cliente deve enviar o montante do
            teste Satoshi. Presente apenas num comprovativo SATOSHI_TEST.
        expected_amount:
          type: string
          nullable: true
          description: >-
            Montante exato on-chain, na moeda nativa do depósito, com o qual o
            depósito de teste Satoshi deve corresponder. Presente apenas num
            comprovativo SATOSHI_TEST.
        expires_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            Prazo para a janela do teste de Satoshi deste comprovativo. Presente
            apenas num comprovativo SATOSHI_TEST; o expires_at da própria sessão
            do widget é prolongado para cobri-lo quando SATOSHI_TEST é
            disponibilizado.
        challenge:
          type: string
          nullable: true
          description: >-
            Mensagem emitida pela Didit que o cliente assina com a sua carteira.
            Presente apenas num comprovativo MESSAGE_SIGNING.
        rejection_reason:
          type: string
          description: >-
            O motivo pelo qual a prova foi recusada, como uma frase em inglês
            para o utilizador final. Presente apenas quando `status` é REJECTED;
            vazio quando o seu revisor recusou uma captura de ecrã (a sua nota
            permanece consigo).
        created_at:
          type: string
          format: date-time
        attempts:
          type: integer
          description: >-
            Quantas vezes foram submetidas provas para este comprovativo
            (assinaturas, IDs de transação, carregamentos).
        failure_reason:
          allOf:
            - $ref: '#/components/schemas/TravelRuleWalletProofFailureReason'
          description: >-
            O motivo pelo qual a última tentativa falhou ou a prova foi
            encerrada. Vazio quando nada falhou.
    TravelRuleWidgetProofError:
      type: object
      properties:
        detail:
          type: string
          description: Mensagem legível em inglês.
        code:
          allOf:
            - $ref: '#/components/schemas/TravelRuleWalletProofFailureReason'
          description: >-
            Motivo legível por máquina, para que um cliente possa apresentar a
            sua própria mensagem traduzida.
        status:
          type: string
          enum:
            - PENDING
            - VERIFIED
            - REJECTED
            - EXPIRED
          description: >-
            Presente quando o comprovativo está fechado: REJECTED pelo depósito
            acabado de submeter (400), ou REJECTED ou EXPIRED quando são
            enviadas provas para um comprovativo que já está fechado (409).
        proof_id:
          type: string
          format: uuid
          description: 'Presente com o estado: o comprovativo fechado.'
        method:
          type: string
          enum:
            - MESSAGE_SIGNING
            - SATOSHI_TEST
            - SCREENSHOT
            - SELF_DECLARATION
          description: 'Presente com o estado: o método do comprovativo fechado.'
        max_attempts:
          type: integer
          description: >-
            Presente com o estado: comprovativos de carteira rejeitados que esta
            sessão permite.
        attempts_used:
          type: integer
          description: 'Presente com o estado: comprovativos rejeitados até ao momento.'
        attempts_remaining:
          type: integer
          description: >-
            Presente com o estado: quando for 0, iniciar outro comprovativo
            devolve 409 e gera uma nova sessão de 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: >-
        O motivo pelo qual uma prova de propriedade da carteira, ou a sua última
        tentativa, não alcançou o estado VERIFIED. Vazio quando nada falhou. Uma
        prova PENDING pode conter um motivo: a última tentativa falhou e o
        utilizador final pode tentar novamente. DEPOSIT_MISMATCH, DEPOSIT_STALE,
        TXID_REUSED e REVIEW_REJECTED encerram a prova como REJECTED.
        SIGNATURE_INVALID: a assinatura não corresponde à carteira e ao desafio.
        SIGNATURE_UNSUPPORTED_SCHEME: a carteira assinou num formato que a Didit
        não verifica. DEPOSIT_NOT_FOUND, DEPOSIT_UNCONFIRMED,
        DEPOSIT_LOOKUP_FAILED: o depósito de teste não está legível ou ainda não
        foi confirmado; a Didit continua a verificá-lo até que a janela de teste
        termine. DEPOSIT_MISMATCH: a transação não envia o montante esperado da
        carteira para o endereço de depósito. DEPOSIT_STALE: a transação é
        anterior ao desafio. TXID_REUSED: a transação já comprovou outra
        carteira. CHAIN_UNSUPPORTED: o método não está disponível nesta
        blockchain. WINDOW_EXPIRED: a janela de teste terminou.
        OWNERSHIP_CHANGED: o titular da carteira mudou, ou a carteira foi
        eliminada do seu livro de endereços, após a criação da sessão do widget.
        METHOD_SWITCHED: o utilizador final escolheu outro método antes de
        concluir este. REVIEW_REJECTED: o seu revisor rejeitou a captura de
        ecrã. ABANDONED: a sessão do widget expirou antes de o utilizador final
        concluir.

````

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