> ## 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 Travel Rule : soumettre une preuve de portefeuille

> Soumettez avec Didit une preuve de portefeuille (signature, txid de dépôt test, capture d'écran). Échec : code renvoyé ; mauvais dépôt : rejet.



Prompt de l’API de soumission des preuves du widget
        Copier le prompt dans le presse-papiers



      
      

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



      
      

Coller dans



## OpenAPI

````yaml fr/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 vérification d'identité. Authentifiez-vous avec l'en-tête 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: Soumettre la preuve de détention du portefeuille
      description: >-
        Endpoint public indexé par le token de session du widget, aucune clé API
        requise. Envoyez la preuve requise par la méthode de vérification : une
        signature pour MESSAGE_SIGNING, un txid pour SATOSHI_TEST (JSON), ou un
        fichier pour SCREENSHOT (multipart). Chaque soumission compte comme une
        tentative. Une signature qui échoue à la vérification, ou un dépôt qui
        ne correspond pas, renvoie 400 avec un code et laisse la preuve à l'état
        PENDING afin que l'utilisateur final puisse réessayer. Un dépôt détecté
        mais pas encore confirmé renvoie 200 avec le statut PENDING et fait
        l'objet d'une revérification automatique jusqu'à la fermeture de la
        fenêtre. Une capture d'écran renvoie 200 avec le statut PENDING et est
        placée dans votre file d'attente d'examen (GET
        /v3/travel-rule/wallet-proofs/). Une preuve EXPIRED ou REJECTED n'est
        jamais vérifiée ultérieurement : démarrez-en une nouvelle. Formats de
        signature vérifiés par famille de chaînes : les chaînes EVM acceptent
        une signature personal_sign (EIP-191), encodée en hexadécimal ; Bitcoin
        accepte une signature signmessage BIP-137 (adresses P2PKH, P2SH-P2WPKH
        et P2WPKH) ou une signature simple BIP-322 (adresses P2WPKH et P2TR),
        encodée en base64 ; Solana accepte une signature Ed25519 sur le
        challenge, encodée en base58 ; Tron accepte une signature signMessageV2
        (TIP-191), encodée en hexadécimal. Une signature BIP-322 complète ou de
        justificatif de fonds, ou une adresse multisig, échoue avec
        SIGNATURE_UNSUPPORTED_SCHEME.
      operationId: verifyTravelRuleWidgetProof
      parameters:
        - name: token
          in: path
          required: true
          description: >-
            Token de session opaque renvoyé lors de la création de la session du
            widget.
          schema:
            type: string
        - name: proof_id
          in: path
          required: true
          description: proof_id renvoyé lors du lancement de la preuve.
          schema:
            type: string
            format: uuid
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                signature:
                  type: string
                  description: >-
                    MESSAGE_SIGNING : la signature du portefeuille sur le défi
                    de la preuve.
                txid:
                  type: string
                  description: 'SATOSHI_TEST : l''ID de transaction du dépôt de test.'
          multipart/form-data:
            schema:
              type: object
              required:
                - file
              properties:
                file:
                  type: string
                  format: binary
                  description: >-
                    SCREENSHOT : une image montrant le portefeuille dans
                    l'application de portefeuille de l'utilisateur final.
      responses:
        '200':
          description: >-
            VERIFIED, ou encore PENDING (une capture d'écran en attente
            d'examen, un dépôt non indexé ou pas encore confirmé, avec le code
            DEPOSIT_NOT_FOUND ou DEPOSIT_UNCONFIRMED).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofVerifyResult'
        '400':
          description: >-
            Preuve manquante ; tentative infructueuse maintenant la preuve
            PENDING afin que l'utilisateur final puisse réessayer (code
            SIGNATURE_INVALID, SIGNATURE_UNSUPPORTED_SCHEME ou
            DEPOSIT_LOOKUP_FAILED) ; ou dépôt de test rejetant la preuve (code
            DEPOSIT_MISMATCH, DEPOSIT_STALE ou TXID_REUSED, statut REJECTED,
            avec le décompte des tentatives de la session) : sélectionner à
            nouveau une méthode démarre une nouvelle preuve tant que
            attempts_remaining est supérieur à 0.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofError'
        '404':
          description: Token inconnu, ou aucun justificatif de ce type sur cette session.
        '409':
          description: "code OWNERSHIP_CHANGED (la preuve est clôturée avec celui-ci)\_; une preuve clôturée (REJECTED ou EXPIRED), avec son statut, le code avec lequel elle a été clôturée et le nombre de tentatives de la session\_: choisissez à nouveau une méthode pour démarrer une nouvelle preuve\_; ou une preuve SELF_DECLARATION, qui est vérifiée dès son démarrage."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofError'
        '410':
          description: >-
            La session a expiré, ou code WINDOW_EXPIRED lorsque la fenêtre de
            test satoshi s'est fermée.
          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: >-
            Présent lorsque la preuve est VERIFIED : l'entrée du carnet
            d'adresses a désormais sa propriété vérifiée.
        transfer_status:
          type: string
          nullable: true
          description: >-
            Présent lorsque la preuve est VERIFIED : le statut du transfert lié,
            null s'il n'y en a aucun.
        detail:
          type: string
          description: >-
            Présent tant que la preuve reste PENDING : une capture d'écran
            soumise en attente d'examen, ou un dépôt de test qui n'est pas
            encore confirmé.
        code:
          allOf:
            - $ref: '#/components/schemas/TravelRuleWalletProofFailureReason'
          description: >-
            Présent sur un dépôt de test en attente : raison pour laquelle il
            n'est pas encore confirmé.
    TravelRuleWidgetProofError:
      type: object
      properties:
        detail:
          type: string
          description: Message lisible par l'humain en anglais.
        code:
          allOf:
            - $ref: '#/components/schemas/TravelRuleWalletProofFailureReason'
          description: >-
            Raison lisible par machine, afin qu'un client puisse afficher son
            propre message traduit.
        status:
          type: string
          enum:
            - PENDING
            - VERIFIED
            - REJECTED
            - EXPIRED
          description: >-
            Présent lorsque la preuve est clôturée : REJECTED par le dépôt qui
            vient d'être soumis (400), ou REJECTED ou EXPIRED lorsqu'une pièce
            justificative est envoyée pour une preuve déjà clôturée (409).
        proof_id:
          type: string
          format: uuid
          description: 'Présent avec le statut : la preuve clôturée.'
        method:
          type: string
          enum:
            - MESSAGE_SIGNING
            - SATOSHI_TEST
            - SCREENSHOT
            - SELF_DECLARATION
          description: 'Présent avec le statut : la méthode de la preuve clôturée.'
        max_attempts:
          type: integer
          description: >-
            Présent avec le statut : preuves de portefeuille rejetées autorisées
            par cette session.
        attempts_used:
          type: integer
          description: 'Présent avec le statut : preuves rejetées jusqu''à présent.'
        attempts_remaining:
          type: integer
          description: >-
            Présent avec le statut : lorsqu'il est à 0, démarrer une autre
            preuve renvoie 409 et vous générez une nouvelle session 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: "Raison pour laquelle une preuve de propriété du portefeuille, ou sa dernière tentative, n'a pas atteint le statut VERIFIED. Vide lorsque rien n'a échoué. Une preuve PENDING peut en comporter une\_: la dernière tentative a échoué et l'utilisateur final peut réessayer. DEPOSIT_MISMATCH, DEPOSIT_STALE, TXID_REUSED et REVIEW_REJECTED clôturent la preuve comme REJECTED. SIGNATURE_INVALID\_: la signature ne correspond pas au portefeuille et au défi. SIGNATURE_UNSUPPORTED_SCHEME\_: le portefeuille a signé dans un format que Didit ne vérifie pas. DEPOSIT_NOT_FOUND, DEPOSIT_UNCONFIRMED, DEPOSIT_LOOKUP_FAILED\_: le dépôt test n'est pas lisible ou pas encore confirmé\_; Didit continue de vérifier jusqu'à la fermeture de la fenêtre de test. DEPOSIT_MISMATCH\_: la transaction n'envoie pas le montant attendu depuis le portefeuille vers l'adresse de dépôt. DEPOSIT_STALE\_: la transaction est antérieure au défi. TXID_REUSED\_: la transaction a déjà servi à prouver un autre portefeuille. CHAIN_UNSUPPORTED\_: la méthode n'est pas disponible sur cette blockchain. WINDOW_EXPIRED\_: la fenêtre de test a expiré. OWNERSHIP_CHANGED\_: le détenteur du portefeuille a changé, ou le portefeuille a été supprimé de votre carnet d'adresses après la création de la session de widget. METHOD_SWITCHED\_: l'utilisateur final a choisi une autre méthode avant de terminer celle-ci. REVIEW_REJECTED\_: votre réviseur a rejeté la capture d'écran. ABANDONED\_: la session de widget a expiré avant que l'utilisateur final n'ait terminé."

````

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