# $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.pdffrom 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)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()));ctx := context.Background()
// Reads DIDIT_API_KEY.
client := didit.NewClient()
resp, err := client.WalletScreening.ScreenPDF(ctx, didit.WalletScreeningResultParam{
Provider: "your-provider",
ScreeningType: "WALLET_SCREENING",
RiskScore: 1,
Severity: "UNKNOWN",
Status: "SCREENED",
Summary: "your-summary",
WalletAddress: "your-wallet-address",
Blockchain: "your-blockchain",
SourceOfFunds: []didit.WalletScreeningResultParamSourceOfFunds{{}},
DestinationOfFunds: []didit.WalletScreeningResultParamDestinationOfFunds{{}},
CounterpartyConnections: []didit.WalletScreeningResultParamCounterpartyConnections{{}},
SanctionsHit: true,
DominantRiskCategory: didit.String("your-dominant-risk-category"),
ReportSignature: "your-report-signature",
})
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
file, err := os.Create("download.pdf")
if err != nil {
log.Fatal(err)
}
defer file.Close()
if _, err := io.Copy(file, resp.Body); err != nil {
log.Fatal(err)
}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"));<?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');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)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");"<string>"ウォレットスクリーニングPDFレポートAPI
スクリーニングエンドポイントのJSONを再送信すると、ウォレットスクリーニング結果をDiditブランドのPDFで出力できます。ステートレスで、プロバイダー呼び出しや追加請求は発生しません。
# $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.pdffrom 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)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()));ctx := context.Background()
// Reads DIDIT_API_KEY.
client := didit.NewClient()
resp, err := client.WalletScreening.ScreenPDF(ctx, didit.WalletScreeningResultParam{
Provider: "your-provider",
ScreeningType: "WALLET_SCREENING",
RiskScore: 1,
Severity: "UNKNOWN",
Status: "SCREENED",
Summary: "your-summary",
WalletAddress: "your-wallet-address",
Blockchain: "your-blockchain",
SourceOfFunds: []didit.WalletScreeningResultParamSourceOfFunds{{}},
DestinationOfFunds: []didit.WalletScreeningResultParamDestinationOfFunds{{}},
CounterpartyConnections: []didit.WalletScreeningResultParamCounterpartyConnections{{}},
SanctionsHit: true,
DominantRiskCategory: didit.String("your-dominant-risk-category"),
ReportSignature: "your-report-signature",
})
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
file, err := os.Create("download.pdf")
if err != nil {
log.Fatal(err)
}
defer file.Close()
if _, err := io.Copy(file, resp.Body); err != nil {
log.Fatal(err)
}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"));<?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');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)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");"<string>"ステートレスである理由
スタンドアロンのウォレットスクリーニングは取引テーブルに何も書き込まないため、このエンドポイントがPDFを生成する元となる保存済みのレコードはありません。代わりに、POST /v3/wallet-screening/から受け取ったJSONをそのまま再送信すると、Diditはプロバイダーを再度呼び出すことなく、そのペイロードをPDFとして生成します。
report_signatureフィールド
すべてのPOST /v3/wallet-screening/レスポンスには、report_signatureフィールドが含まれるようになりました。これはアプリケーションに紐づく不透明な署名です。このエンドポイントはPDFを生成する前にこの署名を検証します。そのため、呼び出し元がrisk_score、severity、sanctions_hitなどのフィールドを編集して、Diditが実際には出していない結果について、見た目上は問題のないDiditブランドのPDFを取得することはできません。
report_signatureを含むレスポンス本文全体を、必ず変更せずに再送信してください。キーの順序を入れ替えることは問題ありませんが、署名された値を変更することはできません。
# 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
請求
プロバイダーの呼び出しは行われず、請求も一切発生しません。このエンドポイントは、POST /v3/wallet-screening/を呼び出した時点で支払い済みの結果を再表示するだけです。
エラー
| ステータス | 意味 |
|---|---|
400 | リクエスト本文がウォレットスクリーニング結果の形式に一致するJSONオブジェクトではない、またはreport_signatureが欠落しているか、再送信されたフィールドと一致しません。 |
401 | x-api-keyが欠落しているか無効です。 |
次のステップ
ウォレットのスクリーニング
オンデマンドのウォレットスクリーニング
承認
お客様のアプリケーションのAPIキーです。Business ConsoleのDevelopers -> API keysで取得できます。プライマリキーはフルアクセス権を持ちます。名前付きキーにはスコープを設定できます。リソースごとのアクセス権(なし、読み取り、書き込み)、一部のワークフローまたは承認済みセッションへの限定、IPアドレスのリストへの限定、有効期限の設定です。401は、キーが誤っている、失効している、または期限切れであることを意味します。403は、キーが送信されていない、キーにこのリソースやアクションへのアクセス権がない、またはIPリスト外のアドレスからリクエストが送信されたことを意味します。セッションのルートでの404は、セッションがキーのワークフローまたはステータスの対象外であることを意味します。メディアへのアクセス権がないキーでは、画像、動画、PDFのURLがnullで返されます。セッションの書き込み権限がないキーでは、セッションのリンクとトークンがnullで返されます。詳細は次を参照してください: https://docs.didit.me/console/api-keys
ボディ
POST /v3/wallet-screening/から返された、変更を加えていないJSONオブジェクト(report_signatureを含む)。
POST /v3/wallet-screening/のレスポンスと同じ形式です。report_signatureを含め、そのレスポンス本文をそのまま渡してください。
スクリーニングを実行したプロバイダーです(例:merklescience、crystal)。
このエンドポイントでは常にWALLET_SCREENINGです。
WALLET_SCREENING 0〜100に正規化されたリスクスコア。値が高いほど、リスクのあるエンティティへのエクスポージャーが大きいことを意味します。Merkle Scienceはアドレスを0〜5で評価し、それぞれ0、15、35、55、75、95に対応します。
risk_scoreから導出されるリスク区分です。0-9はUNKNOWN、10-39はLOW、40-69はMEDIUM、70-89はHIGH、90-100はCRITICALです。UNKNOWNは最も低い区分であり、データなしを表す別の状態ではありません。risk_scoreが0(問題のないアドレスでよくあるケース)の場合は不利な評価がないことを意味し、1から9の範囲のゼロ以外のスコアはLOW未満ではあるものの実際のシグナルです。区分だけでなくrisk_scoreを確認してください。UNKNOWNを低リスクや問題なしという積極的な評価として扱わないでください。合格として表示しないでください。
UNKNOWN, LOW, MEDIUM, HIGH, CRITICAL スクリーニング結果のステータス。
SCREENED, PENDING, ERROR スクリーニング結果の、人が読める形式の概要。
スクリーニングされたアドレスで、そのまま返されます。
スクリーニングされたブロックチェーン。
このアドレスが資金を受け取った送金元(エンティティ別に帰属を特定)。各エントリはエクスポージャーの内訳です。
Show child attributes
Show child attributes
このアドレスが資金を送った送金先(エンティティ別に帰属を特定)。項目の形式はsource_of_fundsと同じで、exposure_direction = outgoingです。
Show child attributes
Show child attributes
プロバイダーがスクリーニング対象のアドレスに紐付けたエンティティ。Merkle Scienceの場合、これらはアドレス自体の所有者タグとユーザータグから取得されるため、同じエンティティが2回表示されることがあり、資金フローは含まれません。received_usd、sent_usd、received_hops、sent_hopsはnullで、percentageは0です。ここではrisk_levelやis_directに基づいて処理を分岐しないでください。判定にはsanctions_hit、dominant_risk_category、risk_factors[].is_high_riskを、直接性の判断にはsource_of_funds/destination_of_funds内のexposure_typeを使用してください。
Show child attributes
Show child attributes
アドレスに直接的または間接的な制裁エクスポージャーがある場合はtrue。
最も重みの高い高リスクカテゴリです(例: sanctioned、mixer、stolen_funds)。支配的なカテゴリがない場合はnullです。
この結果そのものに対する不透明なHMAC-SHA256署名で、アプリケーションにスコープされています。単体では意味を持ちません。PDFとして出力するには、このフィールドを含むレスポンス本文全体を変更せずにPOST /v3/wallet-screening/pdf/へ再送信してください。report_signatureが欠落している場合、または署名対象のフィールド(例: risk_score、severity、sanctions_hit)が再送信前に編集されていた場合、PDFエンドポイントはリクエストを400で拒否します。
取引スクリーニングのフィールドで、結果の形式と共通です。ウォレットスクリーニングの結果では常にnullです。
取引スクリーニングのフィールドで、結果の形式と共通です。ウォレットスクリーニングの結果では常にnullです。
取引スクリーニングのフィールドで、結果の形式と共通です。ウォレットスクリーニングの結果では常にnullです。
取引スクリーニングのフィールドで、結果の形式と共通です。ウォレットスクリーニングの結果では常にnullです。
取引スクリーニングのフィールドで、結果の形式と共通です。ウォレットスクリーニングの結果では常に空です。
取引スクリーニングのフィールドで、結果の形式と共通です。ウォレットスクリーニングの結果では常に空です。
取引スクリーニングのフィールドで、結果の形式と共通です。ウォレットスクリーニングの結果では常に空です。
取引スクリーニングのフィールドで、結果の形式と共通です。ウォレットスクリーニングの結果では常にnullです。
取引スクリーニングのフィールドで、結果の形式と共通です。ウォレットスクリーニングの結果では常にnullです。
取引スクリーニング用のエクスポージャーグラフのノードです。ウォレットスクリーニングの結果では空になります。
取引スクリーニング用のエクスポージャーグラフのエッジです。ウォレットスクリーニングの結果では空になります。
重要な公的地位を有する者 (PEP)への該当状況。PEPの検出結果がない場合はnullとなり、現時点ではPEPの結果を報告するプロバイダーがないため、すべての結果がこれに該当します。falseは、スクリーニングで明示的に否定的な結果が出た場合にのみ返されます。nullをPEPチェック完了と解釈しないでください。
risk_scoreの順位付きの説明で、この判定を導いた要因を示します。プロバイダーは独自のモデルでアドレスを評価し、判定のみを返すため(Merkle Scienceは0〜5の整数を返します)、スコアだけでは対応に活かせません。高リスクのものを先頭に、次に各ドライバーを経由した金額の大きい順に並べ、上位5件までに制限されます。source_of_fundsとdestination_of_fundsには常に完全な内訳が含まれます。risk_scoreが高いにもかかわらずis_high_riskのエントリがない場合は、プロバイダーが制裁や帰属エンティティとの一致を報告しておらず、独自のエクスポージャーモデルのみでアドレスを評価したことを意味します。このことはsummaryに明記されます。
Show child attributes
Show child attributes
プロバイダー独自のペイロードです。形式はプロバイダーごとに異なり、予告なく変更される場合があります。解析せずに、正規化されたフィールドを参照してください。
レスポンス
レンダリングされたPDF書類。バイナリのapplication/pdfとして直接返されます。JSONラッパーはありません。
The response is of type file.