> ## 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 주소록

> 직접 관리하는 지갑을 Travel Rule 주소록에 추가해, Didit에서 INTERNAL 경로 수신 거래가 해당 지갑으로 연결되도록 합니다. 자기 신고로 사전 검증할 수도 있습니다.



지갑 주소 등록 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 ko/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: >-
            이 애플리케이션에 대한 중복 지갑(주소, 체인 및 메모), 체인에서 지원할 수 없는 메모 또는 X-address, 누락된
            `address`, 유효하지 않은 `travel_address`, `allow_self_declaration`이 꺼져 있는
            동안의 `self_declared: true`, 또는 `ownership_validation_mode`가 `FULL`인
            동안의 `self_declared: true`입니다.
          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 증명을 통해 이미 소유 구조가 확인된 상태로
            생성됩니다. Travel Rule 설정에서 `allow_self_declaration`이 꺼져 있으면 400을 반환합니다.
        travel_address:
          type: string
          description: >-
            선택 사항입니다. 이 지갑에 대한 거래 상대방 VASP의 Travel Address로, TRP가 지원하는 자산(BTC,
            ETH 및 지정된 네트워크의 USDC)에 대한 TRP 라우팅을 활성화합니다. 잘못된 Travel Address는 400을
            반환합니다.
          maxLength: 512
        memo:
          type: string
          maxLength: 256
          description: >-
            선택 사항입니다. 지갑의 일부인 대상 태그 또는 메모입니다. XRP: 대상 태그, 0부터 4294967295까지의
            정수(JSON 숫자가 허용됨). XLM: 최대 28바이트의 텍스트 메모, 64비트 ID 또는 16진수 형태의 32바이트
            해시. 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: >-
            지갑 주소입니다. 해시로만 가져온 항목의 경우 `""`입니다. 대소문자를 구분하지 않고 주소를 비교하며, 애플리케이션,
            체인, 메모별로 고유합니다. 항목을 삭제한 후 동일한 주소를 다시 등록할 수 있습니다.
        chain:
          type: string
          description: >-
            주소에 대한 체인 token(예: `ETH` 또는 `BTC`). Didit이 이체를 라우팅하거나 등록할 때 지갑 주소를
            기준으로 주소록 항목을 매칭하며, 이체에 체인이 포함된 경우 대소문자를 무시하고 이 값도 기준으로 매칭합니다. 이체의
            체인은 `beneficiary_data.chain`이며, 직접 전송하지 않은 경우 거래의 암호화폐 체인 또는 통화
            기호(예: `ETH`)에서 채워지거나 입금 후 등록의 `chain`에서 채워지므로 모든 곳에서 동일한 token을
            사용하십시오. 체인이 비어 있는 항목은 모든 체인과 일치합니다. 비트코인에 등록된 Lightning 수취인(노드 id 또는
            Lightning Address)은 `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: >-
            알려진 경우, 이 지갑에 대한 거래 상대방 VASP의 Travel Address입니다. Didit이 TRP가 지원하는
            자산(BTC, ETH 및 지정된 네트워크의 USDC)에 대해 TRP 레일을 통해 이 수취인의 이체를 라우팅할 수 있도록
            합니다.
        address_hash:
          type: string
          description: >-
            읽기 전용입니다. 소문자로 변환된 주소의 SHA-256 해시값(소문자 16진수)입니다. 해시만으로 가져온 항목은 이 값을
            기준으로 매칭됩니다.
        memo:
          type: string
          description: >-
            메모 네트워크(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: >-
        Business Console의 Developers -> API keys에서 발급받은 귀하 애플리케이션의 API 키입니다. 기본
        키는 전체 접근 권한을 갖습니다. 이름이 지정된 키는 리소스별 none, read, write 범위로 권한을 제한할 수 있으며
        특정 워크플로나 승인된 세션, IP 주소 목록, 만료일 등으로 제한할 수도 있습니다. 401은 키가 잘못되었거나 폐기되었거나
        만료되었음을 의미합니다. 403은 키가 전송되지 않았거나, 키에 해당 리소스나 작업에 대한 접근 권한이 없거나, 요청이 허용된
        IP 목록 외부 주소에서 발생했음을 의미합니다. 세션 경로에서의 404는 해당 세션이 키의 허용 워크플로 또는 상태 범위를
        벗어났음을 의미합니다. 미디어 접근 권한이 없는 키는 이미지, 비디오, PDF URL을 null로 수신하며, 세션 write
        권한이 없는 키는 세션 링크와 token을 null로 수신합니다.
        https://docs.didit.me/console/api-keys 를 참고하십시오.

````

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