> ## 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 위젯

> 위젯 세션 token으로 지갑 소유권 증명을 시작합니다. 메시지 서명, Satoshi test, 스크린샷, 자기 선언 중 선택할 수 있으며, 방법을 다시 선택하면 재개됩니다. Didit 제공.

Widget Proof API 시작 프롬프트
프롬프트를 클립보드에 복사

<pre>
  \`Start a wallet-ownership proof for a widget session. This is the call the hosted widget makes when the end user picks a proof method; use it only if I build my own widget UI.

  Endpoint:
  POST [https://verification.didit.me/v3/travel-rule/widget/\{token}/proofs/](https://verification.didit.me/v3/travel-rule/widget/\{token}/proofs/)

  Authentication:
  None - the widget token in the URL path is the credential. Treat the token as a secret.

  Body:

  * method - one of the context's allowed\_methods: MESSAGE\_SIGNING, SATOSHI\_TEST, SCREENSHOT or SELF\_DECLARATION.
  * wallet\_address, chain - optional, default to the session's.

  Behavior:

  * 201 with a new PENDING proof. MESSAGE\_SIGNING returns the challenge to sign; SATOSHI\_TEST returns deposit\_address, expected\_amount and expires\_at; SELF\_DECLARATION is verified at once.
  * 200 with the proof already open when the same method is picked again (same challenge or amount): resume it, do not treat it as an error.
  * Picking another method closes the unfinished proof as METHOD\_SWITCHED, except a submitted screenshot or a test deposit still being checked.
  * After a REJECTED proof, picking a method starts a new one (201). A session takes a limited number of rejected proofs: the context reports max\_attempts, attempts\_used and attempts\_remaining.
  * Message signing works on EVM chains (Ethereum, BNB Chain, Polygon, Arbitrum, Base, Optimism, Avalanche, Linea and others), Bitcoin (BIP-137 and BIP-322 simple), Solana and Tron.

  Failure modes (errors carry a code to translate):

  * 400 - code CHAIN\_UNSUPPORTED when the method is not available on the chain; also an invalid body or a wallet that does not match the transfer.
  * 403 - SELF\_DECLARATION not allowed for the application.
  * 409 - code OWNERSHIP\_CHANGED: mint a new session for the current holder.
  * 409 - no attempts left (no code; the body carries attempts\_remaining 0): mint a new session.
  * 404 - unknown token. 410 - the session expired.

  Full guide: /transaction-monitoring/wallet-ownership-widget#what-it-proves.\`
</pre>

붙여넣을 곳


## OpenAPI

````yaml ko/openapi-25.json POST /v3/travel-rule/widget/{token}/proofs/
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/widget/{token}/proofs/:
    post:
      tags:
        - Travel Rule
      summary: 지갑 소유권 증명을 시작합니다.
      description: >-
        위젯 세션 token으로 식별되는 공개 endpoint이며 API 키가 필요하지 않습니다. 최종 사용자가 증명 방식을 선택할 때
        호스팅된 위젯이 이를 호출합니다. 증명은 오직 이 호출을 통해서만 생성되고 증명 퍼널에 집계됩니다. 동일한 방식을 다시 선택하면
        두 번째 증명을 시작하는 대신 이미 열려 있는 증명을 반환합니다(200, 동일한 챌린지 또는 입금액). 다른 방식을 선택하면
        제출된 스크린샷이나 확인 중인 테스트 입금을 제외하고 완료되지 않은 증명을 METHOD_SWITCHED로 종료합니다.
        MESSAGE_SIGNING은 서명할 챌린지를 반환하고, SATOSHI_TEST는 입금 주소, 정확한 금액 및 유효 기간을
        반환하며, SELF_DECLARATION은 즉시 검증됩니다(상태 VERIFIED). 체인 패밀리별로 검증되는 서명 형식: EVM
        체인은 hex 인코딩된 personal_sign(EIP-191) 서명, Bitcoin은 base64 인코딩된 BIP-137
        signmessage 서명(P2PKH, P2SH-P2WPKH, P2WPKH 주소) 또는 BIP-322 simple
        서명(P2WPKH 및 P2TR 주소), Solana는 base58 인코딩된 챌린지에 대한 Ed25519 서명, Tron은 hex
        인코딩된 signMessageV2(TIP-191) 서명을 지원합니다. BIP-322 full 또는 proof-of-funds
        서명, 또는 다중 서명 주소는 SIGNATURE_UNSUPPORTED_SCHEME 오류로 실패합니다.
      operationId: createTravelRuleWidgetProof
      parameters:
        - name: token
          in: path
          required: true
          description: 위젯 세션이 생성되었을 때 반환된 불투명 세션 token입니다.
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TravelRuleWidgetProofCreate'
      responses:
        '200':
          description: 이 방식에 대해 이미 열려 있던 증명이 재개되었습니다.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofSummary'
        '201':
          description: 새로운 PENDING 증명(SELF_DECLARATION의 경우 VERIFIED).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofSummary'
        '400':
          description: >-
            유효하지 않은 본문, 전송과 일치하지 않는 지갑, 허용되지 않는 SCREENSHOT, 또는 해당 체인에서 메서드를 사용할
            수 없을 때 발생하는 CHAIN_UNSUPPORTED 코드입니다.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofError'
        '403':
          description: 이 애플리케이션에는 SELF_DECLARATION이 허용되지 않습니다.
        '404':
          description: 알 수 없는 token입니다.
        '409':
          description: >-
            코드 OWNERSHIP_CHANGED: 세션이 발급된 후 지갑 소유자가 변경되었거나 지갑이 삭제되었습니다. 현재 소유자를
            위해 새 세션을 발급하십시오. 세션에 satoshi_deposit_address가 없을 때, 그리고 세션에 남은 시도
            횟수가 없을 때(코드 없음. 본문에 max_attempts, attempts_used, attempts_remaining
            0 포함) SATOSHI_TEST에 대해서도 반환됩니다: 새 세션을 발급하십시오.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofError'
        '410':
          description: 세션이 만료되었습니다.
      security:
        - {}
      x-codeSamples:
        - lang: curl
          label: curl
          source: >-
            curl -X POST
            https://verification.didit.me/v3/travel-rule/widget/{token}/proofs/
            \
              -H 'Content-Type: application/json' \
              -d '{"method": "MESSAGE_SIGNING"}'
components:
  schemas:
    TravelRuleWidgetProofCreate:
      type: object
      required:
        - method
      properties:
        method:
          type: string
          enum:
            - MESSAGE_SIGNING
            - SATOSHI_TEST
            - SCREENSHOT
            - SELF_DECLARATION
          description: 최종 사용자가 선택한 증명 방식입니다. 컨텍스트의 allowed_methods 중 하나여야 합니다.
        wallet_address:
          type: string
          maxLength: 128
          description: 기본값은 세션의 wallet_address입니다. 세션이 거래와 연결된 경우 거래의 지갑과 일치해야 합니다.
        chain:
          type: string
          maxLength: 32
          description: 기본값은 세션의 체인입니다.
    TravelRuleWidgetProofSummary:
      type: object
      properties:
        proof_id:
          type: string
          format: uuid
        method:
          type: string
          enum:
            - MESSAGE_SIGNING
            - SATOSHI_TEST
            - SCREENSHOT
            - SELF_DECLARATION
        status:
          type: string
          enum:
            - PENDING
            - VERIFIED
            - REJECTED
            - EXPIRED
          description: >-
            PENDING: 최종 사용자가 이 방식을 선택했으며 증명이 아직 결정되지 않았습니다. 실패한 서명 또는 아직 읽을 수
            없거나 확인되지 않은 테스트 입금은 failure_reason과 함께 증명을 PENDING 상태로 유지하므로 최종 사용자가
            다시 시도할 수 있습니다. 제출된 SATOSHI_TEST 입금은 유효 기간이 닫힐 때까지 자동으로 재확인되며, 제출된
            SCREENSHOT은 검토를 대기합니다. VERIFIED: 소유권이 증명되었습니다. REJECTED: 테스트 입금이 확실히
            잘못되었거나(다른 발신자, 입금 주소로 전송된 예상치 않은 금액, 챌린지보다 이전 시점, 또는 이미 다른 지갑을 증명한
            거래) 검토자가 스크린샷을 거부했습니다. failure_reason에 구체적인 사유가 표시됩니다. 거부된 증명은 최종적이며
            세션 시도 횟수 중 하나를 사용합니다. EXPIRED: 증명을 더 이상 결정할 수 없습니다(유효 기간 만료, 최종 사용자가
            방식 변경, 위젯 세션 만료, 또는 지갑 보유자 변경). failure_reason에 구체적인 사유가 표시됩니다.
        wallet_address:
          type: string
        chain:
          type: string
          description: '증명이 대상인 주소록 항목의 표준 체인 식별자입니다(예: ETH, BTC, SOL, TRX).'
        deposit_address:
          type: string
          nullable: true
          description: 고객이 사토시 테스트 금액을 보내야 하는 입금 주소입니다. SATOSHI_TEST 증명에만 존재합니다.
        expected_amount:
          type: string
          nullable: true
          description: >-
            Satoshi 테스트 입금과 일치해야 하는 입금의 고유 통화로 표시된 정확한 온체인 금액입니다. SATOSHI_TEST
            증명에만 존재합니다.
        expires_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            해당 증명 자체의 사토시 테스트 기간 마감 시한입니다. SATOSHI_TEST 증명에만 존재하며, SATOSHI_TEST가
            제공될 경우 위젯 세션 자체의 expires_at이 이를 포함하도록 연장됩니다.
        challenge:
          type: string
          nullable: true
          description: 고객이 자신의 지갑으로 서명하는 Didit 발행 메시지입니다. MESSAGE_SIGNING 증명에만 존재합니다.
        rejection_reason:
          type: string
          description: >-
            증명이 거부된 이유(최종 사용자를 위한 영어 문장)입니다. `status`가 REJECTED일 때만 존재하며, 검토자가
            스크린샷을 거부한 경우에는 비어 있습니다(검토자 메모는 외부에 공개되지 않음).
        created_at:
          type: string
          format: date-time
        attempts:
          type: integer
          description: 이 증명을 위해 증빙 자료(서명, 거래 ID, 업로드)가 제출된 횟수입니다.
        failure_reason:
          allOf:
            - $ref: '#/components/schemas/TravelRuleWalletProofFailureReason'
          description: 마지막 시도가 실패한 이유 또는 증명이 종료된 이유입니다. 실패한 항목이 없으면 비어 있습니다.
    TravelRuleWidgetProofError:
      type: object
      properties:
        detail:
          type: string
          description: 사람이 읽기 쉬운 영어 메시지입니다.
        code:
          allOf:
            - $ref: '#/components/schemas/TravelRuleWalletProofFailureReason'
          description: 클라이언트가 자체 번역 메시지를 표시할 수 있도록 제공되는 기계 판독 가능한 사유입니다.
        status:
          type: string
          enum:
            - PENDING
            - VERIFIED
            - REJECTED
            - EXPIRED
          description: >-
            증명이 종료되었을 때 표시됩니다. 방금 제출된 입금으로 인해 REJECTED(400)되거나, 이미 종료된 증명에 증빙
            자료가 전송되었을 때 REJECTED 또는 EXPIRED(409)됩니다.
        proof_id:
          type: string
          format: uuid
          description: 상태와 함께 표시됩니다. 종료된 증명입니다.
        method:
          type: string
          enum:
            - MESSAGE_SIGNING
            - SATOSHI_TEST
            - SCREENSHOT
            - SELF_DECLARATION
          description: 상태와 함께 표시됩니다. 종료된 증명의 방식입니다.
        max_attempts:
          type: integer
          description: 상태와 함께 표시됩니다. 이 세션에서 허용하는 거부된 지갑 증명입니다.
        attempts_used:
          type: integer
          description: 상태와 함께 표시됩니다. 지금까지 거부된 증명 목록입니다.
        attempts_remaining:
          type: integer
          description: 상태와 함께 표시됩니다. 0인 경우 다른 증명을 시작하면 409가 반환되며 새 위젯 세션을 발급해야 합니다.
    TravelRuleWalletProofFailureReason:
      type: string
      enum:
        - ''
        - SIGNATURE_INVALID
        - SIGNATURE_UNSUPPORTED_SCHEME
        - DEPOSIT_NOT_FOUND
        - DEPOSIT_UNCONFIRMED
        - DEPOSIT_LOOKUP_FAILED
        - DEPOSIT_MISMATCH
        - DEPOSIT_STALE
        - TXID_REUSED
        - CHAIN_UNSUPPORTED
        - WINDOW_EXPIRED
        - OWNERSHIP_CHANGED
        - METHOD_SWITCHED
        - REVIEW_REJECTED
        - ABANDONED
      description: >-
        지갑 소유권 증명 또는 마지막 시도가 VERIFIED에 도달하지 못한 이유입니다. 실패한 항목이 없으면 비어 있습니다.
        PENDING 증명에도 포함될 수 있습니다. 즉 마지막 시도가 실패했으며 최종 사용자가 다시 시도할 수 있습니다.
        DEPOSIT_MISMATCH, DEPOSIT_STALE, TXID_REUSED 및 REVIEW_REJECTED는 증명을
        REJECTED 상태로 종료합니다. SIGNATURE_INVALID: 서명이 지갑 및 챌린지와 일치하지 않습니다.
        SIGNATURE_UNSUPPORTED_SCHEME: 지갑이 Didit에서 검증하지 않는 형식으로 서명했습니다.
        DEPOSIT_NOT_FOUND, DEPOSIT_UNCONFIRMED, DEPOSIT_LOOKUP_FAILED: 테스트 입금을
        읽을 수 없거나 아직 확인되지 않았습니다. Didit은 테스트 기간이 종료될 때까지 계속 확인합니다.
        DEPOSIT_MISMATCH: 트랜잭션이 지갑에서 입금 주소로 예상 금액을 전송하지 않습니다. DEPOSIT_STALE:
        트랜잭션이 챌린지보다 이전 시점의 것입니다. TXID_REUSED: 트랜잭션이 이미 다른 지갑을 증명했습니다.
        CHAIN_UNSUPPORTED: 이 체인에서는 해당 방식을 사용할 수 없습니다. WINDOW_EXPIRED: 테스트 기간이
        만료되었습니다. OWNERSHIP_CHANGED: 위젯 세션이 생성된 후 지갑 소유자가 변경되었거나 주소록에서 지갑이
        삭제되었습니다. METHOD_SWITCHED: 최종 사용자가 이 방식을 완료하기 전에 다른 방식을 선택했습니다.
        REVIEW_REJECTED: 검토자가 스크린샷을 거부했습니다. ABANDONED: 최종 사용자가 완료하기 전에 위젯 세션이
        만료되었습니다.

````

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