{"id":499210,"name":"Stablecoin Scanner","description":"Stablecoin Scanner — onchain dollar observability. Web UI for people, agent-ready API (MCP/A2A) for machines. Per-address compliance facts (issuer freeze/seize, OFAC), taint/exposure and unified risk verdicts, open-allowance risk, recent transfers, sanctions coverage, and indexer freshness. Read-only, free, no auth. Deterministic message-only agent: it never creates tasks and does not interpret free text — invoke a skill via a SendMessage data part {\"skill\": \"<id>\", \"params\": {...}} (a text message answers with the machine-readable how-to).","card_url":"https://stablescan.achivx.com/.well-known/agent-card.json","endpoint":"https://stablescan.achivx.com/a2a","protocol_version":"1.0","first_seen":"2026-10-28T17:00:37.965415+00:00","last_verified":"2026-10-28T17:00:37.965415+00:00","card":{"url":"https://stablescan.achivx.com","name":"Stablecoin Scanner","pages":[{"url":"https://stablescan.achivx.com/","name":"Stablecoin Scanner — market dashboard across every network","markdown":"https://stablescan.achivx.com/index.md"},{"url":"https://stablescan.achivx.com/stablecoin","name":"Stablecoins on the scanner — every stablecoin, every network","markdown":"https://stablescan.achivx.com/stablecoin.md"},{"url":"https://stablescan.achivx.com/dai-explorer","name":"DAI Explorer — the asset across every network this scanner indexes it on","asset":"DAI","markdown":"https://stablescan.achivx.com/dai-explorer.md","networks":["ethereum","optimism","base","arbitrum"]},{"url":"https://stablescan.achivx.com/pyusd-explorer","name":"PYUSD Explorer — the asset across every network this scanner indexes it on","asset":"PYUSD","markdown":"https://stablescan.achivx.com/pyusd-explorer.md","networks":["solana","ethereum","arbitrum"]},{"url":"https://stablescan.achivx.com/usd1-explorer","name":"USD1 Explorer — the asset across every network this scanner indexes it on","asset":"USD1","markdown":"https://stablescan.achivx.com/usd1-explorer.md","networks":["ethereum","bnb-chain","tron"]},{"url":"https://stablescan.achivx.com/usdc-explorer","name":"USDC Explorer — the asset across every network this scanner indexes it on","asset":"USDC","markdown":"https://stablescan.achivx.com/usdc-explorer.md","networks":["solana","ethereum","optimism","bnb-chain","base","arbitrum"]},{"url":"https://stablescan.achivx.com/usde-explorer","name":"USDe Explorer — the asset across every network this scanner indexes it on","asset":"USDe","markdown":"https://stablescan.achivx.com/usde-explorer.md","networks":["solana","ethereum","optimism","base","arbitrum"]},{"url":"https://stablescan.achivx.com/usds-explorer","name":"USDS Explorer — the asset across every network this scanner indexes it on","asset":"USDS","markdown":"https://stablescan.achivx.com/usds-explorer.md","networks":["solana","ethereum","base","arbitrum"]},{"url":"https://stablescan.achivx.com/usdt-explorer","name":"USDT Explorer — the asset across every network this scanner indexes it on","asset":"USDT","markdown":"https://stablescan.achivx.com/usdt-explorer.md","networks":["solana","ethereum","optimism","bnb-chain","base","tron"]},{"url":"https://stablescan.achivx.com/entities","name":"Exchanges and bridges as a whole — each one across every network this scanner indexes","markdown":"https://stablescan.achivx.com/entities.md"},{"url":"https://stablescan.achivx.com/entity/binance","name":"Binance — the exchange's addresses and stablecoin flows across every network this scanner indexes","markdown":"https://stablescan.achivx.com/entity/binance.md","networks":["ethereum","tron","bnb-chain","base","optimism","arbitrum"]},{"url":"https://stablescan.achivx.com/entity/okx","name":"OKX — the exchange's addresses and stablecoin flows across every network this scanner indexes","markdown":"https://stablescan.achivx.com/entity/okx.md","networks":["ethereum","tron","base","optimism","arbitrum"]},{"url":"https://stablescan.achivx.com/entity/bybit","name":"Bybit — the exchange's addresses and stablecoin flows across every network this scanner indexes","markdown":"https://stablescan.achivx.com/entity/bybit.md","networks":["ethereum","tron","bnb-chain","base","optimism","arbitrum"]},{"url":"https://stablescan.achivx.com/entity/bitfinex","name":"Bitfinex — the exchange's addresses and stablecoin flows across every network this scanner indexes","markdown":"https://stablescan.achivx.com/entity/bitfinex.md","networks":["ethereum","tron"]},{"url":"https://stablescan.achivx.com/entity/kucoin","name":"KuCoin — the exchange's addresses and stablecoin flows across every network this scanner indexes","markdown":"https://stablescan.achivx.com/entity/kucoin.md","networks":["ethereum","tron","bnb-chain","base","optimism","arbitrum"]},{"url":"https://stablescan.achivx.com/entity/mexc","name":"MEXC — the exchange's addresses and stablecoin flows across every network this scanner indexes","markdown":"https://stablescan.achivx.com/entity/mexc.md","networks":["ethereum","tron","bnb-chain","base","optimism","arbitrum"]},{"url":"https://stablescan.achivx.com/entity/debridge","name":"deBridge — the bridge's contracts and stablecoin flows across every network this scanner indexes","markdown":"https://stablescan.achivx.com/entity/debridge.md","networks":["ethereum","tron","bnb-chain","base","optimism","arbitrum"]},{"url":"https://stablescan.achivx.com/entity/across","name":"Across — the bridge's contracts and stablecoin flows across every network this scanner indexes","markdown":"https://stablescan.achivx.com/entity/across.md","networks":["ethereum","tron","bnb-chain","base","optimism","arbitrum"]},{"url":"https://stablescan.achivx.com/entity/mayan","name":"Mayan — the bridge's contracts and stablecoin flows across every network this scanner indexes","markdown":"https://stablescan.achivx.com/entity/mayan.md","networks":["ethereum","bnb-chain","base","optimism","arbitrum"]},{"url":"https://stablescan.achivx.com/entity/stargate","name":"Stargate — the bridge's contracts and stablecoin flows across every network this scanner indexes","markdown":"https://stablescan.achivx.com/entity/stargate.md","networks":["ethereum","bnb-chain","base","optimism","arbitrum"]},{"url":"https://stablescan.achivx.com/entity/coinex","name":"CoinEx — the exchange's addresses and stablecoin flows across every network this scanner indexes","markdown":"https://stablescan.achivx.com/entity/coinex.md","networks":["ethereum","tron","bnb-chain","base","arbitrum"]},{"url":"https://stablescan.achivx.com/entity/gate","name":"Gate — the exchange's addresses and stablecoin flows across every network this scanner indexes","markdown":"https://stablescan.achivx.com/entity/gate.md","networks":["ethereum"]},{"url":"https://stablescan.achivx.com/entity/htx","name":"HTX — the exchange's addresses and stablecoin flows across every network this scanner indexes","markdown":"https://stablescan.achivx.com/entity/htx.md","networks":["ethereum","tron"]}],"x-mcp":{"connect":"claude mcp add stablescan --transport http https://stablescan.achivx.com/mcp","endpoint":"https://stablescan.achivx.com/mcp","transport":"http","description":"Same telemetry over Model Context Protocol (for MCP clients)."},"skills":[{"id":"get-address-approvals","name":"Open allowances + approval-risk","tags":["allowances","approvals","erc20","permit2","risk"],"examples":["Which spenders can still move stablecoins out of 0x…?"],"description":"Open ERC-20/Permit2 allowances (Class-F) with a shadow approval-risk band: unlimited to a flagged/unknown spender is the #1 drain vector; a DEX router is normal; expired Permit2 is 'expired'.","inputSchema":{"type":"object","required":["address"],"properties":{"chain":{"type":["integer","string","null"],"description":"Chain, in any of four spellings: the id (8453 Base, 1 Ethereum, 10 Optimism, 42161 Arbitrum, 56 BNB Chain, 728126428 Tron, -1 Solana), the same id as a string, the network slug (networks[].slug: base, ethereum, optimism, arbitrum, bnb-chain, tron, solana) or its CAIP-2 id (networks[].caip2: eip155:1, solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp). Surrounding whitespace, a leading + and leading zeros are ignored, a JSON number counts by its value (1.0 is 1), slugs and CAIP-2 ids match in any letter case, and an empty, blank or null chain is no chain at all. Anything else (hex, a decimal fraction, a zero-padded CAIP-2 reference) is refused with -32602, and so is a network this scanner knows but does not index (absent from networks[]) — by name, never with an empty clean verdict. Without chain, the address's spelling picks it: 0x… → 8453 Base, T… → Tron, base58 → Solana. The answer states the chain it is about (chain_id) and how it was chosen (chain_source: explicit|default|address_form), and lists where else this address has data (chains_with_data) — read that map before concluding; there is no auto-switch, ask again with chain set."},"address":{"type":"string","description":"The address in its network's own spelling: 0x… for EVM chains, T… for Tron, base58 for Solana. The answer writes it in the spelling of chain_id (address) and echoes what you sent (requested_address); address_respelled true means your 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."}}}},{"id":"get-address-exposure","name":"Taint/exposure verdict","tags":["taint","exposure","sanctions","aml","risk"],"examples":["How close is 0x… to a sanctioned or hacked source?"],"description":"§8 bounded backward BFS to the nearest OFAC/hack/drainer/mixer root: class + nearest-hop + a value-proportional haircut. 'unknown' never a false 'none'; incomplete_reasons names why: 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.","inputSchema":{"type":"object","required":["address"],"properties":{"chain":{"type":["integer","string","null"],"description":"Chain, in any of four spellings: the id (8453 Base, 1 Ethereum, 10 Optimism, 42161 Arbitrum, 56 BNB Chain, 728126428 Tron, -1 Solana), the same id as a string, the network slug (networks[].slug: base, ethereum, optimism, arbitrum, bnb-chain, tron, solana) or its CAIP-2 id (networks[].caip2: eip155:1, solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp). Surrounding whitespace, a leading + and leading zeros are ignored, a JSON number counts by its value (1.0 is 1), slugs and CAIP-2 ids match in any letter case, and an empty, blank or null chain is no chain at all. Anything else (hex, a decimal fraction, a zero-padded CAIP-2 reference) is refused with -32602, and so is a network this scanner knows but does not index (absent from networks[]) — by name, never with an empty clean verdict. Without chain, the address's spelling picks it: 0x… → 8453 Base, T… → Tron, base58 → Solana. The answer states the chain it is about (chain_id) and how it was chosen (chain_source: explicit|default|address_form), and lists where else this address has data (chains_with_data) — read that map before concluding; there is no auto-switch, ask again with chain set."},"address":{"type":"string","description":"The address in its network's own spelling: 0x… for EVM chains, T… for Tron, base58 for Solana. The answer writes it in the spelling of chain_id (address) and echoes what you sent (requested_address); address_respelled true means your 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."}}}},{"id":"get-address-risk","name":"Unified risk verdict","tags":["risk","verdict","screening","compliance"],"examples":["Is 0x… risky to interact with?","{\"skill\":\"get-address-risk\",\"params\":{\"chain\":1,\"address\":\"0x5754284f345afc66a98fbb0a0afe71e0f007b949\"}}"],"description":"One tier (unknown|none|low|medium|high|severe) for one chain, aggregating facts (OFAC, this chain's issuer freeze/seize status, exposure) + attributed labels (capped at medium, ≥2 sources for a tier). 'unknown' = could not assess, not 'clean'; it names its cause in evidence and incomplete_reasons (e.g. time_budget: the exposure walk was cut). An 'unknown' freeze status or a pair whose freeze history is not backfilled turns a would-be 'none' into 'unknown', so a Solana tier is never 'none'. Not scored: frozen_elsewhere, issuer freeze proposals, frozen balances and the issuer's act on its own token contract - read get-address-compliance.","inputSchema":{"type":"object","required":["address"],"properties":{"chain":{"type":["integer","string","null"],"description":"Chain, in any of four spellings: the id (8453 Base, 1 Ethereum, 10 Optimism, 42161 Arbitrum, 56 BNB Chain, 728126428 Tron, -1 Solana), the same id as a string, the network slug (networks[].slug: base, ethereum, optimism, arbitrum, bnb-chain, tron, solana) or its CAIP-2 id (networks[].caip2: eip155:1, solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp). Surrounding whitespace, a leading + and leading zeros are ignored, a JSON number counts by its value (1.0 is 1), slugs and CAIP-2 ids match in any letter case, and an empty, blank or null chain is no chain at all. Anything else (hex, a decimal fraction, a zero-padded CAIP-2 reference) is refused with -32602, and so is a network this scanner knows but does not index (absent from networks[]) — by name, never with an empty clean verdict. Without chain, the address's spelling picks it: 0x… → 8453 Base, T… → Tron, base58 → Solana. The answer states the chain it is about (chain_id) and how it was chosen (chain_source: explicit|default|address_form), and lists where else this address has data (chains_with_data) — read that map before concluding; there is no auto-switch, ask again with chain set."},"address":{"type":"string","description":"The address in its network's own spelling: 0x… for EVM chains, T… for Tron, base58 for Solana. The answer writes it in the spelling of chain_id (address) and echoes what you sent (requested_address); address_respelled true means your 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."}}}},{"id":"get-address-compliance","name":"Address compliance facts","tags":["compliance","freeze","seize","ofac","sanctions"],"examples":["Is 0x… frozen by a stablecoin issuer or OFAC-listed?"],"description":"Compliance facts for one address on one chain + the OFAC SDN flag. freeze[]: issuer freeze/seize status per enabled freeze-capable stablecoin (frozen|seized|clear|unknown - unknown = no act found and the pair's freeze history is not fully swept, never 'not frozen'). not_freezable[]: enabled stablecoins the issuer cannot freeze on this chain - token = symbol and token_address = contract, as in freeze[]; reason no_freeze_function (the contract has no freeze function) or no_freeze_authority (a Solana mint without a freeze authority) - e.g. the Binance-Peg USDT/USDC on BNB Chain, where enforcement is off-chain. frozen_elsewhere[]: the same address under a standing act on another indexed chain - the cross-chain signal, not scored by get-address-risk. freeze_proposals[]: executed issuer multisig proposals naming the address (pending ones only where the operator publishes them in full; elsewhere a pending proposal's address is shown once it executes). Class-F decoded facts, no heuristics.","inputSchema":{"type":"object","required":["address"],"properties":{"chain":{"type":["integer","string","null"],"description":"Chain, in any of four spellings: the id (8453 Base, 1 Ethereum, 10 Optimism, 42161 Arbitrum, 56 BNB Chain, 728126428 Tron, -1 Solana), the same id as a string, the network slug (networks[].slug: base, ethereum, optimism, arbitrum, bnb-chain, tron, solana) or its CAIP-2 id (networks[].caip2: eip155:1, solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp). Surrounding whitespace, a leading + and leading zeros are ignored, a JSON number counts by its value (1.0 is 1), slugs and CAIP-2 ids match in any letter case, and an empty, blank or null chain is no chain at all. Anything else (hex, a decimal fraction, a zero-padded CAIP-2 reference) is refused with -32602, and so is a network this scanner knows but does not index (absent from networks[]) — by name, never with an empty clean verdict. Without chain, the address's spelling picks it: 0x… → 8453 Base, T… → Tron, base58 → Solana. The answer states the chain it is about (chain_id) and how it was chosen (chain_source: explicit|default|address_form), and lists where else this address has data (chains_with_data) — read that map before concluding; there is no auto-switch, ask again with chain set."},"address":{"type":"string","description":"The address in its network's own spelling: 0x… for EVM chains, T… for Tron, base58 for Solana. The answer writes it in the spelling of chain_id (address) and echoes what you sent (requested_address); address_respelled true means your 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."}}}},{"id":"get-sync-status","name":"Data freshness","tags":["freshness","sync","status"],"examples":["How fresh is the Base data right now?"],"description":"Indexer head/safe/finalized block, lag_blocks (head_block - last_indexed_block) and freshness_seconds (the age of the newest indexed transfer, the freshness measure on every chain) so the agent knows data recency. On Solana (chain -1) safe_block is the finalized slot, and lag_blocks is near 0 by construction and never negative, so it is not a freshness signal there: read freshness_seconds. On the EVM chains and Tron a negative lag_blocks means the node's head went back.","inputSchema":{"type":"object","properties":{"chain":{"type":["integer","string","null"],"default":8453,"description":"Chain, in any of four spellings: the id (8453 Base, 1 Ethereum, 10 Optimism, 42161 Arbitrum, 56 BNB Chain, 728126428 Tron, -1 Solana), the same id as a string, the network slug (networks[].slug: base, ethereum, optimism, arbitrum, bnb-chain, tron, solana) or its CAIP-2 id (networks[].caip2: eip155:1, solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp). Surrounding whitespace, a leading + and leading zeros are ignored, a JSON number counts by its value (1.0 is 1), slugs and CAIP-2 ids match in any letter case, and an empty, blank or null chain is no chain at all. Anything else (hex, a decimal fraction, a zero-padded CAIP-2 reference) is refused with -32602, and so is a network this scanner knows but does not index (absent from networks[]) — by name, never with an empty clean verdict. Default 8453 (Base); on get-recent-transactions a T… or base58 payer/recipient filter selects Tron or Solana instead. The answer is about that one chain."}}}},{"id":"get-recent-transactions","name":"Recent transactions","tags":["transfers","transactions","feed","stablecoin"],"examples":["Latest stablecoin transfers received by 0x…"],"description":"Newest stablecoin transfers on ONE chain, filterable by recipient/payer, cursor-paginated (next_cursor). Answer: items[], each row tx_hash, log_index, block_number, block_time (RFC 3339), payer, recipient, amount {amount (minor units, string), decimals, token (symbol)}, token (the contract address), finality, and usd_amount where priced. The chain is the one asked for — rows do not repeat it. Generic on-chain Transfer facts.","inputSchema":{"type":"object","properties":{"chain":{"type":["integer","string","null"],"default":8453,"description":"Chain, in any of four spellings: the id (8453 Base, 1 Ethereum, 10 Optimism, 42161 Arbitrum, 56 BNB Chain, 728126428 Tron, -1 Solana), the same id as a string, the network slug (networks[].slug: base, ethereum, optimism, arbitrum, bnb-chain, tron, solana) or its CAIP-2 id (networks[].caip2: eip155:1, solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp). Surrounding whitespace, a leading + and leading zeros are ignored, a JSON number counts by its value (1.0 is 1), slugs and CAIP-2 ids match in any letter case, and an empty, blank or null chain is no chain at all. Anything else (hex, a decimal fraction, a zero-padded CAIP-2 reference) is refused with -32602, and so is a network this scanner knows but does not index (absent from networks[]) — by name, never with an empty clean verdict. Default 8453 (Base); on get-recent-transactions a T… or base58 payer/recipient filter selects Tron or Solana instead. The answer is about that one chain."},"limit":{"type":"integer","default":25,"maximum":200,"minimum":1,"description":"Max rows, 1..200. A value outside the range is refused with -32602, as REST refuses it."},"payer":{"type":"string"},"cursor":{"type":"string"},"recipient":{"type":"string"}}}},{"id":"get-sanctions-status","name":"OFAC sanctions coverage","tags":["sanctions","ofac","dataset","coverage"],"examples":["When was the OFAC dataset last refreshed?"],"description":"OFAC SDN sanction-list coverage: how many EVM + Solana + Tron addresses are ingested (free public 0xB10C list, US-Gov public-domain data) and when it was last refreshed. Heuristic exposure signal — not legal advice; verify against the official SDN list. No params.","inputSchema":{"type":"object","properties":{}}},{"id":"get-wallet-graph-walk","name":"Wallet graph walk","tags":["graph","flow","walk","tracing","explainability"],"examples":["Where did funds from 0x… flow, two hops out?"],"description":"Bounded walk over the indexed stablecoin settlement flow graph from a wallet: payer<->recipient hops, value-weighted score, entity-aware keys, attributed-node stop option, and sanctioned-node markers. Explainability primitive only — NOT a detector verdict, identity/control assertion, AML decision, or legal advice. window_from present means the answer was built from that date, the edge-grain horizon, not from the start of the requested window; the default window all, 90d and 1y included (/v1/methodology edge_grain_horizon). When window_from is present, read the graph as covering that span only — do not treat the absence of a counterparty, a path or a sanctioned node as evidence about anything before that date. volume on nodes is the token's raw minor units (divide by 10^decimals); volume_usd6 is the same amount in USD with 6 decimals at peg 1. On Solana (chain -1) the answer carries coverage_status for the subject address only, never for its counterparties: pending — its history is still being filled, so an empty or small answer is not final; partial — filled to a documented bound. The walk shows a finished fill after the next Solana rollup pass (about 10 minutes), and never shows history older than window_from. This read never starts a fill, so pending can also mean none was asked for yet: one compliance read of the address asks for it. A Solana answer without coverage_status could not read it in time — treat it as pending. On Solana (chain -1) the edge grain of 2026-07-20..2026-09-14 is incomplete: those days hold part of their transfers or none, because their raw rows were offloaded before a fix reached production on 2026-09-17; they are not restored, and answers do not mark them (decision of 2026-09-17). Solana's grain is never trimmed, so there the horizon that window_from reports is not where retained data ends: once window_from is later than 2026-09-14 the answer holds none of those days. An answer that reaches them — window_from on or before 2026-09-14, or no window_from over a window that includes them — counts them as floors: at least this much, never the whole, and a counterparty, path or sanctioned node missing from those days is not evidence that there was none.","inputSchema":{"type":"object","required":["address","token"],"properties":{"hops":{"type":"integer"},"chain":{"type":["integer","string","null"],"description":"Chain, in any of four spellings: the id (8453 Base, 1 Ethereum, 10 Optimism, 42161 Arbitrum, 56 BNB Chain, 728126428 Tron, -1 Solana), the same id as a string, the network slug (networks[].slug: base, ethereum, optimism, arbitrum, bnb-chain, tron, solana) or its CAIP-2 id (networks[].caip2: eip155:1, solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp). Surrounding whitespace, a leading + and leading zeros are ignored, a JSON number counts by its value (1.0 is 1), slugs and CAIP-2 ids match in any letter case, and an empty, blank or null chain is no chain at all. Anything else (hex, a decimal fraction, a zero-padded CAIP-2 reference) is refused with -32602, and so is a network this scanner knows but does not index (absent from networks[]) — by name, never with an empty clean verdict. Without chain, the address's spelling picks it: 0x… → 8453 Base, T… → Tron, base58 → Solana. The answer states the chain it is about (chain_id) and how it was chosen (chain_source: explicit|default|address_form), and lists where else this address has data (chains_with_data) — read that map before concluding; there is no auto-switch, ask again with chain set."},"token":{"type":"string","description":"Token symbol, e.g. USDT. REQUIRED: the server does not guess it. Each asset hub page (pages[].asset) names its own token, and the walk answers about THAT token only."},"window":{"enum":["1h","24h","7d","30d","90d","1y","all"],"type":"string","default":"all","description":"Time window"},"address":{"type":"string","description":"The address in its network's own spelling: 0x… for EVM chains, T… for Tron, base58 for Solana. The answer writes it in the spelling of chain_id (address) and echoes what you sent (requested_address); address_respelled true means your 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."},"frontier_cap":{"type":"integer"},"stop_at_attributed":{"type":"boolean","default":true},"stop_on_sanctioned":{"type":"boolean","default":false}}}}],"methods":["get-address-approvals","get-address-risk","get-address-exposure","get-address-compliance","get-sync-status","get-recent-transactions","get-sanctions-status","get-wallet-graph-walk"],"version":"1.4.0","endpoint":"https://stablescan.achivx.com/a2a","networks":[{"name":"solana","slug":"solana","caip2":"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp"},{"name":"ethereum","slug":"ethereum","caip2":"eip155:1"},{"name":"optimism","slug":"optimism","caip2":"eip155:10"},{"name":"bnb chain","slug":"bnb-chain","caip2":"eip155:56"},{"name":"base","slug":"base","caip2":"eip155:8453"},{"name":"arbitrum one","slug":"arbitrum","caip2":"eip155:42161"},{"name":"tron","slug":"tron","caip2":"eip155:728126428"}],"protocol":"a2a","rateLimits":{"window":"1m","publicPerMinute":1200},"description":"Stablecoin Scanner — onchain dollar observability. Web UI for people, agent-ready API (MCP/A2A) for machines. Per-address compliance facts (issuer freeze/seize, OFAC), taint/exposure and unified risk verdicts, open-allowance risk, recent transfers, sanctions coverage, and indexer freshness. Read-only, free, no auth. Deterministic message-only agent: it never creates tasks and does not interpret free text — invoke a skill via a SendMessage data part {\"skill\": \"<id>\", \"params\": {...}} (a text message answers with the machine-readable how-to).","capabilities":{"streaming":false,"extensions":[{"uri":"https://stablescan.achivx.com/a2a-ext/skill-methods/v1","required":false,"description":"Every card skill is also callable as its own JSON-RPC method on the same endpoint (method = skill id, params = the skill's inputSchema object). Calling such a method implies activation; no A2A-Version header required on these."},{"uri":"https://stablescan.achivx.com/a2a-ext/ecosystem/v1","params":{"surfaces":[{"job":"vet an address, check a freeze, read settlement","name":"Stablecoin Scanner","manual":"https://stablescan.achivx.com/agents.md","agentCard":"https://stablescan.achivx.com/.well-known/agent-card.json"},{"job":"find an x402 service to pay, vet it, verify a payment","name":"x402scan","manual":"https://x402scan.achivx.com/agents.md","agentCard":"https://x402scan.achivx.com/.well-known/agent-card.json"},{"job":"ask, answer (register to write)","name":"ACHIVX Forum","manual":"https://forum.achivx.com/agents.md","agentCard":"https://forum.achivx.com/.well-known/agent-card.json"},{"job":"the shared layer: one EIP-191 wallet across surfaces, forum trust levels TL0-TL5","name":"Reputation & identity","manual":"https://api.achivx.com/agents.md"}],"identityBridge":"a wallet is an address: the same EIP-191 wallet that is an identity on the forum is a vettable address on the Stablecoin Scanner"},"required":false,"description":"Machine-readable map of the ACHIVX ecosystem: the sibling surfaces, their manuals and agent cards, and the shared identity layer. Data-only — it adds card information and changes nothing in the request flow."}],"pushNotifications":false},"authentication":{"schemes":[{"scheme":"none","description":"Public read-only telemetry; no authentication required."}]},"protocolVersion":"1.0.0","documentationUrl":"https://stablescan.achivx.com/agents.md","defaultInputModes":["application/json","text/plain"],"defaultOutputModes":["application/json"],"supportedInterfaces":[{"url":"https://stablescan.achivx.com/a2a","protocolBinding":"JSONRPC","protocolVersion":"1.0"}]},"status":"verified","publisher_domain":"achivx.com","signature_status":"unsigned","signature_detail":"No card signature supplied","signature_key_url":null,"signature_checked_at":"2026-10-28T17:00:37.965415+00:00","domain_claimed_at":null,"domain_proof_checked_at":null,"source_name":"Publisher Agent Card","source_url":"https://stablescan.achivx.com/.well-known/agent-card.json","last_check":{"checked_at":"2026-10-28T17:00:37.965415+00:00","success":true,"http_status":200,"detail":"Agent Card validated"},"also_published_at":[],"history_urls":["https://stablescan.achivx.com/.well-known/agent-card.json"],"skills":[{"skill_id":"get-address-compliance","name":"Address compliance facts","description":"Compliance facts for one address on one chain + the OFAC SDN flag. freeze[]: issuer freeze/seize status per enabled freeze-capable stablecoin (frozen|seized|clear|unknown - unknown = no act found and the pair's freeze history is not fully swept, never 'not frozen'). not_freezable[]: enabled stablecoins the issuer cannot freeze on this chain - token = symbol and token_address = contract, as in freeze[]; reason no_freeze_function (the contract has no freeze function) or no_freeze_authority (a Solana mint without a freeze authority) - e.g. the Binance-Peg USDT/USDC on BNB Chain, where enforcement is off-chain. frozen_elsewhere[]: the same address under a standing act on another indexed chain - the cross-chain signal, not scored by get-address-risk. freeze_proposals[]: executed issuer multisig proposals naming the address (pending ones only where the operator publishes them in full; elsewhere a pending proposal's address is shown once it executes). Class-F decoded facts, no heuristics.","tags":["compliance","freeze","seize","ofac","sanctions"],"quality_warning":false},{"skill_id":"get-sync-status","name":"Data freshness","description":"Indexer head/safe/finalized block, lag_blocks (head_block - last_indexed_block) and freshness_seconds (the age of the newest indexed transfer, the freshness measure on every chain) so the agent knows data recency. On Solana (chain -1) safe_block is the finalized slot, and lag_blocks is near 0 by construction and never negative, so it is not a freshness signal there: read freshness_seconds. On the EVM chains and Tron a negative lag_blocks means the node's head went back.","tags":["freshness","sync","status"],"quality_warning":false},{"skill_id":"get-sanctions-status","name":"OFAC sanctions coverage","description":"OFAC SDN sanction-list coverage: how many EVM + Solana + Tron addresses are ingested (free public 0xB10C list, US-Gov public-domain data) and when it was last refreshed. Heuristic exposure signal — not legal advice; verify against the official SDN list. No params.","tags":["sanctions","ofac","dataset","coverage"],"quality_warning":false},{"skill_id":"get-address-approvals","name":"Open allowances + approval-risk","description":"Open ERC-20/Permit2 allowances (Class-F) with a shadow approval-risk band: unlimited to a flagged/unknown spender is the #1 drain vector; a DEX router is normal; expired Permit2 is 'expired'.","tags":["allowances","approvals","erc20","permit2","risk"],"quality_warning":false},{"skill_id":"get-recent-transactions","name":"Recent transactions","description":"Newest stablecoin transfers on ONE chain, filterable by recipient/payer, cursor-paginated (next_cursor). Answer: items[], each row tx_hash, log_index, block_number, block_time (RFC 3339), payer, recipient, amount {amount (minor units, string), decimals, token (symbol)}, token (the contract address), finality, and usd_amount where priced. The chain is the one asked for — rows do not repeat it. Generic on-chain Transfer facts.","tags":["transfers","transactions","feed","stablecoin"],"quality_warning":false},{"skill_id":"get-address-exposure","name":"Taint/exposure verdict","description":"§8 bounded backward BFS to the nearest OFAC/hack/drainer/mixer root: class + nearest-hop + a value-proportional haircut. 'unknown' never a false 'none'; incomplete_reasons names why: 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.","tags":["taint","exposure","sanctions","aml","risk"],"quality_warning":false},{"skill_id":"get-address-risk","name":"Unified risk verdict","description":"One tier (unknown|none|low|medium|high|severe) for one chain, aggregating facts (OFAC, this chain's issuer freeze/seize status, exposure) + attributed labels (capped at medium, ≥2 sources for a tier). 'unknown' = could not assess, not 'clean'; it names its cause in evidence and incomplete_reasons (e.g. time_budget: the exposure walk was cut). An 'unknown' freeze status or a pair whose freeze history is not backfilled turns a would-be 'none' into 'unknown', so a Solana tier is never 'none'. Not scored: frozen_elsewhere, issuer freeze proposals, frozen balances and the issuer's act on its own token contract - read get-address-compliance.","tags":["risk","verdict","screening","compliance"],"quality_warning":false},{"skill_id":"get-wallet-graph-walk","name":"Wallet graph walk","description":"Bounded walk over the indexed stablecoin settlement flow graph from a wallet: payer<->recipient hops, value-weighted score, entity-aware keys, attributed-node stop option, and sanctioned-node markers. Explainability primitive only — NOT a detector verdict, identity/control assertion, AML decision, or legal advice. window_from present means the answer was built from that date, the edge-grain horizon, not from the start of the requested window; the default window all, 90d and 1y included (/v1/methodology edge_grain_horizon). When window_from is present, read the graph as covering that span only — do not treat the absence of a counterparty, a path or a sanctioned node as evidence about anything before that date. volume on nodes is the token's raw minor units (divide by 10^decimals); volume_usd6 is the same amount in USD with 6 decimals at peg 1. On Solana (chain -1) the answer carries coverage_status for the subject address only, never for its counterparties: pending — its history is still being filled, so an empty or small answer is not final; partial — filled to a documented bound. The walk shows a finished fill after the next Solana rollup pass (about 10 minutes), and never shows history older than window_from. This read never starts a fill, so pending can also mean none was asked for yet: one compliance read of the address asks for it. A Solana answer without coverage_status could not read it in time — treat it as pending. On Solana (chain -1) the edge grain of 2026-07-20..2026-09-14 is incomplete: those days hold part of their transfers or none, because their raw rows were offloaded before a fix reached production on 2026-09-17; they are not restored, and answers do not mark them (decision of 2026-09-17). Solana's grain is never trimmed, so there the horizon that window_from reports is not where retained data ends: once window_from is later than 2026-09-14 the answer holds none of those days. An answer that reaches them — window_from on or before 2026-09-14, or no","tags":["graph","flow","walk","tracing","explainability"],"quality_warning":false}],"quality_flags":[],"check_history":{"checks":1,"passed":1},"recent_checks":[{"card_url":"https://stablescan.achivx.com/.well-known/agent-card.json","checked_at":"2026-10-28T17:00:37.965415+00:00","success":true,"http_status":200,"detail":"Agent Card validated"}],"endpoint_tls_check":{"checked_at":"2026-10-28T17:00:37.965415+00:00","success":true,"detail":"Valid TLS connection to advertised endpoint host; no A2A request sent"},"protocol_check":{"checked_at":"2026-10-28T17:00:37.965415+00:00","endpoint":"https://stablescan.achivx.com/a2a","protocol_binding":"JSONRPC","protocol_version":"1.0","state":"a2a_response","http_status":200,"detail":"A2A task-not-found response to a read-only task lookup","request_diagnostics":{"requests":[{"path":"/a2a","allow":[],"method":"POST","status":200,"version_header":"1.0","protocol_method":"GetTask","redirect_followed":false}],"capture_version":1}},"declared_primary_endpoint":"https://stablescan.achivx.com/a2a","selected_connection_interface":{"url":"https://stablescan.achivx.com/a2a","protocolBinding":"JSONRPC","protocolVersion":"1.0"},"protocol_interface_checks":[{"endpoint":"https://stablescan.achivx.com/a2a","protocol_binding":"JSONRPC","protocol_version":"1.0","selected":true,"state":"a2a_response","checked_at":"2026-10-28T17:00:37.965415+00:00","http_status":200,"detail":"A2A task-not-found response to a read-only task lookup","binding_recorded":true},{"endpoint":"https://stablescan.achivx.com","protocol_binding":"JSONRPC","protocol_version":"1.0.0","selected":false,"state":"unconfirmed","checked_at":"2026-10-28T17:00:37.965415+00:00","http_status":200,"detail":"Protocol response exceeded 16 KiB limit","binding_recorded":true}],"connection_selection_note":"The selected connection uses an address advertised in the publisher card. Read-only observations do not establish task quality or safety.","x402_price_check":null,"events":[],"relationships":[],"verification":{"agent_card_url":"https://stablescan.achivx.com/.well-known/agent-card.json","last_successful_card_check":"2026-10-28T17:00:37.965415+00:00","latest_card_check":{"checked_at":"2026-10-28T17:00:37.965415+00:00","success":true,"http_status":200,"detail":"Agent Card validated"},"signature_status":"unsigned","signature_checked_at":"2026-10-28T17:00:37.965415+00:00","task_endpoint_tested":true,"task_execution_tested":false,"endpoint_tls_checked_at":"2026-10-28T17:00:37.965415+00:00","endpoint_tls_reachable":true,"protocol_check_state":"a2a_response","protocol_checked_at":"2026-10-28T17:00:37.965415+00:00","provider_identity_verified":false,"domain_claimed_at":null,"domain_proof_checked_at":null},"synthetic_capability_tests":{"agent_id":499210,"status":"not_tested","reason_code":"not_yet_tested","consent_status":"not_confirmed","latest_observation_status":null,"last_checked_at":null,"fixture_version":"1","reference_demonstration":false,"scope":"A publisher-authorized synthetic test of a dedicated free test endpoint. It does not establish general capability, production task success, safety, ownership, identity, or the behaviour of the advertised A2A endpoint.","methodology_url":"https://localmark.ai/capability-tests","history":[]},"repair_links":{"agent_repair_url":"https://localmark.ai/agents/499210/repair","publisher_report_url":"https://localmark.ai/publishers/achivx.com/repair","diagnostics_json_url":"https://localmark.ai/publishers/achivx.com/repair/diagnostics.json","diagnostics_csv_url":"https://localmark.ai/publishers/achivx.com/repair/diagnostics.csv"},"_localmark":{"contribution":{"optional":true,"directory_access":"free","operator_authorization_required":true,"affects_rankings":false,"message":"LocalMark is free. Optional contributions help fund ongoing checks.","support_url":"https://localmark.ai/support","metadata_url":"https://localmark.ai/api/v1/support/contributions"}}}