addresses

Taint/exposure — reach to sanctioned or hack roots

A walk cut by its budget answers unknown unless a root it reached already sets the verdict; read exposure, not truncation_reason alone. unknown names its causes in incomplete_reasons: OFAC list unloaded, walk cut (time_budget, frontier_cap), Solana coverage pending or partial, short history, or no hack/drainer/mixer label loaded for this chain. Cache-Control: max-age=10 instead of 60 means the walk was cut by its time budget. A replayed verdict carries Age.

get/v1/addresses/{address}/exposure

Request

  • Base URL: https://stablescan.achivx.com
  • URL: https://stablescan.achivx.com/v1/addresses/{address}/exposure
  • Auth: none required

Path parameters

addressstring required

Address in the network's native spelling (0x… EVM, T… Tron, base58 Solana). The answer writes it in the spelling of chain_id (address; /balances alone echoes the path there) and echoes the path in requested_address; address_respelled: true means the spelling belongs to another kind of chain than chain_id (a T… address asked about an EVM chain, a 0x… address asked about Tron) — answered about the same bytes there, not refused, and the same owner only for a plain key account.

Query parameters

1 | 10 | 56 | 8453 | 42161 | 728126428 | -1
OR
'1' | '10' | '56' | '8453' | '42161' | '728126428' | '-1' | 'ethereum' | 'optimism' | 'bnb-chain' | 'base' | 'arbitrum' | 'tron' | 'solana' | 'eip155:1' | 'eip155:10' | 'eip155:56' | 'eip155:8453' | 'eip155:42161' | 'eip155:728126428' | 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp'

Pass it explicitly — silent default is Base (8453); an answer about the wrong network looks exactly like an answer. Accepted as the number, the number in a string, the network slug (ethereum, bnb-chain, … from /v1/networks) or the CAIP-2 id. Surrounding whitespace, a leading + and leading zeros are ignored, slugs and CAIP-2 ids match in any letter case, and an empty or blank value is the parameter left off (/v1/freezes/acts alone refuses it).

hopsinteger

Walk depth; a value that does not parse keeps the default.

Response

Taint/exposure verdict.

addressstring required
address_respelledboolean required

true when the address you sent is spelled for another kind of chain than chain_id — a T… (Tron) address asked about an EVM chain, a 0x… address asked about Tron, a 32-byte base58 (Solana) key asked about an EVM chain or Tron — and the answer is about those same bytes on chain_id. Accepted, not refused; the same 20 bytes are the same owner on EVM chains and Tron only for a plain key account, not for a contract. Always false when you did not pass chain: the spelling then chooses the chain.

chain_idinteger required
chain_sourcestring required

How chain_id was chosen: explicit (you passed chain), default (a 0x address with no chain is answered about Base), address_form (a T or base58 address is answered about the chain its spelling implies). The answer is always about the one chain in chain_id.

computed_atstring required
coverage_statusstring
data_vintagestring

The start of this chain's observed history (RFC3339): the left edge of what the walk could see, not the age of any data. How fresh the data is: freshness_seconds of the sync status; the OFAC list: sanctions_list_as_of.

degraded_reasonstring

Why a stored walk stands in for the live one: live_build_busy (the server was too busy to start the walk) or live_build_timeout (the live walk ran out of its time budget). Such an answer is never cached; ask again later. Absent otherwise.

exposurestring required
exposure_fractionnumber required
freshness_secondsinteger nullable required

Age in seconds of this chain's newest indexed transfer when the answer was served; null when it could not be read for this answer or the chain has no indexed transfer yet — a failed read is never reported as a number. The verdict never moves on it.

frontier_truncatedboolean required
hops_completedinteger required
hops_requestedinteger required
incomplete_reasonsstring[] nullable required

Why this answer is not a complete assessment, one reason each, complete and in a fixed order; [] when it is. time_budget, frontier_cap: the walk was cut (truncation_reason; a time_budget cut may complete at a quieter moment, a frontier_cap one repeats). coverage_pending, coverage_partial: this Solana address's coverage (coverage_status). short_history: under $1 of observed inflow. ofac_list_unloaded: no OFAC list is loaded, so the walk did not run. ofac_list_stale: the OFAC list was last refreshed over 7 days ago (sanctions_list_as_of), so a clean walk is not a check against current listings. no_accusation_labels: no hack/drainer/mixer label is loaded for this chain. A class a reached root sets stands whatever is listed; exposure unknown always lists at least one reason.

min_hopsinteger nullable
nodes_exploredinteger required
notestring required
peg_reliableboolean required
requested_addressstring required

The address exactly as you sent it. address beside it is the same bytes written in the spelling of chain_id (0x-hex in lower case on EVM chains, T… on Tron, base58 on Solana) — except on /v1/addresses/{address}/balances, whose address echoes what you sent.

sanctions_list_as_ofstring

When the OFAC sanctions list the walk checked against was last refreshed (RFC3339), for this chain's address kind; older than 7 days lists ofac_list_stale and a clean walk reads unknown.

snapshot_age_secondsinteger nullable

The stored walk's age in seconds when it was served; present exactly when snapshot_served is true.

snapshot_servedboolean required

true when this walk was a stored one rather than walked for this call; computed_at is then when it was walked and snapshot_age_seconds its age. A fresh stored walk is under 15 minutes old; one standing in for a live walk that could not run or finish (degraded_reason) is up to 6 hours old. A refreshed OFAC list retires every stored walk at once.

truncation_reasonstring

Changes

No recorded changes to this operation across all 1 revision of this API.