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

# واجهة تسجيل عنوان المحفظة: دفتر عناوين Travel Rule

> أضف محفظة تتحكم بها إلى دفتر عناوين Travel Rule ليتم حل التحويلات الداخلية الواردة إليها، مع إمكانية التحقق المسبق عبر الإقرار الذاتي.



موجه واجهة API لتسجيل عنوان المحفظة
        نسخ الموجّه إلى الحافظة



      
      

\<pre>

\`Register a wallet address in the application's Travel Rule address book so inbound INTERNAL-rail transfers can resolve against it.

Endpoint:
POST https://verification.didit.me/v3/travel-rule/wallet-addresses/

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

Request body (application/json):
\{
"address": "0x8ba1f109551bD432803012645Ac136ddd64DBA72",   // required; one entry per address (case-insensitive) and chain (exact text) in the application, a duplicate returns 400
"chain": "ETH",                        // optional; use the same chain token your transfers carry (ETH, BTC), or leave blank to match any chain
"memo": "",                            // optional destination tag or memo on XRP, XLM, EOS, ATOM, HBAR (alias: destinationTag); part of the wallet's identity there
"holder_name": "Ana Diaz",             // used for the beneficiary name match
"holder_vendor_data": "user-042",      // your internal id for the holder
"entity_type": "individual",           // free text, defaults to "individual"
"travel_address": "taiwwrTeRpaRbqpQXB9A1JiLtdE686XtYRC316kPuQzbJSTgv7ndnF4ceHM7CReVGuzqcCCu5RfUHdL1FffHhdf3dzQDEgKAUMtAuD6uteY",   // optional: the counterparty VASP's travel address for this wallet, so outbound BTC, ETH and USDC transfers to it can route over TRP
"self_declared": true                  // write-only, POST only: create the entry already verified via a SELF_DECLARATION proof
}

Behavior:
\- self_declared: true creates the entry already ownership-verified - inbound transfers to it skip UNCONFIRMED_OWNERSHIP entirely and go straight to the name match.
It requires allow_self_declaration: true in Travel Rule settings, otherwise 400.
\- Without it, verify ownership later via the wallet-ownership widget (POST /v3/travel-rule/widget-session/).
\- Matching is scoped by chain.
When a transfer carries a chain, an entry matches only if its chain equals that chain (case-insensitive) or the entry's chain is blank.
Chain names are not translated: an entry with chain "ethereum" does not match a transfer with chain "ETH".
A transfer takes its chain from beneficiary_data.chain, else transaction_details.crypto_params.crypto_chain, else custom_properties.crypto_chain, else the currency, uppercased and used only when it is a chain Didit recognises (for example ETH or BTC).
Register entries with the same token your transfers carry (ETH, BTC), or leave chain blank to match any chain.
Inbound TRP inquiries ignore the chain: they match by address, or by the holder_name of a verified entry when the inquiry carries no address.
Confirming ownership with POST /v3/transactions/{transaction_id}/travel-rule/ownership/ also matches by address only.
\- On a memo network the memo is part of the wallet: an entry with a memo matches only transfers naming that memo, an entry without one matches the whole address. A transfer that names no memo never reaches an entry that has one.
\- An XRP X-address is stored as its classic address and its tag. A Lightning payee (node id or Lightning Address) registered on bitcoin is stored lowercased on the LIGHTNING chain, where Lightning transfers are matched.
\- The response carries address_hash (SHA-256 of the lowercased address, hex). To register many wallets at once, or by hash only, use POST /v3/travel-rule/wallet-addresses/import/.

Failure modes:
\- 400 - an entry with this address, chain and memo already exists: {"address": ["A wallet address entry with this address and chain already exists."]}.
\- 400 - a memo or X-address the chain cannot carry, missing address, an invalid travel_address ("Invalid travel address."), or self_declared: true while allow_self_declaration is off.
\- 403 - missing x-api-key (a wrong, revoked or expired key gets 401).

Full guide: /transaction-monitoring/travel-rule#wallet-address-book.`

