Skip to main content
Didit Raises $2M and Joins Y Combinator (W26)
Didit
Back to blog
Blog · May 21, 2026

Crypto Source-of-Funds Analysis: Reading the Risk Categories

A wallet's risk score is only as useful as the categories behind it. Here's how to read Didit's 14+ source-of-funds categories and the direct/indirect exposure table that turns a number into a decision.

By DiditUpdated
crypto-source-of-funds-analysis.png

A risk score of 78 tells you a wallet is risky. It doesn't tell you why — and "why" is what decides the outcome. A 78 driven by direct sanctions exposure is a hard decline; a 78 driven by indirect, three-hop exposure to a high-risk exchange is an analyst's judgment call. Source-of-funds analysis is the layer that turns the number into a decision.

Didit's Wallet Screening API attributes every risk score to specific source-of-funds categories14+ of them, from SANCTIONED to EXCHANGE — and reports each as direct or indirect exposure with a share and hop count. You get the score, the band, and the breakdown that explains it, at $0.02 per screening.

This guide explains what each category means and how to read the exposure table.

Key takeaways

  • Risk score = the number; categories = the reason. Every 0–100 score is backed by the source-of-funds categories driving it.
  • 14+ categories span sanctions, terrorist financing, ransomware, darknet, mixers, stolen funds, scams, gambling, P2P, and ordinary exchange exposure.
  • Direct vs indirect exposure. Direct means the wallet transacted with the entity; indirect means value reached it through intermediary hops (with the hop count).
  • A network graph traces the path so an analyst can see exactly how funds connect to a risky entity.
  • Read by severity, not just score. Sanctions and CSE exposure are categorical no-gos; exchange exposure is usually benign.
  • $0.02 per screening with BYOK (Crystal or Merkle Science).

What source-of-funds analysis is

On-chain, every wallet's balance has a history — the addresses it received from and sent to, recursively. Source-of-funds analysis clusters those addresses into real-world entities (a known exchange, a sanctioned wallet, a mixer, a darknet market) and measures how much of a wallet's value connects to each category. The output isn't just "risky / not risky"; it's a typed breakdown: this share of inbound value traces to a mixer, that share to a sanctioned entity, the rest to a regulated exchange.

Didit normalizes that breakdown into a consistent set of categories and an exposure table, regardless of whether Crystal or Merkle Science supplied the underlying intelligence.

Why it matters

Two wallets can share a risk score and demand opposite actions. Compliance policy lives in the categories, not the number. Sanctions and child-exploitation exposure are categorical — any direct exposure is a stop, full stop. Mixer, darknet, ransomware, and stolen-funds exposure are high-severity but context-dependent: direct exposure usually blocks, deep indirect exposure may warrant review. Exchange and (sometimes) P2P exposure are often the expected, benign shape of normal crypto activity.

Without the breakdown, an analyst is guessing. With it, the same score resolves into a defensible decision in seconds — and the network graph gives the evidence to back it up in an audit or a SAR.

The 14+ source-of-funds categories

Didit reports exposure across these categories:

CategoryWhat it meansTypical severity
SANCTIONEDConnected to a sanctioned address or entityCritical — categorical block
TERRORIST_FINANCINGLinked to terrorist-financing activityCritical — categorical block
CHILD_EXPLOITATIONLinked to child sexual exploitation materialCritical — categorical block
RANSOMWAREProceeds or payments tied to ransomwareHigh
STOLEN_FUNDSFunds traced to a hack or exploitHigh
DARKNET_MARKETExposure to darknet marketplacesHigh
MIXERFunds passed through a mixing/tumbling serviceHigh
SCAMLinked to known scams or fraud schemesHigh
HIGH_RISK_EXCHANGEExchange with weak or no KYCMedium–High
HIGH_RISK_JURISDICTIONEntity in a high-risk jurisdictionMedium
GAMBLING_UNLICENSEDUnlicensed gambling exposureMedium
P2P_EXCHANGEPeer-to-peer exchange activityLow–Medium
EXCHANGERegulated/known exchangeLow — usually benign
UNNAMED_SERVICEIdentified service without a specific labelContext-dependent

Reading the exposure table

