> ## 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 للموافقة على إثبات المحفظة بلقطة شاشة أو رفضه

> وافِق على إثبات ملكية المحفظة بلقطة شاشة أو ارفضه من قائمة الانتظار في Didit. تؤكد الموافقة المحفظة وتطبّق الملكية على التحويل المرتبط.

موجّه Decide Wallet Proof API
نسخ الموجّه إلى الحافظة

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

الصق في


## OpenAPI

````yaml ar/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 التحقق من الهوية. قم بالمصادقة باستخدام الرأس 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: الموافقة على إثبات المحفظة عبر لقطة شاشة أو رفضه
      description: >-
        اتخاذ قرار بشأن إثبات لقطة شاشة من قائمة انتظار المراجعة الخاصة بك. يؤدي
        approve إلى التحقق من الإثبات ومدخل دفتر العناوين وتطبيق الملكية على
        التحويل الذي تم إنشاء جلسة عنصر الواجهة من أجله، تماماً كما يفعل التوقيع
        الذي تم التحقق منه. لا تؤكد لقطة الشاشة أبداً تحويلاً أرسله عميل آخر لدى
        Didit عبر مسار INTERNAL: يتطلب ذلك رسالة موقعة أو إيداعاً اختبارياً.
        ويؤدي reject إلى إغلاق الإثبات كـ REJECTED مع failure_reason بقيمة
        REVIEW_REJECTED؛ حيث يمكن للمستخدم النهائي بدء إثبات جديد من عنصر
        الواجهة. ويتم الاحتفاظ بالملاحظة مع الإثبات.
      operationId: decideTravelRuleWalletProof
      parameters:
        - name: proof_uuid
          in: path
          required: true
          description: معرّف proof_id من قائمة انتظار المراجعة.
          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: الإثبات الذي تم البت فيه.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWalletProofReview'
        '400':
          description: قرار غير صالح، أو ملاحظة تتجاوز 512 حرفاً.
        '401':
          description: x-api-key مفقود أو غير صالح.
        '403':
          description: تفتقر الجهة المستدعية إلى إذن المعاملات.
        '404':
          description: لا يوجد إثبات لقطة شاشة مُرسَل بهذا المعرّف في تطبيقك.
        '409':
          description: >-
            تم اتخاذ القرار بشأن الإثبات بالفعل (يتضمن متن الاستجابة حالته)، أو
            رمز OWNERSHIP_CHANGED: تغير حامل المحفظة أو حُذفت المحفظة بعد إنشاء
            جلسة عنصر واجهة المستخدم، وبالتالي أُغلق الإثبات ويحتاج الحامل
            الحالي إلى إثبات جديد.
          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: اختياري. يُحتفظ به مع الإثبات ويُعاد كـ 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: معرّف السلسلة القياسي، على سبيل المثال ETH، BTC، SOL، TRX.
        holder_name:
          type: string
        is_ownership_verified:
          type: boolean
          description: >-
            ما إذا كان إدخال دفتر العناوين قد تم التحقق من ملكيته، بواسطة هذا
            الإثبات أو إثبات آخر.
        transaction_id:
          type: string
          format: uuid
          nullable: true
          description: >-
            المعاملة التي تم إنشاء جلسة الواجهة من أجل تحويل Travel Rule الخاص
            بها. Null لجلسة أُنشئت بدون transaction_id.
        file_name:
          type: string
          nullable: true
        content_type:
          type: string
          nullable: true
        screenshot_url:
          type: string
          nullable: true
          description: >-
            رابط محدد الصلاحية زمنيًا للقطة الشاشة المرفوعة. اطلب قائمة الانتظار
            مجددًا للحصول على رابط جديد.
        attempts:
          type: integer
          description: عدد الملفات التي رفعها المستخدم النهائي لهذا الإثبات.
        failure_reason:
          allOf:
            - $ref: '#/components/schemas/TravelRuleWalletProofFailureReason'
          description: >-
            REVIEW_REJECTED بعد الرفض، وOWNERSHIP_CHANGED عندما يتغير مالك
            المحفظة أو تُحذف قبل اتخاذ القرار. فارغ في الحالات الأخرى.
        method_chosen_at:
          type: string
          format: date-time
          nullable: true
          description: وقت اختيار المستخدم النهائي لطريقة لقطة الشاشة.
        decided_at:
          type: string
          format: date-time
          nullable: true
        decided_by:
          type: string
          description: >-
            من أغلق الإثبات: review:<user identifier> لمراجع لوحة التحكم،
            وreview لقرار بمفتاح API، وwidget أو sweeper عندما تغلقه Didit
            تلقائياً. يكون فارغاً أثناء حالة PENDING.
        review_note:
          type: string
          description: الملاحظة المُرسلة مع القرار. تكون فارغة في حال عدم وجود أي ملاحظة.
        created_at:
          type: string
          format: date-time
    TravelRuleWidgetProofError:
      type: object
      properties:
        detail:
          type: string
          description: رسالة سهلة القراءة باللغة الإنجليزية.
        code:
          allOf:
            - $ref: '#/components/schemas/TravelRuleWalletProofFailureReason'
          description: سبب مقروء آلياً، ليتمكن العميل من عرض رسالته المترجمة الخاصة.
        status:
          type: string
          enum:
            - PENDING
            - VERIFIED
            - REJECTED
            - EXPIRED
          description: >-
            موجود عند إغلاق الإثبات: REJECTED بواسطة الإيداع الذي تم إرساله للتو
            (400)، أو REJECTED أو EXPIRED عند إرسال دليل إلى إثبات مغلق بالفعل
            (409).
        proof_id:
          type: string
          format: uuid
          description: 'موجود مع الحالة: الإثبات المغلق.'
        method:
          type: string
          enum:
            - MESSAGE_SIGNING
            - SATOSHI_TEST
            - SCREENSHOT
            - SELF_DECLARATION
          description: 'موجود مع الحالة: طريقة الإثبات المغلق.'
        max_attempts:
          type: integer
          description: 'موجود مع الحالة: إثباتات المحفظة المرفوضة التي تسمح بها هذه الجلسة.'
        attempts_used:
          type: integer
          description: 'موجود مع الحالة: الإثباتات المرفوضة حتى الآن.'
        attempts_remaining:
          type: integer
          description: >-
            موجود مع الحالة: عندما تكون القيمة 0، فإن بدء إثبات آخر يُرجع 409
            وتقوم بإنشاء جلسة 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: >-
        سبب عدم وصول إثبات ملكية المحفظة، أو المحاولة الأخيرة له، إلى حالة
        VERIFIED. يكون فارغاً عند عدم وجود أي إخفاق. يمكن أن يحمل الإثبات ذو
        الحالة PENDING سبباً: أخفقت المحاولة الأخيرة ويمكن للمستخدم النهائي
        المحاولة مجدداً. تؤدي الحالات DEPOSIT_MISMATCH وDEPOSIT_STALE
        وTXID_REUSED وREVIEW_REJECTED إلى إغلاق الإثبات بحالة REJECTED. الحالة
        SIGNATURE_INVALID: لا يتطابق التوقيع مع المحفظة والتحدي. الحالة
        SIGNATURE_UNSUPPORTED_SCHEME: وقّعت المحفظة بتنسيق لا تتحقق منه Didit.
        الحالات DEPOSIT_NOT_FOUND وDEPOSIT_UNCONFIRMED وDEPOSIT_LOOKUP_FAILED:
        إيداع الاختبار غير قابل للقراءة أو لم يتم تأكيده بعد؛ تواصل Didit فحصه
        حتى تنتهي نافذة الاختبار. الحالة DEPOSIT_MISMATCH: المعاملة لا ترسل
        المبلغ المتوقع من المحفظة إلى عنوان الإيداع. الحالة DEPOSIT_STALE: تاريخ
        المعاملة يسبق التحدي. الحالة TXID_REUSED: أثبتت المعاملة بالفعل ملكية
        محفظة أخرى. الحالة CHAIN_UNSUPPORTED: الطريقة غير متوفرة على هذه
        السلسلة. الحالة WINDOW_EXPIRED: أُغلقت نافذة الاختبار. الحالة
        OWNERSHIP_CHANGED: تغيّر صاحب المحفظة، أو حُذفت المحفظة من دفتر العناوين
        الخاص بك، بعد إنشاء جلسة عنصر واجهة المستخدم. الحالة METHOD_SWITCHED:
        اختار المستخدم النهائي طريقة أخرى قبل إنهاء هذه الطريقة. الحالة
        REVIEW_REJECTED: رفض المراجِع الخاص بك لقطة الشاشة. الحالة ABANDONED:
        انقضت صلاحية جلسة عنصر واجهة المستخدم قبل أن يُنهي المستخدم النهائي
        العملية.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        مفتاح API الخاص بتطبيقك، من Developers -> API keys في Business Console.
        يمتلك المفتاح الأساسي وصولاً كاملاً. يمكن تحديد نطاق المفتاح المسمى: لا
        شيء، أو قراءة، أو كتابة لكل مورد، ومحدوداً ببعض مسارات العمل أو بالجلسات
        المقبولة، وبقائمة من عناوين IP، وبتاريخ انتهاء الصلاحية. يشير 401 إلى أن
        المفتاح غير صحيح أو ملغى أو منتهي الصلاحية؛ ويشير 403 إلى أنه لم يتم
        إرسال أي مفتاح، أو أن المفتاح ليس لديه حق الوصول إلى هذا المورد أو
        الإجراء، أو أن الطلب جاء من عنوان خارج قائمة عناوين IP الخاصة به؛ ويشير
        404 في مسار جلسة إلى أن الجلسة خارج مسارات العمل أو الحالات الخاصة
        بالمفتاح. يتلقى المفتاح الذي لا يمتلك حق الوصول إلى الوسائط عناوين URL
        للصور ومقاطع الفيديو وملفات PDF كـ null، ويتلقى المفتاح الذي لا يمتلك
        إذن كتابة للجلسات روابط الجلسة وtoken كـ null. راجع
        https://docs.didit.me/console/api-keys.

````

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