Card snapshot
stablescan.achivx.com
·
2026-10-15 20:34:02 UTC
·
db82142e043f2c3983b4a21e5000c901e93284eef229a0c7424e18d7cfb675ce
This is a frozen copy of the agent's agent-card.json as we observed it at the timestamp above. We capture a new snapshot every time the card's content hash changes. Useful for: forensic drift analysis, verifying downstream callers see the right version, reproducing routing decisions made historically.
{
"authentication": {
"schemes": [
{
"description": "Public read-only telemetry; no authentication required.",
"scheme": "none"
}
]
},
"capabilities": {
"extensions": [
{
"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.",
"required": false,
"uri": "https://stablescan.achivx.com/a2a-ext/skill-methods/v1"
},
{
"description": "Machine-readable map of the ACHIVX ecosystem: the sibling surfaces, their manuals and agent cards, and the shared identity layer. Data-only \u2014 it adds card information and changes nothing in the request flow.",
"params": {
"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",
"surfaces": [
{
"agentCard": "https://stablescan.achivx.com/.well-known/agent-card.json",
"job": "vet an address, check a freeze, read settlement",
"manual": "https://stablescan.achivx.com/agents.md",
"name": "Stablecoin Scanner"
},
{
"agentCard": "https://x402scan.achivx.com/.well-known/agent-card.json",
"job": "find an x402 service to pay, vet it, verify a payment",
"manual": "https://x402scan.achivx.com/agents.md",
"name": "x402scan"
},
{
"agentCard": "https://forum.achivx.com/.well-known/agent-card.json",
"job": "ask, answer (register to write)",
"manual": "https://forum.achivx.com/agents.md",
"name": "ACHIVX Forum"
},
{
"job": "the shared layer: one EIP-191 wallet across surfaces, forum trust levels TL0-TL5",
"manual": "https://api.achivx.com/agents.md",
"name": "Reputation & identity"
}
]
},
"required": false,
"uri": "https://stablescan.achivx.com/a2a-ext/ecosystem/v1"
}
],
"pushNotifications": false,
"streaming": false
},
"defaultInputModes": [
"application/json",
"text/plain"
],
"defaultOutputModes": [
"application/json"
],
"description": "Stablecoin Scanner \u2014 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 \u2014 invoke a skill via a SendMessage data part {\"skill\": \"<id>\", \"params\": {...}} (a text message answers with the machine-readable how-to).",
"documentationUrl": "https://stablescan.achivx.com/agents.md",
"endpoint": "https://stablescan.achivx.com/a2a",
"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"
],
"name": "Stablecoin Scanner",
"networks": [
{
"caip2": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",
"name": "solana",
"slug": "solana"
},
{
"caip2": "eip155:1",
"name": "ethereum",
"slug": "ethereum"
},
{
"caip2": "eip155:10",
"name": "optimism",
"slug": "optimism"
},
{
"caip2": "eip155:56",
"name": "bnb chain",
"slug": "bnb-chain"
},
{
"caip2": "eip155:8453",
"name": "base",
"slug": "base"
},
{
"caip2": "eip155:42161",
"name": "arbitrum one",
"slug": "arbitrum"
},
{
"caip2": "eip155:728126428",
"name": "tron",
"slug": "tron"
}
],
"pages": [
{
"markdown": "https://stablescan.achivx.com/index.md",
"name": "Stablecoin Scanner \u2014 market dashboard across every network",
"url": "https://stablescan.achivx.com/"
},
{
"markdown": "https://stablescan.achivx.com/stablecoin.md",
"name": "Stablecoins on the scanner \u2014 every stablecoin, every network",
"url": "https://stablescan.achivx.com/stablecoin"
},
{
"asset": "DAI",
"markdown": "https://stablescan.achivx.com/dai-explorer.md",
"name": "DAI Explorer \u2014 the asset across every network this scanner indexes it on",
"networks": [
"ethereum",
"optimism",
"base",
"arbitrum"
],
"url": "https://stablescan.achivx.com/dai-explorer"
},
{
"asset": "PYUSD",
"markdown": "https://stablescan.achivx.com/pyusd-explorer.md",
"name": "PYUSD Explorer \u2014 the asset across every network this scanner indexes it on",
"networks": [
"solana",
"ethereum",
"arbitrum"
],
"url": "https://stablescan.achivx.com/pyusd-explorer"
},
{
"asset": "USD1",
"markdown": "https://stablescan.achivx.com/usd1-explorer.md",
"name": "USD1 Explorer \u2014 the asset across every network this scanner indexes it on",
"networks": [
"ethereum",
"bnb-chain",
"tron"
],
"url": "https://stablescan.achivx.com/usd1-explorer"
},
{
"asset": "USDC",
"markdown": "https://stablescan.achivx.com/usdc-explorer.md",
"name": "USDC Explorer \u2014 the asset across every network this scanner indexes it on",
"networks": [
"solana",
"ethereum",
"optimism",
"bnb-chain",
"base",
"arbitrum"
],
"url": "https://stablescan.achivx.com/usdc-explorer"
},
{
"asset": "USDe",
"markdown": "https://stablescan.achivx.com/usde-explorer.md",
"name": "USDe Explorer \u2014 the asset across every network this scanner indexes it on",
"networks": [
"solana",
"ethereum",
"optimism",
"base",
"arbitrum"
],
"url": "https://stablescan.achivx.com/usde-explorer"
},
{
"asset": "USDS",
"markdown": "https://stablescan.achivx.com/usds-explorer.md",
"name": "USDS Explorer \u2014 the asset across every network this scanner indexes it on",
"networks": [
"solana",
"ethereum",
"base",
"arbitrum"
],
"url": "https://stablescan.achivx.com/usds-explorer"
},
{
"asset": "USDT",
"markdown": "https://stablescan.achivx.com/usdt-explorer.md",
"name": "USDT Explorer \u2014 the asset across every network this scanner indexes it on",
"networks": [
"solana",
"ethereum",
"optimism",
"bnb-chain",
"base",
"tron"
],
"url": "https://stablescan.achivx.com/usdt-explorer"
}
],
"protocol": "a2a",
"protocolVersion": "1.0.0",
"rateLimits": {
"publicPerMinute": 1200,
"window": "1m"
},
"skills": [
{
"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'.",
"examples": [
"Which spenders can still move stablecoins out of 0x\u2026?"
],
"id": "get-address-approvals",
"inputSchema": {
"properties": {
"address": {
"description": "The address in its network's own spelling: 0x\u2026 for EVM chains, T\u2026 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\u2026 address asked about an EVM chain, a 0x\u2026 address asked about Tron) \u2014 answered about the same bytes there, not refused, and the same owner only for a plain key account.",
"type": "string"
},
"chain": {
"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[]) \u2014 by name, never with an empty clean verdict. Without chain, the address's spelling picks it: 0x\u2026 \u2192 8453 Base, T\u2026 \u2192 Tron, base58 \u2192 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) \u2014 read that map before concluding; there is no auto-switch, ask again with chain set.",
"type": [
"integer",
"string",
"null"
]
}
},
"required": [
"address"
],
"type": "object"
},
"name": "Open allowances + approval-risk",
"tags": [
"allowances",
"approvals",
"erc20",
"permit2",
"risk"
]
},
{
"description": "\u00a78 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.",
"examples": [
"How close is 0x\u2026 to a sanctioned or hacked source?"
],
"id": "get-address-exposure",
"inputSchema": {
"properties": {
"address": {
"description": "The address in its network's own spelling: 0x\u2026 for EVM chains, T\u2026 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\u2026 address asked about an EVM chain, a 0x\u2026 address asked about Tron) \u2014 answered about the same bytes there, not refused, and the same owner only for a plain key account.",
"type": "string"
},
"chain": {
"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[]) \u2014 by name, never with an empty clean verdict. Without chain, the address's spelling picks it: 0x\u2026 \u2192 8453 Base, T\u2026 \u2192 Tron, base58 \u2192 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) \u2014 read that map before concluding; there is no auto-switch, ask again with chain set.",
"type": [
"integer",
"string",
"null"
]
}
},
"required": [
"address"
],
"type": "object"
},
"name": "Taint/exposure verdict",
"tags": [
"taint",
"exposure",
"sanctions",
"aml",
"risk"
]
},
{
"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, \u22652 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 and frozen balances - read get-address-compliance.",
"examples": [
"Is 0x\u2026 risky to interact with?",
"{\"skill\":\"get-address-risk\",\"params\":{\"chain\":1,\"address\":\"0x5754284f345afc66a98fbb0a0afe71e0f007b949\"}}"
],
"id": "get-address-risk",
"inputSchema": {
"properties": {
"address": {
"description": "The address in its network's own spelling: 0x\u2026 for EVM chains, T\u2026 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\u2026 address asked about an EVM chain, a 0x\u2026 address asked about Tron) \u2014 answered about the same bytes there, not refused, and the same owner only for a plain key account.",
"type": "string"
},
"chain": {
"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[]) \u2014 by name, never with an empty clean verdict. Without chain, the address's spelling picks it: 0x\u2026 \u2192 8453 Base, T\u2026 \u2192 Tron, base58 \u2192 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) \u2014 read that map before concluding; there is no auto-switch, ask again with chain set.",
"type": [
"integer",
"string",
"null"
]
}
},
"required": [
"address"
],
"type": "object"
},
"name": "Unified risk verdict",
"tags": [
"risk",
"verdict",
"screening",
"compliance"
]
},
{
"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.",
"examples": [
"Is 0x\u2026 frozen by a stablecoin issuer or OFAC-listed?"
],
"id": "get-address-compliance",
"inputSchema": {
"properties": {
"address": {
"description": "The address in its network's own spelling: 0x\u2026 for EVM chains, T\u2026 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\u2026 address asked about an EVM chain, a 0x\u2026 address asked about Tron) \u2014 answered about the same bytes there, not refused, and the same owner only for a plain key account.",
"type": "string"
},
"chain": {
"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[]) \u2014 by name, never with an empty clean verdict. Without chain, the address's spelling picks it: 0x\u2026 \u2192 8453 Base, T\u2026 \u2192 Tron, base58 \u2192 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) \u2014 read that map before concluding; there is no auto-switch, ask again with chain set.",
"type": [
"integer",
"string",
"null"
]
}
},
"required": [
"address"
],
"type": "object"
},
"name": "Address compliance facts",
"tags": [
"compliance",
"freeze",
"seize",
"ofac",
"sanctions"
]
},
{
"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.",
"examples": [
"How fresh is the Base data right now?"
],
"id": "get-sync-status",
"inputSchema": {
"properties": {
"chain": {
"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[]) \u2014 by name, never with an empty clean verdict. Default 8453 (Base); on get-recent-transactions a T\u2026 or base58 payer/recipient filter selects Tron or Solana instead. The answer is about that one chain.",
"type": [
"integer",
"string",
"null"
]
}
},
"type": "object"
},
"name": "Data freshness",
"tags": [
"freshness",
"sync",
"status"
]
},
{
"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 \u2014 rows do not repeat it. Generic on-chain Transfer facts.",
"examples": [
"Latest stablecoin transfers received by 0x\u2026"
],
"id": "get-recent-transactions",
"inputSchema": {
"properties": {
"chain": {
"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[]) \u2014 by name, never with an empty clean verdict. Default 8453 (Base); on get-recent-transactions a T\u2026 or base58 payer/recipient filter selects Tron or Solana instead. The answer is about that one chain.",
"type": [
"integer",
"string",
"null"
]
},
"cursor": {
"type": "string"
},
"limit": {
"default": 25,
"description": "Max rows, 1..200. A value outside the range is refused with -32602, as REST refuses it.",
"maximum": 200,
"minimum": 1,
"type": "integer"
},
"payer": {
"type": "string"
},
"recipient": {
"type": "string"
}
},
"type": "object"
},
"name": "Recent transactions",
"tags": [
"transfers",
"transactions",
"feed",
"stablecoin"
]
},
{
"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 \u2014 not legal advice; verify against the official SDN list. No params.",
"examples": [
"When was the OFAC dataset last refreshed?"
],
"id": "get-sanctions-status",
"inputSchema": {
"properties": {},
"type": "object"
},
"name": "OFAC sanctions coverage",
"tags": [
"sanctions",
"ofac",
"dataset",
"coverage"
]
},
{
"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 \u2014 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 \u2014 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 \u2014 its history is still being filled, so an empty or small answer is not final; partial \u2014 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 \u2014 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 \u2014 window_from on or before 2026-09-14, or no window_from over a window that includes them \u2014 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.",
"examples": [
"Where did funds from 0x\u2026 flow, two hops out?"
],
"id": "get-wallet-graph-walk",
"inputSchema": {
"properties": {
"address": {
"description": "The address in its network's own spelling: 0x\u2026 for EVM chains, T\u2026 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\u2026 address asked about an EVM chain, a 0x\u2026 address asked about Tron) \u2014 answered about the same bytes there, not refused, and the same owner only for a plain key account.",
"type": "string"
},
"chain": {
"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[]) \u2014 by name, never with an empty clean verdict. Without chain, the address's spelling picks it: 0x\u2026 \u2192 8453 Base, T\u2026 \u2192 Tron, base58 \u2192 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) \u2014 read that map before concluding; there is no auto-switch, ask again with chain set.",
"type": [
"integer",
"string",
"null"
]
},
"frontier_cap": {
"type": "integer"
},
"hops": {
"type": "integer"
},
"stop_at_attributed": {
"default": true,
"type": "boolean"
},
"stop_on_sanctioned": {
"default": false,
"type": "boolean"
},
"token": {
"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.",
"type": "string"
},
"window": {
"default": "all",
"description": "Time window",
"enum": [
"1h",
"24h",
"7d",
"30d",
"90d",
"1y",
"all"
],
"type": "string"
}
},
"required": [
"address",
"token"
],
"type": "object"
},
"name": "Wallet graph walk",
"tags": [
"graph",
"flow",
"walk",
"tracing",
"explainability"
]
}
],
"supportedInterfaces": [
{
"protocolBinding": "JSONRPC",
"protocolVersion": "1.0",
"url": "https://stablescan.achivx.com/a2a"
}
],
"url": "https://stablescan.achivx.com",
"version": "1.4.0",
"x-mcp": {
"connect": "claude mcp add stablescan --transport http https://stablescan.achivx.com/mcp",
"description": "Same telemetry over Model Context Protocol (for MCP clients).",
"endpoint": "https://stablescan.achivx.com/mcp",
"transport": "http"
}
}