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

# Invio prova di proprietà del wallet API - Travel Rule

> Con Didit, invia firma, txid di un deposito di prova o screenshot. Tentativo fallito: restituisce un codice; deposito errato: rifiutato.



Prompt API per l'invio delle prove del widget
        Copia il prompt negli appunti



      
      

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



      
      

Incolla in



## OpenAPI

````yaml it/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 di verifica dell'identità. Autenticati con l'intestazione 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: Invia la prova di titolarità del wallet
      description: >-
        Endpoint pubblico associato al token di sessione del widget, nessuna
        chiave API richiesta. Invia l'evidenza richiesta dal metodo di prova:
        firma per MESSAGE_SIGNING, txid per SATOSHI_TEST (JSON) o un file per
        SCREENSHOT (multipart). Ogni invio conta come un tentativo. Una firma
        che non viene verificata, o un deposito che non corrisponde, restituisce
        400 con un codice e lascia la prova in PENDING affinché l'utente finale
        possa riprovare. Un deposito rilevato ma non ancora confermato risponde
        con 200 e stato PENDING e viene ricontrollato automaticamente fino alla
        chiusura della finestra temporale. Uno screenshot risponde con 200 e
        stato PENDING e attende nella tua coda di revisione (GET
        /v3/travel-rule/wallet-proofs/). Una prova EXPIRED o REJECTED non verrà
        mai verificata in seguito: avviane una nuova. Formati di firma
        verificati per famiglia di catena: le catene EVM accettano una firma
        personal_sign (EIP-191), codificata in hex; Bitcoin accetta una firma
        signmessage BIP-137 (indirizzi P2PKH, P2SH-P2WPKH e P2WPKH) o una firma
        semplice BIP-322 (indirizzi P2WPKH e P2TR), codificata in base64; Solana
        accetta una firma Ed25519 sul challenge, codificata in base58; Tron
        accetta una firma signMessageV2 (TIP-191), codificata in hex. Una firma
        BIP-322 completa o di prova dei fondi, oppure un indirizzo multisig,
        fallisce con SIGNATURE_UNSUPPORTED_SCHEME.
      operationId: verifyTravelRuleWidgetProof
      parameters:
        - name: token
          in: path
          required: true
          description: >-
            Token di sessione opaco restituito quando la sessione del widget è
            stata creata.
          schema:
            type: string
        - name: proof_id
          in: path
          required: true
          description: proof_id restituito all'avvio della prova.
          schema:
            type: string
            format: uuid
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                signature:
                  type: string
                  description: >-
                    MESSAGE_SIGNING: la firma del wallet sulla sfida della
                    prova.
                txid:
                  type: string
                  description: 'SATOSHI_TEST: l''ID di transazione del deposito di prova.'
          multipart/form-data:
            schema:
              type: object
              required:
                - file
              properties:
                file:
                  type: string
                  format: binary
                  description: >-
                    SCREENSHOT: un'immagine che mostra il wallet nell'app del
                    wallet dell'utente finale.
      responses:
        '200':
          description: >-
            VERIFIED, o ancora PENDING (uno screenshot in attesa di revisione,
            un deposito non ancora indicizzato o non ancora confermato, con
            codice DEPOSIT_NOT_FOUND o DEPOSIT_UNCONFIRMED).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofVerifyResult'
        '400':
          description: >-
            Elemento probatorio mancante; un tentativo non riuscito che mantiene
            la prova in stato PENDING consentendo all'utente finale di riprovare
            (codice SIGNATURE_INVALID, SIGNATURE_UNSUPPORTED_SCHEME o
            DEPOSIT_LOOKUP_FAILED); oppure un deposito di prova che rifiuta la
            prova (codice DEPOSIT_MISMATCH, DEPOSIT_STALE o TXID_REUSED, stato
            REJECTED, con il conteggio dei tentativi della sessione):
            selezionando nuovamente un metodo si avvia una nuova prova finché
            attempts_remaining è superiore a 0.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofError'
        '404':
          description: >-
            Token sconosciuto o nessuna prova di questo tipo presente nella
            sessione.
        '409':
          description: >-
            codice OWNERSHIP_CHANGED (la prova si chiude con questo); una prova
            chiusa (REJECTED o EXPIRED), con il suo stato, il codice con cui si
            è chiusa e i conteggi dei tentativi della sessione: seleziona
            nuovamente un metodo per avviare una nuova prova; oppure una prova
            SELF_DECLARATION, che viene verificata all'avvio.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofError'
        '410':
          description: >-
            La sessione è scaduta, oppure codice WINDOW_EXPIRED quando la
            finestra del test dei satoshi si è chiusa.
          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 la prova è VERIFIED: la titolarità della voce della
            rubrica è ora verificata.
        transfer_status:
          type: string
          nullable: true
          description: >-
            Presente quando la prova è VERIFIED: lo stato del trasferimento
            collegato, null se assente.
        detail:
          type: string
          description: >-
            Presente mentre la prova rimane PENDING: uno screenshot inviato in
            attesa di revisione, o un deposito di prova non ancora confermato.
        code:
          allOf:
            - $ref: '#/components/schemas/TravelRuleWalletProofFailureReason'
          description: >-
            Presente su un deposito di prova in sospeso: il motivo per cui non è
            ancora confermato.
    TravelRuleWidgetProofError:
      type: object
      properties:
        detail:
          type: string
          description: Messaggio di facile lettura in inglese.
        code:
          allOf:
            - $ref: '#/components/schemas/TravelRuleWalletProofFailureReason'
          description: >-
            Motivo leggibile dalla macchina, che consente a un client di
            mostrare il proprio messaggio tradotto.
        status:
          type: string
          enum:
            - PENDING
            - VERIFIED
            - REJECTED
            - EXPIRED
          description: >-
            Presente quando la prova è chiusa: REJECTED dal deposito appena
            inviato (400), oppure REJECTED o EXPIRED quando viene inviata
            un'evidenza a una prova già chiusa (409).
        proof_id:
          type: string
          format: uuid
          description: 'Presente con status: la prova chiusa.'
        method:
          type: string
          enum:
            - MESSAGE_SIGNING
            - SATOSHI_TEST
            - SCREENSHOT
            - SELF_DECLARATION
          description: 'Presente con status: il metodo della prova chiusa.'
        max_attempts:
          type: integer
          description: >-
            Presente con status: prove del wallet rifiutate consentite da questa
            sessione.
        attempts_used:
          type: integer
          description: 'Presente con status: prove rifiutate finora.'
        attempts_remaining:
          type: integer
          description: >-
            Presente con status: quando è 0, l'avvio di un'altra prova
            restituisce 409 e crei una nuova sessione 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: >-
        Il motivo per cui una prova di titolarità del wallet, o il suo ultimo
        tentativo, non ha raggiunto lo stato VERIFIED. Vuoto se non si è
        verificato alcun errore. Una prova PENDING può contenerne uno: l'ultimo
        tentativo è fallito e l'utente finale può riprovare. DEPOSIT_MISMATCH,
        DEPOSIT_STALE, TXID_REUSED e REVIEW_REJECTED chiudono la prova come
        REJECTED. SIGNATURE_INVALID: la firma non corrisponde al wallet e alla
        challenge. SIGNATURE_UNSUPPORTED_SCHEME: il wallet ha firmato in un
        formato non verificato da Didit. DEPOSIT_NOT_FOUND, DEPOSIT_UNCONFIRMED,
        DEPOSIT_LOOKUP_FAILED: il deposito di prova non è leggibile o non è
        ancora confermato; Didit continua a verificarlo fino alla chiusura della
        finestra di prova. DEPOSIT_MISMATCH: la transazione non invia l'importo
        previsto dal wallet all'indirizzo di deposito. DEPOSIT_STALE: la
        transazione è antecedente alla challenge. TXID_REUSED: la transazione ha
        già dimostrato la titolarità di un altro wallet. CHAIN_UNSUPPORTED: il
        metodo non è disponibile su questa blockchain. WINDOW_EXPIRED: la
        finestra di prova si è chiusa. OWNERSHIP_CHANGED: il titolare del wallet
        è cambiato, oppure il wallet è stato eliminato dalla tua rubrica, dopo
        la generazione della sessione del widget. METHOD_SWITCHED: l'utente
        finale ha scelto un altro metodo prima di completare questo.
        REVIEW_REJECTED: il tuo revisore ha rifiutato lo screenshot. ABANDONED:
        la sessione del widget è scaduta prima che l'utente finale terminasse.

````

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