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 returns409 Conflict.
Request
POST https://verification.didit.me/v3/wallet-screening/
Authenticate with the x-api-key header.
Response
The response is the standardised screening result — identical in shape to theWALLET_SCREENING provider result returned by transaction screening.
How
severity is set. severity is the band of the normalised risk_score: 0-9 → UNKNOWN, 10-39 → LOW, 40-69 → MEDIUM, 70-89 → HIGH, 90-100 → CRITICAL. 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.source_of_funds / destination_of_funds is an exposure breakdown with these fields:
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 — includingreport_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.
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.