Sentinel scores an address or a transfer in a single call across Ethereum, Solana and Tron — sanctions and watchlist matches, mixer and bridge exposure, hop distance to a flagged cluster — and returns the evidence trail behind every point of the score.
POST /v1/screen/address
{ "chain": "ethereum", "address": "0x7a25…f3b1" }
→ 200 OK
{
"risk_score": 71,
"band": "elevated",
"reasons": [
{ "code": "MIXER_PROXIMITY", "weight": 34,
"hops": 2, "cluster": "tornado-router" },
{ "code": "HIGH_VELOCITY_FUNNEL", "weight": 22 },
{ "code": "NEW_ADDRESS", "weight": 15 }
],
"sanctions": { "match": false, "lists": ["OFAC","EU","UK","UN"] },
"evidence_url": "https://api.fin-techai.com/v1/…"
}
Every score decomposes into weighted reasons. The evidence URL resolves to the exact transfer path that produced each one, so a reviewer never has to take the number on trust.
lists checked per call — OFAC, EU, UK, UN, refreshed hourly
chains in one interface: Ethereum, Solana, Tron
p95 for a cached address; 1.2s cold with full tracing
evidence retention on every score you were served
Figures describe the current production deployment and are restated each quarter. Ask for the latest measurement report before you cite them.
Most screening vendors return a score and a colour. When a regulator or a payment partner asks why a customer was frozen, the answer has to be a chain of transfers — not a proprietary index nobody can inspect. Teams end up rebuilding the tracing work by hand in a block explorer, at the exact moment they are least able to afford it.
The second problem is coverage shape. A vendor strong on Ethereum is usually thin on Tron, which is where a large share of USDT settlement actually happens. Compliance teams paper over the gap with a second vendor, a second integration and two disagreeing scores for the same counterparty.
Full-node ingest on Ethereum, Solana and Tron, plus sanctions and watchlist feeds refreshed hourly. Reorg-aware: a score is stamped with the block height it was computed at, so you can tell a stale answer from a wrong one.
Addresses are grouped into behavioural clusters — exchange deposit sets, mixer routers, bridge relays, funnel accounts. Tracing walks the transfer graph outward and records the hop distance and value share of each path it finds.
Each contributing signal carries an explicit weight. The score is the sum, not a black box, so you can reweight for your own risk appetite and see exactly what changes in your historical alert volume before you ship it.
| Field | Type | Meaning |
|---|---|---|
| risk_score | integer 0–100 | Sum of weighted reason codes. Not a probability, and not comparable across vendors. |
| band | string | clear · watch · elevated · high. Cut-offs are yours to configure; these are the defaults. |
| reasons[] | array | Every signal that fired, with its weight, hop distance and the cluster it points at. |
| sanctions.match | boolean | A direct match on a screened list. Deliberately separate from the score: a sanctions hit is not a risk gradient. |
| as_of_block | integer | Block height the score was computed at. Compare against your own head to detect staleness. |
| evidence_url | string | Signed, expiring link to the transfer paths behind the reasons. |
Screening is decision support. It narrows where a human should look; it does not decide, and we will not pretend otherwise in a sales conversation.
coverage.Sandbox keys are issued the same day, with fixtures for the cases you actually need to test against.