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

> تتيح Didit إرسال توقيع أو معرّف معاملة إيداع تجريبية أو لقطة شاشة لإثبات ملكية المحفظة. المحاولة الفاشلة تُرجع رمزاً، والإيداع الخاطئ يُرفض.



موجّه API لإرسال دليل إثبات الأداة
        نسخ الموجّه إلى الحافظة



      
      

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



      
      

الصق في



## OpenAPI

````yaml ar/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 التحقق من الهوية. قم بالمصادقة باستخدام الرأس 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: إرسال أدلة إثبات ملكية المحفظة
      description: >-
        endpoint عام مفتاحه هو token جلسة عنصر واجهة المستخدم، ولا يتطلب أي
        مفتاح API. أرسل الدليل الذي تتطلبه طريقة الإثبات: توقيع لـ
        MESSAGE_SIGNING، أو txid لـ SATOSHI_TEST (JSON)، أو ملف لـ SCREENSHOT
        (multipart). تُحتسب كل عملية إرسال كمحاولة. والتوقيع الذي لا يتم التحقق
        منه، أو الإيداع الذي لا يتطابق، يُرجع الاستجابة 400 مع رمز ويترك الإثبات
        بالحالة PENDING حتى يتمكن المستخدم النهائي من المحاولة مجدداً. والإيداع
        الذي تمت رؤيته ولكن لم يتم تأكيده بعد يُرجع الاستجابة 200 بالحالة
        PENDING وتتم إعادة التحقق منه تلقائياً حتى تُغلق النافذة الزمنية. ولقطة
        الشاشة تُرجع الاستجابة 200 بالحالة PENDING وتنتظر في قائمة الانتظار
        للمراجعة الخاصة بك (GET /v3/travel-rule/wallet-proofs/). والإثبات بحالة
        EXPIRED أو REJECTED لا يتم التحقق منه لاحقاً أبداً: ابدأ إثباتاً جديداً.
        تنسيقات التوقيع التي يتم التحقق منها لكل عائلة سلاسل: تقبل سلاسل EVM
        توقيع personal_sign (EIP-191) بترميز hex؛ وتقبل Bitcoin توقيع
        signmessage وفق BIP-137 (لعناوين P2PKH وP2SH-P2WPKH وP2WPKH) أو توقيعاً
        بسيطاً وفق BIP-322 (لعناوين P2WPKH وP2TR) بترميز base64؛ وتقبل Solana
        توقيع Ed25519 على التحدي بترميز base58؛ وتقبل Tron توقيع signMessageV2
        (TIP-191) بترميز hex. ويفشل التوقيع الكامل أو توقيع إثبات الأموال وفق
        BIP-322، أو عنوان متعدد التوقيع، بالرمز SIGNATURE_UNSUPPORTED_SCHEME.
      operationId: verifyTravelRuleWidgetProof
      parameters:
        - name: token
          in: path
          required: true
          description: token جلسة مبهم يُعاد عند إنشاء جلسة الأداة.
          schema:
            type: string
        - name: proof_id
          in: path
          required: true
          description: معرّف proof_id الذي تم إرجاعه عند بدء الإثبات.
          schema:
            type: string
            format: uuid
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                signature:
                  type: string
                  description: 'MESSAGE_SIGNING: توقيع المحفظة على تحدي الإثبات.'
                txid:
                  type: string
                  description: 'SATOSHI_TEST: معرّف المعاملة للإيداع التجريبي.'
          multipart/form-data:
            schema:
              type: object
              required:
                - file
              properties:
                file:
                  type: string
                  format: binary
                  description: >-
                    SCREENSHOT: صورة تظهر المحفظة في تطبيق المحفظة الخاص
                    بالمستخدم النهائي.
      responses:
        '200':
          description: >-
            VERIFIED، أو لا تزال PENDING (لقطة شاشة قيد المراجعة، إيداع لم
            يُفهرس أو لم يتم تأكيده بعد، مع الرمز DEPOSIT_NOT_FOUND أو
            DEPOSIT_UNCONFIRMED).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofVerifyResult'
        '400':
          description: >-
            دليل مفقود؛ أو محاولة فاشلة تُبقي الإثبات في حالة PENDING حتى يتمكن
            المستخدم النهائي من المحاولة مجددًا (الرمز SIGNATURE_INVALID أو
            SIGNATURE_UNSUPPORTED_SCHEME أو DEPOSIT_LOOKUP_FAILED)؛ أو إيداع
            تجريبي يرفض الإثبات (الرمز DEPOSIT_MISMATCH أو DEPOSIT_STALE أو
            TXID_REUSED، والحالة REJECTED، مع عدد محاولات الجلسة): يؤدي اختيار
            طريقة مرة أخرى إلى بدء إثبات جديد طالما أن attempts_remaining أكبر
            من 0.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofError'
        '404':
          description: token غير معروف، أو لا يوجد إثبات كهذا في هذه الجلسة.
        '409':
          description: >-
            الرمز OWNERSHIP_CHANGED (يتم إغلاق الإثبات به)؛ إثبات مغلق (REJECTED
            أو EXPIRED)، مع حالته والرمز الذي أُغلق به وعدد محاولات الجلسة: اختر
            طريقة مجدداً لبدء إثبات جديد؛ أو إثبات SELF_DECLARATION، الذي يتم
            التحقق منه عند بدئه.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofError'
        '410':
          description: >-
            انتهت صلاحية الجلسة، أو الرمز WINDOW_EXPIRED عند إغلاق نافذة اختبار
            satoshi.
          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: >-
            موجود عندما يكون الإثبات بتصنيف VERIFIED: تم الآن التحقق من ملكية
            إدخال دفتر العناوين.
        transfer_status:
          type: string
          nullable: true
          description: >-
            موجود عندما يكون الإثبات بتصنيف VERIFIED: حالة التحويل المرتبط،
            وقيمته null إذا لم يوجد تحويل.
        detail:
          type: string
          description: >-
            موجود طالما ظل الإثبات بالحالة PENDING: لقطة شاشة مرسلة قيد
            المراجعة، أو إيداع تجريبي لم يتم تأكيده بعد.
        code:
          allOf:
            - $ref: '#/components/schemas/TravelRuleWalletProofFailureReason'
          description: 'موجود في الإيداع التجريبي المعلق: يوضح سبب عدم تأكيده بعد.'
    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:
        انقضت صلاحية جلسة عنصر واجهة المستخدم قبل أن يُنهي المستخدم النهائي
        العملية.

````

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