> ## 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 برمز جلسة الودجت: توقيع الرسالة، اختبار Satoshi، لقطة شاشة أو إقرار. اختيار الطريقة مجددًا يستأنفها.

موجّه API لبدء Widget Proof
نسخ الموجّه إلى الحافظة

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

الصق في


## OpenAPI

````yaml ar/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 التحقق من الهوية. قم بالمصادقة باستخدام الرأس x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/travel-rule/widget/{token}/proofs/:
    post:
      tags:
        - Travel Rule
      summary: بدء إثبات ملكية المحفظة
      description: >-
        endpoint عام مفتاحه هو token جلسة عنصر واجهة المستخدم، ولا يتطلب أي
        مفتاح API: يستدعيه عنصر واجهة المستخدم المستضاف عندما يختار المستخدم
        النهائي طريقة إثبات. لا يُنشأ الإثبات ولا يُحتسب ضمن مسار تحويل
        الإثباتات الخاص بك إلا بدءاً من هذا الاستدعاء. يؤدي اختيار الطريقة نفسها
        مجدداً إلى إرجاع الإثبات المفتوح بالفعل (200، التحدي نفسه أو مبلغ
        الإيداع نفسه) بدلاً من بدء إثبات ثانٍ؛ ويؤدي اختيار طريقة أخرى إلى إغلاق
        الإثبات غير المكتمل بالحالة METHOD_SWITCHED، باستثناء لقطة الشاشة
        المُرسلة أو الإيداع التجريبي الذي لا يزال قيد الفحص. يُرجع
        MESSAGE_SIGNING التحدي المطلوب توقيعه؛ ويُرجع SATOSHI_TEST عنوان الإيداع
        والمبلغ المحدد والنافذة الزمنية؛ ويتم التحقق من SELF_DECLARATION على
        الفور (الحالة VERIFIED). تنسيقات التوقيع التي يتم التحقق منها لكل عائلة
        سلاسل: تقبل سلاسل 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: createTravelRuleWidgetProof
      parameters:
        - name: token
          in: path
          required: true
          description: token جلسة مبهم يُعاد عند إنشاء جلسة الأداة.
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TravelRuleWidgetProofCreate'
      responses:
        '200':
          description: تم استئناف الإثبات المفتوح بالفعل لهذه الطريقة.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofSummary'
        '201':
          description: إثبات جديد بحالة PENDING (أو VERIFIED لـ SELF_DECLARATION).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofSummary'
        '400':
          description: >-
            جسم الطلب غير صالح، أو المحفظة لا تتطابق مع التحويل، أو SCREENSHOT
            غير مسموح به، أو الرمز CHAIN_UNSUPPORTED عندما تكون الطريقة غير
            متاحة على الشبكة.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofError'
        '403':
          description: SELF_DECLARATION غير مسموح به لهذا التطبيق.
        '404':
          description: token غير معروف.
        '409':
          description: >-
            الرمز OWNERSHIP_CHANGED: تغير حامل المحفظة أو حُذفت المحفظة بعد
            إنشاء الجلسة؛ أنشئ جلسة جديدة للحامل الحالي. يُعاد أيضاً لـ
            SATOSHI_TEST عندما لا تحتوي الجلسة على satoshi_deposit_address،
            وعندما لا تتبقى أي محاولات للجلسة (لا يوجد رمز؛ يحتوي نص الاستجابة
            على max_attempts وattempts_used وattempts_remaining بقيمة 0): أنشئ
            جلسة جديدة.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofError'
        '410':
          description: انتهت صلاحية الجلسة.
      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: >-
            طريقة الإثبات التي اختارها المستخدم النهائي. يجب أن تكون إحدى الطرق
            المسموح بها في allowed_methods ضمن السياق.
        wallet_address:
          type: string
          maxLength: 128
          description: >-
            القيمة الافتراضية هي wallet_address الخاص بالجلسة. يجب أن يطابق
            محفظة التحويل عندما تكون الجلسة مرتبطة بتحويل.
        chain:
          type: string
          maxLength: 32
          description: القيمة الافتراضية هي سلسلة الكتل الخاصة بالجلسة.
    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: اختار المستخدم النهائي هذه الطريقة ولم يُبت في الإثبات بعد.
            يؤدي التوقيع الفاشل أو الإيداع التجريبي غير القابل للقراءة أو غير
            المؤكد بعد إلى إبقاء الإثبات PENDING مع وجود failure_reason، حتى
            يتمكن المستخدم النهائي من المحاولة مجددًا؛ ويُعاد فحص إيداع
            SATOSHI_TEST المُرسل تلقائيًا حتى تُغلق نافذته الزمنية، بينما تنتظر
            لقطة شاشة SCREENSHOT المُرسلة مراجعتك. VERIFIED: تم إثبات الملكية.
            REJECTED: الإيداع التجريبي غير صحيح فعليًا (مُرسِل آخر، أو ليس
            المبلغ المتوقع إلى عنوان الإيداع، أو أقدم من التحدي، أو معاملة أثبتت
            بالفعل محفظة أخرى) أو قام المراجِع برفض لقطة الشاشة؛ ويوضح
            failure_reason السبب بدقة. الإثبات المرفوض نهائي ويستهلك إحدى
            محاولات الجلسة. EXPIRED: لم يعد بالإمكان البت في الإثبات (أُغلقت
            نافذته الزمنية، أو غيّر المستخدم النهائي الطريقة، أو انتهت جلسة
            الأداة، أو تغيّر حامل المحفظة)؛ ويوضح failure_reason السبب بدقة.
        wallet_address:
          type: string
        chain:
          type: string
          description: >-
            معرّف السلسلة القياسي لإدخال دفتر العناوين الذي يخصه الإثبات، على
            سبيل المثال ETH، BTC، SOL، TRX.
        deposit_address:
          type: string
          nullable: true
          description: >-
            عنوان الإيداع الذي يجب على العميل إرسال مبلغ اختبار Satoshi إليه.
            يتوفر فقط في إثبات SATOSHI_TEST.
        expected_amount:
          type: string
          nullable: true
          description: >-
            المبلغ الدقيق على السلسلة، بالعملة الأصلية للإيداع، الذي يجب أن
            يتطابق معه إيداع اختبار Satoshi. موجود فقط في إثبات SATOSHI_TEST.
        expires_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            الموعد النهائي للنافذة الزمنية لاختبار ساتوشي الخاص بهذا الإثبات.
            يظهر فقط في إثبات من نوع SATOSHI_TEST؛ ويتم تمديد expires_at الخاص
            بجلسة عنصر الواجهة لتغطيته عند تقديم SATOSHI_TEST.
        challenge:
          type: string
          nullable: true
          description: >-
            رسالة صادرة عن Didit يوقّعها العميل بمحفظته. تتوفر فقط في إثبات
            MESSAGE_SIGNING.
        rejection_reason:
          type: string
          description: >-
            سبب رفض الإثبات، كجملة باللغة الإنجليزية للمستخدم النهائي. يظهر فقط
            عندما تكون `status` هي REJECTED؛ ويكون فارغاً عندما يرفض المراجِع
            لقطة شاشة (تبقى ملاحظتك لديك).
        created_at:
          type: string
          format: date-time
        attempts:
          type: integer
          description: >-
            عدد المرات التي تم فيها تقديم أدلة لهذا الإثبات (التوقيعات، معرّفات
            المعاملات، عمليات الرفع).
        failure_reason:
          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.