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

> Envie à Didit assinatura, txid do depósito de teste ou print da prova de propriedade da carteira. Falha retorna código; depósito errado rejeita.



Prompt da API de envio de evidência de prova do widget
        Copiar o prompt para a área de transferência



      
      

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



      
      

Colar em



## OpenAPI

````yaml pt-br/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 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/{proof_id}/verify/:
    post:
      tags:
        - Travel Rule
      summary: Enviar evidências de prova de propriedade da carteira
      description: >-
        Endpoint público identificado pelo token de sessão do widget, sem
        necessidade de chave de API. Envie a evidência que o método da prova
        exige: signature para MESSAGE_SIGNING, txid para SATOSHI_TEST (JSON) ou
        um arquivo para SCREENSHOT (multipart). Cada envio conta como uma
        tentativa. Uma assinatura que não é verificada, ou um depósito que não
        corresponde, responde 400 com um código e mantém a prova como PENDING
        para que o usuário final possa tentar novamente. Um depósito detectado,
        mas ainda não confirmado, responde 200 com status PENDING e é verificado
        novamente de forma automática até a janela se encerrar. Uma captura de
        tela responde 200 com status PENDING e aguarda na sua fila de revisão
        (GET /v3/travel-rule/wallet-proofs/). Uma prova EXPIRED ou REJECTED
        nunca é verificada depois: inicie uma nova. 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: verifyTravelRuleWidgetProof
      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
        - name: proof_id
          in: path
          required: true
          description: proof_id retornado quando a prova foi iniciada.
          schema:
            type: string
            format: uuid
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                signature:
                  type: string
                  description: >-
                    MESSAGE_SIGNING: a assinatura da carteira sobre o desafio da
                    prova.
                txid:
                  type: string
                  description: 'SATOSHI_TEST: o ID da transação do depósito de teste.'
          multipart/form-data:
            schema:
              type: object
              required:
                - file
              properties:
                file:
                  type: string
                  format: binary
                  description: >-
                    SCREENSHOT: uma imagem mostrando a carteira no aplicativo de
                    carteira do usuário final.
      responses:
        '200':
          description: >-
            VERIFIED ou ainda PENDING (uma captura de tela aguardando revisão,
            um depósito ainda não indexado ou ainda não confirmado, com o código
            DEPOSIT_NOT_FOUND ou DEPOSIT_UNCONFIRMED).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofVerifyResult'
        '400':
          description: >-
            Evidência ausente; uma tentativa com falha que mantém a prova como
            PENDING para que o usuário final possa tentar novamente (código
            SIGNATURE_INVALID, SIGNATURE_UNSUPPORTED_SCHEME ou
            DEPOSIT_LOOKUP_FAILED); ou um depósito de teste que rejeita a prova
            (código DEPOSIT_MISMATCH, DEPOSIT_STALE ou TXID_REUSED, status
            REJECTED, com as contagens de tentativas da sessão): escolher um
            método novamente inicia uma nova prova enquanto attempts_remaining
            for maior que 0.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofError'
        '404':
          description: Token desconhecido, ou essa prova não existe nesta sessão.
        '409':
          description: >-
            código OWNERSHIP_CHANGED (a prova é encerrada com ele); uma prova
            encerrada (REJECTED ou EXPIRED), com seu status, o código com que
            foi encerrada e as contagens de tentativas da sessão: escolha um
            método novamente para iniciar uma nova prova; ou uma prova
            SELF_DECLARATION, que é verificada ao ser iniciada.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofError'
        '410':
          description: >-
            A sessão expirou, ou o código WINDOW_EXPIRED quando a janela do
            teste de satoshi foi encerrada.
          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: >-
            Presente quando a prova está VERIFIED: a entrada do catálogo de
            endereços agora tem a propriedade verificada.
        transfer_status:
          type: string
          nullable: true
          description: >-
            Presente quando a prova está VERIFIED: o status da transferência
            vinculada, null quando não há uma.
        detail:
          type: string
          description: >-
            Presente enquanto a prova permanece PENDING: uma captura de tela
            enviada aguardando revisão, ou um depósito de teste ainda não
            confirmado.
        code:
          allOf:
            - $ref: '#/components/schemas/TravelRuleWalletProofFailureReason'
          description: >-
            Presente em um depósito de teste pendente: o motivo pelo qual ele
            ainda não foi confirmado.
    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.