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

> 검토 대기열의 스크린샷 지갑 소유권 증명을 Didit에서 승인하거나 거부합니다. 승인하면 지갑이 검증되고 연결된 거래에 소유권이 적용됩니다.

지갑 증명 결정 API 프롬프트
프롬프트를 클립보드에 복사

<pre>
  \`Approve or reject a screenshot wallet-ownership proof from my review queue.

  Endpoint:
  POST [https://verification.didit.me/v3/travel-rule/wallet-proofs/\{proof\_uuid}/decision/](https://verification.didit.me/v3/travel-rule/wallet-proofs/\{proof_uuid}/decision/)

  Authentication:
  Use the x-api-key header with my Didit API key.

  Body:

  * decision - "approve" or "reject".
  * note - optional, up to 512 characters, kept with the proof and returned as review\_note.

  Behavior:

  * approve verifies the proof and the wallet address book entry, and applies the ownership to the transfer the widget session was minted for, exactly as a verified signature does.
  * A screenshot never confirms a transfer another Didit customer sent over the INTERNAL rail: that needs a signed message or a test deposit.
  * reject closes the proof as REJECTED with failure\_reason REVIEW\_REJECTED. It uses one of the widget session's attempts; the end user can start a new proof from the widget while attempts remain. Your note is never shown to the end user.
  * Returns the decided proof, in the same shape as the review queue.

  Failure modes:

  * 404 - no submitted screenshot proof with this id in my application.
  * 409 - already decided (the body carries its status), or code OWNERSHIP\_CHANGED when the wallet's holder changed or the wallet was deleted after the widget session was minted; ask the current holder for a new proof.
  * 400 - invalid decision or a note that is too long.
  * 401 - missing or malformed x-api-key.

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

붙여넣을 곳


## OpenAPI

````yaml ko/openapi-25.json POST /v3/travel-rule/wallet-proofs/{proof_uuid}/decision/
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-proofs/{proof_uuid}/decision/:
    post:
      tags:
        - Travel Rule
      summary: 스크린샷 지갑 증명 승인 또는 거부
      description: >-
        검토 대기열에서 스크린샷 증명에 대해 결정을 내립니다. approve는 검증된 서명과 동일하게 증명 및 주소록 항목을 검증하고
        위젯 세션이 생성된 대상 거래에 소유권을 적용합니다. 스크린샷으로는 다른 Didit 고객이 INTERNAL 레일을 통해 전송한
        거래를 절대 확인할 수 없으며, 이는 서명된 메시지나 테스트 입금이 필요합니다. reject는 failure_reason
        REVIEW_REJECTED와 함께 증명을 REJECTED 상태로 마감합니다. 최종 사용자는 위젯에서 새 증명을 시작할 수
        있습니다. 메모는 증명과 함께 보관됩니다.
      operationId: decideTravelRuleWalletProof
      parameters:
        - name: proof_uuid
          in: path
          required: true
          description: 검토 대기열의 proof_id입니다.
          schema:
            type: string
            format: uuid
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TravelRuleWalletProofDecision'
            example:
              decision: approve
              note: Address matches the wallet app.
      responses:
        '200':
          description: 결정된 증명입니다.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWalletProofReview'
        '400':
          description: 유효하지 않은 결정이거나 메모가 512자를 초과합니다.
        '401':
          description: x-api-key가 누락되었거나 유효하지 않습니다.
        '403':
          description: 호출자에게 거래 권한이 없습니다.
        '404':
          description: 애플리케이션에 이 id를 가진 제출된 스크린샷 증명이 없습니다.
        '409':
          description: >-
            증명이 이미 결정되었거나(본문에 상태 포함), OWNERSHIP_CHANGED 코드입니다. 위젯 세션이 생성된 후 지갑
            소유자가 변경되었거나 지갑이 삭제되어 증명이 종료되었으므로 현재 소유자에게 새 증명이 필요합니다.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TravelRuleWidgetProofError'
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: >-
            curl -X POST
            https://verification.didit.me/v3/travel-rule/wallet-proofs/{proof_uuid}/decision/
            \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -d '{"decision": "approve", "note": "Address matches the wallet app."}'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.travel_rule.wallet_proofs.decide(
                "11111111-2222-3333-4444-555555555555",
                decision="approve",
                note="Address matches the wallet app.",
            )
            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.walletProofs.decide("11111111-2222-3333-4444-555555555555",
            {
              decision: "approve",
              note: "Address matches the wallet app.",
            });

            console.log(result);
        - lang: java
          label: Java
          source: >-
            import me.didit.Didit;

            import me.didit.types.TravelRuleWalletProofDecision;


            // Reads DIDIT_API_KEY.

            Didit client = new Didit();


            var result =
            client.travelRule().walletProofs().decide("11111111-2222-3333-4444-555555555555",
            TravelRuleWalletProofDecision.builder()
                    .decision(TravelRuleWalletProofDecision.Decision.of("approve"))
                    .note("Address matches the wallet app.")
                    .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->walletProofs->decide('11111111-2222-3333-4444-555555555555',
            [
                'decision' => 'approve',
                'note' => 'Address matches the wallet app.',
            ]);

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

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

            result = didit.travel_rule.wallet_proofs.decide(
              "11111111-2222-3333-4444-555555555555",
              decision: "approve",
              note: "Address matches the wallet app."
            )
            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.WalletProofs.DecideAsync("11111111-2222-3333-4444-555555555555",
            new TravelRuleWalletProofDecision

            {
                Decision = "approve",
                Note = "Address matches the wallet app.",
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    TravelRuleWalletProofDecision:
      type: object
      required:
        - decision
      properties:
        decision:
          type: string
          enum:
            - approve
            - reject
        note:
          type: string
          maxLength: 512
          description: 선택 사항입니다. 증명과 함께 보관되며 review_note로 반환됩니다.
    TravelRuleWalletProofReview:
      type: object
      properties:
        proof_id:
          type: string
          format: uuid
        method:
          type: string
          enum:
            - SCREENSHOT
        status:
          type: string
          enum:
            - PENDING
            - VERIFIED
            - REJECTED
            - EXPIRED
        wallet_address:
          type: string
        chain:
          type: string
          description: '표준 체인 식별자입니다(예: ETH, BTC, SOL, TRX).'
        holder_name:
          type: string
        is_ownership_verified:
          type: boolean
          description: 이 증명 또는 다른 증명을 통해 주소록 항목의 소유권이 확인되었는지 여부입니다.
        transaction_id:
          type: string
          format: uuid
          nullable: true
          description: >-
            위젯 세션이 발급된 Travel Rule 전송에 해당하는 거래입니다. transaction_id 없이 발급된 세션의 경우
            null입니다.
        file_name:
          type: string
          nullable: true
        content_type:
          type: string
          nullable: true
        screenshot_url:
          type: string
          nullable: true
          description: 업로드된 스크린샷에 대한 시간 제한 링크입니다. 최신 링크를 가져오려면 대기열을 다시 나열하십시오.
        attempts:
          type: integer
          description: 최종 사용자가 이 증명을 위해 업로드한 파일 수입니다.
        failure_reason:
          allOf:
            - $ref: '#/components/schemas/TravelRuleWalletProofFailureReason'
          description: >-
            거부 후에는 REVIEW_REJECTED, 결정 전에 지갑 소유자가 변경되었거나 지갑이 삭제된 경우에는
            OWNERSHIP_CHANGED입니다. 그 외의 경우에는 비어 있습니다.
        method_chosen_at:
          type: string
          format: date-time
          nullable: true
          description: 최종 사용자가 스크린샷 방식을 선택한 시점입니다.
        decided_at:
          type: string
          format: date-time
          nullable: true
        decided_by:
          type: string
          description: >-
            증명을 마감한 주체: 콘솔 검토자의 경우 review:<user identifier>, API 키 결정의 경우
            review, Didit이 자동으로 마감한 경우 widget 또는 sweeper입니다. PENDING 상태인 동안에는 비어
            있습니다.
        review_note:
          type: string
          description: 결정과 함께 전송된 메모입니다. 없는 경우 비어 있습니다.
        created_at:
          type: string
          format: date-time
    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: 최종 사용자가 완료하기 전에 위젯 세션이
        만료되었습니다.
  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.