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

# 지갑 스크리닝 PDF 보고서 API

> 스크리닝 엔드포인트의 JSON을 다시 전송하면 지갑 스크리닝 결과를 Didit 브랜드 PDF로 생성합니다. 상태를 저장하지 않고, 제공자를 호출하지 않으며, 추가 요금이 없습니다.



지갑 PDF 스크리닝 프롬프트
        프롬프트를 클립보드에 복사



      
      

\<pre>

\`Render a previously returned on-demand wallet-screening result as a Didit-branded PDF, through the Didit Management API.

Endpoint:
POST https://verification.didit.me/v3/wallet-screening/pdf/

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

Goal:
\- Turn a wallet-screening JSON result into a downloadable PDF report. This is stateless: nothing is persisted, no provider is called again, and there is no additional billing.

Prerequisites:
\- You must already have the exact JSON body that POST /v3/wallet-screening/ returned, including its report_signature field. This endpoint does not accept a hand-built or edited payload.

Request body (application/json):
\- The full, unmodified response body from POST /v3/wallet-screening/ (or its console equivalent), including report_signature.

Example call:
curl -X POST "https://verification.didit.me/v3/wallet-screening/pdf/" \
-H "x-api-key: YOUR_API_KEY" -H "Content-Type: application/json" \
-d "$RESULT" \
-o wallet_screening_report.pdf

Response:
\- Body is binary (application/pdf). DO NOT parse as JSON.
\- Content-Type: application/pdf
\- Content-Disposition: attachment; filename=wallet_screening_<address>.pdf

Failure modes:
\- 400 - the body is not a JSON object matching the wallet-screening result shape, or report_signature is missing or invalid (the result was edited, truncated, or hand-built instead of reposted verbatim).
\- 401 - missing or invalid x-api-key.

For the underlying screening call, see /management-api/transactions/screen-wallet.`

\</pre>



      
      

붙여넣을 곳