\</pre>



      
      

الصق في



## OpenAPI

````yaml ar/openapi-25.json POST /v3/travel-rule/wallet-addresses/
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-addresses/:
    post:
      tags:
        - Travel Rule
      summary: تسجيل عنوان محفظة
      description: >-
        أضف إدخالاً إلى دفتر عناوين محافظ Travel Rule الخاص بك حتى يمكن تسوية
        التحويلات الواردة عبر مسار INTERNAL بناءً عليه.
      operationId: createTravelRuleWalletAddress
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/WalletAddressEntryCreate'
            example:
              address: 0xBeneficiaryWallet01
              chain: ETH
              holder_name: Ana Diaz
              holder_vendor_data: user-042
              self_declared: true
      responses:
        '201':
          description: الإدخال الذي تم إنشاؤه.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WalletAddressEntry'
        '400':
          description: >-
            محفظة مكررة (العنوان، السلسلة، وmemo) لهذا التطبيق، أو memo أو
            X-address لا يمكن للسلسلة حمله، أو `address` مفقود، أو
            `travel_address` غير صالح، أو `self_declared: true` بينما
            `allow_self_declaration` معطل، أو `self_declared: true` بينما
            `ownership_validation_mode` هو `FULL`.
          content:
            application/json:
              schema:
                type: object
              examples:
                Duplicate entry:
                  value:
                    address:
                      - >-
                        A wallet address entry with this address and chain
                        already exists.
                Invalid travel address:
                  value:
                    travel_address:
                      - Invalid travel address.
                Self-declaration disabled:
                  value:
                    self_declared:
                      - >-
                        Self-declared ownership is disabled for this
                        application.
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: >-
            curl -X POST
            https://verification.didit.me/v3/travel-rule/wallet-addresses/ \
              -H 'x-api-key: YOUR_API_KEY' -H 'Content-Type: application/json' \
              -d '{"address": "0xBeneficiaryWallet01", "chain": "ETH", "holder_name": "Ana Diaz", "self_declared": true}'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.travel_rule.wallet_addresses.create(
                address="0xBeneficiaryWallet01",
                chain="ETH",
                holder_vendor_data="user-042",
                holder_name="Ana Diaz",
                self_declared=True,
            )
            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.walletAddresses.create({
              address: "0xBeneficiaryWallet01",
              chain: "ETH",
              holder_vendor_data: "user-042",
              holder_name: "Ana Diaz",
              self_declared: true,
            });
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.TravelRule.WalletAddresses.Create(ctx, didit.WalletAddressEntryCreate{\n\tAddress:          \"0xBeneficiaryWallet01\",\n\tChain:            didit.String(\"ETH\"),\n\tHolderVendorData: didit.String(\"user-042\"),\n\tHolderName:       didit.String(\"Ana Diaz\"),\n\tSelfDeclared:     didit.Bool(true),\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: >-
            import me.didit.Didit;

            import me.didit.types.WalletAddressEntryCreate;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.travelRule().walletAddresses().create(WalletAddressEntryCreate.builder()
                    .address("0xBeneficiaryWallet01")
                    .chain("ETH")
                    .holderVendorData("user-042")
                    .holderName("Ana Diaz")
                    .selfDeclared(true)
                    .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->walletAddresses->create([
                'address' => '0xBeneficiaryWallet01',
                'chain' => 'ETH',
                'holder_vendor_data' => 'user-042',
                'holder_name' => 'Ana Diaz',
                'self_declared' => true,
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

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

            result = didit.travel_rule.wallet_addresses.create(
              address: "0xBeneficiaryWallet01",
              chain: "ETH",
              holder_vendor_data: "user-042",
              holder_name: "Ana Diaz",
              self_declared: true
            )
            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.WalletAddresses.CreateAsync(new
            WalletAddressEntryCreate

            {
                Address = "0xBeneficiaryWallet01",
                Chain = "ETH",
                HolderVendorData = "user-042",
                HolderName = "Ana Diaz",
                SelfDeclared = true,
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    WalletAddressEntryCreate:
      type: object
      required:
        - address
      properties:
        address:
          type: string
          maxLength: 128
          description: >-
            عنوان المحفظة. يُخزن عنوان XRP من النوع X-address كعنوان كلاسيكي
            وعلامته، بحيث يطابق التحويلات التي تشير إلى أيٍّ من الصيغتين.
        chain:
          type: string
          maxLength: 32
          description: >-
            رمز السلسلة (token) للعنوان، على سبيل المثال `ETH` أو `BTC`. عندما
            تقوم Didit بتوجيه تحويل أو تسجيله، فإنها تطابق مدخلات دفتر العناوين
            بناءً على عنوان المحفظة، وعندما يتضمن التحويل سلسلة، فإنها تطابق هذه
            القيمة أيضاً، مع تجاهل حالة الأحرف. سلسلة التحويل هي
            `beneficiary_data.chain`، وتُملأ من سلسلة العملات المشفرة للمعاملة
            أو رمز العملة (على سبيل المثال `ETH`) عندما لا ترسلها، أو `chain`
            لتسجيل ما بعد الإيداع، لذا استخدم نفس الـ token في كل مكان. المدخل
            ذو السلسلة الفارغة يطابق أي سلسلة. تُخزّن السلاسل المعروفة تحت معرّف
            قياسي واحد بغض النظر عن طريقة الكتابة التي ترسلها: يتم تخزين
            "ethereum" و"Ethereum" و"ERC20" جميعها كـ ETH، و"BNB Smart Chain"
            و"BEP20" كـ BNB، و"tron" كـ TRX. أما اسم السلسلة غير المعروف فيتم
            الاحتفاظ به كما قُدّم.
        holder_vendor_data:
          type: string
          maxLength: 255
        holder_name:
          type: string
          maxLength: 255
        entity_type:
          type: string
          default: individual
          maxLength: 16
        self_declared:
          type: boolean
          default: false
          description: >-
            للكتابة فقط. عندما تكون true، يتم إنشاء الإدخال مع التحقق من ملكيته
            مسبقاً عبر إثبات SELF_DECLARATION. يُرجع 400 عندما يكون
            `allow_self_declaration` معطلاً في إعدادات Travel Rule الخاصة بك.
        travel_address:
          type: string
          description: >-
            اختياري. عنوان Travel Address الخاص بـ VASP الطرف المقابل لهذه
            المحفظة، مما يمكّن توجيه TRP للأصول التي يدعمها TRP (وهي BTC و ETH و
            USDC على شبكة محددة). يؤدي إدخال Travel Address غير صالح إلى إرجاع
            400.
          maxLength: 512
        memo:
          type: string
          maxLength: 256
          description: >-
            اختياري. وسم الوجهة (destination tag) أو المذكرة (memo) التي تشكل
            جزءاً من المحفظة. XRP: وسم وجهة، عدد صحيح من 0 إلى 4294967295 (يُقبل
            رقم JSON). XLM: مذكرة نصية تصل إلى 28 بايت، أو معرّف 64 بت أو تجزئة
            بطول 32 بايت بصيغة hex. EOS: حتى 256 بايت. ATOM: حتى 256 حرفاً.
            HBAR: حتى 100 بايت. محافظ Bitcoin وEVM وSolana وTron وLitecoin
            وBitcoin Cash وDogecoin وLightning لا تقبل أي مذكرة: وجود واحدة يؤدي
            إلى خطأ `400`. الاسم المستعار: `destinationTag` أو
            `destination_tag`.
    WalletAddressEntry:
      type: object
      properties:
        uuid:
          type: string
          format: uuid
        address:
          type: string
          description: >-
            عنوان المحفظة؛ القيمة `""` لمدخل تم استيراده بواسطة التجزئة (hash)
            فقط. فريد لكل تطبيق وسلسلة وmemo، مع مقارنة العنوان دون مراعاة حالة
            الأحرف. بعد حذف أحد المدخلات، يمكنك تسجيل نفس العنوان مرة أخرى.
        chain:
          type: string
          description: >-
            رمز الشبكة للعنوان، مثل `ETH` أو `BTC`. عندما تقوم Didit بتوجيه
            تحويل أو تسجيله، فإنها تطابق مدخلات دفتر العناوين بناءً على عنوان
            المحفظة، وعندما يتضمن التحويل شبكة، تطابق هذه القيمة أيضاً بغض النظر
            عن حالة الأحرف. شبكة التحويل هي `beneficiary_data.chain`، وتُملأ من
            شبكة العملات المشفرة للمعاملة أو رمز العملة (مثل `ETH`) عندما لا
            ترسلها بنفسك، أو من `chain` لتسجيل ما بعد الإيداع، لذا استخدم الرمز
            نفسه في كل مكان. المدخلة ذات الشبكة الفارغة تطابق أي شبكة. يُخزن
            المستفيد من Lightning (معرّف العقدة أو Lightning Address) المسجل على
            bitcoin بأحرف صغيرة تحت `LIGHTNING`، حيث تتم مطابقة تحويلات
            Lightning. يتم تخزين الشبكات المعروفة تحت معرّف معياري واحد بغض
            النظر عن طريقة كتابتها في الإرسال: يتم تخزين "ethereum" و"Ethereum"
            و"ERC20" كـ ETH، و"BNB Smart Chain" و"BEP20" كـ BNB، و"tron" كـ TRX.
            أما اسم الشبكة غير المعروف فيُحتفظ به كما هو وارد.
        holder_vendor_data:
          type: string
          description: معرّفك الداخلي للحائز.
        holder_name:
          type: string
          description: اسم صاحب المحفظة، يُستخدم لمطابقة اسم المستفيد.
        entity_type:
          type: string
          description: نص حر، القيمة الافتراضية هي "individual".
        is_ownership_verified:
          type: boolean
          description: للقراءة فقط. ما إذا كان قد تم إثبات ملكية هذا العنوان.
        created_at:
          type: string
          format: date-time
        travel_address:
          type: string
          description: >-
            Travel Address الخاص بـ VASP الطرف المقابل لهذه المحفظة، إن كان
            معلوماً. يتيح لـ Didit توجيه تحويلات هذا المستفيد عبر مسار TRP،
            للأصول التي يدعمها TRP (وهي BTC وETH وUSDC على شبكة مُسمّاة).
        address_hash:
          type: string
          description: >-
            للقراءة فقط. تجزئة SHA-256 للعنوان بالأحرف الصغيرة، بنظام hex ذي
            الأحرف الصغيرة. يتم مطابقة الإدخال المستورد عبر تجزئته فقط عليه.
        memo:
          type: string
          description: >-
            علامة الوجهة (destination tag) أو المذكرة (memo) التي تشكل جزءًا من
            المحفظة على شبكة تستخدم المذكرات (XRP وXLM وEOS وATOM وHBAR)؛ القيمة
            `""` للعنوان بأكمله. لا يطابق الإدخال الذي يحتوي على مذكرة سوى
            التحويلات التي تحدد تلك المذكرة؛ بينما يطابق الإدخال الذي لا يحتوي
            عليها العنوان بأكمله.
        receiving_travel_address:
          type: string
          readOnly: true
          description: >-
            Travel Address الخاص بك لكل محفظة لهذه المحفظة: قدّمه إلى الـ VASP
            المُرسِل لكي يحدد استعلام TRP الخاص به هذه المحفظة. يكون فارغاً
            للمحفظة المسجلة على أنها تابعة لـ VASP آخر، وطالما أن Travel Rule
            معطل، وقبل حفظ ملف تعريف VASP الخاص بك.
  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.