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

# Filtrage des portefeuilles : API de rapport PDF

> Convertit le JSON du filtrage de portefeuille en rapport PDF aux couleurs de Didit. Sans état, sans appel fournisseur, sans frais supplémentaires.



Prompt PDF de filtrage des portefeuilles
        Copier le prompt dans le presse-papiers



      
      

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



      
      

Coller dans

## Pourquoi il est sans étatLe filtrage des portefeuilles autonome n'écrit rien dans la table des transactions. Il n'existe donc aucun enregistrement stocké à partir duquel cet endpoint pourrait générer le rendu. Vous renvoyez à la place le JSON exact que `POST /v3/wallet-screening/` vous a déjà retourné, et Didit génère le PDF à partir de ce payload sans appeler à nouveau un fournisseur.## Le champ `report_signature`Chaque réponse de `POST /v3/wallet-screening/` inclut désormais un champ `report_signature` : une signature opaque propre à votre application. Cet endpoint vérifie cette signature avant le rendu. Ainsi, un appelant ne peut pas modifier `risk_score`, `severity`, `sanctions_hit` ni aucun autre champ pour obtenir un PDF d'apparence légitime estampillé Didit, pour un résultat que Didit n'a jamais produit.Renvoyez toujours le corps de réponse complet **sans modification**, y compris `report_signature`. Changer l'ordre des clés est sans danger ; modifier une valeur signée ne l'est pas.```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
```## FacturationAucun appel à un fournisseur n'est effectué et rien n'est facturé : cette opération ne fait que générer à nouveau le rendu d'un résultat que vous avez déjà payé lors de l'appel à `POST /v3/wallet-screening/`.## Erreurs| Statut | Signification |
| - | - |
| `400` | Le corps n'est pas un objet JSON correspondant à la structure du résultat de filtrage des portefeuilles, ou `report_signature` est absent ou ne correspond pas aux champs renvoyés. |
| `401` | `x-api-key` absent ou invalide. |## Étapes suivantes> [card] [Filtrer un portefeuille](https://docs.didit.me/fr/management-api/transactions/screen-wallet.md)
>
> Lancez le filtrage des portefeuilles à la demande sous-jacent et récupérez le résultat JSON à renvoyer ici.> [card] [Filtrage des portefeuilles à la demande](https://docs.didit.me/fr/transaction-monitoring/wallet-screening.md)
>
> Vue d'ensemble de l'endpoint de filtrage des portefeuilles autonome et de son modèle de résultat.


## OpenAPI

````yaml fr/openapi-25.json POST /v3/wallet-screening/pdf/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API de vérification d'identité. Authentifiez-vous avec l'en-tête x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/wallet-screening/pdf/:
    post:
      tags:
        - Transactions
      summary: Générer le résultat d'un filtrage des portefeuilles au format PDF
      description: >-
        Complément sans état de `POST /v3/wallet-screening/` : republiez le
        corps JSON exact renvoyé par ce endpoint — y compris la
        `report_signature` qu'il a ajoutée — et recevez en retour un PDF aux
        couleurs de Didit présentant le même résultat. Aucun fournisseur n'est
        appelé et rien n'est facturé ni conservé ; cela ne fait que générer à
        nouveau le rendu d'un résultat que Didit a déjà produit. La signature
        associe le PDF à un résultat non modifié : toute modification de
        `risk_score`, `severity`, `sanctions_hit` ou de tout autre champ signé
        avant la republication échoue avec une erreur `400`.
      operationId: screenWalletPdf
      requestBody:
        required: true
        description: >-
          L'objet JSON non modifié renvoyé par `POST /v3/wallet-screening/`,
          incluant `report_signature`.
        content:
          application/json:
            schema:
              allOf:
                - $ref: '#/components/schemas/WalletScreeningResult'
              required:
                - report_signature
              description: >-
                Même format que la réponse `POST /v3/wallet-screening/` —
                transmettez ce corps de réponse tel quel, y compris
                `report_signature`.
      responses:
        '200':
          description: >-
            Le document PDF généré, renvoyé directement au format binaire
            `application/pdf` — il n'y a pas d'encapsulation JSON.
          headers:
            Content-Disposition:
              description: >-
                `attachment; filename=wallet_screening_{address}.pdf`, dérivé de
                `wallet_address` (ou `transaction_hash`) dans le résultat
                republié.
              schema:
                type: string
                example: >-
                  attachment;
                  filename=wallet_screening_0x28c6c06298d514db0899.pdf
          content:
            application/pdf:
              schema:
                type: string
                format: binary
        '400':
          description: >-
            Le corps n'est pas un objet JSON correspondant au format de résultat
            du filtrage des portefeuilles, ou `report_signature` est manquant ou
            ne correspond pas aux champs republiés (modifié ou tronqué avant la
            republication).
          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` manquant ou invalide.'
      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: >-
            Fournisseur ayant effectué le filtrage (par ex. `merklescience`,
            `crystal`).
        screening_type:
          type: string
          enum:
            - WALLET_SCREENING
          description: Toujours `WALLET_SCREENING` pour cet endpoint.
        risk_score:
          type: integer
          description: >-
            Score de risque normalisé de 0 à 100. Une valeur plus élevée indique
            une plus forte exposition à des entités à risque. Merkle Science
            note une adresse de 0 à 5, ce qui correspond à 0, 15, 35, 55, 75 ou
            95.
        severity:
          type: string
          enum:
            - UNKNOWN
            - LOW
            - MEDIUM
            - HIGH
            - CRITICAL
          description: >-
            Tranche de risque dérivée de `risk_score` : `0-9` UNKNOWN, `10-39`
            LOW, `40-69` MEDIUM, `70-89` HIGH, `90-100` CRITICAL. `UNKNOWN` est
            la tranche la plus basse, pas un état distinct d'absence de données
            : un `risk_score` de 0 (le cas courant d'une adresse propre) indique
            l'absence d'évaluation défavorable, tandis qu'un score non nul dans
            la plage 1-9 est un signal réel mais inférieur à LOW - lisez le
            `risk_score`, pas seulement la tranche. Ne traitez jamais `UNKNOWN`
            comme une évaluation confirmée de faible risque ou sans risque ; ne
            l'affichez pas comme une validation.
        status:
          type: string
          enum:
            - SCREENED
            - PENDING
            - ERROR
          description: Statut du résultat du filtrage.
        summary:
          type: string
          description: Résumé lisible par l'utilisateur du résultat de filtrage.
        wallet_address:
          type: string
          description: L'adresse filtrée, renvoyée en écho.
        transaction_hash:
          type: string
          nullable: true
          description: >-
            Champ de filtrage de transaction, partagé avec la structure du
            résultat. Vaut toujours `null` sur un résultat de Filtrage des
            portefeuilles.
        blockchain:
          type: string
          description: La blockchain qui a été filtrée.
        block_timestamp:
          type: string
          nullable: true
          description: >-
            Champ de filtrage de transaction, partagé avec la structure du
            résultat. Vaut toujours `null` sur un résultat de Filtrage des
            portefeuilles.
        total_value_usd:
          type: number
          nullable: true
          description: >-
            Champ de filtrage de transaction, partagé avec la structure du
            résultat. Vaut toujours `null` sur un résultat de Filtrage des
            portefeuilles.
        fee_usd:
          type: number
          nullable: true
          description: >-
            Champ de filtrage de transaction, partagé avec la structure du
            résultat. Vaut toujours `null` sur un résultat de Filtrage des
            portefeuilles.
        sender_rows:
          type: array
          items:
            type: object
          description: >-
            Champ de filtrage de transaction, partagé avec la structure du
            résultat. Toujours vide sur un résultat de Filtrage des
            portefeuilles.
        receiver_rows:
          type: array
          items:
            type: object
          description: >-
            Champ de filtrage de transaction, partagé avec la structure du
            résultat. Toujours vide sur un résultat de Filtrage des
            portefeuilles.
        transaction_flows:
          type: array
          items:
            type: object
          description: >-
            Champ de filtrage de transaction, partagé avec la structure du
            résultat. Toujours vide sur un résultat de Filtrage des
            portefeuilles.
        transaction_flows_status:
          type: string
          nullable: true
          description: >-
            Champ de filtrage de transaction, partagé avec la structure du
            résultat. Vaut toujours `null` sur un résultat de Filtrage des
            portefeuilles.
        transaction_flows_error:
          type: string
          nullable: true
          description: >-
            Champ de filtrage de transaction, partagé avec la structure du
            résultat. Vaut toujours `null` sur un résultat de Filtrage des
            portefeuilles.
        source_of_funds:
          type: array
          description: >-
            Provenance des fonds reçus par l'adresse, attribués par entité.
            Chaque entrée est une ventilation de l'exposition.
          items:
            type: object
            properties:
              category:
                type: string
                description: >-
                  Catégorie de risque normalisée, par exemple
                  `exchange_licensed`, `dex`, `defi`, `payment_processor`,
                  `mixer`, `darknet_market`, `sanctioned`, `stolen_funds`,
                  `high_risk_exchange`.
              percentage:
                type: number
                description: Part de l'exposition totale du sens concerné, de 0 à 100.
              amount_usd:
                type: number
                nullable: true
                description: Valeur en USD attribuée à cette entité.
              entity_name:
                type: string
                nullable: true
                description: >-
                  Nom de l'entité attribuée, par exemple une plateforme
                  d'échange, un mixeur ou un groupe sous sanctions.
              entity_type:
                type: string
                nullable: true
                description: >-
                  Type d'entité du fournisseur (par ex. `Exchange`, `DeFi`,
                  `Sanctions`, `Theft`).
              entity_subtype:
                type: string
                nullable: true
                description: >-
                  Sous-type plus granulaire (par ex. `Mandatory KYC and AML`,
                  `OFAC`, `Yield Aggregator`).
              hops:
                type: integer
                nullable: true
                description: >-
                  Nombre de sauts jusqu'à l'entité (1 pour une contrepartie
                  directe), lorsque le fournisseur en signale un. Toujours
                  `null` pour Merkle Science, qui indique uniquement si
                  l'exposition est directe ou indirecte : utilisez
                  `exposure_type`.
              description:
                type: string
                nullable: true
                description: >-
                  `entity_type / entity_subtype`, selon la façon dont le
                  fournisseur qualifie l'entité.
              is_direct:
                type: boolean
                description: Vrai lorsque `exposure_type` est `direct`.
              exposure_direction:
                type: string
                enum:
                  - incoming
                  - outgoing
                  - connected
                description: >-
                  Indique si les fonds proviennent de (`incoming`) ou ont été
                  envoyés vers (`outgoing`) cette entité.
              exposure_type:
                type: string
                enum:
                  - direct
                  - indirect
                description: Exposition `direct` (1 saut) ou `indirect` (multisauts).
              provider_entity_id:
                type: string
                nullable: true
                description: L'identifiant propre au fournisseur pour l'entité.
              provider_entity_type_id:
                type: string
                nullable: true
                description: L'identifiant propre au fournisseur pour `entity_type`.
              provider_entity_subtype_id:
                type: string
                nullable: true
                description: L'identifiant propre au fournisseur pour `entity_subtype`.
              country:
                type: string
                nullable: true
                description: >-
                  Pays principal ISO 3166-1 alpha-2 de l'entité. Vide ou `null`
                  lorsque le fournisseur ne le connaît pas.
              raw_amount:
                type: number
                nullable: true
                description: >-
                  Montant dans l'unité propre de l'actif, lorsque le fournisseur
                  le transmet.
              raw_currency:
                type: string
                nullable: true
                description: Unité de `raw_amount`, lorsque le fournisseur l'indique.
        destination_of_funds:
          type: array
          description: >-
            Destination des fonds envoyés par l'adresse, attribués par entité.
            Même structure d'élément que `source_of_funds` avec
            `exposure_direction` = `outgoing`.
          items:
            type: object
            properties:
              category:
                type: string
                description: >-
                  Catégorie de risque normalisée, par exemple
                  `exchange_licensed`, `dex`, `defi`, `payment_processor`,
                  `mixer`, `darknet_market`, `sanctioned`, `stolen_funds`,
                  `high_risk_exchange`.
              percentage:
                type: number
                description: Part de l'exposition totale du sens concerné, de 0 à 100.
              amount_usd:
                type: number
                nullable: true
                description: Valeur en USD attribuée à cette entité.
              entity_name:
                type: string
                nullable: true
                description: >-
                  Nom de l'entité attribuée, par exemple une plateforme
                  d'échange, un mixeur ou un groupe sous sanctions.
              entity_type:
                type: string
                nullable: true
                description: >-
                  Type d'entité du fournisseur (par ex. `Exchange`, `DeFi`,
                  `Sanctions`, `Theft`).
              entity_subtype:
                type: string
                nullable: true
                description: >-
                  Sous-type plus granulaire (par ex. `Mandatory KYC and AML`,
                  `OFAC`, `Yield Aggregator`).
              hops:
                type: integer
                nullable: true
                description: >-
                  Nombre de sauts jusqu'à l'entité (1 pour une contrepartie
                  directe), lorsque le fournisseur en signale un. Toujours
                  `null` pour Merkle Science, qui indique uniquement si
                  l'exposition est directe ou indirecte : utilisez
                  `exposure_type`.
              description:
                type: string
                nullable: true
                description: >-
                  `entity_type / entity_subtype`, selon la façon dont le
                  fournisseur qualifie l'entité.
              is_direct:
                type: boolean
                description: Vrai lorsque `exposure_type` est `direct`.
              exposure_direction:
                type: string
                enum:
                  - incoming
                  - outgoing
                  - connected
                description: >-
                  Indique si les fonds proviennent de (`incoming`) ou ont été
                  envoyés vers (`outgoing`) cette entité.
              exposure_type:
                type: string
                enum:
                  - direct
                  - indirect
                description: Exposition `direct` (1 saut) ou `indirect` (multisauts).
              provider_entity_id:
                type: string
                nullable: true
                description: L'identifiant propre au fournisseur pour l'entité.
              provider_entity_type_id:
                type: string
                nullable: true
                description: L'identifiant propre au fournisseur pour `entity_type`.
              provider_entity_subtype_id:
                type: string
                nullable: true
                description: L'identifiant propre au fournisseur pour `entity_subtype`.
              country:
                type: string
                nullable: true
                description: >-
                  Pays principal ISO 3166-1 alpha-2 de l'entité. Vide ou `null`
                  lorsque le fournisseur ne le connaît pas.
              raw_amount:
                type: number
                nullable: true
                description: >-
                  Montant dans l'unité propre de l'actif, lorsque le fournisseur
                  le transmet.
              raw_currency:
                type: string
                nullable: true
                description: Unité de `raw_amount`, lorsque le fournisseur l'indique.
        counterparty_connections:
          type: array
          description: >-
            Entités auxquelles le fournisseur attribue l'adresse filtrée. Pour
            Merkle Science, celles-ci proviennent des propres tags de
            propriétaire et d'utilisateur de l'adresse, la même entité peut donc
            apparaître deux fois, et elles ne comportent aucun flux de fonds :
            `received_usd`, `sent_usd`, `received_hops` et `sent_hops` sont
            `null` et `percentage` est 0. N'effectuez pas de routage sur
            `risk_level` ou `is_direct` ici : utilisez `sanctions_hit`,
            `dominant_risk_category` et `risk_factors[].is_high_risk` pour le
            verdict, et `exposure_type` dans
            `source_of_funds`/`destination_of_funds` pour le caractère direct.
          items:
            type: object
            properties:
              entity_name:
                type: string
                nullable: true
                description: Nom de l'entité attribuée.
              entity_type:
                type: string
                nullable: true
                description: Type d'entité du fournisseur.
              entity_subtype:
                type: string
                nullable: true
                description: Sous-type d'entité du fournisseur.
              risk_level:
                type: string
                description: >-
                  En minuscules et dépendant du fournisseur. Pour Merkle
                  Science, il s'agit du niveau de risque propre à l'adresse de 0
                  à 5 (`no_risk`, `low`, `medium_low`, `medium`, `high`,
                  `critical`), relevé à `high` lorsque la catégorie de l'entité
                  est à haut risque ; il ne s'agit pas d'un niveau distinct
                  propre à l'entité.
              categories:
                type: array
                items:
                  type: string
                description: Catégories de risque normalisées de l'entité.
              received_usd:
                type: number
                nullable: true
                description: >-
                  Montant en USD reçu de l'entité, lorsque le fournisseur le
                  signale.
              sent_usd:
                type: number
                nullable: true
                description: >-
                  Montant en USD envoyé à l'entité, lorsque le fournisseur le
                  signale.
              received_hops:
                type: integer
                nullable: true
                description: >-
                  Sauts jusqu'à l'entité du côté récepteur, lorsque le
                  fournisseur les signale.
              sent_hops:
                type: integer
                nullable: true
                description: >-
                  Sauts jusqu'à l'entité du côté émetteur, lorsque le
                  fournisseur les signale.
              percentage:
                type: number
                description: >-
                  Part de l'exposition de l'adresse, lorsque le fournisseur la
                  signale ; sinon 0.
              is_direct:
                type: boolean
                description: >-
                  Toujours `true` pour Merkle Science, dont les connexions sont
                  des attributions plutôt que des contreparties.
              country:
                type: string
                nullable: true
                description: Pays de l'entité, lorsqu'il est connu.
              provider_entity_id:
                type: string
                nullable: true
                description: L'identifiant propre au fournisseur pour l'entité.
        network_nodes:
          type: array
          items:
            type: object
          description: >-
            Nœuds du graphe d'exposition pour le filtrage des transactions. Vide
            pour un résultat de filtrage des portefeuilles.
        network_edges:
          type: array
          items:
            type: object
          description: >-
            Arêtes du graphe d'exposition pour le filtrage des transactions.
            Vide pour un résultat de filtrage des portefeuilles.
        sanctions_hit:
          type: boolean
          description: >-
            Vrai si l'adresse a une exposition directe ou indirecte à des
            sanctions.
        pep_counterparty:
          type: boolean
          description: >-
            Exposition à une personne politiquement exposée. `null` lorsqu'aucun
            résultat PEP n'est disponible, ce qui est le cas de tous les
            résultats actuels car aucun fournisseur n'en signale ; `false`
            uniquement pour un résultat de filtrage explicitement négatif. Ne
            considérez pas `null` comme une vérification PEP terminée.
          nullable: true
        dominant_risk_category:
          type: string
          nullable: true
          description: >-
            Catégorie à haut risque ayant le poids le plus élevé, ou `null` si
            aucune n'est dominante (par exemple `sanctioned`, `mixer`,
            `stolen_funds`).
        risk_factors:
          type: array
          description: >-
            Explication classée de `risk_score` : ce qui a produit ce verdict.
            Les fournisseurs évaluent une adresse selon leur propre modèle et ne
            renvoient qu'un verdict (Merkle Science renvoie un entier de 0 à 5),
            de sorte que le score seul n'est pas exploitable. Les éléments sont
            classés par niveau de risque décroissant, puis selon la valeur ayant
            transité par chaque facteur déterminant, plafonnés aux cinq plus
            importants ; `source_of_funds` et `destination_of_funds` contiennent
            toujours la ventilation complète. Un `risk_score` élevé sans entrée
            `is_high_risk` signifie que le fournisseur n'a signalé aucune
            correspondance avec des sanctions ou une entité attribuée et a
            évalué l'adresse uniquement d'après son propre modèle d'exposition -
            `summary` l'indique explicitement.
          items:
            type: object
            properties:
              source:
                type: string
                enum:
                  - attribution
                  - exposure
                description: >-
                  `attribution` correspond à ce que le fournisseur indique être
                  l'adresse elle-même (son propre tag ou cluster) ; `exposure`
                  indique où ses fonds ont réellement transité.
              category:
                type: string
                description: >-
                  Catégorie de risque normalisée, même vocabulaire que la
                  répartition de l'exposition.
              label:
                type: string
                description: >-
                  La formulation propre au fournisseur pour le motif (par ex.
                  `Gambling / Crypto only`), correspondant à ce que vous verriez
                  également dans la console du fournisseur.
              entity_name:
                type: string
                nullable: true
                description: >-
                  Entité attribuée à l'origine du facteur, par exemple un site
                  de jeux d'argent ou une plateforme d'échange.
              direction:
                type: string
                enum:
                  - incoming
                  - outgoing
                  - connected
                  - unknown
                  - attribution
                description: >-
                  Direction du flux de fonds, `attribution` lorsque le facteur
                  déclenchant est l'étiquette propre à l'adresse, ou `unknown`
                  lorsque le fournisseur n'a pas indiqué de direction.
              exposure_type:
                type: string
                enum:
                  - direct
                  - indirect
                  - unknown
                  - attribution
                description: >-
                  `direct` (1 saut) ou `indirect` (multisauts), `attribution`
                  pour le tag propre de l'adresse, ou `unknown` lorsque le
                  fournisseur n'a pas indiqué à combien de sauts se trouve la
                  contrepartie. Traitez `unknown` comme non classifié, et non
                  comme `direct`.
              amount_usd:
                type: number
                format: float
                nullable: true
                description: Valeur en USD attribuée à ce facteur.
              percentage:
                type: number
                format: float
                description: >-
                  Part du volume TOTAL filtré de l'adresse, les deux sens
                  combinés - contrairement au `percentage` dans
                  `source_of_funds`/`destination_of_funds`, qui est normalisé
                  par sens. Comparable et cumulable sur l'ensemble de la liste.
              is_high_risk:
                type: boolean
                description: >-
                  Indique si la catégorie fait partie de celles que Didit
                  considère comme à haut risque (`sanctioned`, `mixer`,
                  `stolen_funds`, `ransomware`, `scam`, `darknet_market`,
                  `terrorist_financing`, `child_exploitation`,
                  `hacked_exchange`, `high_risk_exchange`, `seized_funds`).
              description:
                type: string
                description: >-
                  Rendu sur une seule ligne de l'élément déterminant, par ex.
                  `9.01% indirect outgoing exposure to Gambling / Crypto only
                  (Example Gambling)`.
        raw_response:
          type: object
          additionalProperties: true
          description: >-
            Le payload propre au fournisseur. Sa structure est spécifique au
            fournisseur et peut changer sans préavis : lisez les champs
            normalisés plutôt que de le parser.
        report_signature:
          type: string
          description: >-
            Signature HMAC-SHA256 opaque sur ce résultat exact, restreinte à
            votre application. Non significative en elle-même — republiez
            l'intégralité du corps de la réponse, sans modification et en
            incluant ce champ, vers `POST /v3/wallet-screening/pdf/` pour en
            faire le rendu sous forme de PDF. L'endpoint PDF rejette la requête
            avec `400` si `report_signature` est manquant ou si un champ signé
            (par exemple `risk_score`, `severity`, `sanctions_hit`) a été
            modifié avant la republication.
      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 clé API de votre application, issue de Développeurs -> Clés API dans
        la Business Console. La clé principale dispose d'un accès complet. Une
        clé nommée peut être restreinte : aucun, lecture ou écriture par
        ressource, limitée à certains workflows ou aux sessions approuvées, à
        une liste d'adresses IP et à une date d'expiration. 401 signifie que la
        clé est incorrecte, révoquée ou expirée ; 403 signifie qu'aucune clé n'a
        été envoyée, que la clé n'a pas accès à cette ressource ou action, ou
        que la requête provient d'une adresse hors de sa liste d'IP ; 404 sur
        une route de session signifie que la session est hors des workflows ou
        des statuts de la clé. Une clé sans accès aux médias reçoit les URL
        d'images, de vidéos et de PDF à null, et une clé sans accès en écriture
        aux sessions reçoit les liens et tokens de session à null. Voir
        https://docs.didit.me/console/api-keys.

````

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