## 왜 무상태인가독립형 지갑 스크리닝은 거래 테이블에 아무것도 기록하지 않으므로, 이 endpoint가 렌더링할 저장된 기록이 없습니다. 대신 `POST /v3/wallet-screening/`이 이미 반환한 JSON 본문을 그대로 다시 전송하면, Didit이 공급자를 다시 호출하지 않고 해당 페이로드를 PDF로 렌더링합니다.## `report_signature` 필드`POST /v3/wallet-screening/` 응답에는 이제 `report_signature` 필드가 포함됩니다. 이는 애플리케이션 범위로 한정된 불투명 서명입니다. 이 endpoint는 렌더링 전에 이 서명을 검증하므로, 호출자가 `risk_score`, `severity`, `sanctions_hit` 또는 다른 필드를 수정해서 Didit이 생성하지 않은 결과에 대해 정상처럼 보이는 Didit 브랜드 PDF를 얻을 수는 없습니다.항상 `report_signature`를 포함한 전체 응답 본문을 **수정하지 않고** 다시 전송하십시오. 키 순서를 바꾸는 것은 괜찮지만, 서명된 값을 변경하는 것은 허용되지 않습니다.```bash theme={null}
# 1. Run the screening and save the full response
RESULT=$(curl -s -X POST https://verification.didit.me/v3/wallet-screening/ \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"wallet_address": "0x28c6c06298d514db089934071355e5743bf21d60", "blockchain": "ETH"}')

# 2. Repost it verbatim to render the PDF
curl -X POST https://verification.didit.me/v3/wallet-screening/pdf/ \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d "$RESULT" \
  -o wallet_screening_report.pdf
```## 결제공급자 호출이 이루어지지 않으며 결제되지 않습니다. 이 endpoint는 `POST /v3/wallet-screening/`을 호출할 때 이미 결제한 결과를 다시 렌더링할 뿐입니다.## 오류| 상태 | 의미 |
| - | - |
| `400` | 본문이 지갑 스크리닝 결과 형식과 일치하는 JSON 객체가 아니거나, `report_signature`가 없거나 다시 전송된 필드와 일치하지 않습니다. |
| `401` | `x-api-key`가 없거나 유효하지 않습니다. |## 다음 단계> [card] [지갑 스크리닝](https://docs.didit.me/ko/management-api/transactions/screen-wallet.md)
>
> 기반이 되는 온디맨드 지갑 스크리닝을 실행하고, 여기에 다시 전송할 JSON 결과를 가져옵니다.> [card] [온디맨드 지갑 스크리닝](https://docs.didit.me/ko/transaction-monitoring/wallet-screening.md)
>
> 독립형 지갑 스크리닝 endpoint와 결과 모델의 개요입니다.


## OpenAPI

````yaml ko/openapi-25.json POST /v3/wallet-screening/pdf/
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/wallet-screening/pdf/:
    post:
      tags:
        - Transactions
      summary: 지갑 스크리닝 결과를 PDF로 렌더링
      description: >-
        `POST /v3/wallet-screening/`의 상태 비저장(stateless) 동반 기능: 해당 endpoint가 반환한
        정확한 JSON 본문(추가된 `report_signature` 포함)을 다시 전송하여 동일한 결과의 Didit 브랜드 PDF를
        받습니다. 제공업체를 호출하지 않으며 요금이 청구되거나 데이터가 보존되지 않습니다. 이는 Didit이 이미 생성한 결과를 다시
        렌더링하기만 합니다. 서명은 PDF를 수정되지 않은 결과와 연결하므로, 다시 전송하기 전에 `risk_score`,
        `severity`, `sanctions_hit` 또는 기타 서명된 필드를 수정하면 `400` 오류가 발생합니다.
      operationId: screenWalletPdf
      requestBody:
        required: true
        description: >-
          `report_signature`를 포함하여 `POST /v3/wallet-screening/`에서 반환된 수정되지 않은
          JSON 객체입니다.
        content:
          application/json:
            schema:
              allOf:
                - $ref: '#/components/schemas/WalletScreeningResult'
              required:
                - report_signature
              description: >-
                `POST /v3/wallet-screening/` 응답과 동일한 형태입니다. `report_signature`를
                포함하여 해당 응답 본문을 그대로 다시 전달하십시오.
      responses:
        '200':
          description: 렌더링된 PDF 문서로, 바이너리 `application/pdf` 형식으로 직접 반환됩니다. JSON 래퍼가 없습니다.
          headers:
            Content-Disposition:
              description: >-
                다시 게시된 결과의 `wallet_address`(또는 `transaction_hash`)에서 파생된
                `attachment; filename=wallet_screening_{address}.pdf`입니다.
              schema:
                type: string
                example: >-
                  attachment;
                  filename=wallet_screening_0x28c6c06298d514db0899.pdf
          content:
            application/pdf:
              schema:
                type: string
                format: binary
        '400':
          description: >-
            본문이 지갑 스크리닝 결과 형식과 일치하는 JSON 객체가 아니거나, `report_signature`가 누락되었거나 다시
            게시된 필드와 일치하지 않습니다(다시 게시하기 전에 수정되거나 잘림).
          content:
            application/json:
              schema:
                type: object
              examples:
                Not an object:
                  value:
                    non_field_errors:
                      - >-
                        Expected a JSON object matching a wallet-screening
                        result.
                Missing or invalid signature:
                  value:
                    report_signature:
                      - >-
                        This wallet-screening result is missing or fails its
                        report signature - repost the exact JSON returned by the
                        wallet-screening endpoint, unmodified.
        '401':
          description: '`x-api-key`가 누락되었거나 유효하지 않습니다.'
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: >-
            # $RESULT is the saved JSON body from POST /v3/wallet-screening/

            curl -X POST
            'https://verification.didit.me/v3/wallet-screening/pdf/' \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -d "$RESULT" \
              -o wallet_screening_report.pdf
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            content = client.wallet_screening.screen_pdf(
                provider="your-provider",
                screening_type="WALLET_SCREENING",
                risk_score=1,
                severity="UNKNOWN",
                status="SCREENED",
                summary="your-summary",
                wallet_address="your-wallet-address",
                blockchain="your-blockchain",
                source_of_funds=[{}],
                destination_of_funds=[{}],
                counterparty_connections=[{}],
                sanctions_hit=True,
                dominant_risk_category="your-dominant-risk-category",
                report_signature="your-report-signature",
            )
            with open("download.pdf", "wb") as file:
                file.write(content)
        - lang: javascript
          label: Node.js
          source: >-
            import { writeFile } from "node:fs/promises";

            import Didit from "@didit-protocol/sdk-node";


            // Reads DIDIT_API_KEY.

            const didit = new Didit();


            const content = await didit.walletScreening.screenPdf({
              provider: "your-provider",
              screening_type: "WALLET_SCREENING",
              risk_score: 1,
              severity: "UNKNOWN",
              status: "SCREENED",
              summary: "your-summary",
              wallet_address: "your-wallet-address",
              blockchain: "your-blockchain",
              source_of_funds: [{}],
              destination_of_funds: [{}],
              counterparty_connections: [{}],
              sanctions_hit: true,
              dominant_risk_category: "your-dominant-risk-category",
              report_signature: "your-report-signature",
            });

            await writeFile("download.pdf", Buffer.from(await
            content.arrayBuffer()));
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresp, err := client.WalletScreening.ScreenPDF(ctx, didit.WalletScreeningResultParam{\n\tProvider:                \"your-provider\",\n\tScreeningType:           \"WALLET_SCREENING\",\n\tRiskScore:               1,\n\tSeverity:                \"UNKNOWN\",\n\tStatus:                  \"SCREENED\",\n\tSummary:                 \"your-summary\",\n\tWalletAddress:           \"your-wallet-address\",\n\tBlockchain:              \"your-blockchain\",\n\tSourceOfFunds:           []didit.WalletScreeningResultParamSourceOfFunds{{}},\n\tDestinationOfFunds:      []didit.WalletScreeningResultParamDestinationOfFunds{{}},\n\tCounterpartyConnections: []didit.WalletScreeningResultParamCounterpartyConnections{{}},\n\tSanctionsHit:            true,\n\tDominantRiskCategory:    didit.String(\"your-dominant-risk-category\"),\n\tReportSignature:         \"your-report-signature\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer resp.Body.Close()\nfile, err := os.Create(\"download.pdf\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer file.Close()\nif _, err := io.Copy(file, resp.Body); err != nil {\n\tlog.Fatal(err)\n}"
        - lang: java
          label: Java
          source: |-
            import java.nio.file.Path;
            import java.util.List;
            import me.didit.Didit;
            import me.didit.types.WalletScreeningResult;

            // Reads DIDIT_API_KEY.
            Didit client = new Didit();

            client.walletScreening().screenPdf(WalletScreeningResult.builder()
                    .provider("your-provider")
                    .screeningType(WalletScreeningResult.ScreeningType.of("WALLET_SCREENING"))
                    .riskScore(1L)
                    .severity(WalletScreeningResult.Severity.of("UNKNOWN"))
                    .status(WalletScreeningResult.Status.of("SCREENED"))
                    .summary("your-summary")
                    .walletAddress("your-wallet-address")
                    .blockchain("your-blockchain")
                    .sourceOfFunds(List.of(WalletScreeningResult.SourceOfFunds.builder()
                            .build()))
                    .destinationOfFunds(List.of(WalletScreeningResult.DestinationOfFunds.builder()
                            .build()))
                    .counterpartyConnections(List.of(WalletScreeningResult.CounterpartyConnections.builder()
                            .build()))
                    .sanctionsHit(true)
                    .dominantRiskCategory("your-dominant-risk-category")
                    .reportSignature("your-report-signature")
                    .build())
                    .writeTo(Path.of("download.pdf"));
        - lang: php
          label: PHP
          source: |-
            <?php

            require 'vendor/autoload.php';

            use Didit\DiditClient;

            // Reads DIDIT_API_KEY.
            $didit = new DiditClient();

            $content = $didit->walletScreening->screenPdf([
                'provider' => 'your-provider',
                'screening_type' => 'WALLET_SCREENING',
                'risk_score' => 1,
                'severity' => 'UNKNOWN',
                'status' => 'SCREENED',
                'summary' => 'your-summary',
                'wallet_address' => 'your-wallet-address',
                'blockchain' => 'your-blockchain',
                'source_of_funds' => [[]],
                'destination_of_funds' => [[]],
                'counterparty_connections' => [[]],
                'sanctions_hit' => true,
                'dominant_risk_category' => 'your-dominant-risk-category',
                'report_signature' => 'your-report-signature',
            ]);
            $content->saveTo('download.pdf');
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

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

            content = didit.wallet_screening.screen_pdf(
              provider: "your-provider",
              screening_type: "WALLET_SCREENING",
              risk_score: 1,
              severity: "UNKNOWN",
              status: "SCREENED",
              summary: "your-summary",
              wallet_address: "your-wallet-address",
              blockchain: "your-blockchain",
              source_of_funds: [{}],
              destination_of_funds: [{}],
              counterparty_connections: [{}],
              sanctions_hit: true,
              dominant_risk_category: "your-dominant-risk-category",
              report_signature: "your-report-signature"
            )
            File.binwrite("download.pdf", content)
        - lang: csharp
          label: .NET
          source: >-
            using System;

            using Didit;


            // Reads DIDIT_API_KEY.

            using var client = new DiditClient();


            var content = await client.WalletScreening.ScreenPdfAsync(new
            WalletScreeningResult

            {
                Provider = "your-provider",
                ScreeningType = "WALLET_SCREENING",
                RiskScore = 1,
                Severity = "UNKNOWN",
                Status = "SCREENED",
                Summary = "your-summary",
                WalletAddress = "your-wallet-address",
                Blockchain = "your-blockchain",
                SourceOfFunds = new WalletScreeningResultSourceOfFunds[] { new() },
                DestinationOfFunds = new WalletScreeningResultDestinationOfFunds[] { new() },
                CounterpartyConnections = new WalletScreeningResultCounterpartyConnections[] { new() },
                SanctionsHit = true,
                DominantRiskCategory = "your-dominant-risk-category",
                ReportSignature = "your-report-signature",
            });

            await content.SaveToAsync("download.pdf");
components:
  schemas:
    WalletScreeningResult:
      type: object
      properties:
        provider:
          type: string
          description: '스크리닝을 수행한 제공자입니다(예: `merklescience`, `crystal`).'
        screening_type:
          type: string
          enum:
            - WALLET_SCREENING
          description: 이 endpoint의 경우 항상 `WALLET_SCREENING`입니다.
        risk_score:
          type: integer
          description: >-
            정규화된 0-100 위험 점수입니다. 높을수록 위험한 엔티티에 대한 노출도가 높음을 의미합니다. Merkle
            Science는 주소를 0-5로 등급을 매기며, 이는 0, 15, 35, 55, 75 또는 95에 매핑됩니다.
        severity:
          type: string
          enum:
            - UNKNOWN
            - LOW
            - MEDIUM
            - HIGH
            - CRITICAL
          description: >-
            `risk_score`에서 파생된 위험 구간: `0-9` UNKNOWN, `10-39` LOW, `40-69`
            MEDIUM, `70-89` HIGH, `90-100` CRITICAL. `UNKNOWN`은 별도의 데이터 없음 상태가
            아니라 가장 낮은 구간입니다. 즉, `risk_score` 0(일반적인 정상 주소 사례)은 부정적인 평가가 없음을 의미하는
            반면, 1-9 범위의 0이 아닌 점수는 실제이지만 LOW 미만인 신호이므로 구간만 보지 말고 `risk_score`를
            확인해야 합니다. `UNKNOWN`을 긍정적인 저위험 또는 무결격 등급으로 간주하지 마십시오. 통과로 표시해서는 안
            됩니다.
        status:
          type: string
          enum:
            - SCREENED
            - PENDING
            - ERROR
          description: 스크리닝 결과 상태입니다.
        summary:
          type: string
          description: 스크리닝 결과에 대해 사람이 읽을 수 있는 요약입니다.
        wallet_address:
          type: string
          description: 스크리닝된 주소로, 그대로 반환됩니다.
        transaction_hash:
          type: string
          nullable: true
          description: 결과 형태와 공유되는 거래 스크리닝 필드입니다. 지갑 스크리닝 결과에서는 항상 `null`입니다.
        blockchain:
          type: string
          description: 스크리닝된 블록체인입니다.
        block_timestamp:
          type: string
          nullable: true
          description: 결과 형태와 공유되는 거래 스크리닝 필드입니다. 지갑 스크리닝 결과에서는 항상 `null`입니다.
        total_value_usd:
          type: number
          nullable: true
          description: 결과 형태와 공유되는 거래 스크리닝 필드입니다. 지갑 스크리닝 결과에서는 항상 `null`입니다.
        fee_usd:
          type: number
          nullable: true
          description: 결과 형태와 공유되는 거래 스크리닝 필드입니다. 지갑 스크리닝 결과에서는 항상 `null`입니다.
        sender_rows:
          type: array
          items:
            type: object
          description: 결과 형태와 공유되는 거래 스크리닝 필드입니다. 지갑 스크리닝 결과에서는 항상 비어 있습니다.
        receiver_rows:
          type: array
          items:
            type: object
          description: 결과 형태와 공유되는 거래 스크리닝 필드입니다. 지갑 스크리닝 결과에서는 항상 비어 있습니다.
        transaction_flows:
          type: array
          items:
            type: object
          description: 결과 형태와 공유되는 거래 스크리닝 필드입니다. 지갑 스크리닝 결과에서는 항상 비어 있습니다.
        transaction_flows_status:
          type: string
          nullable: true
          description: 결과 형태와 공유되는 거래 스크리닝 필드입니다. 지갑 스크리닝 결과에서는 항상 `null`입니다.
        transaction_flows_error:
          type: string
          nullable: true
          description: 결과 형태와 공유되는 거래 스크리닝 필드입니다. 지갑 스크리닝 결과에서는 항상 `null`입니다.
        source_of_funds:
          type: array
          description: 주소가 자금을 수취한 출처이며, 엔티티별로 귀속됩니다. 각 항목은 익스포저 세부 내역입니다.
          items:
            type: object
            properties:
              category:
                type: string
                description: >-
                  정규화된 위험 카테고리(예: `exchange_licensed`, `dex`, `defi`,
                  `payment_processor`, `mixer`, `darknet_market`, `sanctioned`,
                  `stolen_funds`, `high_risk_exchange`)입니다.
              percentage:
                type: number
                description: 해당 방향의 총 노출 점유율(0-100)입니다.
              amount_usd:
                type: number
                nullable: true
                description: 이 엔티티에 기인한 USD 가치입니다.
              entity_name:
                type: string
                nullable: true
                description: '귀속된 엔티티의 이름(예: 거래소, 믹서 또는 제재 대상 그룹).'
              entity_type:
                type: string
                nullable: true
                description: '제공자 엔터티 유형입니다(예: `Exchange`, `DeFi`, `Sanctions`, `Theft`).'
              entity_subtype:
                type: string
                nullable: true
                description: >-
                  더 세부적인 하위 유형입니다(예: `Mandatory KYC and AML`, `OFAC`, `Yield
                  Aggregator`).
              hops:
                type: integer
                nullable: true
                description: >-
                  제공업체가 보고하는 경우 엔티티까지의 홉 수입니다(직접 거래 상대방의 경우 1). 노출이 직접적인지 간접적인지만
                  보고하는 Merkle Science의 경우 항상 `null`이므로 `exposure_type`을 사용하십시오.
              description:
                type: string
                nullable: true
                description: 제공자가 엔티티에 지정한 라벨의 `entity_type / entity_subtype`.
              is_direct:
                type: boolean
                description: '`exposure_type`이 `direct`인 경우 true입니다.'
              exposure_direction:
                type: string
                enum:
                  - incoming
                  - outgoing
                  - connected
                description: >-
                  자금이 이 엔티티로부터 들어왔는지(`incoming`) 또는 이 엔티티로 나갔는지(`outgoing`)
                  여부입니다.
              exposure_type:
                type: string
                enum:
                  - direct
                  - indirect
                description: '`direct`(1홉) 또는 `indirect`(다중 홉) 노출.'
              provider_entity_id:
                type: string
                nullable: true
                description: 엔터티에 대한 공급자 자체 식별자입니다.
              provider_entity_type_id:
                type: string
                nullable: true
                description: '`entity_type`에 대한 공급자 자체 식별자입니다.'
              provider_entity_subtype_id:
                type: string
                nullable: true
                description: '`entity_subtype`에 대한 공급자 자체 식별자입니다.'
              country:
                type: string
                nullable: true
                description: >-
                  엔터티의 기본 ISO 3166-1 alpha-2 국가입니다. 제공업체가 알지 못하는 경우 비어 있거나
                  `null`입니다.
              raw_amount:
                type: number
                nullable: true
                description: 제공업체에서 보고한 경우, 자산 자체 단위 기준의 금액입니다.
              raw_currency:
                type: string
                nullable: true
                description: 제공업체에서 보고한 경우 `raw_amount`의 단위입니다.
        destination_of_funds:
          type: array
          description: >-
            주소가 자금을 전송한 대상이며, 엔티티별로 귀속됩니다. `exposure_direction` = `outgoing`인
            `source_of_funds`와 동일한 항목 형태를 갖습니다.
          items:
            type: object
            properties:
              category:
                type: string
                description: >-
                  정규화된 위험 카테고리(예: `exchange_licensed`, `dex`, `defi`,
                  `payment_processor`, `mixer`, `darknet_market`, `sanctioned`,
                  `stolen_funds`, `high_risk_exchange`)입니다.
              percentage:
                type: number
                description: 해당 방향의 총 노출 점유율(0-100)입니다.
              amount_usd:
                type: number
                nullable: true
                description: 이 엔티티에 기인한 USD 가치입니다.
              entity_name:
                type: string
                nullable: true
                description: '귀속된 엔티티의 이름(예: 거래소, 믹서 또는 제재 대상 그룹).'
              entity_type:
                type: string
                nullable: true
                description: '제공자 엔터티 유형입니다(예: `Exchange`, `DeFi`, `Sanctions`, `Theft`).'
              entity_subtype:
                type: string
                nullable: true
                description: >-
                  더 세부적인 하위 유형입니다(예: `Mandatory KYC and AML`, `OFAC`, `Yield
                  Aggregator`).
              hops:
                type: integer
                nullable: true
                description: >-
                  제공업체가 보고하는 경우 엔티티까지의 홉 수입니다(직접 거래 상대방의 경우 1). 노출이 직접적인지 간접적인지만
                  보고하는 Merkle Science의 경우 항상 `null`이므로 `exposure_type`을 사용하십시오.
              description:
                type: string
                nullable: true
                description: 제공자가 엔티티에 지정한 라벨의 `entity_type / entity_subtype`.
              is_direct:
                type: boolean
                description: '`exposure_type`이 `direct`인 경우 true입니다.'
              exposure_direction:
                type: string
                enum:
                  - incoming
                  - outgoing
                  - connected
                description: >-
                  자금이 이 엔티티로부터 들어왔는지(`incoming`) 또는 이 엔티티로 나갔는지(`outgoing`)
                  여부입니다.
              exposure_type:
                type: string
                enum:
                  - direct
                  - indirect
                description: '`direct`(1홉) 또는 `indirect`(다중 홉) 노출.'
              provider_entity_id:
                type: string
                nullable: true
                description: 엔터티에 대한 공급자 자체 식별자입니다.
              provider_entity_type_id:
                type: string
                nullable: true
                description: '`entity_type`에 대한 공급자 자체 식별자입니다.'
              provider_entity_subtype_id:
                type: string
                nullable: true
                description: '`entity_subtype`에 대한 공급자 자체 식별자입니다.'
              country:
                type: string
                nullable: true
                description: >-
                  엔터티의 기본 ISO 3166-1 alpha-2 국가입니다. 제공업체가 알지 못하는 경우 비어 있거나
                  `null`입니다.
              raw_amount:
                type: number
                nullable: true
                description: 제공업체에서 보고한 경우, 자산 자체 단위 기준의 금액입니다.
              raw_currency:
                type: string
                nullable: true
                description: 제공업체에서 보고한 경우 `raw_amount`의 단위입니다.
        counterparty_connections:
          type: array
          description: >-
            제공업체가 스크리닝된 주소의 소유로 귀속시킨 엔티티입니다. Merkle Science의 경우 주소 자체의 소유자 및 사용자
            태그에서 가져오므로 동일한 엔티티가 두 번 나타날 수 있으며 자금 흐름을 포함하지 않습니다(`received_usd`,
            `sent_usd`, `received_hops`, `sent_hops`는 `null`이고 `percentage`는 0).
            여기서는 `risk_level`이나 `is_direct`를 기준으로 라우팅하지 마세요. 판정에는
            `sanctions_hit`, `dominant_risk_category`,
            `risk_factors[].is_high_risk`를 사용하고, 직접성 여부에는
            `source_of_funds`/`destination_of_funds`의 `exposure_type`을 사용하세요.
          items:
            type: object
            properties:
              entity_name:
                type: string
                nullable: true
                description: 귀속된 엔터티 이름입니다.
              entity_type:
                type: string
                nullable: true
                description: 제공자 엔터티 유형입니다.
              entity_subtype:
                type: string
                nullable: true
                description: 제공자 엔터티 하위 유형입니다.
              risk_level:
                type: string
                description: >-
                  소문자이며 제공업체에 따라 다릅니다. Merkle Science의 경우 주소 자체의 0-5 위험
                  등급(`no_risk`, `low`, `medium_low`, `medium`, `high`,
                  `critical`)이며, 엔터티의 카테고리가 고위험인 경우 `high`로 상향 조정됩니다. 이는 엔터티의 별도
                  등급이 아닙니다.
              categories:
                type: array
                items:
                  type: string
                description: 엔티티의 정규화된 위험 카테고리입니다.
              received_usd:
                type: number
                nullable: true
                description: 제공업체가 보고한 경우, 엔티티로부터 수취한 USD 금액입니다.
              sent_usd:
                type: number
                nullable: true
                description: 제공업체가 보고한 경우, 엔티티로 송금한 USD 금액입니다.
              received_hops:
                type: integer
                nullable: true
                description: 제공업체에서 보고한 경우, 수신 측 엔티티까지의 홉 수입니다.
              sent_hops:
                type: integer
                nullable: true
                description: 제공업체에서 보고한 경우, 송신 측 엔티티까지의 홉 수입니다.
              percentage:
                type: number
                description: 제공업체가 보고하는 경우 주소의 노출 점유율이며, 그렇지 않은 경우 0입니다.
              is_direct:
                type: boolean
                description: 연결이 거래 상대방이 아닌 귀속 정보인 Merkle Science의 경우 항상 `true`입니다.
              country:
                type: string
                nullable: true
                description: 알려진 경우 엔터티의 국가입니다.
              provider_entity_id:
                type: string
                nullable: true
                description: 엔터티에 대한 공급자 자체 식별자입니다.
        network_nodes:
          type: array
          items:
            type: object
          description: 거래 스크리닝을 위한 익스포저 그래프 노드입니다. 지갑 스크리닝 결과에서는 비어 있습니다.
        network_edges:
          type: array
          items:
            type: object
          description: 거래 스크리닝을 위한 익스포저 그래프 에지입니다. 지갑 스크리닝 결과에서는 비어 있습니다.
        sanctions_hit:
          type: boolean
          description: 주소가 직접 또는 간접적인 제재에 노출된 경우 true입니다.
        pep_counterparty:
          type: boolean
          description: >-
            정치적 주요 인물(PEP) 노출 여부입니다. PEP 결과가 없는 경우 `null`이며, 현재 어떤 제공업체도 이를 보고하지
            않으므로 모든 결과가 이에 해당합니다. 명시적인 부정적 스크리닝 결과에 대해서만 `false`입니다. `null`을 완료된
            PEP 확인으로 간주하지 마십시오.
          nullable: true
        dominant_risk_category:
          type: string
          nullable: true
          description: >-
            가중치가 가장 높은 고위험 카테고리이거나, 지배적인 카테고리가 없는 경우 `null`입니다(예: `sanctioned`,
            `mixer`, `stolen_funds`).
        risk_factors:
          type: array
          description: >-
            `risk_score`에 대한 순위별 설명입니다. 이 판정이 도출된 원인을 나타냅니다. 제공자는 자체 모델을 기반으로
            주소의 등급을 매기고 판정 결과만 반환하므로(Merkle Science는 0-5 사이의 정수 반환), 점수만으로는 조치를
            취하기 어렵습니다. 고위험 항목이 먼저 정렬되고, 그 다음 각 요인을 통해 이동한 금액 순으로 정렬되며 상위 5개로
            제한됩니다. `source_of_funds` 및 `destination_of_funds`에는 항상 전체 내역이 포함됩니다.
            `is_high_risk` 항목이 없는데 `risk_score`가 높다면 제공자가 제재 또는 주소에 귀속된 엔티티 일치를
            보고하지 않았으며 순전히 자체 위험 노출 모델에 따라 주소 등급을 매겼음을 의미합니다. `summary`에 이 내용이
            명시적으로 표시됩니다.
          items:
            type: object
            properties:
              source:
                type: string
                enum:
                  - attribution
                  - exposure
                description: >-
                  `attribution`은 공급업체가 해당 주소 자체에 대해 식별한 정보(자체 태그 또는 클러스터)이며,
                  `exposure`는 자금이 실제로 이동한 위치입니다.
              category:
                type: string
                description: 정규화된 위험 카테고리로, 노출 세부 내역과 동일한 어휘를 사용합니다.
              label:
                type: string
                description: >-
                  공급자 콘솔에서도 확인할 수 있는 드라이버에 대한 공급자 자체 문구입니다(예: `Gambling / Crypto
                  only`).
              entity_name:
                type: string
                nullable: true
                description: '드라이버 배후에 귀속된 엔터티입니다(예: 도박 사이트 또는 거래소).'
              direction:
                type: string
                enum:
                  - incoming
                  - outgoing
                  - connected
                  - unknown
                  - attribution
                description: >-
                  자금 흐름의 방향입니다. 드라이버가 주소 자체의 태그인 경우 `attribution`, 제공업체가 방향을
                  보고하지 않은 경우 `unknown`입니다.
              exposure_type:
                type: string
                enum:
                  - direct
                  - indirect
                  - unknown
                  - attribution
                description: >-
                  `direct`(1홉) 또는 `indirect`(다중 홉), 주소 자체 태그의 경우 `attribution`,
                  제공자가 거래 상대방의 홉 수를 명시하지 않은 경우 `unknown`. `unknown`은 `direct`가
                  아닌 미분류로 처리하십시오.
              amount_usd:
                type: number
                format: float
                nullable: true
                description: 이 드라이버에 귀속된 USD 가치입니다.
              percentage:
                type: number
                format: float
                description: >-
                  두 방향을 합산한 주소의 전체 스크리닝 볼륨 점유율입니다. 방향별로 정규화되는
                  `source_of_funds`/`destination_of_funds` 내부의 `percentage`와
                  다릅니다. 전체 목록에 걸쳐 비교 및 합산이 가능합니다.
              is_high_risk:
                type: boolean
                description: >-
                  해당 카테고리가 Didit에서 고위험으로 처리하는 카테고리(`sanctioned`, `mixer`,
                  `stolen_funds`, `ransomware`, `scam`, `darknet_market`,
                  `terrorist_financing`, `child_exploitation`,
                  `hacked_exchange`, `high_risk_exchange`, `seized_funds`)인지
                  여부입니다.
              description:
                type: string
                description: >-
                  드라이버를 한 줄로 표시한 것입니다(예: `9.01% indirect outgoing exposure to
                  Gambling / Crypto only (Example Gambling)`).
        raw_response:
          type: object
          additionalProperties: true
          description: >-
            공급자 자체 payload입니다. 형태는 공급자마다 다르며 사전 예고 없이 변경될 수 있으므로, 이를 직접 파싱하지 말고
            정규화된 필드를 확인하십시오.
        report_signature:
          type: string
          description: >-
            애플리케이션으로 범위가 지정된, 이 정확한 결과에 대한 불투명한 HMAC-SHA256 서명입니다. 단독으로는 의미가
            없으며, PDF로 렌더링하려면 이 필드를 포함하여 수정되지 않은 전체 응답 본문을 `POST
            /v3/wallet-screening/pdf/`로 다시 전송해야 합니다. `report_signature`가 누락되었거나
            다시 전송하기 전에 서명된 필드(예: `risk_score`, `severity`, `sanctions_hit`)가 수정된
            경우, PDF endpoint에서는 요청을 `400`으로 거부합니다.
      required:
        - provider
        - screening_type
        - risk_score
        - severity
        - status
        - summary
        - wallet_address
        - blockchain
        - sanctions_hit
        - dominant_risk_category
        - source_of_funds
        - destination_of_funds
        - counterparty_connections
        - report_signature
  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.