Each category in a screening result is tagged direct or indirect and carries a share of the wallet's value and, for indirect exposure, a hop count:

{
  "wallet_screening": {
    "risk_score": 78,
    "risk_band": "HIGH",
    "exposure": [
      { "category": "MIXER", "type": "INDIRECT", "hops": 2, "share": 0.34 },
      { "category": "DARKNET_MARKET", "type": "INDIRECT", "hops": 3, "share": 0.11 },
      { "category": "EXCHANGE", "type": "DIRECT", "share": 0.55 }
    ]
  }
}
  • Type. DIRECT means the wallet transacted with the entity itself; INDIRECT means value reached it through one or more intermediary hops.
  • Hops. For indirect exposure, how many transactions away the risky entity sits — closer hops weigh heavier.
  • Share. How much of the wallet's value is attributable to that category.

Read together: the example above is a 78 because a third of the value passed through a mixer two hops out and a slice traces to a darknet market — high enough to hold for review, but the absence of direct sanctions exposure is why it isn't an automatic decline.

Technical details

Source-of-funds analysis is part of every wallet screening on the unified /v3/ API:

curl -X POST https://verification.didit.me/v3/transactions/ \
  -H "x-api-key: $DIDIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "transaction_id": "txn_c40b",
    "category": "finance",
    "currency_kind": "crypto",
    "direction": "INBOUND",
    "wallet_address": "0x71f3...0a9d",
    "include_crypto_screening": true,
    "subject": { "vendor_data": "user_8820", "role": "RECEIVER" }
  }'

The verdict carries the 0–100 score, the LOW/MEDIUM/HIGH/CRITICAL band, and the typed exposure table shown above — plus a network graph an analyst can open in the Console. Price: $0.02 per screening with BYOK (Crystal or Merkle Science).

Use cases

  • Crypto exchanges — auto-decline any direct SANCTIONED exposure; route deep MIXER/DARKNET_MARKET exposure to review.
  • On/off-ramps — distinguish benign EXCHANGE exposure from risky HIGH_RISK_EXCHANGE before converting.
  • Custodians — use the category breakdown and network graph as evidence for any frozen-asset decision.
  • Wallets — warn users when a destination address carries SCAM or STOLEN_FUNDS exposure.
  • VASPs — pair source-of-funds categories with Travel Rule counterparty data for a complete risk picture.

How to integrate with Didit

  1. Map categories to policy. Decide which categories are categorical blocks (sanctions, TF, CSE) and which thresholds trigger review.
  2. Screen crypto transactions. POST /v3/transactions/ with currency_kind: "crypto" and a direction.
  3. Branch on the breakdown, not just the score. Read the exposure table; act on category + type (direct/indirect) + share.
  4. Investigate in the Console. High-risk screenings open alerts with the network graph attached.

Frequently asked questions

Why does the score alone not tell me what to do?

Because two wallets with the same score can need opposite actions. The categories and exposure type (direct vs indirect) are what make the decision defensible.

What's the difference between direct and indirect exposure?

Direct means the wallet transacted with the risky entity itself; indirect means value reached it through intermediary hops. Indirect exposure includes a hop count so you can weigh how close it is.

Which categories should always block?

SANCTIONED, TERRORIST_FINANCING, and CHILD_EXPLOITATION are categorical no-gos for any direct exposure. The high-severity financial-crime categories usually warrant review or decline depending on type and share.

Is exchange exposure a problem?

Plain EXCHANGE exposure is usually benign — it's the expected shape of normal activity. HIGH_RISK_EXCHANGE (weak or no KYC) is the one to watch.

How much does it cost to get this breakdown?

It's included in every wallet screening at $0.02 with BYOK — the categories and exposure table come back with the score, no extra call.

Ready to get started?

Read the Wallet Screening overview in the docs, see how it fits the platform on the Wallet Screening product page, and check per-call pricing on the pricing page. When you're ready, start free — 500 free KYC checks every month, and wallet screening at $0.02 per screening.

Infrastructure for identity and fraud.

One API for KYC, KYB, Transaction Monitoring, and Wallet Screening. Integrate in 5 minutes.

Ask an AI to summarise this page
Crypto Source-of-Funds Analysis | Didit