> ## 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 최종 사용자 링크 생성 및 이메일 발송

> Didit API로 Travel Rule 최종 사용자 링크를 새로 발급하거나 사용자 등록 주소로 이메일 발송합니다. 링크 만료, 취소, 전송 결과 필드를 포함합니다.

Didit의 Travel Rule 최종 사용자 링크 API는 사용자가 지갑 또는 거래 상대방을 선택할 수 있도록 링크를 발급하며, 기록된 이메일 주소로 이 링크를 보낼 수도 있습니다.

`{"channel": "link"}`를 전송하면 링크가 복사되고, `{"channel": "email"}`을 전송하면 이메일 전송도 시도합니다. `channel`을 생략하면 기본값은 `link`입니다. 이메일은 최종 사용자의 Didit 기록에 있는 주소와, 사용 가능한 경우 인증 세션의 언어를 사용합니다. 임의의 수신자를 지정할 수는 없습니다.

이 API에는 거래에 대한 쓰기 권한과, `AWAITING_COUNTERPARTY`, `COUNTERPARTY_VASP_NOT_FOUND`, `COUNTERPARTY_VASP_NOT_REACHABLE`, `UNCONFIRMED_OWNERSHIP` 또는 `ON_HOLD` 상태의 아웃바운드 전송이 필요합니다. 그 밖의 상태에서는 `409`를 반환하며, 알 수 없는 거래이거나 전송이 없는 경우에는 `404`를 반환합니다.

응답에는 `end_user_link`, `expires_at`, `emailed_to`, `email_available`이 포함됩니다. 새 링크를 생성하면 해당 전송에 대해 이전에 열려 있던 최종 사용자 링크는 모두 폐기됩니다. 링크는 의도한 최종 사용자에게만 공유하십시오.

기록된 이메일이 없으면 `channel: email` 요청은 `code: end_user_email_missing`과 함께 `409`를 반환합니다. 이 경우 `channel: link`로 요청하십시오. 이메일 전송에 실패하더라도 API는 사용 가능한 링크를 반환하며, 이때 `emailed_to`는 빈 값입니다. `email_available`은 주소가 존재한다는 뜻이며, 전송이 성공했다는 의미가 아닙니다.

사용자가 생성 시점에 명시적으로 선택하는 방식은 [거래 생성](https://docs.didit.me/ko/management-api/transactions/create.md)과 [Travel Rule 가이드](https://docs.didit.me/ko/transaction-monitoring/travel-rule.md#거래-상대방-탐색)를 참고하십시오. 전송 작업은 [전송 업데이트](https://docs.didit.me/ko/management-api/travel-rule/update-transfer.md)를 참고하십시오.


## OpenAPI

````yaml ko/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입니다. 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: Travel Rule 종단 사용자 링크 생성 또는 이메일 전송
      description: >-
        이 전송에 대해 새 링크를 발급하고 이전의 열린 링크를 모두 취소합니다. transactions에 대한 쓰기 권한과
        AWAITING_COUNTERPARTY, COUNTERPARTY_VASP_NOT_FOUND,
        COUNTERPARTY_VASP_NOT_REACHABLE, UNCONFIRMED_OWNERSHIP 또는 ON_HOLD 상태의
        아웃바운드 전송이 필요합니다. channel=email은 가능한 경우 최종 사용자의 Didit 기록 이메일과 인증 세션 언어를
        사용합니다. 전송에 실패하면 emailed_to가 비어 있는 상태로 링크를 반환합니다. email_available은 전달 여부가
        아니라 주소 사용 가능 여부를 나타냅니다. [사용자
        링크](/ko/management-api/travel-rule/create-user-link)를 참조하세요.
      operationId: createTravelRuleUserLink
      parameters:
        - name: transaction_id
          in: path
          required: true
          description: 해당 이체를 소유한 Didit 고유 거래 UUID입니다.
          schema:
            type: string
            format: uuid
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TravelRuleUserLinkRequest'
            example:
              channel: link
      responses:
        '200':
          description: 성공 응답입니다.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleUserLinkResponse'
        '400':
          description: 잘못된 요청 필드입니다.
        '403':
          description: 거래를 기록할 권한이 없습니다.
        '404':
          description: 알 수 없는 거래이거나 Travel Rule 전송이 없습니다.
        '409':
          description: >-
            전송 방향이나 상태상 연결할 수 없거나, channel=email인데 최종 사용자 주소가 없는 경우입니다. 후자의 경우
            code=end_user_email_missing이며, channel=link로 다시 시도하십시오.
          content:
            application/json:
              schema:
                type: object
                properties:
                  detail:
                    type: string
                    description: 충돌 설명.
                  code:
                    type: string
                    description: 이메일을 사용할 수 없을 때 존재합니다.
                    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는 새 링크를 반환합니다. email은 링크를 최종 사용자의 Didit 기록 이메일로도 전송을 시도합니다.
          enum:
            - link
            - email
          default: link
    TravelRuleUserLinkResponse:
      type: object
      properties:
        end_user_link:
          type: string
          description: 새 최종 사용자 링크입니다. 이 송금에 대해 이전에 열려 있던 링크는 모두 취소됩니다.
          format: uri
        expires_at:
          type: string
          description: 링크 만료 시각입니다.
          format: date-time
        emailed_to:
          type: string
          description: 전송이 성공한 경우 수신자, 그렇지 않으면 빈 문자열. 이메일 전송이 실패해도 사용 가능한 링크는 반환됩니다.
        email_available:
          type: boolean
          description: 최종 사용자의 Didit 레코드에 이메일이 있는지 여부입니다.
      required:
        - end_user_link
        - expires_at
        - emailed_to
        - email_available
  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.