Skip to main content
Sometimes you need to check a crypto wallet’s AML risk before there is any transaction to record — for example, when a customer adds a withdrawal address, or when your compliance team wants to vet an address ad hoc. The on-demand wallet screening endpoint screens a single address and returns the full risk result without creating a transaction. This is the standalone counterpart to the automatic crypto screening that runs during transaction submission. Both share the same blockchain analytics providers and the same result shape.

When to use it

Wallet screening writes nothing to the transactions table. If you need the screening attached to a monitored transaction (with rules, alerts, and webhooks), submit a transaction instead.

Prerequisites

Transaction monitoring must be configured for the application with either a managed provider or an existing provider key. Configure it in Transactions > Settings > Provider Preferences in the Business Console. If no provider is configured, the endpoint returns 409 Conflict.

Request

POST https://verification.didit.me/v3/wallet-screening/ Authenticate with the x-api-key header.
LIGHTNING is available only when the application has a connected Elliptic or Chainalysis BYOK provider in the console Marketplace. It is not available with managed Merkle Science or with Crystal or TRM Labs. Requests without a supported connected provider return 400 and are not screened or billed.

Response

The response is the standardised screening result — identical in shape to the WALLET_SCREENING provider result returned by transaction screening.
How severity is set. severity is the band of the normalised risk_score: 0-9UNKNOWN, 10-39LOW, 40-69MEDIUM, 70-89HIGH, 90-100CRITICAL. UNKNOWN is the lowest band, not a separate “no data” state: risk_score: 0 (the common clean-address case) means the provider returned no adverse assessment, while a non-zero score in the 1-9 range is a real but sub-LOW signal - so read the risk_score itself, not just the band. Either way, do not render UNKNOWN as an affirmative “clear” or pass.direction does not change the risk model. The optional direction field is passed to the provider as context only. It does not affect risk_score, severity, or which breakdown lists are returned: both source_of_funds and destination_of_funds are always returned regardless. Changing or omitting direction therefore does not require re-screening a previously screened address.

Risk factors

risk_factors is the ranked answer to “why is this address scored the way it is”. Providers grade an address on their own model and return only a verdict — Merkle Science returns an integer 0-5 — so risk_score alone cannot be actioned. Each entry names one driver, ordered high-risk first and then by the value that moved through it.
A high score with no is_high_risk factor is a real, meaningful outcome. It means the provider graded the address on its own exposure model without reporting a sanctions, PEP or attributed-entity match — the factors that are listed are the fund flows behind the grade. summary states this explicitly, so treat these addresses as “review the flows”, not as a confirmed hit. risk_factors is capped at the five strongest drivers; source_of_funds and destination_of_funds always carry the complete breakdown.risk_factors is a top-level field, not a nested one. Results screened before it existed omit the key entirely — read it as an empty list rather than assuming an empty explanation.
Each entry in source_of_funds / destination_of_funds is an exposure breakdown with these fields:
A clean address returns the same shape with risk_score near 0, sanctions_hit: false, dominant_risk_category: null, licensed-exchange-only entries, and risk_factors carrying no is_high_risk entry. See Crypto & Wallet Screening for a full walkthrough of the risk categories, exposure table, and network graph.

PDF report

To get a Didit-branded PDF of a screening result, repost the exact response body — including report_signature — to POST /v3/wallet-screening/pdf/. This is stateless: no provider call, no additional billing, nothing persisted. Editing any signed field (risk_score, severity, sanctions_hit, …) before reposting fails with 400.
See Screen Wallet PDF for the full request/response schema and error shapes.

Billing

One AML monitoring usage is billed per successful screening at the same rate as transaction-coupled crypto screening. See pricing for managed and connected-key rates. Sandbox applications are not billed. Validation errors (400) and unconfigured-provider errors (409) are never billed.

Errors

Next steps

API reference

Full request and response schema for the Screen Wallet endpoint.

Screen Wallet PDF

Render a screening result as a Didit-branded PDF.

Crypto & wallet screening

Automatic screening during transaction creation and the result model.