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

> Didit 可将钱包筛查结果渲染为带 Didit 品牌标识的 PDF：将筛查接口返回的 JSON 原样回传即可。无状态，不调用服务商，也不产生额外费用。



筛查钱包 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>



      
      

粘贴到

## 为什么是无状态的独立的钱包筛查不会向 transactions 表写入任何记录，因此 endpoint 没有可供渲染的已存储记录。取而代之，您需要重新提交 `POST /v3/wallet-screening/` 已返回给您的完全相同的 JSON。Didit 会将该 payload 渲染为 PDF，无需再次调用服务提供方。## `report_signature` 字段每个 `POST /v3/wallet-screening/` 响应现在都包含 `report_signature` 字段，这是一个限定于您应用的不透明签名。endpoint 在渲染前会验证该签名，因此调用方无法修改 `risk_score`、`severity`、`sanctions_hit` 或任何其他字段，从而获得一份外观正常、带有 Didit 品牌的 PDF，而其内容并非 Didit 实际生成的结果。请始终原样重新提交完整的响应正文，包括 `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/zh/management-api/transactions/screen-wallet.md)
>
> 运行底层的按需钱包筛查，并获取需要在此重新提交的 JSON 结果。> [card] [按需钱包筛查](https://docs.didit.me/zh/transaction-monitoring/wallet-screening.md)
>
> 独立钱包筛查 endpoint 及结果模型的概述。


## OpenAPI

````yaml zh/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/` 的无状态配套接口：重新提交该 endpoint 返回的完全相同的 JSON
        请求体（包括其添加的 `report_signature`），即可获取相同结果的 Didit 品牌
        PDF。此操作不会调用任何服务商，不产生计费，也不会持久化存储；仅重新渲染 Didit 已经生成的结果。该签名将 PDF
        与未修改的结果绑定：在重新提交前修改 `risk_score`、`severity`、`sanctions_hit`
        或任何其他签名字段将导致请求失败并返回 `400`。
      operationId: screenWalletPdf
      requestBody:
        required: true
        description: 由 `POST /v3/wallet-screening/` 返回的未经修改的 JSON 对象，包括 `report_signature`。
        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: >-
                `attachment;
                filename=wallet_screening_{address}.pdf`，派生自重新提交的结果中的
                `wallet_address`（或 `transaction_hash`）。
              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
            范围内的非零分数是真实存在但低于 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: 归属于该实体的美元价值。
              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: 归属于该实体的美元价值。
              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: 从实体收到的美元金额（服务商报告时）。
              sent_usd:
                type: number
                nullable: true
                description: 发送给实体的美元金额（服务商报告时）。
              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 发现结果时为
            `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
            的整数），因此仅凭该分数无法采取操作。按高风险优先排序，随后按流经各驱动因素的价值排序，最多保留五个影响最大的因素；`source_of_funds`
            和 `destination_of_funds` 始终包含完整的明细。若 `risk_score` 较高但没有
            `is_high_risk`
            条目，则表示数据源未报告任何制裁或归属实体匹配，纯粹根据其自身的风险敞口模型对该地址进行了评级，`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: 归属于该驱动因素的美元价值。
              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
            签名，作用域限定于您的应用。该字段本身无单独意义，请将未经修改且包含此字段的完整响应体重新发送至 `POST
            /v3/wallet-screening/pdf/` 以将其渲染为 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: >-
        您的应用 API 密钥，可在 Business Console 的“开发者 -> API
        密钥”中获取。主密钥拥有完整访问权限。指定名称的密钥可设置作用域：针对每个资源设为无权限、只读或读写，限定于特定工作流或已通过的会话、限定于
        IP 地址列表，以及设置到期日期。401 表示密钥错误、已撤销或已过期；403 表示未发送密钥、密钥无权访问该资源或操作，或请求来自其 IP
        列表之外的地址；在会话路由上返回 404 表示该会话不在该密钥允许的工作流或状态范围内。没有媒体访问权限的密钥获取到的图片、视频和 PDF
        URL 将为 null；没有会话写入权限的密钥获取到的会话链接和 token 将为 null。请参阅
        https://docs.didit.me/console/api-keys。

````

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