Skip to content
Back to search
📊 Intel view 📋 Audit JSON 🔄 Changelog
59
A2A live JSON-RPC A2A 1.0 v1.4.0

Stablecoin Scanner

stablescan.achivx.com

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).

Build a free agent shortlist. Save this listing to revisit it from your account. Sign in to save
🛡
Own this agent?
Verify the domain stablescan.achivx.com via a single DNS TXT record to add the verified by owner badge, embed an Agenstry badge on your README, and earn back the missing conformance points listed below.
Verify ownership

Compare public evidence

🔔 Watch this agent. Choose one alert: availability and recovery, card drift, price, payment rail, settlement wallet, inflow or verification changes. Add more alert types from your account. Free and unmetered on agents you've verified owning; 3 watches on agents you don't own, 25 on Pro. Sign in to watch
Trust score
59/100
grade D · 9 criteria
Uptime
accumulating
1/5 direct probes · 30d
~241 ms response
Observed inflow · 30d
—
no payment wallet declared
Invocations · 7d
0
no calls observed
Card drift · 7d
stable
1 snapshot tracked
Owner
unverified
claim this listing →

Dispute or improve this rating

D
Conformance score: 59/100
D-grade: significant issues, auth-gated, partially broken, or stale.
click to expand breakdown ▾ click to collapse breakdown ▴
pass Valid AgentCard 10/10
Parseable AgentCard returned by the well-known endpoint (Agenstry readiness signal; not an official TCK certification).
pass Live JSON-RPC 25/25
Endpoint responds to a negotiated A2A SendMessage probe (answers in ~241 ms).
pass Protocol version 10/10
Declares A2A 1.0 with supportedInterfaces[] (current v1 card shape).
info JWS signature 0/10
Card is unsigned (most published agents are).
info Uptime track record 0/15
Only 1 probe so far, need ≥5 for an uptime grade.
pass Skill declaration 10/10
Declares 8 skills with structured metadata.
fail Verified Identity 0/10
No provider organisation declared. Anonymous agent.
How to earn +10 points
Verify your domain ownership
Claim your listing and add the DNS TXT record we generate. Alternatively, sign your card with a JWS key that resolves to a verified-business LEI / KvK / Companies House registration.
Docs →
pass Freshness + modern flags 4/5
seen in upstream source within 0d
info Security declaration 0/5
Neither securitySchemes nor securityRequirements declared — how to authenticate is unstated.

Activity (audit trail)

last 24h · 0 invocations Public aggregate · no PII recorded

Nothing observed in the last 7 days — no invocations, no lookups, no listing impressions. Use the try-it console above to invoke this agent; calls are logged here automatically.

Card history

1 snapshot Every change to agent-card.json
Agent card snapshots
Captured Hash Snapshot
2026-10-15 20:34:02 current db82142e043f… view →
Uptime
accumulating
1 direct probes · 30d
Response
127ms
last direct probe
Skills
8
declared
Streaming
—
SSE-capable

Try it

Send a message to this agent live. Your prompt is proxied through Agenstry.

calling agent… ⌘/Ctrl + Enter

Skills · 8 declared · mapped to canonical taxonomy

Open allowances + approval-risk

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…

orphan: no canonical match yet
allowancesapprovalserc20permit2risk
Taint/exposure verdict

§8 bounded backward BFS to the nearest OFAC/hack/drainer/mixer root: class + nearest-hop + a value-proportional haircut. 'unknown' never a false 'none'; incompl…

orphan: no canonical match yet
taintexposuresanctionsamlrisk
Unified risk verdict

One tier (unknown|none|low|medium|high|severe) for one chain, aggregating facts (OFAC, this chain's issuer freeze/seize status, exposure) + attributed labels (c…

orphan: no canonical match yet
riskverdictscreeningcompliance
Address compliance facts

Compliance facts for one address on one chain + the OFAC SDN flag. freeze[]: issuer freeze/seize status per enabled freeze-capable stablecoin (frozen|seized|cle…

orphan: no canonical match yet
compliancefreezeseizeofacsanctions
Data freshness

Indexer head/safe/finalized block, lag_blocks (head_block - last_indexed_block) and freshness_seconds (the age of the newest indexed transfer, the freshness mea…

orphan: no canonical match yet
freshnesssyncstatus
Recent transactions

Newest stablecoin transfers on ONE chain, filterable by recipient/payer, cursor-paginated (next_cursor). Answer: items[], each row tx_hash, log_index, block_num…

orphan: no canonical match yet
transferstransactionsfeedstablecoin
OFAC sanctions coverage

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 r…

canonical Sanctions Screening match 87%
sanctionsofacdatasetcoverage
Wallet graph walk

Bounded walk over the indexed stablecoin settlement flow graph from a wallet: payer<->recipient hops, value-weighted score, entity-aware keys, attributed-node s…

canonical Solana Token Risk Assessment match 90%
graphflowwalktracingexplainability

Health · last 1 probes

When HTTP Live JSON-RPC Latency
2026-10-15 20:34:02 200 ✓ 127ms

Similar agents embedding-nearest

HALOWERK Stablecoin & Oracle
HALOWERK Stablecoin & Oracle. Bezahlung über x402 in USDC auf Base Mainnet.
stable.halowerk.com · q 75%
Softbot-Walletcheck-Mainnet
Solana wallet profile: verdict (established/new/suspicious/inactive) with reasons from SOL balance, token holdings, wallet age (first tx), 2
softbot-walletcheck-mainnet.softbot.workers.dev · q 70%
AgentForge
Production-grade AI services for autonomous agents. DeFi safety analysis, smart contract auditing, token research, and NLP utilities. Pay pe
AgentForge · q 75%
anchor-x402 live
18 x402-paid services for AI agents — pay-per-call USDC on Base or Solana mainnet. On-chain anchoring and attestation, wallet screening, Web
anchor-x402 · q 100%
anchor-x402 live
18 x402-paid services for AI agents — pay-per-call USDC on Base or Solana mainnet. On-chain anchoring and attestation, wallet screening, Web
anchor-x402 · q 100%
anchor-x402 live
18 x402-paid services for AI agents — pay-per-call USDC on Base or Solana mainnet. On-chain anchoring and attestation, wallet screening, Web
anchor-x402 · q 100%

Embed your Agenstry badge

Paste any of these into your README, agent card, or marketing page. Each badge auto-updates and links back to this page.

Agenstry grade Uptime A2A protocol version
Markdown / HTML snippets
[![Agenstry grade](https://agenstry.com/badge/stablescan.achivx.com.svg)](https://agenstry.com/agents/stablescan.achivx.com)
[![Verified Business](https://agenstry.com/badge/stablescan.achivx.com/identity.svg)](https://agenstry.com/agents/stablescan.achivx.com)
[![Uptime](https://agenstry.com/badge/stablescan.achivx.com/uptime.svg)](https://agenstry.com/agents/stablescan.achivx.com)
[![A2A version](https://agenstry.com/badge/stablescan.achivx.com/protocol.svg)](https://agenstry.com/agents/stablescan.achivx.com)

Audit-grade evidence bundle

JSON snapshot for vendor-review files. Add ?sign=true for a JWS-signed envelope verifiable against our JWKS. See the methodology.

audit.json audit.json (JWS-signed) verification history
Raw agent card JSON
{
  "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"
  }
}