Every transfer has a history.See it before you accept the funds.

DART follows the funds up to five hops back through labeled counterparties, matches every path against your rules, and returns a 0–100 score with the exact rules behind it.

Built for exchanges, payment firms and licensed VASPs. Use it in the console, through the API, or from your AI agent.

  1. Sanctioned wallet
    3 hops upstream, OFAC SDN list
  2. Mixer
    2 hops upstream, obfuscation service
  3. 0x3f…9e12
    1 hop upstream, unlabeled wallet
  4. 0x8a…c21e
    Screened address, inbound deposit
Use DART from your AI toolMCP
Grok Bot

Click a tool to copy its setup prompt, then paste it there: it asks for your API key and connects itself. See an agent at work

02 · For agents

Ask in a sentence. Your agent screens, explains, and edits the rules.

DART is also an MCP server: 21 typed tools — screening, results, rulesets, rules — on the same engine, rulesets and API key as the console. Any MCP client connects with one URL; other agents read llms.txt or the skill file.

The tool results are real: the screening above, and a ruleset clone made on production for this page (deleted afterwards). The agent’s replies are written from them.

03 · Rulesets and scoring

72 rules in plain sight. One matrix gives the score.

Every verdict traces back to a rule you can read and a matrix you can edit. Clone a built-in ruleset, change a threshold, copy a rule into a variant, mark the ones you care about with a ★ — the engine runs exactly what the editor shows.

The rule editor of a cloned ruleset: code, name, category, risk, action and direction per rule, a ★ column with the highlighted count, and Edit, Copy and Delete on every row
The rule editor. ★ marks the rules surfaced first in results; Copy derives a variant without retyping.

One rule, as stored

{
  "rule_code": "KYA_SANCTION_EXPOSURE_H2",
  "name": "Exposure to sanctioned address (2 hops)",
  "category": "Sanctions",
  "risk_level": "critical",
  "action": "block",
  "min_hops": 2,
  "max_hops": 2,
  "conditions": [
    { "parameter": "primary_category",
      "operator": "==", "value": "Sanctions" },
    { "parameter": "amount",
      "operator": ">",  "value": 10, "unit": "USDT/USDC" },
    { "parameter": "risk_rate",
      "operator": ">=", "value": 5 }
  ],
  "reference": "MAS PSN02; FATF R.16"
}

Three conditions, all of which must hold. amount is the smallest edge on the path — the funds that could actually traverse it — and risk_rate divides that by what the screened address received. The hop band is exact: this rule speaks only for 2-hop paths; its siblings cover 1 and 3 to 5.

Then the score

contribution = base × severity weight × fund ratio

Every hit adds one cell of the matrix — its base for direction and hop band, scaled by the rule’s severity and by the share of the address’s flow the risky money represents. The cells sum to a 0–100 score, and the bands turn it into a decision: Accept, Review, EDD, Block. An address that itself carries a sanctions label scores 100 outright.

Clone the scoring ruleset to move a threshold or reweight a band; the console shows the derivation of every score it gives.

The scoring ruleset editor: the contribution formula, verdict bands from Accept to Block, inflow and outflow bases per hop band, and severity weights
The scoring ruleset editor, as shipped: bases per hop band, verdict thresholds at 20 / 50 / 80, severity weights 1 / 0.8 / 0.6 / 0.3.

04 · Two ways in

Click Run in the console, or send one curl.

The console and the API run the same engine on the same rulesets and return the same result. Analysts work in the console; systems call the API — one request, one JSON, Chainalysis-compatible with our extensions. Batches go in as a CSV.

The screening page after a run: address, detected chain and type, ruleset picker, the score with its verdict and the triggered rules
The console. Paste an address, press Run, read the result; every run is saved as a snapshot.
Request
curl -X POST https://api.width.live/api/v3/screen/kya \
  -H "X-Api-Key: $DART_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "chain_name": "Tron", "address": "TZCL2K…3ULr", "inflow_hops": 3 }'
Response
{
  "risk": "critical",
  "riskReason": "Critical: Exposure to sanctioned address (2 hops)",
  "score": { "score": 24.1, "verdict": "review", "hitPaths": 7 },
  "exposures": [
    { "category": "Sanctions",
      "direction": "inflow", "value": 139609 },
    { "category": "Public Freezing Action",
      "direction": "inflow", "value": 32197.5 }
  ],
  "highlightSummary": { "rulesChecked": 5, "rulesHit": 0 },
  "hits": [ … 7 paths: rule, hops, amounts, nodes … ]
}

Sync by default; async returns a job id to poll. Same account, same quota, same snapshots as the console. Read the API docs →

05 · Questions

Six things people ask before they start.

Labels and fund flows come from our own on-chain data layer, which attributes addresses to sanctioned entities, exchanges, mixers and other categories and traces transfers hop by hop. The chains and assets a screening accepts are read live from that layer — the console shows the current list.

Read more in the manual

Run your next address through it.

A console and an API, for exchanges, payment firms and licensed VASPs. Accounts are provisioned by our team — book a demo and we will set one up.