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

# Submeter prova de propriedade de carteira - Travel Rule

> Submeta na Didit a assinatura, o ID da transação de depósito de teste ou uma captura de ecrã. Falha devolve código; depósito errado rejeita.



Prompt da API para submeter evidências 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/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: Submeter a prova de propriedade da carteira
      description: >-
        Endpoint público associado ao token de sessão do widget, sem necessidade
        de chave de API. Envie a evidência necessária para o método da prova:
        assinatura para MESSAGE_SIGNING, txid para SATOSHI_TEST (JSON) ou um
        ficheiro para SCREENSHOT (multipart). Cada envio conta como uma
        tentativa. Uma assinatura que não seja verificada ou um depósito que não
        coincida responde com 400 com um código e deixa a prova como PENDING
        para que o utilizador final possa tentar novamente. Um depósito detetado
        mas ainda não confirmado responde com 200 com o estado PENDING e é
        verificado novamente de forma automática até ao fecho da janela. Uma
        captura de ecrã responde com 200 com o estado PENDING e aguarda na sua
        fila de revisão (GET /v3/travel-rule/wallet-proofs/). Uma prova EXPIRED
        ou REJECTED nunca é verificada mais tarde: inicie uma nova. 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: verifyTravelRuleWidgetProof
      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
        - name: proof_id
          in: path
          required: true
          description: proof_id devolvido 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 que mostra a carteira na aplicação de
                    carteira do utilizador final.
      responses:
        '200':
          description: >-
            VERIFIED, ou ainda PENDING (uma captura de ecrã a aguardar revisão,
            um depósito ainda não indexado ou 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 em falta; uma tentativa falhada que mantém a prova como
            PENDING para que o utilizador 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, estado
            REJECTED, com as contagens de tentativas da sessão): escolher um
            método novamente inicia uma nova prova enquanto attempts_remaining
            for superior a 0.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofError'
        '404':
          description: Token desconhecido ou nenhum comprovativo deste tipo nesta sessão.
        '409':
          description: >-
            código OWNERSHIP_CHANGED (a prova é encerrada com este); uma prova
            encerrada (REJECTED ou EXPIRED), com o seu estado, o código com que
            encerrou e as contagens de tentativas da sessão: escolha novamente
            um método para iniciar uma nova prova; ou uma prova
            SELF_DECLARATION, que é verificada quando iniciada.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofError'
        '410':
          description: >-
            A sessão expirou, ou código WINDOW_EXPIRED quando a janela do teste
            satoshi fechou.
          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 o comprovativo está VERIFIED: a entrada do livro de
            endereços foi agora verificada quanto à propriedade.
        transfer_status:
          type: string
          nullable: true
          description: >-
            Presente quando o comprovativo está VERIFIED: o estado da
            transferência associada, ou null quando não existir nenhuma.
        detail:
          type: string
          description: >-
            Presente enquanto o comprovativo permanece PENDING: uma captura de
            ecrã submetida que aguarda revisão, ou um depósito de teste que
            ainda não está confirmado.
        code:
          allOf:
            - $ref: '#/components/schemas/TravelRuleWalletProofFailureReason'
          description: >-
            Presente num depósito de teste pendente: o motivo pelo qual 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 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.