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

# API para iniciar prova de propriedade de carteira

> A Didit inicia a prova de propriedade de carteira via token do widget: assinatura, teste Satoshi, captura ou autodeclaração. Repetir o método retoma.

Prompt da API para iniciar a prova do widget
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-br/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 de carteira
      description: >-
        Endpoint público identificado pelo token de sessão do widget, sem
        necessidade de chave de API: o widget hospedado o chama quando o usuário
        final escolhe um método de prova. Uma prova só passa a existir, e a
        contar no seu funil de provas, a partir desta chamada. Escolher o mesmo
        método novamente retorna a prova já aberta (200, mesmo desafio ou mesmo
        valor de depósito) em vez de iniciar uma segunda; escolher outro método
        encerra a prova não concluída como METHOD_SWITCHED, exceto uma captura
        de tela já enviada ou um depósito de teste que ainda está sendo
        verificado. MESSAGE_SIGNING retorna o desafio a ser assinado;
        SATOSHI_TEST, o endereço de depósito, o valor exato e a janela;
        SELF_DECLARATION é verificado imediatamente (status VERIFIED). Formatos
        de assinatura verificados por família de blockchain: redes 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 BIP-322 simple (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 BIP-322 full ou
        proof-of-funds, 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 retornado quando a sessão do widget foi
            criada.
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TravelRuleWidgetProofCreate'
      responses:
        '200':
          description: A comprovação já aberta para este método, retomada.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofSummary'
        '201':
          description: Um novo comprovante PENDING (VERIFIED para SELF_DECLARATION).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofSummary'
        '400':
          description: >-
            Corpo inválido, uma carteira que não corresponde à transferência,
            SCREENSHOT não permitido ou o 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 é permitido para esta aplicação.
        '404':
          description: Token desconhecido.
        '409':
          description: >-
            código OWNERSHIP_CHANGED: o titular da carteira mudou ou a carteira
            foi excluída depois que a sessão foi gerada; gere uma nova sessão
            para o titular atual. Também é retornado para SATOSHI_TEST quando a
            sessão não tem satoshi_deposit_address, e quando a sessão não tem
            mais tentativas (sem código; o corpo traz max_attempts,
            attempts_used e attempts_remaining 0): gere 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 comprovação que o usuário final escolheu. Deve ser um
            dos allowed_methods do contexto.
        wallet_address:
          type: string
          maxLength: 128
          description: >-
            O padrão é o wallet_address da sessão. Deve corresponder à carteira
            da transferência quando a sessão estiver vinculada a uma
            transferência.
        chain:
          type: string
          maxLength: 32
          description: O padrã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 usuário final escolheu este método e a prova ainda não
            foi decidida. Uma assinatura que falhou ou um depósito de teste que
            ainda não pôde ser lido ou confirmado mantém a prova em PENDING com
            um failure_reason, para que o usuário final possa tentar novamente;
            um depósito SATOSHI_TEST enviado é verificado de novo
            automaticamente até sua janela se encerrar, e um SCREENSHOT enviado
            aguarda a sua revisão. VERIFIED: a propriedade está comprovada.
            REJECTED: o depósito de teste está realmente incorreto (outro
            remetente, valor diferente do esperado para o endereço de depósito,
            anterior ao desafio ou uma transação que já comprovou outra
            carteira) ou o seu revisor rejeitou a captura de tela;
            failure_reason indica qual. Uma prova rejeitada é definitiva e
            consome uma das tentativas da sessão. EXPIRED: a prova não pode mais
            ser decidida (sua janela se encerrou, o usuário final trocou de
            método, a sessão do widget expirou ou o titular da carteira mudou);
            failure_reason indica qual.
        wallet_address:
          type: string
        chain:
          type: string
          description: >-
            Identificador canônico da blockchain da entrada do catálogo de
            endereços à qual 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 valor de
            teste em Satoshi. Presente apenas em uma prova SATOSHI_TEST.
        expected_amount:
          type: string
          nullable: true
          description: >-
            Valor on-chain exato, na moeda nativa do depósito, ao qual o
            depósito de teste Satoshi deve corresponder. Presente apenas em uma
            prova SATOSHI_TEST.
        expires_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            Prazo da janela do teste Satoshi desta prova. Presente apenas em uma
            prova SATOSHI_TEST; o expires_at da própria sessão do widget é
            estendido para cobri-lo quando SATOSHI_TEST é oferecido.
        challenge:
          type: string
          nullable: true
          description: >-
            Mensagem emitida pela Didit que o cliente assina com a própria
            carteira. Presente apenas em uma prova MESSAGE_SIGNING.
        rejection_reason:
          type: string
          description: >-
            Por que a comprovação foi rejeitada, como uma frase em inglês para o
            usuário final. Presente apenas quando `status` é REJECTED; vazio
            quando seu revisor rejeitou uma captura de tela (sua observação fica
            só com você).
        created_at:
          type: string
          format: date-time
        attempts:
          type: integer
          description: >-
            Quantas vezes evidências foram enviadas para esta comprovação
            (assinaturas, IDs de transação, uploads).
        failure_reason:
          allOf:
            - $ref: '#/components/schemas/TravelRuleWalletProofFailureReason'
          description: >-
            Por que a última tentativa não foi suficiente, ou por que a
            comprovação 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 exibir sua
            própria mensagem traduzida.
        status:
          type: string
          enum:
            - PENDING
            - VERIFIED
            - REJECTED
            - EXPIRED
          description: >-
            Presente quando a prova está encerrada: REJECTED pelo depósito que
            acabou de ser enviado (400), ou REJECTED ou EXPIRED quando
            evidências são enviadas para uma prova que já está encerrada (409).
        proof_id:
          type: string
          format: uuid
          description: 'Presente com status: a prova encerrada.'
        method:
          type: string
          enum:
            - MESSAGE_SIGNING
            - SATOSHI_TEST
            - SCREENSHOT
            - SELF_DECLARATION
          description: 'Presente com status: o método da prova encerrada.'
        max_attempts:
          type: integer
          description: >-
            Presente com status: provas de carteira recusadas que esta sessão
            permite.
        attempts_used:
          type: integer
          description: 'Presente com status: provas recusadas até o momento.'
        attempts_remaining:
          type: integer
          description: >-
            Presente com status: quando for 0, iniciar outra prova retorna 409 e
            você gera uma nova sessão do 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 que uma prova de propriedade de carteira, ou sua última tentativa,
        não chegou a VERIFIED. Vazio quando nada falhou. Uma prova PENDING pode
        ter um motivo: a última tentativa falhou e o usuário 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 em um formato que a
        Didit não verifica. DEPOSIT_NOT_FOUND, DEPOSIT_UNCONFIRMED,
        DEPOSIT_LOOKUP_FAILED: o depósito de teste não pode ser lido ou ainda
        não foi confirmado; a Didit continua verificando-o até a janela de teste
        fechar. DEPOSIT_MISMATCH: a transação não envia o valor 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 fechou. OWNERSHIP_CHANGED:
        o titular da carteira mudou, ou a carteira foi excluída do seu catálogo
        de endereços, depois que a sessão do widget foi criada. METHOD_SWITCHED:
        o usuário final escolheu outro método antes de concluir este.
        REVIEW_REJECTED: seu revisor rejeitou a captura de tela. ABANDONED: a
        sessão do widget expirou antes de o usuário final concluir.

````

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