> ## Documentation Index
> Fetch the complete documentation index at: https://docs.didit.me/llms.txt
> Use this file to discover all available pages before exploring further.

# API de relatório PDF de triagem de carteira

> Gere em PDF com a marca Didit a triagem de carteira reenviando o JSON do endpoint. Sem estado, sem chamar o provedor, sem cobrança extra.



Prompt para gerar o PDF da triagem de carteira
        Copiar o prompt para a área de transferência



      
      

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



      
      

Colar em

## Por que é sem estadoA triagem de carteiras avulsa não grava nada na tabela de transações, então não existe um registro armazenado a partir do qual este endpoint possa gerar o PDF. Em vez disso, você reenvia exatamente o JSON que o `POST /v3/wallet-screening/` já retornou, e a Didit transforma esse payload em PDF sem consultar novamente um provedor.## O campo `report_signature`Toda resposta do `POST /v3/wallet-screening/` agora inclui o campo `report_signature`, uma assinatura opaca vinculada à sua aplicação. Este endpoint verifica essa assinatura antes de gerar o PDF, de modo que ninguém consiga editar `risk_score`, `severity`, `sanctions_hit` ou qualquer outro campo e obter um PDF com a marca Didit, de aparência legítima, para um resultado que a Didit nunca produziu.Sempre reenvie o corpo completo da resposta **sem modificações**, incluindo `report_signature`. Reordenar as chaves é permitido; não é permitido alterar nenhum valor assinado.```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
```## FaturamentoNenhuma chamada ao provedor é feita e nada é cobrado: este endpoint apenas gera novamente um resultado pelo qual você já pagou ao chamar o `POST /v3/wallet-screening/`.## Erros| Status | Significado |
| - | - |
| `400` | O corpo não é um objeto JSON que corresponde à estrutura do resultado da triagem de carteira, ou `report_signature` está ausente ou não corresponde aos campos reenviados. |
| `401` | `x-api-key` ausente ou inválido. |## Próximos passos> [card] [Triagem de carteira](https://docs.didit.me/pt-br/management-api/transactions/screen-wallet.md)
>
> Execute a triagem de carteira sob demanda e obtenha o resultado em JSON para reenviar aqui.> [card] [Triagem de carteiras sob demanda](https://docs.didit.me/pt-br/transaction-monitoring/wallet-screening.md)
>
> Visão geral do endpoint independente de triagem de carteiras e do modelo de resultado.


## OpenAPI

````yaml pt-br/openapi-25.json POST /v3/wallet-screening/pdf/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API de verificação de identidade. Autentique-se com o cabeçalho x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/wallet-screening/pdf/:
    post:
      tags:
        - Transactions
      summary: Gerar o resultado de uma triagem de carteiras em PDF
      description: >-
        Complemento sem estado de `POST /v3/wallet-screening/`: reenvie
        exatamente o corpo JSON que esse endpoint retornou, incluindo a
        `report_signature` que ele adicionou, e receba um PDF com a marca Didit
        do mesmo resultado. Nenhum provedor é chamado e nada é cobrado nem
        armazenado; isso apenas renderiza novamente um resultado que a Didit já
        produziu. A assinatura vincula o PDF a um resultado não modificado:
        editar `risk_score`, `severity`, `sanctions_hit` ou qualquer outro campo
        assinado antes de reenviar resulta em falha com `400`.
      operationId: screenWalletPdf
      requestBody:
        required: true
        description: >-
          O objeto JSON sem modificações retornado por `POST
          /v3/wallet-screening/`, incluindo `report_signature`.
        content:
          application/json:
            schema:
              allOf:
                - $ref: '#/components/schemas/WalletScreeningResult'
              required:
                - report_signature
              description: >-
                Mesmo formato da resposta de `POST /v3/wallet-screening/`: envie
                de volta o corpo dessa resposta literalmente, incluindo
                `report_signature`.
      responses:
        '200':
          description: >-
            O documento PDF renderizado, retornado diretamente como binário
            `application/pdf`: não há wrapper JSON.
          headers:
            Content-Disposition:
              description: >-
                `attachment; filename=wallet_screening_{address}.pdf`, derivado
                de `wallet_address` (ou `transaction_hash`) no resultado
                reenviado.
              schema:
                type: string
                example: >-
                  attachment;
                  filename=wallet_screening_0x28c6c06298d514db0899.pdf
          content:
            application/pdf:
              schema:
                type: string
                format: binary
        '400':
          description: >-
            O corpo não é um objeto JSON que corresponda ao formato do resultado
            da triagem de carteiras, ou `report_signature` está ausente ou não
            corresponde aos campos reenviados (editados ou truncados antes do
            reenvio).
          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` ausente ou inválido.'
      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: >-
            Provedor que realizou a triagem (por exemplo, `merklescience`,
            `crystal`).
        screening_type:
          type: string
          enum:
            - WALLET_SCREENING
          description: Sempre `WALLET_SCREENING` neste endpoint.
        risk_score:
          type: integer
          description: >-
            Pontuação de risco normalizada de 0 a 100. Quanto maior, maior a
            exposição a entidades de risco. A Merkle Science classifica um
            endereço de 0 a 5, o que corresponde a 0, 15, 35, 55, 75 ou 95.
        severity:
          type: string
          enum:
            - UNKNOWN
            - LOW
            - MEDIUM
            - HIGH
            - CRITICAL
          description: >-
            Faixa de risco derivada de `risk_score`: `0-9` UNKNOWN, `10-39` LOW,
            `40-69` MEDIUM, `70-89` HIGH, `90-100` CRITICAL. `UNKNOWN` é a faixa
            mais baixa, não um estado separado de ausência de dados. Um
            `risk_score` 0 (o caso comum de endereço limpo) significa que não há
            avaliação adversa. Já uma pontuação diferente de zero na faixa de
            1-9 é um sinal real, mas abaixo de LOW. Leia o `risk_score`, não
            apenas a faixa. Nunca trate `UNKNOWN` como uma classificação
            afirmativa de baixo risco ou de aprovação, e não o exiba como
            aprovado.
        status:
          type: string
          enum:
            - SCREENED
            - PENDING
            - ERROR
          description: Status do resultado da análise.
        summary:
          type: string
          description: Resumo legível do resultado da triagem.
        wallet_address:
          type: string
          description: O endereço analisado, devolvido na resposta.
        transaction_hash:
          type: string
          nullable: true
          description: >-
            Campo de triagem de transações, compartilhado com o formato do
            resultado. Sempre `null` em um resultado de triagem de carteiras.
        blockchain:
          type: string
          description: A blockchain que foi analisada.
        block_timestamp:
          type: string
          nullable: true
          description: >-
            Campo de triagem de transações, compartilhado com o formato do
            resultado. Sempre `null` em um resultado de triagem de carteiras.
        total_value_usd:
          type: number
          nullable: true
          description: >-
            Campo de triagem de transações, compartilhado com o formato do
            resultado. Sempre `null` em um resultado de triagem de carteiras.
        fee_usd:
          type: number
          nullable: true
          description: >-
            Campo de triagem de transações, compartilhado com o formato do
            resultado. Sempre `null` em um resultado de triagem de carteiras.
        sender_rows:
          type: array
          items:
            type: object
          description: >-
            Campo de triagem de transações, compartilhado com o formato do
            resultado. Sempre vazio em um resultado de triagem de carteiras.
        receiver_rows:
          type: array
          items:
            type: object
          description: >-
            Campo de triagem de transações, compartilhado com o formato do
            resultado. Sempre vazio em um resultado de triagem de carteiras.
        transaction_flows:
          type: array
          items:
            type: object
          description: >-
            Campo de triagem de transações, compartilhado com o formato do
            resultado. Sempre vazio em um resultado de triagem de carteiras.
        transaction_flows_status:
          type: string
          nullable: true
          description: >-
            Campo de triagem de transações, compartilhado com o formato do
            resultado. Sempre `null` em um resultado de triagem de carteiras.
        transaction_flows_error:
          type: string
          nullable: true
          description: >-
            Campo de triagem de transações, compartilhado com o formato do
            resultado. Sempre `null` em um resultado de triagem de carteiras.
        source_of_funds:
          type: array
          description: >-
            De onde o endereço recebeu fundos, atribuídos por entidade. Cada
            entrada é um detalhamento de exposição.
          items:
            type: object
            properties:
              category:
                type: string
                description: >-
                  Categoria de risco normalizada, por exemplo
                  `exchange_licensed`, `dex`, `defi`, `payment_processor`,
                  `mixer`, `darknet_market`, `sanctioned`, `stolen_funds`,
                  `high_risk_exchange`.
              percentage:
                type: number
                description: Participação na exposição total da direção, de 0 a 100.
              amount_usd:
                type: number
                nullable: true
                description: Valor em USD atribuído a esta entidade.
              entity_name:
                type: string
                nullable: true
                description: >-
                  Nome da entidade atribuída, por exemplo uma exchange, um mixer
                  ou um grupo sancionado.
              entity_type:
                type: string
                nullable: true
                description: >-
                  Tipo da entidade no provedor (por exemplo, `Exchange`, `DeFi`,
                  `Sanctions`, `Theft`).
              entity_subtype:
                type: string
                nullable: true
                description: >-
                  Subtipo mais detalhado (por exemplo, `Mandatory KYC and AML`,
                  `OFAC`, `Yield Aggregator`).
              hops:
                type: integer
                nullable: true
                description: >-
                  Número de saltos até a entidade (1 para uma contraparte
                  direta), quando o provedor informa esse dado. Sempre `null`
                  para a Merkle Science, que informa apenas se a exposição é
                  direta ou indireta: use `exposure_type`.
              description:
                type: string
                nullable: true
                description: >-
                  `entity_type / entity_subtype`, conforme o provedor classifica
                  a entidade.
              is_direct:
                type: boolean
                description: True quando `exposure_type` é `direct`.
              exposure_direction:
                type: string
                enum:
                  - incoming
                  - outgoing
                  - connected
                description: >-
                  Se os fundos vieram desta entidade (`incoming`) ou foram
                  enviados a ela (`outgoing`).
              exposure_type:
                type: string
                enum:
                  - direct
                  - indirect
                description: Exposição `direct` (1 salto) ou `indirect` (vários saltos).
              provider_entity_id:
                type: string
                nullable: true
                description: O identificador próprio do provedor para a entidade.
              provider_entity_type_id:
                type: string
                nullable: true
                description: O identificador próprio do provedor para `entity_type`.
              provider_entity_subtype_id:
                type: string
                nullable: true
                description: O identificador próprio do provedor para `entity_subtype`.
              country:
                type: string
                nullable: true
                description: >-
                  País principal da entidade no formato ISO 3166-1 alpha-2.
                  Vazio ou `null` quando o provedor não o conhece.
              raw_amount:
                type: number
                nullable: true
                description: >-
                  Valor na própria unidade do ativo, quando o provedor o
                  informa.
              raw_currency:
                type: string
                nullable: true
                description: Unidade de `raw_amount`, quando o provedor a informa.
        destination_of_funds:
          type: array
          description: >-
            Para onde o endereço enviou fundos, atribuídos por entidade. Mesmo
            formato de item de `source_of_funds`, com `exposure_direction` =
            `outgoing`.
          items:
            type: object
            properties:
              category:
                type: string
                description: >-
                  Categoria de risco normalizada, por exemplo
                  `exchange_licensed`, `dex`, `defi`, `payment_processor`,
                  `mixer`, `darknet_market`, `sanctioned`, `stolen_funds`,
                  `high_risk_exchange`.
              percentage:
                type: number
                description: Participação na exposição total da direção, de 0 a 100.
              amount_usd:
                type: number
                nullable: true
                description: Valor em USD atribuído a esta entidade.
              entity_name:
                type: string
                nullable: true
                description: >-
                  Nome da entidade atribuída, por exemplo uma exchange, um mixer
                  ou um grupo sancionado.
              entity_type:
                type: string
                nullable: true
                description: >-
                  Tipo da entidade no provedor (por exemplo, `Exchange`, `DeFi`,
                  `Sanctions`, `Theft`).
              entity_subtype:
                type: string
                nullable: true
                description: >-
                  Subtipo mais detalhado (por exemplo, `Mandatory KYC and AML`,
                  `OFAC`, `Yield Aggregator`).
              hops:
                type: integer
                nullable: true
                description: >-
                  Número de saltos até a entidade (1 para uma contraparte
                  direta), quando o provedor informa esse dado. Sempre `null`
                  para a Merkle Science, que informa apenas se a exposição é
                  direta ou indireta: use `exposure_type`.
              description:
                type: string
                nullable: true
                description: >-
                  `entity_type / entity_subtype`, conforme o provedor classifica
                  a entidade.
              is_direct:
                type: boolean
                description: True quando `exposure_type` é `direct`.
              exposure_direction:
                type: string
                enum:
                  - incoming
                  - outgoing
                  - connected
                description: >-
                  Se os fundos vieram desta entidade (`incoming`) ou foram
                  enviados a ela (`outgoing`).
              exposure_type:
                type: string
                enum:
                  - direct
                  - indirect
                description: Exposição `direct` (1 salto) ou `indirect` (vários saltos).
              provider_entity_id:
                type: string
                nullable: true
                description: O identificador próprio do provedor para a entidade.
              provider_entity_type_id:
                type: string
                nullable: true
                description: O identificador próprio do provedor para `entity_type`.
              provider_entity_subtype_id:
                type: string
                nullable: true
                description: O identificador próprio do provedor para `entity_subtype`.
              country:
                type: string
                nullable: true
                description: >-
                  País principal da entidade no formato ISO 3166-1 alpha-2.
                  Vazio ou `null` quando o provedor não o conhece.
              raw_amount:
                type: number
                nullable: true
                description: >-
                  Valor na própria unidade do ativo, quando o provedor o
                  informa.
              raw_currency:
                type: string
                nullable: true
                description: Unidade de `raw_amount`, quando o provedor a informa.
        counterparty_connections:
          type: array
          description: >-
            Entidades às quais o provedor atribui o endereço analisado. Para a
            Merkle Science, elas vêm das tags de proprietário e de usuário do
            próprio endereço, então a mesma entidade pode aparecer duas vezes, e
            não trazem fluxos de fundos: `received_usd`, `sent_usd`,
            `received_hops` e `sent_hops` são `null` e `percentage` é 0. Não
            tome decisões com base em `risk_level` ou `is_direct` aqui: use
            `sanctions_hit`, `dominant_risk_category` e
            `risk_factors[].is_high_risk` para o veredito, e `exposure_type` em
            `source_of_funds`/`destination_of_funds` para saber se a exposição é
            direta.
          items:
            type: object
            properties:
              entity_name:
                type: string
                nullable: true
                description: Nome da entidade atribuída.
              entity_type:
                type: string
                nullable: true
                description: Tipo da entidade no provedor.
              entity_subtype:
                type: string
                nullable: true
                description: Subtipo da entidade no provedor.
              risk_level:
                type: string
                description: >-
                  Em minúsculas e dependente do provedor. Para a Merkle Science,
                  é o próprio grau de risco de 0 a 5 do endereço (`no_risk`,
                  `low`, `medium_low`, `medium`, `high`, `critical`), elevado
                  para `high` quando a categoria da entidade é de alto risco;
                  não é um grau separado da entidade.
              categories:
                type: array
                items:
                  type: string
                description: Categorias de risco normalizadas da entidade.
              received_usd:
                type: number
                nullable: true
                description: >-
                  Valor em USD recebido da entidade, quando o provedor o
                  informa.
              sent_usd:
                type: number
                nullable: true
                description: Valor em USD enviado à entidade, quando o provedor o informa.
              received_hops:
                type: integer
                nullable: true
                description: >-
                  Saltos até a entidade do lado receptor, quando o provedor os
                  informa.
              sent_hops:
                type: integer
                nullable: true
                description: >-
                  Saltos até a entidade do lado remetente, quando o provedor os
                  informa.
              percentage:
                type: number
                description: >-
                  Participação na exposição do endereço, quando o provedor a
                  informa; caso contrário, 0.
              is_direct:
                type: boolean
                description: >-
                  Sempre `true` para a Merkle Science, cujas conexões são
                  atribuições, e não contrapartes.
              country:
                type: string
                nullable: true
                description: País da entidade, quando conhecido.
              provider_entity_id:
                type: string
                nullable: true
                description: O identificador próprio do provedor para a entidade.
        network_nodes:
          type: array
          items:
            type: object
          description: >-
            Nós do grafo de exposição para a triagem de transações. Vazio em um
            resultado de Triagem de carteiras.
        network_edges:
          type: array
          items:
            type: object
          description: >-
            Arestas do grafo de exposição para a triagem de transações. Vazio em
            um resultado de Triagem de carteiras.
        sanctions_hit:
          type: boolean
          description: True se o endereço tem exposição direta ou indireta a sanções.
        pep_counterparty:
          type: boolean
          description: >-
            Exposição como pessoa politicamente exposta. `null` quando não há
            nenhuma constatação de PEP disponível, o que ocorre hoje em todos os
            resultados, pois nenhum provedor a informa; `false` somente para um
            resultado de triagem explicitamente negativo. Não interprete `null`
            como uma verificação de PEP concluída.
          nullable: true
        dominant_risk_category:
          type: string
          nullable: true
          description: >-
            Categoria de alto risco com maior peso, ou `null` quando nenhuma
            predomina (por exemplo, `sanctioned`, `mixer`, `stolen_funds`).
        risk_factors:
          type: array
          description: >-
            Explicação ordenada de `risk_score`: o que levou a este veredito. Os
            provedores avaliam um endereço com o próprio modelo e retornam
            apenas um veredito (a Merkle Science retorna um inteiro de 0 a 5),
            então a pontuação sozinha não permite agir. A ordem é primeiro os de
            alto risco, depois o valor que passou por cada fator, limitada aos
            cinco mais fortes; `source_of_funds` e `destination_of_funds` sempre
            trazem o detalhamento completo. Um `risk_score` alto sem nenhuma
            entrada `is_high_risk` significa que o provedor não informou
            correspondência com sanções nem com entidade atribuída e avaliou o
            endereço apenas com o próprio modelo de exposição. O `summary`
            informa isso explicitamente.
          items:
            type: object
            properties:
              source:
                type: string
                enum:
                  - attribution
                  - exposure
                description: >-
                  `attribution` é o que o provedor diz que o próprio endereço é
                  (sua própria tag ou cluster); `exposure` é para onde seus
                  fundos de fato se moveram.
              category:
                type: string
                description: >-
                  Categoria de risco normalizada, com o mesmo vocabulário do
                  detalhamento de exposição.
              label:
                type: string
                description: >-
                  A descrição do próprio provedor para o fator (por exemplo,
                  `Gambling / Crypto only`), que é o que você também veria no
                  console do provedor.
              entity_name:
                type: string
                nullable: true
                description: >-
                  Entidade atribuída por trás do fator, por exemplo, um site de
                  apostas ou uma exchange.
              direction:
                type: string
                enum:
                  - incoming
                  - outgoing
                  - connected
                  - unknown
                  - attribution
                description: >-
                  Direção do fluxo de fundos, `attribution` quando o fator
                  determinante é a própria tag do endereço, ou `unknown` quando
                  o provedor não informou uma direção.
              exposure_type:
                type: string
                enum:
                  - direct
                  - indirect
                  - unknown
                  - attribution
                description: >-
                  `direct` (1 salto) ou `indirect` (vários saltos),
                  `attribution` para a tag do próprio endereço, ou `unknown`
                  quando o provedor não informou a quantos saltos de distância a
                  contraparte está. Trate `unknown` como não classificado, e não
                  como `direct`.
              amount_usd:
                type: number
                format: float
                nullable: true
                description: Valor em USD atribuído a este fator.
              percentage:
                type: number
                format: float
                description: >-
                  Participação no volume TOTAL analisado do endereço, somando as
                  duas direções, ao contrário de `percentage` dentro de
                  `source_of_funds`/`destination_of_funds`, que é normalizado
                  por direção. Comparável e somável em toda a lista.
              is_high_risk:
                type: boolean
                description: >-
                  Se a categoria é uma das que a Didit trata como de alto risco
                  (`sanctioned`, `mixer`, `stolen_funds`, `ransomware`, `scam`,
                  `darknet_market`, `terrorist_financing`, `child_exploitation`,
                  `hacked_exchange`, `high_risk_exchange`, `seized_funds`).
              description:
                type: string
                description: >-
                  Representação em uma linha do fator determinante, por exemplo
                  `9.01% indirect outgoing exposure to Gambling / Crypto only
                  (Example Gambling)`.
        raw_response:
          type: object
          additionalProperties: true
          description: >-
            O payload próprio do provedor. O formato dele é específico de cada
            provedor e pode mudar sem aviso: leia os campos normalizados em vez
            de interpretá-lo.
        report_signature:
          type: string
          description: >-
            Assinatura HMAC-SHA256 opaca sobre exatamente este resultado,
            restrita à sua aplicação. Não tem significado por si só: reenvie o
            corpo completo da resposta, sem modificações e incluindo este campo,
            para `POST /v3/wallet-screening/pdf/` para gerá-lo como PDF. O
            endpoint de PDF rejeita a requisição com `400` se `report_signature`
            estiver ausente ou se qualquer campo assinado (por exemplo,
            `risk_score`, `severity`, `sanctions_hit`) tiver sido editado antes
            do reenvio.
      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: >-
        Chave de API da sua aplicação, em Developers -> API keys no Business
        Console. A chave principal tem acesso total. Uma chave nomeada pode ter
        escopo restrito: nenhum acesso, leitura ou escrita por recurso, limitada
        a alguns fluxos ou a sessões aprovadas, a uma lista de endereços IP e a
        uma data de validade. 401 significa que a chave está errada, revogada ou
        expirada; 403 significa que nenhuma chave foi enviada, que a chave não
        tem acesso a este recurso ou ação, ou que a requisição veio de um
        endereço fora da sua lista de IPs; 404 em uma rota de sessão significa
        que a sessão está fora dos fluxos ou status da chave. Uma chave sem
        acesso a mídia recebe URLs de imagem, vídeo e PDF como null, e uma chave
        sem permissão de escrita em sessões recebe links e tokens de sessão como
        null. Consulte https://docs.didit.me/console/api-keys.

````

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