> ## 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 de preuve de propriété de portefeuille - Travel Rule

> Avec Didit, démarrez une preuve de propriété de portefeuille depuis un token de session widget : signature, test Satoshi, capture ou déclaration.

Prompt de l'API Start Widget Proof
Copier le prompt dans le presse-papiers

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

Coller dans


## OpenAPI

````yaml fr/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 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/:
    post:
      tags:
        - Travel Rule
      summary: Démarrer une preuve de propriété du portefeuille
      description: >-
        Endpoint public indexé par le token de session du widget, aucune clé API
        requise : le widget hébergé l'appelle lorsque l'utilisateur final
        choisit une méthode de preuve. Une preuve n'existe et ne compte dans
        votre entonnoir de preuves qu'à partir de cet appel. Choisir à nouveau
        la même méthode renvoie la preuve déjà ouverte (200, même challenge ou
        montant de dépôt) au lieu d'en démarrer une deuxième ; choisir une autre
        méthode ferme celle non terminée avec METHOD_SWITCHED, à l'exception
        d'une capture d'écran soumise ou d'un dépôt test toujours en cours de
        vérification. MESSAGE_SIGNING renvoie le challenge à signer ;
        SATOSHI_TEST l'adresse de dépôt, le montant exact et la fenêtre
        temporelle ; SELF_DECLARATION est vérifiée immédiatement (statut
        VERIFIED). 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: createTravelRuleWidgetProof
      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
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TravelRuleWidgetProofCreate'
      responses:
        '200':
          description: La preuve déjà ouverte pour cette méthode, reprise.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofSummary'
        '201':
          description: Une nouvelle preuve PENDING (VERIFIED pour SELF_DECLARATION).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofSummary'
        '400':
          description: >-
            Corps non valide, portefeuille ne correspondant pas au transfert,
            SCREENSHOT non autorisé, ou code CHAIN_UNSUPPORTED lorsque la
            méthode n'est pas disponible sur la blockchain.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofError'
        '403':
          description: SELF_DECLARATION n'est pas autorisée pour cette application.
        '404':
          description: Token inconnu.
        '409':
          description: "code OWNERSHIP_CHANGED\_: le détenteur du portefeuille a changé ou le portefeuille a été supprimé après la création de la session\_; créez une nouvelle session pour le détenteur actuel. Renvoyé également pour SATOSHI_TEST lorsque la session n'a pas de satoshi_deposit_address, et lorsque la session n'a plus de tentatives restantes (aucun code\_; le corps contient max_attempts, attempts_used et attempts_remaining à 0)\_: créez une nouvelle session."
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofError'
        '410':
          description: La session a expiré.
      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: >-
            La méthode de preuve choisie par l'utilisateur final. Elle doit
            faire partie des allowed_methods du contexte.
        wallet_address:
          type: string
          maxLength: 128
          description: >-
            Prend par défaut le wallet_address de la session. Doit correspondre
            au portefeuille du transfert lorsque la session est liée à un
            transfert.
        chain:
          type: string
          maxLength: 32
          description: Prend par défaut la blockchain de la session.
    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 : l'utilisateur final a choisi cette méthode et la preuve
            n'est pas encore tranchée. Une signature échouée ou un dépôt test
            non lisible ou non encore confirmé maintient la preuve PENDING avec
            un failure_reason, afin que l'utilisateur final puisse réessayer ;
            un dépôt SATOSHI_TEST soumis est revérifié automatiquement jusqu'à
            la clôture de sa fenêtre, et une SCREENSHOT soumise attend votre
            examen. VERIFIED : la propriété est prouvée. REJECTED : le dépôt
            test est véritablement incorrect (autre expéditeur, montant vers
            l'adresse de dépôt différent de celui attendu, antérieur au défi, ou
            transaction ayant déjà prouvé un autre portefeuille) ou votre
            réviseur a refusé la capture d'écran ; failure_reason indique la
            cause. Une preuve rejetée est définitive et consomme l'une des
            tentatives de la session. EXPIRED : la preuve ne peut plus être
            tranchée (sa fenêtre s'est fermée, l'utilisateur final a changé de
            méthode, la session du widget a expiré ou le titulaire du
            portefeuille a changé) ; failure_reason indique la cause.
        wallet_address:
          type: string
        chain:
          type: string
          description: >-
            Identifiant canonique de la blockchain de l'entrée du carnet
            d'adresses à laquelle la preuve se rapporte, par ex. ETH, BTC, SOL,
            TRX.
        deposit_address:
          type: string
          nullable: true
          description: >-
            Adresse de dépôt à laquelle le client doit envoyer le montant du
            test Satoshi. Présent uniquement sur une preuve SATOSHI_TEST.
        expected_amount:
          type: string
          nullable: true
          description: >-
            Montant on-chain exact, dans la devise native du dépôt, auquel le
            dépôt de test Satoshi doit correspondre. Présent uniquement sur une
            preuve SATOSHI_TEST.
        expires_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            Date limite pour la fenêtre du test Satoshi propre à cette preuve.
            Présent uniquement sur une preuve SATOSHI_TEST ; l'expires_at propre
            à la session de widget est prolongé pour la couvrir lorsque
            SATOSHI_TEST est proposé.
        challenge:
          type: string
          nullable: true
          description: >-
            Message émis par Didit que le client signe avec son portefeuille.
            Présent uniquement sur une preuve MESSAGE_SIGNING.
        rejection_reason:
          type: string
          description: >-
            Raison pour laquelle la preuve a été refusée, sous forme de phrase
            en anglais pour l'utilisateur final. Présente uniquement lorsque
            `status` est REJECTED ; vide lorsque votre réviseur a refusé une
            capture d'écran (votre note reste chez vous).
        created_at:
          type: string
          format: date-time
        attempts:
          type: integer
          description: >-
            Nombre de fois où des éléments probants ont été soumis pour ce
            justificatif (signatures, identifiants de transaction,
            téléversements).
        failure_reason:
          allOf:
            - $ref: '#/components/schemas/TravelRuleWalletProofFailureReason'
          description: >-
            Raison pour laquelle la dernière tentative a échoué, ou raison pour
            laquelle la preuve a été clôturée. Vide lorsque rien n'a échoué.
    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.