> ## 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 формирует 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>



      
      

Вставьте в

## Почему запрос не сохраняет состояниеСкрининг кошелька по запросу не записывает ничего в таблицу транзакций, поэтому этому эндпоинту не из чего отрисовать отчёт. Вместо этого вы повторно отправляете точный JSON, который вам вернул `POST /v3/wallet-screening/`. Didit отрисовывает этот payload в PDF и не обращается к провайдеру повторно.## Поле `report_signature`Каждый ответ `POST /v3/wallet-screening/` теперь содержит поле `report_signature`: непрозрачную подпись, привязанную к вашему приложению. Перед отрисовкой этот эндпоинт проверяет подпись. Благодаря этому вызывающая сторона не может изменить `risk_score`, `severity`, `sanctions_hit` или любое другое поле и получить аккуратный PDF с брендингом Didit для результата, который 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
```## ОплатаПровайдер не вызывается, и плата не взимается. Этот запрос только повторно отрисовывает результат, за который вы уже заплатили при вызове `POST /v3/wallet-screening/`.## Ошибки| Статус | Значение |
| - | - |
| `400` | Тело запроса не является JSON-объектом, соответствующим структуре результата скрининга кошелька, или `report_signature` отсутствует либо не совпадает с повторно отправленными полями. |
| `401` | Заголовок `x-api-key` отсутствует или недействителен. |## Следующие шаги> [card] [Скрининг кошелька](https://docs.didit.me/ru/management-api/transactions/screen-wallet.md)
>
> Выполните скрининг кошелька по запросу и получите JSON-результат, который нужно повторно отправить на этот эндпоинт.> [card] [Скрининг кошельков по запросу](https://docs.didit.me/ru/transaction-monitoring/wallet-screening.md)
>
> Обзор эндпоинта скрининга кошелька по запросу и модели результата.


## OpenAPI

````yaml ru/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/`:
        отправьте повторно точное тело JSON, возвращённое этим endpoint —
        включая добавленную им `report_signature` — и получите фирменный PDF
        Didit с тем же результатом. Провайдеры не вызываются, плата не взимается
        и данные не сохраняются; выполняется лишь повторный рендеринг
        результата, ранее сформированного Didit. Подпись привязывает PDF к
        неизменённому результату: изменение `risk_score`, `severity`,
        `sanctions_hit` или любого другого подписанного поля перед повторной
        отправкой приведёт к ошибке `400`.
      operationId: screenWalletPdf
      requestBody:
        required: true
        description: >-
          Неизменённый JSON-объект, возвращённый `POST /v3/wallet-screening/`,
          включая `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: Всегда `WALLET_SCREENING` для этого endpoint.
        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: Сумма в 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 для прямого контрагента),
                  если провайдер его возвращает. Всегда `null` для Merkle
                  Science, который сообщает только о том, является ли экспозиция
                  прямой или косвенной: используйте `exposure_type`.
              description:
                type: string
                nullable: true
                description: >-
                  `entity_type / entity_subtype`, как сущность помечена
                  провайдером.
              is_direct:
                type: boolean
                description: True, когда `exposure_type` имеет значение `direct`.
              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: >-
            Куда адрес отправлял средства, с атрибуцией по сущностям. Та же
            структура элементов, что и у `source_of_funds`, с
            `exposure_direction` = `outgoing`.
          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 для прямого контрагента),
                  если провайдер его возвращает. Всегда `null` для Merkle
                  Science, который сообщает только о том, является ли экспозиция
                  прямой или косвенной: используйте `exposure_type`.
              description:
                type: string
                nullable: true
                description: >-
                  `entity_type / entity_subtype`, как сущность помечена
                  провайдером.
              is_direct:
                type: boolean
                description: True, когда `exposure_type` имеет значение `direct`.
              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` для
            итогового решения, а `exposure_type` в
            `source_of_funds`/`destination_of_funds` для определения прямого
            характера транзакции.
          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: >-
                  Количество переходов (hops) до сущности на стороне получателя,
                  если провайдер передаёт эти данные.
              sent_hops:
                type: integer
                nullable: true
                description: >-
                  Количество переходов (hops) до сущности на стороне
                  отправителя, если провайдер передаёт эти данные.
              percentage:
                type: number
                description: >-
                  Доля экспозиции адреса, если поставщик сообщает это значение;
                  в противном случае 0.
              is_direct:
                type: boolean
                description: >-
                  Всегда `true` для Merkle Science, чьи связи являются
                  атрибуциями, а не контрагентами.
              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`, если данных о PEP
            нет (что относится ко всем текущим результатам, так как ни один
            провайдер их не возвращает); `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: Сумма в USD, относящаяся к этому драйверу.
              percentage:
                type: number
                format: float
                description: >-
                  Доля от ОБЩЕГО проверенного объёма адреса в обоих направлениях
                  суммарно, в отличие от `percentage` внутри
                  `source_of_funds`/`destination_of_funds`, который
                  нормализуется по каждому направлению отдельно. Сопоставима и
                  суммируема по всему списку.
              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. Endpoint для PDF отклоняет запрос с
            ошибкой `400`, если `report_signature` отсутствует или если
            какое-либо подписанное поле (например, `risk_score`, `severity`,
            `sanctions_hit`) было изменено перед повторной отправкой.
      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-ключ вашего приложения из раздела «Разработчикам» -> «API-ключи» в
        Business Console. Основной ключ имеет полный доступ. Именованный ключ
        может иметь ограниченную область действия: без доступа, чтение или
        запись для каждого ресурса, ограничение определенными сценариями или
        одобренными сессиями, списком IP-адресов и сроком действия. 401
        означает, что ключ неверен, отозван или его срок действия истек; 403
        означает, что ключ не был передан, у ключа нет доступа к этому ресурсу
        или действию, либо запрос поступил с адреса вне его списка IP-адресов;
        404 на маршруте сессии означает, что сессия не входит в сценарии или
        статусы ключа. Ключ без доступа к медиа получает URL изображений, видео
        и PDF как null, а ключ без прав на запись сессий получает ссылки на
        сессии и токены как null. См. https://docs.didit.me/console/api-keys.

````

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