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

# Approuver ou rejeter une preuve de portefeuille (API)

> Approuvez ou rejetez avec Didit une preuve de portefeuille par capture d'écran. L'approbation vérifie le portefeuille et l'associe au transfert.

Prompt de l'API Decide Wallet Proof
Copier le prompt dans le presse-papiers

<pre>
  \`Approve or reject a screenshot wallet-ownership proof from my review queue.

  Endpoint:
  POST [https://verification.didit.me/v3/travel-rule/wallet-proofs/\{proof\_uuid}/decision/](https://verification.didit.me/v3/travel-rule/wallet-proofs/\{proof_uuid}/decision/)

  Authentication:
  Use the x-api-key header with my Didit API key.

  Body:

  * decision - "approve" or "reject".
  * note - optional, up to 512 characters, kept with the proof and returned as review\_note.

  Behavior:

  * approve verifies the proof and the wallet address book entry, and applies the ownership to the transfer the widget session was minted for, exactly as a verified signature does.
  * A screenshot never confirms a transfer another Didit customer sent over the INTERNAL rail: that needs a signed message or a test deposit.
  * reject closes the proof as REJECTED with failure\_reason REVIEW\_REJECTED. It uses one of the widget session's attempts; the end user can start a new proof from the widget while attempts remain. Your note is never shown to the end user.
  * Returns the decided proof, in the same shape as the review queue.

  Failure modes:

  * 404 - no submitted screenshot proof with this id in my application.
  * 409 - already decided (the body carries its status), or code OWNERSHIP\_CHANGED when the wallet's holder changed or the wallet was deleted after the widget session was minted; ask the current holder for a new proof.
  * 400 - invalid decision or a note that is too long.
  * 401 - missing or malformed x-api-key.

  Full guide: /transaction-monitoring/wallet-ownership-widget#what-it-proves.\`
</pre>

Coller dans


## OpenAPI

````yaml fr/openapi-25.json POST /v3/travel-rule/wallet-proofs/{proof_uuid}/decision/
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/wallet-proofs/{proof_uuid}/decision/:
    post:
      tags:
        - Travel Rule
      summary: Approuver ou rejeter une capture d'écran comme preuve de portefeuille
      description: >-
        Prendre une décision sur une preuve par capture d'écran depuis votre
        file d'attente d'examen. approve vérifie la preuve ainsi que l'entrée du
        carnet d'adresses et applique l'actionnariat au transfert pour lequel la
        session de widget a été générée, exactement comme le fait une signature
        vérifiée. Une capture d'écran ne confirme jamais un transfert qu'un
        autre client Didit a envoyé via le canal INTERNAL : cela nécessite un
        message signé ou un dépôt de test. reject clôture la preuve avec le
        statut REJECTED et failure_reason REVIEW_REJECTED ; l'utilisateur final
        peut recommencer une nouvelle preuve depuis le widget. La note est
        conservée avec la preuve.
      operationId: decideTravelRuleWalletProof
      parameters:
        - name: proof_uuid
          in: path
          required: true
          description: proof_id issu de la file d'attente d'examen.
          schema:
            type: string
            format: uuid
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TravelRuleWalletProofDecision'
            example:
              decision: approve
              note: Address matches the wallet app.
      responses:
        '200':
          description: Le justificatif faisant l'objet de la décision.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWalletProofReview'
        '400':
          description: Décision non valide, ou note de plus de 512 caractères.
        '401':
          description: x-api-key manquant ou invalide.
        '403':
          description: >-
            L'appelant ne dispose pas de l'autorisation requise pour les
            transactions.
        '404':
          description: >-
            Aucune preuve de capture d'écran soumise avec cet id dans votre
            application.
        '409':
          description: >-
            La décision relative à la preuve a déjà été prise (le corps contient
            son statut), ou code OWNERSHIP_CHANGED : le titulaire du
            portefeuille a changé ou le portefeuille a été supprimé après la
            création de la session du widget, la preuve est donc fermée et le
            titulaire actuel en nécessite une nouvelle.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofError'
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: >-
            curl -X POST
            https://verification.didit.me/v3/travel-rule/wallet-proofs/{proof_uuid}/decision/
            \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -d '{"decision": "approve", "note": "Address matches the wallet app."}'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.travel_rule.wallet_proofs.decide(
                "11111111-2222-3333-4444-555555555555",
                decision="approve",
                note="Address matches the wallet app.",
            )
            print(result)
        - lang: javascript
          label: Node.js
          source: >-
            import Didit from "@didit-protocol/sdk-node";


            // Reads DIDIT_API_KEY.

            const didit = new Didit();


            const result = await
            didit.travelRule.walletProofs.decide("11111111-2222-3333-4444-555555555555",
            {
              decision: "approve",
              note: "Address matches the wallet app.",
            });

            console.log(result);
        - lang: java
          label: Java
          source: >-
            import me.didit.Didit;

            import me.didit.types.TravelRuleWalletProofDecision;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.travelRule().walletProofs().decide("11111111-2222-3333-4444-555555555555",
            TravelRuleWalletProofDecision.builder()
                    .decision(TravelRuleWalletProofDecision.Decision.of("approve"))
                    .note("Address matches the wallet app.")
                    .build());
            System.out.println(result);
        - lang: php
          label: PHP
          source: >-
            <?php


            require 'vendor/autoload.php';


            use Didit\DiditClient;


            // Reads DIDIT_API_KEY.

            $didit = new DiditClient();


            $result =
            $didit->travelRule->walletProofs->decide('11111111-2222-3333-4444-555555555555',
            [
                'decision' => 'approve',
                'note' => 'Address matches the wallet app.',
            ]);

            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

            # Reads DIDIT_API_KEY.
            didit = Didit::Client.new

            result = didit.travel_rule.wallet_proofs.decide(
              "11111111-2222-3333-4444-555555555555",
              decision: "approve",
              note: "Address matches the wallet app."
            )
            puts result.to_h
        - lang: csharp
          label: .NET
          source: >-
            using System;

            using System.Text.Json;

            using Didit;


            // Reads DIDIT_API_KEY.

            using var client = new DiditClient();


            var result = await
            client.TravelRule.WalletProofs.DecideAsync("11111111-2222-3333-4444-555555555555",
            new TravelRuleWalletProofDecision

            {
                Decision = "approve",
                Note = "Address matches the wallet app.",
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    TravelRuleWalletProofDecision:
      type: object
      required:
        - decision
      properties:
        decision:
          type: string
          enum:
            - approve
            - reject
        note:
          type: string
          maxLength: 512
          description: >-
            Optionnel. Conservé avec la preuve et renvoyé sous le nom
            review_note.
    TravelRuleWalletProofReview:
      type: object
      properties:
        proof_id:
          type: string
          format: uuid
        method:
          type: string
          enum:
            - SCREENSHOT
        status:
          type: string
          enum:
            - PENDING
            - VERIFIED
            - REJECTED
            - EXPIRED
        wallet_address:
          type: string
        chain:
          type: string
          description: Identifiant canonique de la blockchain, par ex. ETH, BTC, SOL, TRX.
        holder_name:
          type: string
        is_ownership_verified:
          type: boolean
          description: >-
            Indique si l'entrée du carnet d'adresses a fait l'objet d'une
            vérification de propriété, par cette preuve ou par une autre.
        transaction_id:
          type: string
          format: uuid
          nullable: true
          description: >-
            La transaction associée au transfert Travel Rule pour lequel la
            session de widget a été créée. Null pour une session créée sans
            transaction_id.
        file_name:
          type: string
          nullable: true
        content_type:
          type: string
          nullable: true
        screenshot_url:
          type: string
          nullable: true
          description: >-
            Lien temporaire vers la capture d'écran téléchargée. Listez à
            nouveau la file d'attente pour obtenir un lien actualisé.
        attempts:
          type: integer
          description: >-
            Nombre de fichiers que l'utilisateur final a téléchargés pour ce
            justificatif.
        failure_reason:
          allOf:
            - $ref: '#/components/schemas/TravelRuleWalletProofFailureReason'
          description: >-
            REVIEW_REJECTED après un refus, OWNERSHIP_CHANGED lorsque le
            portefeuille a changé de titulaire ou a été supprimé avant une
            décision. Vide dans les autres cas.
        method_chosen_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            Date et heure auxquelles l'utilisateur final a choisi la méthode par
            capture d'écran.
        decided_at:
          type: string
          format: date-time
          nullable: true
        decided_by:
          type: string
          description: >-
            Qui a clôturé la preuve : review:<user identifier> pour un réviseur
            de la console, review pour une décision prise par clé API, widget ou
            sweeper lorsque Didit l'a clôturée automatiquement. Vide tant que le
            statut est PENDING.
        review_note:
          type: string
          description: La note envoyée avec la décision. Vide s'il n'y en a aucune.
        created_at:
          type: string
          format: date-time
    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é."
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        La clé API de votre application, issue de Développeurs -> Clés API dans
        la Business Console. La clé principale dispose d'un accès complet. Une
        clé nommée peut être restreinte : aucun, lecture ou écriture par
        ressource, limitée à certains workflows ou aux sessions approuvées, à
        une liste d'adresses IP et à une date d'expiration. 401 signifie que la
        clé est incorrecte, révoquée ou expirée ; 403 signifie qu'aucune clé n'a
        été envoyée, que la clé n'a pas accès à cette ressource ou action, ou
        que la requête provient d'une adresse hors de sa liste d'IP ; 404 sur
        une route de session signifie que la session est hors des workflows ou
        des statuts de la clé. Une clé sans accès aux médias reçoit les URL
        d'images, de vidéos et de PDF à null, et une clé sans accès en écriture
        aux sessions reçoit les liens et tokens de session à null. Voir
        https://docs.didit.me/console/api-keys.

````

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