> ## 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 informe PDF de screening de wallets

> Didit genera en PDF con su marca un resultado de screening de wallet al reenviar el JSON del endpoint. Sin estado, sin llamar al proveedor, sin coste extra.



Prompt para generar el PDF del análisis de wallet
        Copiar el prompt al portapapeles



      
      

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



      
      

Pegar en

## Por qué no guarda estadoEl análisis de wallets independiente no escribe nada en la tabla de transacciones, así que este endpoint no tiene ningún registro almacenado a partir del cual generar el documento. En su lugar, vuelves a enviar exactamente el JSON que ya te devolvió `POST /v3/wallet-screening/`, y Didit convierte ese payload en un PDF sin volver a consultar a ningún proveedor.## El campo `report_signature`Cada respuesta de `POST /v3/wallet-screening/` incluye ahora un campo `report_signature`: una firma opaca vinculada a tu aplicación. Este endpoint la verifica antes de generar el PDF, de modo que nadie puede editar `risk_score`, `severity`, `sanctions_hit` ni ningún otro campo y obtener un PDF con la marca de Didit, de aspecto legítimo, para un resultado que Didit nunca produjo.Vuelve a enviar siempre el cuerpo completo de la respuesta **sin modificar**, incluido `report_signature`. Puedes reordenar las claves; no puedes cambiar ningún valor firmado.```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
```## FacturaciónNo se realiza ninguna solicitud a ningún proveedor y no se factura nada: esto solo vuelve a renderizar un resultado que ya pagaste al llamar a `POST /v3/wallet-screening/`.## Errores| Estado | Significado |
| - | - |
| `400` | El cuerpo no es un objeto JSON con la estructura de un resultado de análisis de wallet, o `report_signature` falta o no coincide con los campos reenviados. |
| `401` | Falta `x-api-key` o no es válida. |## Próximos pasos> [card] [Analizar wallet](https://docs.didit.me/es/management-api/transactions/screen-wallet.md)
>
> Ejecuta el análisis de wallet bajo demanda subyacente y obtén el resultado JSON que debes volver a publicar aquí.> [card] [Análisis de wallets bajo demanda](https://docs.didit.me/es/transaction-monitoring/wallet-screening.md)
>
> Visión general del endpoint independiente de análisis de wallets y de su modelo de resultados.


## OpenAPI

````yaml es/openapi-25.json POST /v3/wallet-screening/pdf/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API de verificación de identidad. Autentícate con el encabezado x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/wallet-screening/pdf/:
    post:
      tags:
        - Transactions
      summary: Generar el resultado de un análisis de wallets en PDF
      description: >-
        Complemento sin estado de `POST /v3/wallet-screening/`: vuelve a enviar
        exactamente el cuerpo JSON que devolvió ese endpoint, incluida la
        `report_signature` que añadió, y recibe un PDF con la marca Didit del
        mismo resultado. No se llama a ningún proveedor y no se factura ni se
        guarda nada; solo se vuelve a generar un resultado que Didit ya produjo.
        La firma vincula el PDF a un resultado sin modificar: si editas
        `risk_score`, `severity`, `sanctions_hit` o cualquier otro campo firmado
        antes de reenviarlo, la solicitud falla con `400`.
      operationId: screenWalletPdf
      requestBody:
        required: true
        description: >-
          El objeto JSON sin modificar que devuelve `POST
          /v3/wallet-screening/`, incluido `report_signature`.
        content:
          application/json:
            schema:
              allOf:
                - $ref: '#/components/schemas/WalletScreeningResult'
              required:
                - report_signature
              description: >-
                Misma estructura que la respuesta de `POST
                /v3/wallet-screening/`: devuelve ese cuerpo de respuesta tal
                cual, incluido `report_signature`.
      responses:
        '200':
          description: >-
            El documento PDF generado, devuelto directamente como binario
            `application/pdf`: no hay envoltorio JSON.
          headers:
            Content-Disposition:
              description: >-
                `attachment; filename=wallet_screening_{address}.pdf`, derivado
                de `wallet_address` (o `transaction_hash`) del resultado
                reenviado.
              schema:
                type: string
                example: >-
                  attachment;
                  filename=wallet_screening_0x28c6c06298d514db0899.pdf
          content:
            application/pdf:
              schema:
                type: string
                format: binary
        '400':
          description: >-
            El cuerpo no es un objeto JSON con la estructura del resultado del
            análisis de wallets, o falta `report_signature` o no coincide con
            los campos reenviados (se editaron o truncaron antes del reenvío).
          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 o no vá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: >-
            Proveedor que realizó el análisis (p. ej., `merklescience`,
            `crystal`).
        screening_type:
          type: string
          enum:
            - WALLET_SCREENING
          description: Siempre `WALLET_SCREENING` para este endpoint.
        risk_score:
          type: integer
          description: >-
            Puntuación de riesgo normalizada de 0 a 100. Un valor más alto
            indica una mayor exposición a entidades de riesgo. Merkle Science
            califica una dirección de 0 a 5, lo que se corresponde con 0, 15,
            35, 55, 75 o 95.
        severity:
          type: string
          enum:
            - UNKNOWN
            - LOW
            - MEDIUM
            - HIGH
            - CRITICAL
          description: >-
            Nivel de riesgo derivado de `risk_score`: `0-9` UNKNOWN, `10-39`
            LOW, `40-69` MEDIUM, `70-89` HIGH, `90-100` CRITICAL. `UNKNOWN` es
            la banda más baja, no un estado aparte sin datos: un `risk_score` de
            0 (el caso habitual de una dirección limpia) significa que no hay
            ninguna evaluación adversa, mientras que una puntuación distinta de
            cero en el rango 1-9 es una señal real pero inferior a LOW; consulta
            el `risk_score`, no solo la banda. Nunca trates `UNKNOWN` como una
            calificación afirmativa de riesgo bajo o sin riesgo; no lo muestres
            como aprobado.
        status:
          type: string
          enum:
            - SCREENED
            - PENDING
            - ERROR
          description: Estado del resultado del análisis.
        summary:
          type: string
          description: Resumen legible del resultado del análisis.
        wallet_address:
          type: string
          description: La dirección analizada, devuelta tal cual.
        transaction_hash:
          type: string
          nullable: true
          description: >-
            Campo del análisis de transacciones, compartido con la estructura
            del resultado. Siempre es `null` en un resultado de análisis de
            wallets.
        blockchain:
          type: string
          description: La blockchain que se analizó.
        block_timestamp:
          type: string
          nullable: true
          description: >-
            Campo del análisis de transacciones, compartido con la estructura
            del resultado. Siempre es `null` en un resultado de análisis de
            wallets.
        total_value_usd:
          type: number
          nullable: true
          description: >-
            Campo del análisis de transacciones, compartido con la estructura
            del resultado. Siempre es `null` en un resultado de análisis de
            wallets.
        fee_usd:
          type: number
          nullable: true
          description: >-
            Campo del análisis de transacciones, compartido con la estructura
            del resultado. Siempre es `null` en un resultado de análisis de
            wallets.
        sender_rows:
          type: array
          items:
            type: object
          description: >-
            Campo del análisis de transacciones, compartido con la estructura
            del resultado. Siempre está vacío en un resultado de análisis de
            wallets.
        receiver_rows:
          type: array
          items:
            type: object
          description: >-
            Campo del análisis de transacciones, compartido con la estructura
            del resultado. Siempre está vacío en un resultado de análisis de
            wallets.
        transaction_flows:
          type: array
          items:
            type: object
          description: >-
            Campo del análisis de transacciones, compartido con la estructura
            del resultado. Siempre está vacío en un resultado de análisis de
            wallets.
        transaction_flows_status:
          type: string
          nullable: true
          description: >-
            Campo del análisis de transacciones, compartido con la estructura
            del resultado. Siempre es `null` en un resultado de análisis de
            wallets.
        transaction_flows_error:
          type: string
          nullable: true
          description: >-
            Campo del análisis de transacciones, compartido con la estructura
            del resultado. Siempre es `null` en un resultado de análisis de
            wallets.
        source_of_funds:
          type: array
          description: >-
            De dónde recibió fondos la dirección, atribuido por entidad. Cada
            entrada es un desglose de exposición.
          items:
            type: object
            properties:
              category:
                type: string
                description: >-
                  Categoría de riesgo normalizada, por ejemplo
                  `exchange_licensed`, `dex`, `defi`, `payment_processor`,
                  `mixer`, `darknet_market`, `sanctioned`, `stolen_funds`,
                  `high_risk_exchange`.
              percentage:
                type: number
                description: Proporción de la exposición total del sentido, de 0 a 100.
              amount_usd:
                type: number
                nullable: true
                description: Valor en USD atribuido a esta entidad.
              entity_name:
                type: string
                nullable: true
                description: >-
                  Nombre de la entidad atribuida, por ejemplo un exchange, un
                  mixer o un grupo sancionado.
              entity_type:
                type: string
                nullable: true
                description: >-
                  Tipo de entidad del proveedor (p. ej., `Exchange`, `DeFi`,
                  `Sanctions`, `Theft`).
              entity_subtype:
                type: string
                nullable: true
                description: >-
                  Subtipo más detallado (p. ej., `Mandatory KYC and AML`,
                  `OFAC`, `Yield Aggregator`).
              hops:
                type: integer
                nullable: true
                description: >-
                  Número de saltos hasta la entidad (1 para una contraparte
                  directa), cuando el proveedor lo informa. Siempre `null` para
                  Merkle Science, que solo informa de si la exposición es
                  directa o indirecta: usa `exposure_type`.
              description:
                type: string
                nullable: true
                description: >-
                  `entity_type / entity_subtype`, tal como el proveedor etiqueta
                  la entidad.
              is_direct:
                type: boolean
                description: True cuando `exposure_type` es `direct`.
              exposure_direction:
                type: string
                enum:
                  - incoming
                  - outgoing
                  - connected
                description: >-
                  Si los fondos provinieron de esta entidad (`incoming`) o se
                  enviaron a ella (`outgoing`).
              exposure_type:
                type: string
                enum:
                  - direct
                  - indirect
                description: Exposición `direct` (1 salto) o `indirect` (varios saltos).
              provider_entity_id:
                type: string
                nullable: true
                description: El identificador propio del proveedor para la entidad.
              provider_entity_type_id:
                type: string
                nullable: true
                description: El identificador propio del proveedor para `entity_type`.
              provider_entity_subtype_id:
                type: string
                nullable: true
                description: El identificador propio del proveedor para `entity_subtype`.
              country:
                type: string
                nullable: true
                description: >-
                  País principal de la entidad en formato ISO 3166-1 alfa-2.
                  Vacío o `null` cuando el proveedor no lo conoce.
              raw_amount:
                type: number
                nullable: true
                description: >-
                  Importe en la unidad propia del activo, cuando el proveedor lo
                  informa.
              raw_currency:
                type: string
                nullable: true
                description: Unidad de `raw_amount`, cuando el proveedor la informa.
        destination_of_funds:
          type: array
          description: >-
            A dónde envió fondos la dirección, atribuido por entidad. Misma
            estructura de elementos que `source_of_funds`, con
            `exposure_direction` = `outgoing`.
          items:
            type: object
            properties:
              category:
                type: string
                description: >-
                  Categoría de riesgo normalizada, por ejemplo
                  `exchange_licensed`, `dex`, `defi`, `payment_processor`,
                  `mixer`, `darknet_market`, `sanctioned`, `stolen_funds`,
                  `high_risk_exchange`.
              percentage:
                type: number
                description: Proporción de la exposición total del sentido, de 0 a 100.
              amount_usd:
                type: number
                nullable: true
                description: Valor en USD atribuido a esta entidad.
              entity_name:
                type: string
                nullable: true
                description: >-
                  Nombre de la entidad atribuida, por ejemplo un exchange, un
                  mixer o un grupo sancionado.
              entity_type:
                type: string
                nullable: true
                description: >-
                  Tipo de entidad del proveedor (p. ej., `Exchange`, `DeFi`,
                  `Sanctions`, `Theft`).
              entity_subtype:
                type: string
                nullable: true
                description: >-
                  Subtipo más detallado (p. ej., `Mandatory KYC and AML`,
                  `OFAC`, `Yield Aggregator`).
              hops:
                type: integer
                nullable: true
                description: >-
                  Número de saltos hasta la entidad (1 para una contraparte
                  directa), cuando el proveedor lo informa. Siempre `null` para
                  Merkle Science, que solo informa de si la exposición es
                  directa o indirecta: usa `exposure_type`.
              description:
                type: string
                nullable: true
                description: >-
                  `entity_type / entity_subtype`, tal como el proveedor etiqueta
                  la entidad.
              is_direct:
                type: boolean
                description: True cuando `exposure_type` es `direct`.
              exposure_direction:
                type: string
                enum:
                  - incoming
                  - outgoing
                  - connected
                description: >-
                  Si los fondos provinieron de esta entidad (`incoming`) o se
                  enviaron a ella (`outgoing`).
              exposure_type:
                type: string
                enum:
                  - direct
                  - indirect
                description: Exposición `direct` (1 salto) o `indirect` (varios saltos).
              provider_entity_id:
                type: string
                nullable: true
                description: El identificador propio del proveedor para la entidad.
              provider_entity_type_id:
                type: string
                nullable: true
                description: El identificador propio del proveedor para `entity_type`.
              provider_entity_subtype_id:
                type: string
                nullable: true
                description: El identificador propio del proveedor para `entity_subtype`.
              country:
                type: string
                nullable: true
                description: >-
                  País principal de la entidad en formato ISO 3166-1 alfa-2.
                  Vacío o `null` cuando el proveedor no lo conoce.
              raw_amount:
                type: number
                nullable: true
                description: >-
                  Importe en la unidad propia del activo, cuando el proveedor lo
                  informa.
              raw_currency:
                type: string
                nullable: true
                description: Unidad de `raw_amount`, cuando el proveedor la informa.
        counterparty_connections:
          type: array
          description: >-
            Entidades a las que el proveedor atribuye la dirección analizada. En
            Merkle Science provienen de las etiquetas de propietario y de
            usuario de la propia dirección, por lo que la misma entidad puede
            aparecer dos veces, y no incluyen flujos de fondos: `received_usd`,
            `sent_usd`, `received_hops` y `sent_hops` son `null` y `percentage`
            es 0. No tomes decisiones de enrutamiento según `risk_level` o
            `is_direct` aquí: usa `sanctions_hit`, `dominant_risk_category` y
            `risk_factors[].is_high_risk` para el veredicto, y `exposure_type`
            en `source_of_funds`/`destination_of_funds` para saber si la
            exposición es directa.
          items:
            type: object
            properties:
              entity_name:
                type: string
                nullable: true
                description: Nombre de la entidad atribuida.
              entity_type:
                type: string
                nullable: true
                description: Tipo de entidad del proveedor.
              entity_subtype:
                type: string
                nullable: true
                description: Subtipo de entidad del proveedor.
              risk_level:
                type: string
                description: >-
                  En minúsculas y depende del proveedor. Para Merkle Science es
                  la calificación de riesgo propia de la dirección, de 0 a 5
                  (`no_risk`, `low`, `medium_low`, `medium`, `high`,
                  `critical`), elevada a `high` cuando la categoría de la
                  entidad es de alto riesgo; no es una calificación aparte de la
                  entidad.
              categories:
                type: array
                items:
                  type: string
                description: Categorías de riesgo normalizadas de la entidad.
              received_usd:
                type: number
                nullable: true
                description: USD recibidos de la entidad, cuando el proveedor lo informa.
              sent_usd:
                type: number
                nullable: true
                description: USD enviados a la entidad, cuando el proveedor lo informa.
              received_hops:
                type: integer
                nullable: true
                description: >-
                  Saltos hasta la entidad del lado receptor, cuando el proveedor
                  los informa.
              sent_hops:
                type: integer
                nullable: true
                description: >-
                  Saltos hasta la entidad del lado emisor, cuando el proveedor
                  los informa.
              percentage:
                type: number
                description: >-
                  Proporción de la exposición de la dirección, cuando el
                  proveedor la informa; en caso contrario, 0.
              is_direct:
                type: boolean
                description: >-
                  Siempre `true` para Merkle Science, cuyas conexiones son
                  atribuciones y no contrapartes.
              country:
                type: string
                nullable: true
                description: País de la entidad, cuando se conoce.
              provider_entity_id:
                type: string
                nullable: true
                description: El identificador propio del proveedor para la entidad.
        network_nodes:
          type: array
          items:
            type: object
          description: >-
            Nodos del grafo de exposición para el análisis de transacciones.
            Vacíos en un resultado de análisis de wallets.
        network_edges:
          type: array
          items:
            type: object
          description: >-
            Aristas del grafo de exposición para el análisis de transacciones.
            Vacías en un resultado de análisis de wallets.
        sanctions_hit:
          type: boolean
          description: >-
            True si la dirección tiene exposición directa o indirecta a
            sanciones.
        pep_counterparty:
          type: boolean
          description: >-
            Exposición como persona expuesta políticamente. `null` cuando no hay
            ningún hallazgo de PEP disponible, lo que ocurre hoy en todos los
            resultados porque ningún proveedor lo informa; `false` solo ante un
            resultado de análisis negativo explícito. No interpretes `null` como
            una comprobación de PEP completada.
          nullable: true
        dominant_risk_category:
          type: string
          nullable: true
          description: >-
            Categoría de alto riesgo con mayor peso, o `null` cuando ninguna es
            dominante (p. ej., `sanctioned`, `mixer`, `stolen_funds`).
        risk_factors:
          type: array
          description: >-
            Explicación ordenada de `risk_score`: qué produjo este veredicto.
            Los proveedores califican una dirección según su propio modelo y
            devuelven solo un veredicto (Merkle Science devuelve un entero de 0
            a 5), por lo que la puntuación por sí sola no permite actuar. Se
            ordena primero por alto riesgo y luego por el valor que pasó por
            cada factor, con un máximo de los cinco más relevantes;
            `source_of_funds` y `destination_of_funds` siempre contienen el
            desglose completo. Un `risk_score` alto sin ninguna entrada
            `is_high_risk` significa que el proveedor no informó ninguna
            coincidencia con sanciones ni con entidades atribuidas y calificó la
            dirección únicamente según su propio modelo de exposición; `summary`
            lo indica de forma explícita.
          items:
            type: object
            properties:
              source:
                type: string
                enum:
                  - attribution
                  - exposure
                description: >-
                  `attribution` es lo que el proveedor dice que es la propia
                  dirección (su propia etiqueta o clúster); `exposure` es hacia
                  dónde se movieron realmente sus fondos.
              category:
                type: string
                description: >-
                  Categoría de riesgo normalizada, con el mismo vocabulario que
                  el desglose de exposición.
              label:
                type: string
                description: >-
                  La redacción propia del proveedor para el factor (p. ej.,
                  `Gambling / Crypto only`), que es lo mismo que verías en la
                  consola del proveedor.
              entity_name:
                type: string
                nullable: true
                description: >-
                  Entidad atribuida detrás del factor, por ejemplo un sitio de
                  apuestas o un exchange.
              direction:
                type: string
                enum:
                  - incoming
                  - outgoing
                  - connected
                  - unknown
                  - attribution
                description: >-
                  Sentido del flujo de fondos, `attribution` cuando el factor
                  determinante es la propia etiqueta de la dirección, o
                  `unknown` cuando el proveedor no indicó un sentido.
              exposure_type:
                type: string
                enum:
                  - direct
                  - indirect
                  - unknown
                  - attribution
                description: >-
                  `direct` (1 salto) o `indirect` (varios saltos), `attribution`
                  para la etiqueta propia de la dirección, o `unknown` cuando el
                  proveedor no indicó a cuántos saltos está la contraparte.
                  Trata `unknown` como sin clasificar, no como `direct`.
              amount_usd:
                type: number
                format: float
                nullable: true
                description: Valor en USD atribuido a este factor determinante.
              percentage:
                type: number
                format: float
                description: >-
                  Proporción del volumen analizado TOTAL de la dirección, con
                  ambos sentidos combinados, a diferencia de `percentage` dentro
                  de `source_of_funds`/`destination_of_funds`, que se normaliza
                  por sentido. Es comparable y sumable en toda la lista.
              is_high_risk:
                type: boolean
                description: >-
                  Si la categoría es una de las que Didit considera de alto
                  riesgo (`sanctioned`, `mixer`, `stolen_funds`, `ransomware`,
                  `scam`, `darknet_market`, `terrorist_financing`,
                  `child_exploitation`, `hacked_exchange`, `high_risk_exchange`,
                  `seized_funds`).
              description:
                type: string
                description: >-
                  Representación en una línea del factor determinante, por
                  ejemplo `9.01% indirect outgoing exposure to Gambling / Crypto
                  only (Example Gambling)`.
        raw_response:
          type: object
          additionalProperties: true
          description: >-
            El payload propio del proveedor. Su estructura depende del proveedor
            y puede cambiar sin previo aviso: lee los campos normalizados en
            lugar de analizarlo.
        report_signature:
          type: string
          description: >-
            Firma HMAC-SHA256 opaca sobre este resultado exacto, limitada a tu
            aplicación. No tiene significado por sí sola: vuelve a enviar el
            cuerpo completo de la respuesta, sin modificar e incluyendo este
            campo, a `POST /v3/wallet-screening/pdf/` para generarlo como PDF.
            El endpoint de PDF rechaza la solicitud con `400` si falta
            `report_signature` o si se editó algún campo firmado (p. ej.,
            `risk_score`, `severity`, `sanctions_hit`) antes de reenviarlo.
      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: >-
        La clave de API de tu aplicación, que encontrarás en Developers -> API
        keys en la Business Console. La clave principal tiene acceso completo.
        Una clave con nombre puede tener un alcance limitado: ninguno, lectura o
        escritura por recurso, limitada a algunos flujos o a sesiones aprobadas,
        a una lista de direcciones IP y a una fecha de caducidad. 401 significa
        que la clave es incorrecta, se revocó o expiró; 403 significa que no se
        envió ninguna clave, que la clave no tiene acceso a este recurso o
        acción, o que la solicitud provino de una dirección fuera de su lista de
        IP; 404 en una ruta de sesión significa que la sesión está fuera de los
        flujos o estados de la clave. Una clave sin acceso a contenido
        multimedia recibe las URL de imágenes, videos y PDF como null, y una
        clave sin permiso de escritura en sesiones recibe los enlaces y tokens
        de sesión como null. Consulta https://docs.didit.me/console/api-keys.

````

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