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

# Laporan PDF Skrining Dompet API

> Render hasil skrining dompet jadi PDF ber-branding Didit dari JSON endpoint skrining. Stateless, tanpa panggilan provider, tanpa biaya tambahan.



Prompt Screen Wallet PDF
        Salin prompt ke papan klip



      
      

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



      
      

Tempel ke

## Mengapa bersifat statelessSkrining dompet mandiri tidak menulis apa pun ke tabel transactions, sehingga tidak ada catatan tersimpan yang bisa dirender oleh endpoint ini. Sebagai gantinya, Anda mengirim ulang JSON persis yang sudah diberikan `POST /v3/wallet-screening/` kepada Anda, dan Didit merender payload tersebut menjadi PDF tanpa memanggil penyedia lagi.## Kolom `report_signature`Setiap respons `POST /v3/wallet-screening/` sekarang menyertakan kolom `report_signature`, yaitu tanda tangan yang tidak dapat diinterpretasikan dan terikat pada aplikasi Anda. Endpoint ini memverifikasinya sebelum merender, sehingga pemanggil tidak dapat mengubah `risk_score`, `severity`, `sanctions_hit`, atau kolom lain lalu mendapatkan PDF berlogo Didit yang tampak rapi untuk hasil yang tidak pernah dihasilkan Didit.Selalu kirim ulang seluruh isi respons **tanpa diubah**, termasuk `report_signature`. Mengurutkan ulang kunci tidak masalah; mengubah nilai yang ditandatangani tidak diperbolehkan.```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
```## PenagihanTidak ada panggilan ke penyedia yang dilakukan dan tidak ada tagihan: endpoint ini hanya merender ulang hasil yang sudah Anda bayar saat memanggil `POST /v3/wallet-screening/`.## Kesalahan| Status | Arti |
| - | - |
| `400` | Isi permintaan bukan objek JSON yang sesuai dengan bentuk hasil skrining dompet, atau `report_signature` tidak ada atau tidak cocok dengan kolom yang dikirim ulang. |
| `401` | `x-api-key` tidak ada atau tidak valid. |## Langkah selanjutnya> [card] [Skrining Dompet](https://docs.didit.me/id/management-api/transactions/screen-wallet.md)
>
> Jalankan skrining dompet sesuai permintaan yang mendasarinya dan dapatkan hasil JSON untuk dikirim ulang ke sini.> [card] [Skrining dompet sesuai permintaan](https://docs.didit.me/id/transaction-monitoring/wallet-screening.md)
>
> Ikhtisar endpoint skrining dompet mandiri dan model hasilnya.


## OpenAPI

````yaml id/openapi-25.json POST /v3/wallet-screening/pdf/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: API Verifikasi Identitas. Lakukan autentikasi dengan header x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/wallet-screening/pdf/:
    post:
      tags:
        - Transactions
      summary: Render hasil Skrining Dompet sebagai PDF
      description: >-
        Pelengkap stateless untuk `POST /v3/wallet-screening/`: kirim ulang body
        JSON persis seperti yang dikembalikan endpoint tersebut — termasuk
        `report_signature` yang ditambahkan — dan dapatkan kembali PDF bermerek
        Didit dengan hasil yang sama. Tidak ada penyedia yang dipanggil dan
        tidak ada yang ditagihkan atau disimpan; ini hanya merender ulang hasil
        yang telah dibuat oleh Didit. Tanda tangan mengikat PDF ke hasil yang
        belum dimodifikasi: mengedit `risk_score`, `severity`, `sanctions_hit`,
        atau kolom lain yang ditandatangani sebelum mengirim ulang akan gagal
        dengan `400`.
      operationId: screenWalletPdf
      requestBody:
        required: true
        description: >-
          Objek JSON yang tidak dimodifikasi yang dikembalikan oleh `POST
          /v3/wallet-screening/`, termasuk `report_signature`.
        content:
          application/json:
            schema:
              allOf:
                - $ref: '#/components/schemas/WalletScreeningResult'
              required:
                - report_signature
              description: >-
                Struktur yang sama dengan respons `POST /v3/wallet-screening/` —
                teruskan isi respons tersebut kembali apa adanya, termasuk
                `report_signature`.
      responses:
        '200':
          description: >-
            Dokumen PDF hasil render, dikembalikan langsung sebagai biner
            `application/pdf` — tidak ada pembungkus JSON.
          headers:
            Content-Disposition:
              description: >-
                `attachment; filename=wallet_screening_{address}.pdf`,
                diturunkan dari `wallet_address` (atau `transaction_hash`) dalam
                hasil yang diposting ulang.
              schema:
                type: string
                example: >-
                  attachment;
                  filename=wallet_screening_0x28c6c06298d514db0899.pdf
          content:
            application/pdf:
              schema:
                type: string
                format: binary
        '400':
          description: >-
            Isi body bukan berupa objek JSON yang cocok dengan bentuk hasil
            Skrining Dompet, atau `report_signature` tidak ada atau tidak cocok
            dengan kolom yang dikirim ulang (diedit atau dipotong sebelum
            dikirim ulang).
          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` tidak ada atau tidak valid.'
      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: >-
            Penyedia yang melakukan skrining (misalnya `merklescience`,
            `crystal`).
        screening_type:
          type: string
          enum:
            - WALLET_SCREENING
          description: Selalu `WALLET_SCREENING` untuk endpoint ini.
        risk_score:
          type: integer
          description: >-
            Skor risiko 0-100 yang dinormalisasi. Nilai lebih tinggi berarti
            paparan lebih besar terhadap entitas berisiko. Merkle Science
            menilai alamat 0-5, yang dipetakan ke 0, 15, 35, 55, 75, atau 95.
        severity:
          type: string
          enum:
            - UNKNOWN
            - LOW
            - MEDIUM
            - HIGH
            - CRITICAL
          description: >-
            Kelompok risiko diturunkan dari `risk_score`: `0-9` UNKNOWN, `10-39`
            LOW, `40-69` MEDIUM, `70-89` HIGH, `90-100` CRITICAL. `UNKNOWN`
            adalah rentang terendah, bukan status tanpa data yang terpisah:
            `risk_score` 0 (kasus alamat bersih yang umum) berarti tidak ada
            penilaian buruk, sedangkan skor bukan nol dalam rentang 1-9 adalah
            sinyal nyata tetapi di bawah LOW - baca `risk_score`, bukan hanya
            kelompoknya. Jangan pernah memperlakukan `UNKNOWN` sebagai indikasi
            afirmatif bahwa risikonya rendah atau penilaian bersih; jangan
            menampilkannya sebagai lolos.
        status:
          type: string
          enum:
            - SCREENED
            - PENDING
            - ERROR
          description: Status hasil skrining.
        summary:
          type: string
          description: Ringkasan hasil skrining yang dapat dibaca manusia.
        wallet_address:
          type: string
          description: Alamat yang diskrining, dikembalikan apa adanya.
        transaction_hash:
          type: string
          nullable: true
          description: >-
            Kolom skrining transaksi, digunakan bersama struktur hasil. Selalu
            `null` pada hasil skrining dompet.
        blockchain:
          type: string
          description: Blockchain yang diskrining.
        block_timestamp:
          type: string
          nullable: true
          description: >-
            Kolom skrining transaksi, digunakan bersama struktur hasil. Selalu
            `null` pada hasil skrining dompet.
        total_value_usd:
          type: number
          nullable: true
          description: >-
            Kolom skrining transaksi, digunakan bersama struktur hasil. Selalu
            `null` pada hasil skrining dompet.
        fee_usd:
          type: number
          nullable: true
          description: >-
            Kolom skrining transaksi, digunakan bersama struktur hasil. Selalu
            `null` pada hasil skrining dompet.
        sender_rows:
          type: array
          items:
            type: object
          description: >-
            Kolom skrining transaksi, digunakan bersama struktur hasil. Selalu
            kosong pada hasil skrining dompet.
        receiver_rows:
          type: array
          items:
            type: object
          description: >-
            Kolom skrining transaksi, digunakan bersama struktur hasil. Selalu
            kosong pada hasil skrining dompet.
        transaction_flows:
          type: array
          items:
            type: object
          description: >-
            Kolom skrining transaksi, digunakan bersama struktur hasil. Selalu
            kosong pada hasil skrining dompet.
        transaction_flows_status:
          type: string
          nullable: true
          description: >-
            Kolom skrining transaksi, digunakan bersama struktur hasil. Selalu
            `null` pada hasil skrining dompet.
        transaction_flows_error:
          type: string
          nullable: true
          description: >-
            Kolom skrining transaksi, digunakan bersama struktur hasil. Selalu
            `null` pada hasil skrining dompet.
        source_of_funds:
          type: array
          description: >-
            Dari mana alamat tersebut menerima dana, diatribusikan berdasarkan
            entitas. Setiap entri merupakan rincian eksposur.
          items:
            type: object
            properties:
              category:
                type: string
                description: >-
                  Kategori risiko yang dinormalisasi, misalnya
                  `exchange_licensed`, `dex`, `defi`, `payment_processor`,
                  `mixer`, `darknet_market`, `sanctioned`, `stolen_funds`,
                  `high_risk_exchange`.
              percentage:
                type: number
                description: Porsi total paparan arah tersebut, 0-100.
              amount_usd:
                type: number
                nullable: true
                description: Nilai USD yang diatribusikan ke entitas ini.
              entity_name:
                type: string
                nullable: true
                description: >-
                  Nama entitas yang diatribusikan, misalnya bursa, mixer, atau
                  kelompok yang terkena sanksi.
              entity_type:
                type: string
                nullable: true
                description: >-
                  Tipe entitas penyedia (misalnya `Exchange`, `DeFi`,
                  `Sanctions`, `Theft`).
              entity_subtype:
                type: string
                nullable: true
                description: >-
                  Subtipe yang lebih terperinci (misalnya `Mandatory KYC and
                  AML`, `OFAC`, `Yield Aggregator`).
              hops:
                type: integer
                nullable: true
                description: >-
                  Jumlah hop ke entitas (1 untuk pihak lawan langsung), jika
                  penyedia melaporkannya. Selalu `null` untuk Merkle Science,
                  yang hanya melaporkan apakah eksposur bersifat langsung atau
                  tidak langsung: gunakan `exposure_type`.
              description:
                type: string
                nullable: true
                description: >-
                  `entity_type / entity_subtype`, sebagaimana penyedia memberi
                  label pada entitas.
              is_direct:
                type: boolean
                description: True saat `exposure_type` bernilai `direct`.
              exposure_direction:
                type: string
                enum:
                  - incoming
                  - outgoing
                  - connected
                description: >-
                  Apakah dana berasal dari (`incoming`) atau dikirim ke
                  (`outgoing`) entitas ini.
              exposure_type:
                type: string
                enum:
                  - direct
                  - indirect
                description: >-
                  Eksposur `direct` (1 lompatan) atau `indirect`
                  (multi-lompatan).
              provider_entity_id:
                type: string
                nullable: true
                description: Pengenal milik penyedia sendiri untuk entitas tersebut.
              provider_entity_type_id:
                type: string
                nullable: true
                description: Pengenal milik penyedia sendiri untuk `entity_type`.
              provider_entity_subtype_id:
                type: string
                nullable: true
                description: Pengenal milik penyedia sendiri untuk `entity_subtype`.
              country:
                type: string
                nullable: true
                description: >-
                  Negara utama entitas berdasarkan ISO 3166-1 alpha-2. Kosong
                  atau `null` ketika penyedia tidak mengetahuinya.
              raw_amount:
                type: number
                nullable: true
                description: >-
                  Jumlah dalam unit aset itu sendiri, saat penyedia
                  melaporkannya.
              raw_currency:
                type: string
                nullable: true
                description: Satuan dari `raw_amount`, saat penyedia melaporkannya.
        destination_of_funds:
          type: array
          description: >-
            Ke mana alamat tersebut mengirim dana, diatribusikan berdasarkan
            entitas. Bentuk item sama seperti `source_of_funds` dengan
            `exposure_direction` = `outgoing`.
          items:
            type: object
            properties:
              category:
                type: string
                description: >-
                  Kategori risiko yang dinormalisasi, misalnya
                  `exchange_licensed`, `dex`, `defi`, `payment_processor`,
                  `mixer`, `darknet_market`, `sanctioned`, `stolen_funds`,
                  `high_risk_exchange`.
              percentage:
                type: number
                description: Porsi total paparan arah tersebut, 0-100.
              amount_usd:
                type: number
                nullable: true
                description: Nilai USD yang diatribusikan ke entitas ini.
              entity_name:
                type: string
                nullable: true
                description: >-
                  Nama entitas yang diatribusikan, misalnya bursa, mixer, atau
                  kelompok yang terkena sanksi.
              entity_type:
                type: string
                nullable: true
                description: >-
                  Tipe entitas penyedia (misalnya `Exchange`, `DeFi`,
                  `Sanctions`, `Theft`).
              entity_subtype:
                type: string
                nullable: true
                description: >-
                  Subtipe yang lebih terperinci (misalnya `Mandatory KYC and
                  AML`, `OFAC`, `Yield Aggregator`).
              hops:
                type: integer
                nullable: true
                description: >-
                  Jumlah hop ke entitas (1 untuk pihak lawan langsung), jika
                  penyedia melaporkannya. Selalu `null` untuk Merkle Science,
                  yang hanya melaporkan apakah eksposur bersifat langsung atau
                  tidak langsung: gunakan `exposure_type`.
              description:
                type: string
                nullable: true
                description: >-
                  `entity_type / entity_subtype`, sebagaimana penyedia memberi
                  label pada entitas.
              is_direct:
                type: boolean
                description: True saat `exposure_type` bernilai `direct`.
              exposure_direction:
                type: string
                enum:
                  - incoming
                  - outgoing
                  - connected
                description: >-
                  Apakah dana berasal dari (`incoming`) atau dikirim ke
                  (`outgoing`) entitas ini.
              exposure_type:
                type: string
                enum:
                  - direct
                  - indirect
                description: >-
                  Eksposur `direct` (1 lompatan) atau `indirect`
                  (multi-lompatan).
              provider_entity_id:
                type: string
                nullable: true
                description: Pengenal milik penyedia sendiri untuk entitas tersebut.
              provider_entity_type_id:
                type: string
                nullable: true
                description: Pengenal milik penyedia sendiri untuk `entity_type`.
              provider_entity_subtype_id:
                type: string
                nullable: true
                description: Pengenal milik penyedia sendiri untuk `entity_subtype`.
              country:
                type: string
                nullable: true
                description: >-
                  Negara utama entitas berdasarkan ISO 3166-1 alpha-2. Kosong
                  atau `null` ketika penyedia tidak mengetahuinya.
              raw_amount:
                type: number
                nullable: true
                description: >-
                  Jumlah dalam unit aset itu sendiri, saat penyedia
                  melaporkannya.
              raw_currency:
                type: string
                nullable: true
                description: Satuan dari `raw_amount`, saat penyedia melaporkannya.
        counterparty_connections:
          type: array
          description: >-
            Entitas yang diatribusikan penyedia ke alamat yang diskrining. Untuk
            Merkle Science, entitas ini berasal dari tag pemilik dan pengguna
            alamat itu sendiri, sehingga entitas yang sama dapat muncul dua
            kali, dan tidak membawa aliran dana: `received_usd`, `sent_usd`,
            `received_hops`, dan `sent_hops` bernilai `null` serta `percentage`
            adalah 0. Jangan menentukan rute berdasarkan `risk_level` atau
            `is_direct` di sini: gunakan `sanctions_hit`,
            `dominant_risk_category`, dan `risk_factors[].is_high_risk` untuk
            keputusan akhir, serta `exposure_type` di
            `source_of_funds`/`destination_of_funds` untuk menentukan apakah
            alirannya langsung.
          items:
            type: object
            properties:
              entity_name:
                type: string
                nullable: true
                description: Nama entitas yang diatribusikan.
              entity_type:
                type: string
                nullable: true
                description: Tipe entitas penyedia.
              entity_subtype:
                type: string
                nullable: true
                description: Subtipe entitas penyedia.
              risk_level:
                type: string
                description: >-
                  Huruf kecil dan bergantung pada penyedia. Untuk Merkle
                  Science, ini adalah tingkat risiko 0-5 milik alamat itu
                  sendiri (`no_risk`, `low`, `medium_low`, `medium`, `high`,
                  `critical`), dinaikkan ke `high` jika kategori entitas
                  berisiko tinggi; ini bukan penilaian terpisah dari entitas.
              categories:
                type: array
                items:
                  type: string
                description: Kategori risiko entitas yang dinormalisasi.
              received_usd:
                type: number
                nullable: true
                description: USD yang diterima dari entitas, jika dilaporkan oleh penyedia.
              sent_usd:
                type: number
                nullable: true
                description: USD yang dikirimkan ke entitas, jika dilaporkan oleh penyedia.
              received_hops:
                type: integer
                nullable: true
                description: Hop ke entitas di sisi penerima, jika penyedia melaporkannya.
              sent_hops:
                type: integer
                nullable: true
                description: Hop ke entitas di sisi pengirim, jika penyedia melaporkannya.
              percentage:
                type: number
                description: >-
                  Porsi paparan alamat tersebut, jika penyedia melaporkannya;
                  jika tidak, 0.
              is_direct:
                type: boolean
                description: >-
                  Selalu `true` untuk Merkle Science, yang koneksinya berupa
                  atribusi alih-alih pihak lawan.
              country:
                type: string
                nullable: true
                description: Negara entitas, jika diketahui.
              provider_entity_id:
                type: string
                nullable: true
                description: Pengenal milik penyedia sendiri untuk entitas tersebut.
        network_nodes:
          type: array
          items:
            type: object
          description: >-
            Node graf paparan untuk skrining transaksi. Kosong pada hasil
            skrining dompet.
        network_edges:
          type: array
          items:
            type: object
          description: >-
            Sisi graf paparan untuk skrining transaksi. Kosong pada hasil
            skrining dompet.
        sanctions_hit:
          type: boolean
          description: >-
            True jika alamat memiliki paparan sanksi langsung atau tidak
            langsung.
        pep_counterparty:
          type: boolean
          description: >-
            Paparan Politically Exposed Person (PEP). `null` jika tidak ada
            temuan PEP yang tersedia, yang merupakan semua hasil saat ini karena
            tidak ada penyedia yang melaporkannya; `false` hanya untuk hasil
            skrining negatif yang eksplisit. Jangan mengartikan `null` sebagai
            pemeriksaan PEP yang telah selesai.
          nullable: true
        dominant_risk_category:
          type: string
          nullable: true
          description: >-
            Kategori berisiko tinggi dengan bobot tertinggi, atau `null` jika
            tidak ada yang dominan (misalnya `sanctioned`, `mixer`,
            `stolen_funds`).
        risk_factors:
          type: array
          description: >-
            Penjelasan berperingkat untuk `risk_score`: faktor apa yang
            menghasilkan keputusan ini. Penyedia menilai alamat berdasarkan
            model mereka sendiri dan hanya mengembalikan keputusan (Merkle
            Science mengembalikan bilangan bulat 0-5), sehingga skor saja tidak
            dapat ditindaklanjuti. Diurutkan dari risiko tinggi terlebih dahulu,
            kemudian berdasarkan nilai yang melewati setiap faktor, dibatasi
            hingga lima yang terkuat; `source_of_funds` dan
            `destination_of_funds` selalu memuat rincian lengkap. `risk_score`
            yang tinggi tanpa entri `is_high_risk` berarti penyedia tidak
            melaporkan adanya kecocokan sanksi atau entitas yang diatribusikan
            dan menilai alamat murni berdasarkan model eksposurnya sendiri -
            `summary` menyatakan hal ini secara eksplisit.
          items:
            type: object
            properties:
              source:
                type: string
                enum:
                  - attribution
                  - exposure
                description: >-
                  `attribution` adalah keterangan penyedia mengenai alamat itu
                  sendiri (label atau clusternya sendiri); `exposure` adalah ke
                  mana dananya sebenarnya berpindah.
              category:
                type: string
                description: >-
                  Kategori risiko yang dinormalisasi, kosakata yang sama dengan
                  rincian paparan.
              label:
                type: string
                description: >-
                  Rumusan kata penyedia sendiri untuk faktor (misalnya `Gambling
                  / Crypto only`), yang juga akan Anda lihat di konsol penyedia.
              entity_name:
                type: string
                nullable: true
                description: >-
                  Entitas yang diatribusikan di balik faktor pendorong, misalnya
                  situs judi atau bursa.
              direction:
                type: string
                enum:
                  - incoming
                  - outgoing
                  - connected
                  - unknown
                  - attribution
                description: >-
                  Arah aliran dana, `attribution` saat pemicunya adalah tag
                  milik alamat itu sendiri, atau `unknown` saat penyedia tidak
                  melaporkan arah.
              exposure_type:
                type: string
                enum:
                  - direct
                  - indirect
                  - unknown
                  - attribution
                description: >-
                  `direct` (1 hop) atau `indirect` (multi-hop), `attribution`
                  untuk tag alamat itu sendiri, atau `unknown` ketika penyedia
                  tidak menyatakan berapa hop jarak pihak lawan. Perlakukan
                  `unknown` sebagai tidak terklasifikasi, bukan sebagai
                  `direct`.
              amount_usd:
                type: number
                format: float
                nullable: true
                description: Nilai USD yang diatribusikan ke faktor pendorong ini.
              percentage:
                type: number
                format: float
                description: >-
                  Porsi dari TOTAL volume yang diskrining pada alamat tersebut,
                  gabungan kedua arah - tidak seperti `percentage` di dalam
                  `source_of_funds`/`destination_of_funds`, yang dinormalisasi
                  per arah. Dapat dibandingkan dan dijumlahkan di seluruh
                  daftar.
              is_high_risk:
                type: boolean
                description: >-
                  Apakah kategori ini termasuk yang diperlakukan Didit sebagai
                  berisiko tinggi (`sanctioned`, `mixer`, `stolen_funds`,
                  `ransomware`, `scam`, `darknet_market`, `terrorist_financing`,
                  `child_exploitation`, `hacked_exchange`, `high_risk_exchange`,
                  `seized_funds`).
              description:
                type: string
                description: >-
                  Representasi satu baris dari faktor pendorong, misalnya `9.01%
                  indirect outgoing exposure to Gambling / Crypto only (Example
                  Gambling)`.
        raw_response:
          type: object
          additionalProperties: true
          description: >-
            Payload milik penyedia sendiri. Formatnya spesifik untuk tiap
            penyedia dan dapat berubah tanpa pemberitahuan: baca kolom yang
            telah dinormalisasi daripada menguraikannya.
        report_signature:
          type: string
          description: >-
            Tanda tangan HMAC-SHA256 tidak transparan atas hasil persis ini,
            dengan cakupan ke aplikasi Anda. Tidak memiliki arti tersendiri —
            kirim ulang seluruh isi respons, tanpa diubah dan termasuk kolom
            ini, ke `POST /v3/wallet-screening/pdf/` untuk merendernya sebagai
            PDF. Endpoint PDF menolak permintaan dengan kode `400` jika
            `report_signature` tidak ada atau jika ada kolom bertanda tangan
            (misalnya `risk_score`, `severity`, `sanctions_hit`) yang diubah
            sebelum dikirim ulang.
      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: >-
        Kunci API aplikasi Anda, dari Developers -> API keys di Business
        Console. Kunci utama memiliki akses penuh. Kunci bernama dapat diberi
        cakupan: none, read, atau write per sumber daya, dibatasi pada beberapa
        alur kerja atau pada sesi yang disetujui, pada daftar alamat IP, dan
        pada tanggal kedaluwarsa. 401 berarti kuncinya salah, dicabut, atau
        kedaluwarsa; 403 berarti tidak ada kunci yang dikirimkan, kunci tidak
        memiliki akses ke sumber daya atau tindakan ini, atau permintaan datang
        dari alamat di luar daftar IP-nya; 404 pada rute sesi berarti sesi
        berada di luar alur kerja atau status kunci tersebut. Kunci tanpa akses
        media menerima URL gambar, video, dan PDF sebagai null, dan kunci tanpa
        izin tulis sesi menerima tautan sesi dan token sebagai null. Lihat
        https://docs.didit.me/console/api-keys.

````

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