> ## 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 para registrar direcciones de wallet en Travel Rule

> Añade con Didit una wallet propia a la libreta de direcciones de Travel Rule para recibir transferencias INTERNAL, opcionalmente autodeclarada.



Prompt de la API para registrar una dirección de wallet
        Copiar el prompt al portapapeles



      
      

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



      
      

Pegar en



## OpenAPI

````yaml es/openapi-25.json POST /v3/travel-rule/wallet-addresses/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API de verificación de identidad. Autentícate con el encabezado x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/travel-rule/wallet-addresses/:
    post:
      tags:
        - Travel Rule
      summary: Registrar una dirección de wallet
      description: >-
        Añade una entrada a tu libreta de direcciones de wallets de Travel Rule
        para que las transferencias entrantes por la vía INTERNAL puedan
        resolverse con ella.
      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: La entrada creada.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WalletAddressEntry'
        '400':
          description: >-
            Wallet duplicada (dirección, cadena y memo) para esta aplicación, un
            memo o una X-address que la cadena no admite, falta `address`, un
            `travel_address` no válido, `self_declared: true` mientras
            `allow_self_declaration` está desactivado, o `self_declared: true`
            mientras `ownership_validation_mode` es `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: >-
            La dirección de la wallet. Una X-address de XRP se almacena como su
            dirección clásica y su tag, por lo que coincide con las
            transferencias que indiquen cualquiera de las dos formas.
        chain:
          type: string
          maxLength: 32
          description: >-
            Token de cadena de la dirección, por ejemplo `ETH` o `BTC`. Cuando
            Didit enruta o registra una transferencia, busca coincidencias en
            las entradas de la libreta de direcciones por la dirección de la
            wallet y, cuando la transferencia incluye una cadena, también por
            este valor, sin distinguir mayúsculas de minúsculas. La cadena de
            una transferencia es `beneficiary_data.chain`, que se rellena a
            partir de la cadena cripto o del símbolo de la moneda de la
            transacción (por ejemplo `ETH`) cuando no la envías, o el `chain` de
            un registro posterior al depósito, así que usa el mismo token en
            todas partes. Una entrada con la cadena vacía coincide con cualquier
            cadena. Las cadenas conocidas se almacenan con un único
            identificador canónico, sea cual sea la grafía que envíes:
            "ethereum", "Ethereum" y "ERC20" se almacenan como ETH, "BNB Smart
            Chain" y "BEP20" como BNB, y "tron" como TRX. Un nombre de cadena
            desconocido se conserva tal como se envía.
        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: >-
            Solo escritura. Si es true, la entrada se crea con la propiedad ya
            verificada mediante una prueba SELF_DECLARATION. Devuelve 400 cuando
            `allow_self_declaration` está desactivado en tu configuración de
            Travel Rule.
        travel_address:
          type: string
          description: >-
            Opcional. La travel address del VASP de la contraparte para esta
            wallet, que habilita el enrutamiento TRP para los activos que admite
            TRP (BTC, ETH y USDC en una red concreta). Una travel address no
            válida devuelve 400.
          maxLength: 512
        memo:
          type: string
          maxLength: 256
          description: >-
            Opcional. La etiqueta de destino o memo que forma parte de la
            wallet. XRP: una etiqueta de destino, un número entero de 0 a
            4294967295 (se acepta un número JSON). XLM: un memo de texto de
            hasta 28 bytes, un id de 64 bits o un hash de 32 bytes en
            hexadecimal. EOS: hasta 256 bytes. ATOM: hasta 256 caracteres. HBAR:
            hasta 100 bytes. Las wallets de Bitcoin, EVM, Solana, Tron,
            Litecoin, Bitcoin Cash, Dogecoin y Lightning no admiten memo: si se
            envía uno, la respuesta es `400`. Alias: `destinationTag` o
            `destination_tag`.
    WalletAddressEntry:
      type: object
      properties:
        uuid:
          type: string
          format: uuid
        address:
          type: string
          description: >-
            La dirección de la wallet; `""` para una entrada importada solo por
            su hash. Única por aplicación, cadena y memo, comparando la
            dirección sin distinguir mayúsculas de minúsculas. Después de
            eliminar una entrada, puedes registrar de nuevo la misma dirección.
        chain:
          type: string
          description: >-
            Token de cadena de la dirección, por ejemplo `ETH` o `BTC`. Cuando
            Didit enruta o registra una transferencia, busca coincidencias en
            las entradas de la libreta de direcciones por la dirección de la
            wallet y, cuando la transferencia incluye una cadena, también por
            este valor, sin distinguir mayúsculas y minúsculas. La cadena de una
            transferencia es `beneficiary_data.chain`, que se rellena a partir
            de la cadena cripto o del símbolo de la moneda de la transacción
            (por ejemplo `ETH`) cuando no la envías, o la `chain` de un registro
            posterior al depósito, así que usa el mismo token en todas partes.
            Una entrada con la cadena vacía coincide con cualquier cadena. Un
            beneficiario de Lightning (un id de nodo o una Lightning Address)
            registrado en bitcoin se almacena en minúsculas en `LIGHTNING`,
            donde se buscan coincidencias para las transferencias de Lightning.
            Las cadenas conocidas se almacenan con un único identificador
            canónico, sea cual sea la grafía que envíes: "ethereum", "Ethereum"
            y "ERC20" se almacenan como ETH, "BNB Smart Chain" y "BEP20" como
            BNB, y "tron" como TRX. Un nombre de cadena desconocido se conserva
            tal como se envió.
        holder_vendor_data:
          type: string
          description: Tu identificador interno del titular.
        holder_name:
          type: string
          description: >-
            Nombre del titular de la wallet, que se usa para la coincidencia del
            nombre del beneficiario.
        entity_type:
          type: string
          description: Texto libre; por defecto, "individual".
        is_ownership_verified:
          type: boolean
          description: >-
            Solo lectura. Indica si se ha demostrado la propiedad de esta
            dirección.
        created_at:
          type: string
          format: date-time
        travel_address:
          type: string
          description: >-
            La dirección de viaje (travel address) del VASP de la contraparte
            para esta wallet, si se conoce. Permite a Didit enrutar las
            transferencias de este beneficiario por el canal TRP, para los
            activos que admite TRP (BTC, ETH y USDC en una red concreta).
        address_hash:
          type: string
          description: >-
            Solo lectura. SHA-256 de la dirección en minúsculas, en hexadecimal
            en minúsculas. Una entrada importada solo por su hash se compara con
            este valor.
        memo:
          type: string
          description: >-
            La etiqueta de destino o memo que forma parte de la wallet en una
            red con memo (XRP, XLM, EOS, ATOM, HBAR); `""` para la dirección
            completa. Una entrada con memo solo coincide con transferencias que
            indican ese memo; una sin memo coincide con toda la dirección.
        receiving_travel_address:
          type: string
          readOnly: true
          description: >-
            Tu dirección de viaje específica para esta wallet: dásela al VASP
            emisor para que su consulta TRP identifique esta wallet. Vacía para
            una wallet registrada como de otro VASP, mientras Travel Rule está
            desactivada y antes de que se guarde tu perfil de VASP.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        La clave de API de tu aplicación, que encontrarás en Developers -> API
        keys en la Business Console. La clave principal tiene acceso completo.
        Una clave con nombre puede tener un alcance limitado: ninguno, lectura o
        escritura por recurso, limitada a algunos flujos o a sesiones aprobadas,
        a una lista de direcciones IP y a una fecha de caducidad. 401 significa
        que la clave es incorrecta, se revocó o expiró; 403 significa que no se
        envió ninguna clave, que la clave no tiene acceso a este recurso o
        acción, o que la solicitud provino de una dirección fuera de su lista de
        IP; 404 en una ruta de sesión significa que la sesión está fuera de los
        flujos o estados de la clave. Una clave sin acceso a contenido
        multimedia recibe las URL de imágenes, videos y PDF como null, y una
        clave sin permiso de escritura en sesiones recibe los enlaces y tokens
        de sesión como null. Consulta https://docs.didit.me/console/api-keys.

````

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