> ## 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 para aprobar o rechazar prueba de wallet con captura

> Aprueba o rechaza en Didit una prueba de propiedad de wallet por captura. Al aprobarla, se verifica la wallet y se aplica a la transferencia.

Prompt de la API para decidir la prueba de wallet
Copiar el prompt al portapapeles

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

Pegar en


## OpenAPI

````yaml es/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 verificación de identidad. Autentícate con el encabezado 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: Aprobar o rechazar una prueba de wallet mediante captura de pantalla
      description: >-
        Resuelve una prueba por captura de pantalla desde tu cola de revisión.
        approve verifica la prueba y la entrada de la libreta de direcciones y
        aplica la propiedad a la transferencia para la que se creó la sesión del
        widget, exactamente igual que una firma verificada. Una captura de
        pantalla nunca confirma una transferencia que otro cliente de Didit
        envió por el canal INTERNAL: para eso se necesita un mensaje firmado o
        un depósito de prueba. reject cierra la prueba como REJECTED con
        failure_reason REVIEW_REJECTED; el usuario final puede iniciar una nueva
        prueba desde el widget. La nota se conserva junto con la prueba.
      operationId: decideTravelRuleWalletProof
      parameters:
        - name: proof_uuid
          in: path
          required: true
          description: proof_id de la cola de revisión.
          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: La prueba sobre la que se tomó la decisión.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWalletProofReview'
        '400':
          description: Decisión no válida o una nota de más de 512 caracteres.
        '401':
          description: x-api-key ausente o no válido.
        '403':
          description: Quien hace la llamada no tiene el permiso de transacciones.
        '404':
          description: >-
            No hay ninguna prueba de captura de pantalla enviada con este id en
            tu aplicación.
        '409':
          description: >-
            La prueba ya tiene una decisión (el cuerpo incluye su estado), o el
            código OWNERSHIP_CHANGED: el titular de la wallet cambió o la wallet
            se eliminó después de crearse la sesión del widget, por lo que la
            prueba está cerrada y el titular actual necesita una nueva.
          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: Opcional. Se guarda con la prueba y se devuelve como 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: Identificador canónico de la cadena, p. ej., ETH, BTC, SOL, TRX.
        holder_name:
          type: string
        is_ownership_verified:
          type: boolean
          description: >-
            Si la entrada de la libreta de direcciones tiene la propiedad
            verificada, mediante esta prueba u otra.
        transaction_id:
          type: string
          format: uuid
          nullable: true
          description: >-
            La transacción para cuya transferencia de Travel Rule se creó la
            sesión del widget. Es null para una sesión creada sin
            transaction_id.
        file_name:
          type: string
          nullable: true
        content_type:
          type: string
          nullable: true
        screenshot_url:
          type: string
          nullable: true
          description: >-
            Enlace de validez limitada a la captura de pantalla subida. Vuelve a
            listar la cola para obtener un enlace nuevo.
        attempts:
          type: integer
          description: Cuántos archivos subió el usuario final para esta prueba.
        failure_reason:
          allOf:
            - $ref: '#/components/schemas/TravelRuleWalletProofFailureReason'
          description: >-
            REVIEW_REJECTED tras un rechazo, OWNERSHIP_CHANGED cuando la wallet
            cambió de titular o se eliminó antes de una decisión. Vacío en caso
            contrario.
        method_chosen_at:
          type: string
          format: date-time
          nullable: true
          description: Cuándo el usuario final eligió el método de captura de pantalla.
        decided_at:
          type: string
          format: date-time
          nullable: true
        decided_by:
          type: string
          description: >-
            Quién cerró la prueba: review:<user identifier> para un revisor de
            la consola, review para una decisión tomada con una clave de API,
            widget o sweeper cuando Didit la cerró automáticamente. Vacío
            mientras está en PENDING.
        review_note:
          type: string
          description: La nota enviada con la decisión. Vacía cuando no hay ninguna.
        created_at:
          type: string
          format: date-time
    TravelRuleWidgetProofError:
      type: object
      properties:
        detail:
          type: string
          description: Mensaje legible en inglés.
        code:
          allOf:
            - $ref: '#/components/schemas/TravelRuleWalletProofFailureReason'
          description: >-
            Motivo legible por máquina, para que un cliente pueda mostrar su
            propio mensaje traducido.
        status:
          type: string
          enum:
            - PENDING
            - VERIFIED
            - REJECTED
            - EXPIRED
          description: >-
            Presente cuando la prueba está cerrada: REJECTED por el depósito que
            se acaba de enviar (400), o REJECTED o EXPIRED cuando se envía
            evidencia a una prueba que ya está cerrada (409).
        proof_id:
          type: string
          format: uuid
          description: 'Presente con status: la prueba cerrada.'
        method:
          type: string
          enum:
            - MESSAGE_SIGNING
            - SATOSHI_TEST
            - SCREENSHOT
            - SELF_DECLARATION
          description: 'Presente con status: el método de la prueba cerrada.'
        max_attempts:
          type: integer
          description: >-
            Presente con status: pruebas de wallet rechazadas que permite esta
            sesión.
        attempts_used:
          type: integer
          description: 'Presente con status: pruebas rechazadas hasta el momento.'
        attempts_remaining:
          type: integer
          description: >-
            Presente con status: cuando es 0, iniciar otra prueba responde 409 y
            debes crear una nueva sesión 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: >-
        Por qué una prueba de propiedad de wallet, o su último intento, no llegó
        a VERIFIED. Vacío cuando nada falló. Una prueba PENDING puede tener uno:
        el último intento falló y el usuario final puede volver a intentarlo.
        DEPOSIT_MISMATCH, DEPOSIT_STALE, TXID_REUSED y REVIEW_REJECTED cierran
        la prueba como REJECTED. SIGNATURE_INVALID: la firma no coincide con la
        wallet y el desafío. SIGNATURE_UNSUPPORTED_SCHEME: la wallet firmó en un
        formato que Didit no verifica. DEPOSIT_NOT_FOUND, DEPOSIT_UNCONFIRMED,
        DEPOSIT_LOOKUP_FAILED: el depósito de prueba no se puede leer o aún no
        está confirmado; Didit sigue comprobándolo hasta que se cierra la
        ventana de prueba. DEPOSIT_MISMATCH: la transacción no envía el importe
        esperado desde la wallet a la dirección de depósito. DEPOSIT_STALE: la
        transacción es anterior al desafío. TXID_REUSED: la transacción ya
        sirvió como prueba de otra wallet. CHAIN_UNSUPPORTED: el método no está
        disponible en esta cadena. WINDOW_EXPIRED: se cerró la ventana de
        prueba. OWNERSHIP_CHANGED: el titular de la wallet cambió, o la wallet
        se eliminó de tu libreta de direcciones, después de que se generara la
        sesión del widget. METHOD_SWITCHED: el usuario final eligió otro método
        antes de terminar este. REVIEW_REJECTED: tu revisor rechazó la captura
        de pantalla. ABANDONED: la sesión del widget caducó antes de que el
        usuario final terminara.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        La clave de API de tu aplicación, que encontrarás en Developers -> API
        keys en la Business Console. La clave principal tiene acceso completo.
        Una clave con nombre puede tener un alcance limitado: ninguno, lectura o
        escritura por recurso, limitada a algunos flujos o a sesiones aprobadas,
        a una lista de direcciones IP y a una fecha de caducidad. 401 significa
        que la clave es incorrecta, se revocó o expiró; 403 significa que no se
        envió ninguna clave, que la clave no tiene acceso a este recurso o
        acción, o que la solicitud provino de una dirección fuera de su lista de
        IP; 404 en una ruta de sesión significa que la sesión está fuera de los
        flujos o estados de la clave. Una clave sin acceso a contenido
        multimedia recibe las URL de imágenes, videos y PDF como null, y una
        clave sin permiso de escritura en sesiones recibe los enlaces y tokens
        de sesión como null. Consulta https://docs.didit.me/console/api-keys.

````

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