This guide is for the hosted API. It needs an
sc_ key and nothing else —
no clone, no local server. If you have not made a call yet, start with
Your first API call. The other guides in this section describe
running the engine yourself, which is a different product position.The workflow
1
Sanctions first
GET /api/v1/wallet/{address}/ofac. A direct hit ends the screening; nothing
else you learn changes the answer.2
Then identity
GET /api/v1/wallet/{address}/score. Who is this, what cluster is it in,
what is published about it.3
Then exchange attribution
GET /api/v1/wallet/{address}/cex. Which venue, by direct label or through a
labelled cluster member.4
Then cross-chain movement
GET /api/v1/wallet/{address}/bridges. The most expensive claim on the API
to get wrong, and the one with the narrowest coverage.The flag that matters on each route
Every route can answerok with nothing in it. That is two different situations
wearing the same shape: we looked and found nothing, and we could not look.
Each route carries the flag that separates them, and reading the flag is the
whole job.
Two flags on
/ofac rather than one, because they fail differently.
proximity_checked is false when no walk happened at all — no real history to
walk, or the engine did not answer. proximity.is_screen is the engine’s own
verdict on whether the walk it did perform may be described as a screen. A
walk over a history it considers unusable runs to completion and still is not
one.
hops_examined, nodes_examined, frontier_exhausted, node_budget_hit,
path and provenance all live inside data.proximity, next to the finding
they describe. Only proximity_checked is lifted to the top of data, because
it is the one a caller must not miss.
When a route declines
state is the first field to read, before the HTTP status. Three of the four
values are refusals to answer, and each is a different fact about the world:
insufficient_evidence— we looked and hold nothing citable.reasonsays what was checked.not_deployed— the upstream that would have answered did not. Nothing was checked, and the answer carries no information about the address.not_supported— the question does not apply to this address kind. A Solana address on/bridgeslands here, because bridge tracing is EVM.
not_deployed as a retry, not as a result. Treat not_supported as a
gap in coverage, and see Chain coverage for which capability reaches
which chain.
Caveats travel with the claim
Where an answer is qualified, the qualification is insidedata, next to the
finding it limits, rather than in a wrapper around it. That is deliberate: an
agent hands the object to a model, and the model restates the conclusion without
whatever surrounded it. If you are reformatting these payloads for a human, carry
caveat through to wherever the conclusion lands.
What this does not tell you
- It is not a verdict. The API reports what is held and how it was established. Whether that clears your own threshold is your judgment.
- A clean screen is a statement about our evidence, not about the address.
- Proximity is EVM. A Solana address gets the direct list match and an explicit note that the hop analysis was not done.
- An address leaving the SDN list is not exoneration. A delisting is a change in the published list, not a finding about conduct, and this API does not report it as one.
Then
- The full v1 reference for every field and limit.
- Data states for why absence is modelled this way.
- The MCP package to run this workflow inside an agent.
Scienter analyses public blockchain records. A finding states what those records show and how confident we are; it is evidence, not proof of anyone’s identity, intent or wrongdoing, and an attribution we cite is the cited source’s. An empty result means not analysed, never safe. Nothing here is legal, tax or investment advice, or a recommendation to transact with any address or asset — see Disclaimers for the full text.