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

# Crear o enviar enlace de Travel Rule para usuario final

> Crea un enlace de Travel Rule para el usuario final o envíalo por correo con Didit. Incluye caducidad, revocación y resultado de la entrega.

La API de enlace para el usuario final de la Travel Rule de Didit emite un enlace para que el usuario complete su elección de wallet o de contraparte, y puede enviarlo por correo electrónico a la dirección registrada del usuario.

Envía `{"channel": "link"}` para copiar un enlace, o `{"channel": "email"}` para intentar también el envío por correo electrónico. Si omites `channel`, el valor predeterminado es `link`. El correo electrónico usa la dirección del usuario final registrada en Didit y el idioma de su sesión de verificación, cuando está disponible. No puedes indicar un destinatario arbitrario.

La API requiere permiso de escritura sobre las transacciones y una transferencia saliente en `AWAITING_COUNTERPARTY`, `COUNTERPARTY_VASP_NOT_FOUND`, `COUNTERPARTY_VASP_NOT_REACHABLE`, `UNCONFIRMED_OWNERSHIP` u `ON_HOLD`. Otros estados devuelven `409`; una transacción desconocida o una transferencia inexistente devuelve `404`.

La respuesta contiene `end_user_link`, `expires_at`, `emailed_to` y `email_available`. Un nuevo enlace revoca los enlaces abiertos anteriores para el usuario final de esa transferencia. Compártelo solo con el usuario final al que va destinado.

Si no existe un correo electrónico registrado, `channel: email` devuelve `409` con `code: end_user_email_missing`; en su lugar, solicita `channel: link`. Si el envío falla, la API sigue devolviendo un enlace utilizable, con `emailed_to` vacío. `email_available` indica que existe una dirección, no que la entrega haya tenido éxito.

Para la elección explícita del usuario durante la creación, consulta [Crear una transacción](https://docs.didit.me/es/management-api/transactions/create.md) y la [guía de la Travel Rule](https://docs.didit.me/es/transaction-monitoring/travel-rule.md#descubrimiento-de-contraparte). Para las acciones sobre transferencias, consulta [Actualizar una transferencia](https://docs.didit.me/es/management-api/travel-rule/update-transfer.md).


## OpenAPI

````yaml es/openapi-25.json POST /v3/transactions/{transaction_id}/travel-rule/user-link/
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/transactions/{transaction_id}/travel-rule/user-link/:
    post:
      tags:
        - Travel Rule
      summary: >-
        Crea o envía por correo electrónico un enlace de Travel Rule para el
        usuario final
      description: >-
        Emite un nuevo enlace y revoca los enlaces abiertos anteriores de esta
        transferencia. Requiere acceso de escritura a transactions y una
        transferencia saliente en estado AWAITING_COUNTERPARTY,
        COUNTERPARTY_VASP_NOT_FOUND, COUNTERPARTY_VASP_NOT_REACHABLE,
        UNCONFIRMED_OWNERSHIP u ON_HOLD. channel=email usa el correo electrónico
        del usuario final registrado en Didit y el idioma de la sesión de
        verificación cuando están disponibles. Si el envío falla, se devuelve el
        enlace con emailed_to vacío; email_available indica si hay una dirección
        disponible, no si se entregó. Consulta [Enlaces de
        usuario](/es/management-api/travel-rule/create-user-link).
      operationId: createTravelRuleUserLink
      parameters:
        - name: transaction_id
          in: path
          required: true
          description: >-
            UUID estable de Didit de la transacción a la que pertenece la
            transferencia.
          schema:
            type: string
            format: uuid
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TravelRuleUserLinkRequest'
            example:
              channel: link
      responses:
        '200':
          description: Respuesta exitosa.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleUserLinkResponse'
        '400':
          description: Campos de la solicitud no válidos.
        '403':
          description: Falta el permiso para escribir transacciones.
        '404':
          description: Transacción desconocida o sin transferencia de Travel Rule.
        '409':
          description: >-
            La dirección o el estado de la transferencia no permiten un vínculo,
            o channel=email no tiene una dirección de usuario final. En este
            último caso, code=end_user_email_missing; reintenta con
            channel=link.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: Explicación del conflicto.
                  code:
                    type: string
                    description: Presente cuando el correo electrónico no está disponible.
                    enum:
                      - end_user_email_missing
                required:
                  - detail
              example:
                detail: >-
                  This end user has no email on their Didit record. Copy the
                  link instead.
                code: end_user_email_missing
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: >-
            curl -X POST
            'https://verification.didit.me/v3/transactions/{transaction_id}/travel-rule/user-link/'
            \
              -H 'x-api-key: YOUR_API_KEY' -H 'Content-Type: application/json' \
              -d '{"channel": "link"}'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.transactions.travel_rule.create_user_link(
                "11111111-2222-3333-4444-555555555555",
                channel="link",
            )
            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.transactions.travelRule.createUserLink("11111111-2222-3333-4444-555555555555",
            {
              channel: "link",
            });

            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Transactions.TravelRule.CreateUserLink(ctx, \"11111111-2222-3333-4444-555555555555\", didit.TravelRuleUserLinkRequest{\n\tChannel: didit.Some(didit.TravelRuleUserLinkRequestChannel(\"link\")),\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.TravelRuleUserLinkRequest;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.transactions().travelRule().createUserLink("11111111-2222-3333-4444-555555555555",
            TravelRuleUserLinkRequest.builder()
                    .channel(TravelRuleUserLinkRequest.Channel.of("link"))
                    .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->transactions->travelRule->createUserLink('11111111-2222-3333-4444-555555555555',
            [
                'channel' => 'link',
            ]);

            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

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

            result = didit.transactions.travel_rule.create_user_link(
              "11111111-2222-3333-4444-555555555555",
              channel: "link"
            )
            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.Transactions.TravelRule.CreateUserLinkAsync("11111111-2222-3333-4444-555555555555",
            new TravelRuleUserLinkRequest

            {
                Channel = new TravelRuleUserLinkRequestChannel("link"),
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    TravelRuleUserLinkRequest:
      type: object
      properties:
        channel:
          type: string
          description: >-
            link devuelve un enlace nuevo; email también intenta enviarlo al
            correo electrónico del registro de Didit del usuario final.
          enum:
            - link
            - email
          default: link
    TravelRuleUserLinkResponse:
      type: object
      properties:
        end_user_link:
          type: string
          description: >-
            Nuevo enlace para el usuario final. Los enlaces abiertos anteriores
            de esta transferencia quedan revocados.
          format: uri
        expires_at:
          type: string
          description: Caducidad del enlace.
          format: date-time
        emailed_to:
          type: string
          description: >-
            Destinatario cuando el envío se realizó correctamente; si no, una
            cadena vacía. Un fallo del correo sigue devolviendo un enlace
            utilizable.
        email_available:
          type: boolean
          description: >-
            Si el usuario final tiene un correo electrónico en su registro de
            Didit.
      required:
        - end_user_link
        - expires_at
        - emailed_to
        - email_available
  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.