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

# Wallet-Screening PDF-Bericht API

> Didit erstellt aus dem JSON des Wallet-Screenings ein PDF im Didit-Design. Zustandslos, ohne Anbieteraufruf, ohne Zusatzkosten.



Wallet-PDF-Prompt prüfen
        Prompt in die Zwischenablage kopieren



      
      

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



      
      

Einfügen in

## Warum der Endpoint zustandslos istDas eigenständige Wallet-Screening schreibt nichts in die Transaktionstabelle, daher gibt es für diesen Endpoint keinen gespeicherten Datensatz, aus dem er ein PDF erzeugen könnte. Stattdessen senden Sie das exakte JSON erneut, das `POST /v3/wallet-screening/` bereits zurückgegeben hat. Didit erzeugt aus diesem Payload ein PDF, ohne erneut einen Anbieter aufzurufen.## Das Feld `report_signature`Jede Antwort von `POST /v3/wallet-screening/` enthält jetzt ein Feld `report_signature`: eine undurchsichtige Signatur, die auf Ihre Anwendung beschränkt ist. Dieser Endpoint prüft sie vor dem Rendern. So kann ein Aufrufer `risk_score`, `severity`, `sanctions_hit` oder ein anderes Feld nicht ändern und dennoch ein sauber aussehendes PDF mit Didit-Branding für ein Ergebnis erhalten, das Didit nie erzeugt hat.Senden Sie den vollständigen Antwortkörper immer **unverändert** erneut, einschließlich `report_signature`. Sie dürfen die Reihenfolge der Schlüssel ändern, signierte Werte dagegen nicht.```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
```## AbrechnungEs wird kein Anbieter aufgerufen und nichts abgerechnet. Dieser Aufruf rendert lediglich ein Ergebnis erneut, für das Sie bereits beim Aufruf von `POST /v3/wallet-screening/` bezahlt haben.## Fehler| Status | Bedeutung |
| - | - |
| `400` | Der Body ist kein JSON-Objekt, das dem Schema des Wallet-Screening-Ergebnisses entspricht, oder `report_signature` fehlt oder stimmt nicht mit den erneut gesendeten Feldern überein. |
| `401` | `x-api-key` fehlt oder ist ungültig. |## Nächste Schritte> [card] [Wallet-Screening ausführen](https://docs.didit.me/de/management-api/transactions/screen-wallet.md)
>
> Führen Sie das zugrunde liegende On-Demand-Wallet-Screening aus und erhalten Sie das JSON-Ergebnis, das Sie hier erneut senden.> [card] [Wallet-Screening auf Abruf](https://docs.didit.me/de/transaction-monitoring/wallet-screening.md)
>
> Überblick über den eigenständigen Wallet-Screening-Endpoint und das Ergebnismodell.


## OpenAPI

````yaml de/openapi-25.json POST /v3/wallet-screening/pdf/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API für Ausweisverifizierung. Authentifizierung über den x-api-key-Header.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/wallet-screening/pdf/:
    post:
      tags:
        - Transactions
      summary: Wallet-Screening-Ergebnis als PDF rendern
      description: >-
        Zustandsloses Gegenstück zu `POST /v3/wallet-screening/`: Senden Sie
        genau den JSON-Body erneut, den dieser Endpoint zurückgegeben hat –
        einschließlich der hinzugefügten `report_signature` – und erhalten Sie
        ein PDF desselben Ergebnisses im Didit-Branding zurück. Es wird kein
        Anbieter aufgerufen und nichts abgerechnet oder dauerhaft gespeichert;
        dies rendert lediglich ein Ergebnis neu, das Didit bereits erstellt hat.
        Die Signatur verknüpft das PDF mit einem unveränderten Ergebnis: Das
        Bearbeiten von `risk_score`, `severity`, `sanctions_hit` oder eines
        anderen signierten Felds vor dem erneuten Senden schlägt mit `400` fehl.
      operationId: screenWalletPdf
      requestBody:
        required: true
        description: >-
          Das unveränderte JSON-Objekt, das von `POST /v3/wallet-screening/`
          zurückgegeben wurde, einschließlich `report_signature`.
        content:
          application/json:
            schema:
              allOf:
                - $ref: '#/components/schemas/WalletScreeningResult'
              required:
                - report_signature
              description: >-
                Gleiche Struktur wie die Antwort von `POST
                /v3/wallet-screening/` — übergeben Sie diesen Antwort-Body
                unverändert zurück, einschließlich `report_signature`.
      responses:
        '200':
          description: >-
            Das gerenderte PDF-Dokument, direkt als binäres `application/pdf`
            zurückgegeben — es gibt keinen JSON-Wrapper.
          headers:
            Content-Disposition:
              description: >-
                `attachment; filename=wallet_screening_{address}.pdf`,
                abgeleitet aus der `wallet_address` (oder dem
                `transaction_hash`) im erneut übermittelten Ergebnis.
              schema:
                type: string
                example: >-
                  attachment;
                  filename=wallet_screening_0x28c6c06298d514db0899.pdf
          content:
            application/pdf:
              schema:
                type: string
                format: binary
        '400':
          description: >-
            Der Body ist kein JSON-Objekt, das dem Format der
            Wallet-Screening-Ergebnisse entspricht, oder `report_signature`
            fehlt bzw. stimmt nicht mit den erneut übermittelten Feldern überein
            (vor der erneuten Übermittlung bearbeitet oder abgeschnitten).
          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: Fehlender oder ungültiger `x-api-key`.
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: >-
            # $RESULT is the saved JSON body from POST /v3/wallet-screening/

            curl -X POST
            'https://verification.didit.me/v3/wallet-screening/pdf/' \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -d "$RESULT" \
              -o wallet_screening_report.pdf
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            content = client.wallet_screening.screen_pdf(
                provider="your-provider",
                screening_type="WALLET_SCREENING",
                risk_score=1,
                severity="UNKNOWN",
                status="SCREENED",
                summary="your-summary",
                wallet_address="your-wallet-address",
                blockchain="your-blockchain",
                source_of_funds=[{}],
                destination_of_funds=[{}],
                counterparty_connections=[{}],
                sanctions_hit=True,
                dominant_risk_category="your-dominant-risk-category",
                report_signature="your-report-signature",
            )
            with open("download.pdf", "wb") as file:
                file.write(content)
        - lang: javascript
          label: Node.js
          source: >-
            import { writeFile } from "node:fs/promises";

            import Didit from "@didit-protocol/sdk-node";


            // Reads DIDIT_API_KEY.

            const didit = new Didit();


            const content = await didit.walletScreening.screenPdf({
              provider: "your-provider",
              screening_type: "WALLET_SCREENING",
              risk_score: 1,
              severity: "UNKNOWN",
              status: "SCREENED",
              summary: "your-summary",
              wallet_address: "your-wallet-address",
              blockchain: "your-blockchain",
              source_of_funds: [{}],
              destination_of_funds: [{}],
              counterparty_connections: [{}],
              sanctions_hit: true,
              dominant_risk_category: "your-dominant-risk-category",
              report_signature: "your-report-signature",
            });

            await writeFile("download.pdf", Buffer.from(await
            content.arrayBuffer()));
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresp, err := client.WalletScreening.ScreenPDF(ctx, didit.WalletScreeningResultParam{\n\tProvider:                \"your-provider\",\n\tScreeningType:           \"WALLET_SCREENING\",\n\tRiskScore:               1,\n\tSeverity:                \"UNKNOWN\",\n\tStatus:                  \"SCREENED\",\n\tSummary:                 \"your-summary\",\n\tWalletAddress:           \"your-wallet-address\",\n\tBlockchain:              \"your-blockchain\",\n\tSourceOfFunds:           []didit.WalletScreeningResultParamSourceOfFunds{{}},\n\tDestinationOfFunds:      []didit.WalletScreeningResultParamDestinationOfFunds{{}},\n\tCounterpartyConnections: []didit.WalletScreeningResultParamCounterpartyConnections{{}},\n\tSanctionsHit:            true,\n\tDominantRiskCategory:    didit.String(\"your-dominant-risk-category\"),\n\tReportSignature:         \"your-report-signature\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer resp.Body.Close()\nfile, err := os.Create(\"download.pdf\")\nif err != nil {\n\tlog.Fatal(err)\n}\ndefer file.Close()\nif _, err := io.Copy(file, resp.Body); err != nil {\n\tlog.Fatal(err)\n}"
        - lang: java
          label: Java
          source: |-
            import java.nio.file.Path;
            import java.util.List;
            import me.didit.Didit;
            import me.didit.types.WalletScreeningResult;

            // Reads DIDIT_API_KEY.
            Didit client = new Didit();

            client.walletScreening().screenPdf(WalletScreeningResult.builder()
                    .provider("your-provider")
                    .screeningType(WalletScreeningResult.ScreeningType.of("WALLET_SCREENING"))
                    .riskScore(1L)
                    .severity(WalletScreeningResult.Severity.of("UNKNOWN"))
                    .status(WalletScreeningResult.Status.of("SCREENED"))
                    .summary("your-summary")
                    .walletAddress("your-wallet-address")
                    .blockchain("your-blockchain")
                    .sourceOfFunds(List.of(WalletScreeningResult.SourceOfFunds.builder()
                            .build()))
                    .destinationOfFunds(List.of(WalletScreeningResult.DestinationOfFunds.builder()
                            .build()))
                    .counterpartyConnections(List.of(WalletScreeningResult.CounterpartyConnections.builder()
                            .build()))
                    .sanctionsHit(true)
                    .dominantRiskCategory("your-dominant-risk-category")
                    .reportSignature("your-report-signature")
                    .build())
                    .writeTo(Path.of("download.pdf"));
        - lang: php
          label: PHP
          source: |-
            <?php

            require 'vendor/autoload.php';

            use Didit\DiditClient;

            // Reads DIDIT_API_KEY.
            $didit = new DiditClient();

            $content = $didit->walletScreening->screenPdf([
                'provider' => 'your-provider',
                'screening_type' => 'WALLET_SCREENING',
                'risk_score' => 1,
                'severity' => 'UNKNOWN',
                'status' => 'SCREENED',
                'summary' => 'your-summary',
                'wallet_address' => 'your-wallet-address',
                'blockchain' => 'your-blockchain',
                'source_of_funds' => [[]],
                'destination_of_funds' => [[]],
                'counterparty_connections' => [[]],
                'sanctions_hit' => true,
                'dominant_risk_category' => 'your-dominant-risk-category',
                'report_signature' => 'your-report-signature',
            ]);
            $content->saveTo('download.pdf');
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

            # Reads DIDIT_API_KEY.
            didit = Didit::Client.new

            content = didit.wallet_screening.screen_pdf(
              provider: "your-provider",
              screening_type: "WALLET_SCREENING",
              risk_score: 1,
              severity: "UNKNOWN",
              status: "SCREENED",
              summary: "your-summary",
              wallet_address: "your-wallet-address",
              blockchain: "your-blockchain",
              source_of_funds: [{}],
              destination_of_funds: [{}],
              counterparty_connections: [{}],
              sanctions_hit: true,
              dominant_risk_category: "your-dominant-risk-category",
              report_signature: "your-report-signature"
            )
            File.binwrite("download.pdf", content)
        - lang: csharp
          label: .NET
          source: >-
            using System;

            using Didit;


            // Reads DIDIT_API_KEY.

            using var client = new DiditClient();


            var content = await client.WalletScreening.ScreenPdfAsync(new
            WalletScreeningResult

            {
                Provider = "your-provider",
                ScreeningType = "WALLET_SCREENING",
                RiskScore = 1,
                Severity = "UNKNOWN",
                Status = "SCREENED",
                Summary = "your-summary",
                WalletAddress = "your-wallet-address",
                Blockchain = "your-blockchain",
                SourceOfFunds = new WalletScreeningResultSourceOfFunds[] { new() },
                DestinationOfFunds = new WalletScreeningResultDestinationOfFunds[] { new() },
                CounterpartyConnections = new WalletScreeningResultCounterpartyConnections[] { new() },
                SanctionsHit = true,
                DominantRiskCategory = "your-dominant-risk-category",
                ReportSignature = "your-report-signature",
            });

            await content.SaveToAsync("download.pdf");
components:
  schemas:
    WalletScreeningResult:
      type: object
      properties:
        provider:
          type: string
          description: >-
            Anbieter, der das Screening durchgeführt hat (z. B. `merklescience`,
            `crystal`).
        screening_type:
          type: string
          enum:
            - WALLET_SCREENING
          description: Für diesen Endpoint immer `WALLET_SCREENING`.
        risk_score:
          type: integer
          description: >-
            Normalisierter Risiko-Score von 0–100. Höher bedeutet eine größere
            Exposition gegenüber riskanten Entitäten. Merkle Science bewertet
            eine Adresse von 0–5, was 0, 15, 35, 55, 75 oder 95 entspricht.
        severity:
          type: string
          enum:
            - UNKNOWN
            - LOW
            - MEDIUM
            - HIGH
            - CRITICAL
          description: >-
            Aus `risk_score` abgeleitete Risikogruppe: `0-9` UNKNOWN, `10-39`
            LOW, `40-69` MEDIUM, `70-89` HIGH, `90-100` CRITICAL. `UNKNOWN` ist
            die niedrigste Spanne, kein separater Zustand ohne Daten:
            `risk_score` 0 (der übliche Fall einer unauffälligen Adresse)
            bedeutet keine negative Bewertung, während ein Wert ungleich null im
            Bereich 1-9 ein reales, aber unter LOW liegendes Signal darstellt –
            werten Sie den `risk_score` aus, nicht nur die Spanne. Behandeln Sie
            `UNKNOWN` niemals als bestätigte Einstufung mit geringem Risiko oder
            unbedenkliche Bewertung; zeigen Sie dies nicht als bestanden an.
        status:
          type: string
          enum:
            - SCREENED
            - PENDING
            - ERROR
          description: Ergebnisstatus des Screenings.
        summary:
          type: string
          description: Für Menschen lesbare Zusammenfassung des Screening-Ergebnisses.
        wallet_address:
          type: string
          description: Die überprüfte Adresse, unverändert zurückgegeben.
        transaction_hash:
          type: string
          nullable: true
          description: >-
            Transaktions-Screening-Feld, gemeinsam mit der Ergebnisstruktur
            genutzt. Bei einem Wallet-Screening-Ergebnis immer `null`.
        blockchain:
          type: string
          description: Die Blockchain, die überprüft wurde.
        block_timestamp:
          type: string
          nullable: true
          description: >-
            Transaktions-Screening-Feld, gemeinsam mit der Ergebnisstruktur
            genutzt. Bei einem Wallet-Screening-Ergebnis immer `null`.
        total_value_usd:
          type: number
          nullable: true
          description: >-
            Transaktions-Screening-Feld, gemeinsam mit der Ergebnisstruktur
            genutzt. Bei einem Wallet-Screening-Ergebnis immer `null`.
        fee_usd:
          type: number
          nullable: true
          description: >-
            Transaktions-Screening-Feld, gemeinsam mit der Ergebnisstruktur
            genutzt. Bei einem Wallet-Screening-Ergebnis immer `null`.
        sender_rows:
          type: array
          items:
            type: object
          description: >-
            Transaktions-Screening-Feld, gemeinsam mit der Ergebnisstruktur
            genutzt. Bei einem Wallet-Screening-Ergebnis immer leer.
        receiver_rows:
          type: array
          items:
            type: object
          description: >-
            Transaktions-Screening-Feld, gemeinsam mit der Ergebnisstruktur
            genutzt. Bei einem Wallet-Screening-Ergebnis immer leer.
        transaction_flows:
          type: array
          items:
            type: object
          description: >-
            Transaktions-Screening-Feld, gemeinsam mit der Ergebnisstruktur
            genutzt. Bei einem Wallet-Screening-Ergebnis immer leer.
        transaction_flows_status:
          type: string
          nullable: true
          description: >-
            Transaktions-Screening-Feld, gemeinsam mit der Ergebnisstruktur
            genutzt. Bei einem Wallet-Screening-Ergebnis immer `null`.
        transaction_flows_error:
          type: string
          nullable: true
          description: >-
            Transaktions-Screening-Feld, gemeinsam mit der Ergebnisstruktur
            genutzt. Bei einem Wallet-Screening-Ergebnis immer `null`.
        source_of_funds:
          type: array
          description: >-
            Von wo die Adresse Gelder empfangen hat, zugeordnet nach Entität.
            Jeder Eintrag ist eine Exposure-Aufschlüsselung.
          items:
            type: object
            properties:
              category:
                type: string
                description: >-
                  Normalisierte Risikokategorie, z. B. `exchange_licensed`,
                  `dex`, `defi`, `payment_processor`, `mixer`, `darknet_market`,
                  `sanctioned`, `stolen_funds`, `high_risk_exchange`.
              percentage:
                type: number
                description: Anteil an der Gesamtexposition der Richtung, 0-100.
              amount_usd:
                type: number
                nullable: true
                description: Dieser Entität zugeschriebener USD-Wert.
              entity_name:
                type: string
                nullable: true
                description: >-
                  Name der zugeordneten Entität, beispielsweise einer
                  Krypto-Börse, eines Mixers oder einer sanktionierten Gruppe.
              entity_type:
                type: string
                nullable: true
                description: >-
                  Typ der Anbieter-Entität (z. B. `Exchange`, `DeFi`,
                  `Sanctions`, `Theft`).
              entity_subtype:
                type: string
                nullable: true
                description: >-
                  Detaillierterer Untertyp (z. B. `Mandatory KYC and AML`,
                  `OFAC`, `Yield Aggregator`).
              hops:
                type: integer
                nullable: true
                description: >-
                  Anzahl der Hops zur Entität (1 für eine direkte Gegenpartei),
                  sofern der Anbieter einen angibt. Immer `null` für Merkle
                  Science, das nur meldet, ob das Exposure direkt oder indirekt
                  ist: Verwenden Sie `exposure_type`.
              description:
                type: string
                nullable: true
                description: >-
                  `entity_type / entity_subtype`, wie der Anbieter die Entität
                  kennzeichnet.
              is_direct:
                type: boolean
                description: True, wenn `exposure_type` gleich `direct` ist.
              exposure_direction:
                type: string
                enum:
                  - incoming
                  - outgoing
                  - connected
                description: >-
                  Gibt an, ob die Mittel von dieser Entität stammten
                  (`incoming`) oder an sie gingen (`outgoing`).
              exposure_type:
                type: string
                enum:
                  - direct
                  - indirect
                description: '`direct` (1 Hop) oder `indirect` (Multi-Hop) Exposition.'
              provider_entity_id:
                type: string
                nullable: true
                description: Die anbietereigene Kennung für die Entität.
              provider_entity_type_id:
                type: string
                nullable: true
                description: Die anbietereigene Kennung für `entity_type`.
              provider_entity_subtype_id:
                type: string
                nullable: true
                description: Die anbietereigene Kennung für `entity_subtype`.
              country:
                type: string
                nullable: true
                description: >-
                  Primäres ISO-3166-1-alpha-2-Land der Entität. Leer oder
                  `null`, wenn der Anbieter es nicht kennt.
              raw_amount:
                type: number
                nullable: true
                description: >-
                  Betrag in der eigenen Einheit des Vermögenswerts, sofern vom
                  Anbieter gemeldet.
              raw_currency:
                type: string
                nullable: true
                description: Einheit von `raw_amount`, sofern vom Anbieter gemeldet.
        destination_of_funds:
          type: array
          description: >-
            Wohin die Adresse Gelder gesendet hat, zugeordnet nach Entität.
            Gleiche Elementstruktur wie `source_of_funds` mit
            `exposure_direction` = `outgoing`.
          items:
            type: object
            properties:
              category:
                type: string
                description: >-
                  Normalisierte Risikokategorie, z. B. `exchange_licensed`,
                  `dex`, `defi`, `payment_processor`, `mixer`, `darknet_market`,
                  `sanctioned`, `stolen_funds`, `high_risk_exchange`.
              percentage:
                type: number
                description: Anteil an der Gesamtexposition der Richtung, 0-100.
              amount_usd:
                type: number
                nullable: true
                description: Dieser Entität zugeschriebener USD-Wert.
              entity_name:
                type: string
                nullable: true
                description: >-
                  Name der zugeordneten Entität, beispielsweise einer
                  Krypto-Börse, eines Mixers oder einer sanktionierten Gruppe.
              entity_type:
                type: string
                nullable: true
                description: >-
                  Typ der Anbieter-Entität (z. B. `Exchange`, `DeFi`,
                  `Sanctions`, `Theft`).
              entity_subtype:
                type: string
                nullable: true
                description: >-
                  Detaillierterer Untertyp (z. B. `Mandatory KYC and AML`,
                  `OFAC`, `Yield Aggregator`).
              hops:
                type: integer
                nullable: true
                description: >-
                  Anzahl der Hops zur Entität (1 für eine direkte Gegenpartei),
                  sofern der Anbieter einen angibt. Immer `null` für Merkle
                  Science, das nur meldet, ob das Exposure direkt oder indirekt
                  ist: Verwenden Sie `exposure_type`.
              description:
                type: string
                nullable: true
                description: >-
                  `entity_type / entity_subtype`, wie der Anbieter die Entität
                  kennzeichnet.
              is_direct:
                type: boolean
                description: True, wenn `exposure_type` gleich `direct` ist.
              exposure_direction:
                type: string
                enum:
                  - incoming
                  - outgoing
                  - connected
                description: >-
                  Gibt an, ob die Mittel von dieser Entität stammten
                  (`incoming`) oder an sie gingen (`outgoing`).
              exposure_type:
                type: string
                enum:
                  - direct
                  - indirect
                description: '`direct` (1 Hop) oder `indirect` (Multi-Hop) Exposition.'
              provider_entity_id:
                type: string
                nullable: true
                description: Die anbietereigene Kennung für die Entität.
              provider_entity_type_id:
                type: string
                nullable: true
                description: Die anbietereigene Kennung für `entity_type`.
              provider_entity_subtype_id:
                type: string
                nullable: true
                description: Die anbietereigene Kennung für `entity_subtype`.
              country:
                type: string
                nullable: true
                description: >-
                  Primäres ISO-3166-1-alpha-2-Land der Entität. Leer oder
                  `null`, wenn der Anbieter es nicht kennt.
              raw_amount:
                type: number
                nullable: true
                description: >-
                  Betrag in der eigenen Einheit des Vermögenswerts, sofern vom
                  Anbieter gemeldet.
              raw_currency:
                type: string
                nullable: true
                description: Einheit von `raw_amount`, sofern vom Anbieter gemeldet.
        counterparty_connections:
          type: array
          description: >-
            Entitäten, denen der Anbieter die überprüfte Adresse zuordnet. Bei
            Merkle Science stammen diese aus den eigenen Eigentümer- und
            Benutzer-Tags der Adresse, sodass dieselbe Entität zweimal vorkommen
            kann und diese keine Mittelflüsse aufweisen: `received_usd`,
            `sent_usd`, `received_hops` und `sent_hops` sind `null` und
            `percentage` ist 0. Steuern Sie hier nicht anhand von `risk_level`
            oder `is_direct`: Verwenden Sie `sanctions_hit`,
            `dominant_risk_category` und `risk_factors[].is_high_risk` für das
            Urteil und `exposure_type` in
            `source_of_funds`/`destination_of_funds` für die Direktheit.
          items:
            type: object
            properties:
              entity_name:
                type: string
                nullable: true
                description: Name der zugeschriebenen Entität.
              entity_type:
                type: string
                nullable: true
                description: Typ der Anbieter-Entität.
              entity_subtype:
                type: string
                nullable: true
                description: Subtyp der Anbieter-Entität.
              risk_level:
                type: string
                description: >-
                  In Kleinbuchstaben und anbieterabhängig. Bei Merkle Science
                  ist dies die eigene Risikostufe 0–5 der Adresse (`no_risk`,
                  `low`, `medium_low`, `medium`, `high`, `critical`), angehoben
                  auf `high`, wenn die Kategorie der Entität ein hohes Risiko
                  aufweist; es handelt sich nicht um eine separate Einstufung
                  der Entität.
              categories:
                type: array
                items:
                  type: string
                description: Normalisierte Risikokategorien der Entität.
              received_usd:
                type: number
                nullable: true
                description: Von der Entität empfangene USD, sofern vom Anbieter gemeldet.
              sent_usd:
                type: number
                nullable: true
                description: An die Entität gesendete USD, sofern vom Anbieter gemeldet.
              received_hops:
                type: integer
                nullable: true
                description: >-
                  Hops zur Entität auf der Empfängerseite, sofern vom Anbieter
                  gemeldet.
              sent_hops:
                type: integer
                nullable: true
                description: >-
                  Hops zur Entität auf der Senderseite, sofern vom Anbieter
                  gemeldet.
              percentage:
                type: number
                description: >-
                  Anteil an der Exposition der Adresse, sofern vom Anbieter
                  gemeldet; andernfalls 0.
              is_direct:
                type: boolean
                description: >-
                  Immer `true` für Merkle Science, deren Verbindungen eher
                  Attributionen als Gegenparteien sind.
              country:
                type: string
                nullable: true
                description: Land der Entität, sofern bekannt.
              provider_entity_id:
                type: string
                nullable: true
                description: Die anbietereigene Kennung für die Entität.
        network_nodes:
          type: array
          items:
            type: object
          description: >-
            Knoten des Exposure-Graphen für das Transaktions-Screening. Bei
            einem Wallet-Screening-Ergebnis leer.
        network_edges:
          type: array
          items:
            type: object
          description: >-
            Kanten des Exposure-Graphen für das Transaktions-Screening. Bei
            einem Wallet-Screening-Ergebnis leer.
        sanctions_hit:
          type: boolean
          description: >-
            True, wenn die Adresse direkt oder indirekt Sanktionen ausgesetzt
            ist.
        pep_counterparty:
          type: boolean
          description: >-
            Exposition gegenüber einer politisch exponierten Person. `null`,
            wenn kein PEP-Befund vorliegt, was derzeit jedes Ergebnis ist, da
            kein Anbieter einen meldet; `false` nur bei einem explizit negativen
            Screening-Ergebnis. Interpretieren Sie `null` nicht als
            abgeschlossene PEP-Prüfung.
          nullable: true
        dominant_risk_category:
          type: string
          nullable: true
          description: >-
            Kategorie mit hohem Risiko mit der höchsten Gewichtung oder `null`,
            wenn keine dominiert (z. B. `sanctioned`, `mixer`, `stolen_funds`).
        risk_factors:
          type: array
          description: >-
            Nach Rang geordnete Erklärung von `risk_score`: was dieses Urteil
            herbeigeführt hat. Anbieter bewerten eine Adresse nach ihrem eigenen
            Modell und geben lediglich ein Urteil zurück (Merkle Science gibt
            eine Ganzzahl von 0-5 zurück), sodass der Score allein nicht
            handlungsrelevant ist. Zuerst nach hohem Risiko, dann nach dem Wert
            sortiert, der durch jeden Treiber bewegt wurde, begrenzt auf die
            fünf stärksten; `source_of_funds` und `destination_of_funds`
            enthalten immer die vollständige Aufschlüsselung. Ein hoher
            `risk_score` ohne `is_high_risk`-Eintrag bedeutet, dass der Anbieter
            keine Übereinstimmung mit Sanktionen oder zugeordneten Entitäten
            gemeldet und die Adresse rein anhand seines eigenen Exposure-Modells
            bewertet hat – `summary` gibt dies explizit an.
          items:
            type: object
            properties:
              source:
                type: string
                enum:
                  - attribution
                  - exposure
                description: >-
                  `attribution` ist das, was der Anbieter als die Adresse selbst
                  angibt (ihr eigener Tag oder Cluster); `exposure` gibt an,
                  wohin ihre Gelder tatsächlich geflossen sind.
              category:
                type: string
                description: >-
                  Normalisierte Risikokategorie, gleiches Vokabular wie bei der
                  Aufschlüsselung der Exposition.
              label:
                type: string
                description: >-
                  Der anbietereigene Wortlaut für den Treiber (z. B. `Gambling /
                  Crypto only`), den Sie auch in der Konsole des Anbieters sehen
                  würden.
              entity_name:
                type: string
                nullable: true
                description: >-
                  Zugeschriebene Entität hinter dem Treiber, zum Beispiel eine
                  Glücksspiel-Website oder eine Börse.
              direction:
                type: string
                enum:
                  - incoming
                  - outgoing
                  - connected
                  - unknown
                  - attribution
                description: >-
                  Richtung des Geldflusses, `attribution`, wenn der Auslöser das
                  eigene Tag der Adresse ist, oder `unknown`, wenn der Anbieter
                  keine Richtung gemeldet hat.
              exposure_type:
                type: string
                enum:
                  - direct
                  - indirect
                  - unknown
                  - attribution
                description: >-
                  `direct` (1 Hop) oder `indirect` (Multi-Hop), `attribution`
                  für das eigene Tag der Adresse oder `unknown`, wenn der
                  Anbieter nicht angegeben hat, wie viele Hops die Gegenpartei
                  entfernt ist. Behandeln Sie `unknown` als nicht klassifiziert,
                  nicht als `direct`.
              amount_usd:
                type: number
                format: float
                nullable: true
                description: Diesem Treiber zugeschriebener USD-Wert.
              percentage:
                type: number
                format: float
                description: >-
                  Anteil am GESAMTEN überprüften Volumen der Adresse, beide
                  Richtungen kombiniert – im Gegensatz zu `percentage` innerhalb
                  von `source_of_funds`/`destination_of_funds`, das pro Richtung
                  normalisiert wird. Über die gesamte Liste hinweg vergleichbar
                  und summierbar.
              is_high_risk:
                type: boolean
                description: >-
                  Gibt an, ob die Kategorie von Didit als hohes Risiko
                  eingestuft wird (`sanctioned`, `mixer`, `stolen_funds`,
                  `ransomware`, `scam`, `darknet_market`, `terrorist_financing`,
                  `child_exploitation`, `hacked_exchange`, `high_risk_exchange`,
                  `seized_funds`).
              description:
                type: string
                description: >-
                  Einzeilige Darstellung des Treibers, z. B. `9.01% indirect
                  outgoing exposure to Gambling / Crypto only (Example
                  Gambling)`.
        raw_response:
          type: object
          additionalProperties: true
          description: >-
            Die anbietereigene Payload. Ihre Struktur ist anbieterspezifisch und
            kann sich ohne Vorankündigung ändern: Lesen Sie die normalisierten
            Felder aus, anstatt sie zu parsen.
        report_signature:
          type: string
          description: >-
            Opake HMAC-SHA256-Signatur über genau dieses Ergebnis, beschränkt
            auf Ihre Anwendung. Für sich allein genommen nicht aussagekräftig –
            senden Sie den vollständigen Antwort-Body unverändert und
            einschließlich dieses Felds erneut an `POST
            /v3/wallet-screening/pdf/`, um ihn als PDF zu rendern. Der
            PDF-Endpoint weist die Anfrage mit `400` ab, wenn `report_signature`
            fehlt oder wenn ein signiertes Feld (z. B. `risk_score`, `severity`,
            `sanctions_hit`) vor dem erneuten Senden bearbeitet wurde.
      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: >-
        Der API-Schlüssel Ihrer Anwendung, aus Entwickler -> API-Schlüssel in
        der Business Console. Der Primärschlüssel hat Vollzugriff. Ein benannter
        Schlüssel kann im Geltungsbereich eingeschränkt werden: keine, Lese-
        oder Schreibberechtigung pro Ressource, beschränkt auf bestimmte
        Workflows oder genehmigte Sitzungen, auf eine Liste von IP-Adressen und
        auf ein Ablaufdatum. 401 bedeutet, dass der Schlüssel falsch, widerrufen
        oder abgelaufen ist; 403 bedeutet, dass kein Schlüssel gesendet wurde,
        der Schlüssel keinen Zugriff auf diese Ressource oder Aktion hat oder
        die Anfrage von einer Adresse außerhalb seiner IP-Liste stammte; 404 bei
        einer Sitzungsroute bedeutet, dass die Sitzung außerhalb der Workflows
        oder Status des Schlüssels liegt. Ein Schlüssel ohne Medienzugriff
        erhält Bild-, Video- und PDF-URLs als null, und ein Schlüssel ohne
        Schreibberechtigung für Sitzungen erhält Sitzungslinks und Token als
        null. Siehe https://docs.didit.me/console/api-keys.

````

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