for agents & bots

API Documentation

Built for autonomous agents: every endpoint is POST + JSON and returns a structured verdict your code branches on. Wire it in as MCP tools, pay per call via x402 (no account), or use an API key with a prepaid balance.

MCP — native agent tools

The fastest path. The Salvo MCP server exposes all 6 endpoints as native tools in any MCP-compatible agent (Claude, Cursor, your own runtime). Calls are billed to your prepaid balance via your API key — your agent just calls pretrade, token-safety, wallet-risk and branches on the verdict.

{
  "mcpServers": {
    "salvo": {
      "command": "npx",
      "args": ["-y", "salvo-mcp"],
      "env": { "SALVO_API_KEY": "sk_live_...", "SALVO_BASE_URL": "https://salvo.one" }
    }
  }
}

x402 — the agent pays per call

For fully autonomous agents with their own wallet and no Salvo account: each request is paid on-chain over HTTP 402. No signup, no key — just a signer.

import { wrapFetchWithPayment, createSigner } from 'x402-fetch'

const pay = wrapFetchWithPayment(fetch, await createSigner('base', AGENT_PK))

// pre-trade gate in a sniper / MEV / Telegram bot's hot path
const r = await pay('https://salvo.one/v1/pretrade', {
  method: 'POST', headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ token: tokenIn, chain: 'base' }),
}).then(r => r.json())

if (r.data.verdict !== 'go') return skip()   // can't sell / honeypot / shallow LP
await buy(tokenIn)

API key — prepaid balance (for apps)

curl -X POST https://salvo.one/v1/token-safety \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{"token":"0x...","chain":"ethereum"}'

Response shape

{ "ok": true, "product": "token-safety", "data": { ... },
  "_meta": { "billedVia": "apikey", "priceUsd": 0.005 } }

Endpoints

POST /v1/token-safety $0.005

Scores rugpull/honeypot risk of an ERC20 token from on-chain signals: mint/pause functions, ownership, upgradeable proxy, ERC20 sanity.

FieldDescription
token requiredERC20 contract address (0x...)
chainData chain (ethereum|base|arbitrum|optimism|...). Default ethereum.
{
  "token": "0x...",
  "chain": "ethereum",
  "riskScore": 18,
  "verdict": "safe",
  "name": "Example",
  "symbol": "EXM",
  "decimals": 18,
  "ownerRenounced": true,
  "flags": [],
  "capabilities": []
}

POST /v1/pretrade $0.003

Single go/caution/block verdict for an ERC20 before buying: safety scan + honeypot sell-simulation (routed to the liquidity pair) + liquidity depth. Built for trading bots (one call).

FieldDescription
token requiredERC20 contract address (0x...)
chainData chain (ethereum|base|arbitrum|optimism|bsc|...). Default ethereum.
{
  "token": "0x...",
  "chain": "ethereum",
  "verdict": "go",
  "canSell": true,
  "riskScore": 12,
  "liquidity": {
    "pairExists": true,
    "pooledNative": 41.2,
    "nativeSymbol": "WETH",
    "tier": "deep",
    "dex": "uniswap-v2"
  },
  "reasons": [
    "passed safety, sell-simulation, and liquidity checks"
  ],
  "confidence": 0.9
}

POST /v1/wallet-risk $0.01

AML risk assessment: OFAC + mixer blocklist screening of the address and its counterparties, an ERC20 + native ETH value graph, and behavioral laundering typologies — with an explainable score and recommendation.

FieldDescription
address requiredWallet address (0x...)
chainData chain. Default ethereum.
depthAnalysis depth 1–3 (wider history window, more thorough, higher cost). Default 1.
{
  "address": "0x...",
  "chain": "ethereum",
  "sanctioned": false,
  "riskScore": 12,
  "verdict": "safe",
  "recommendation": "ALLOW",
  "signals": [],
  "exposure": {
    "directBadContacts": [],
    "counterparties": 14
  }
}

POST /v1/token-unlock $0.004

Reads vesting/lockup schedule from standard contracts (OZ VestingWallet, TokenTimelock): start, end, progress, unlock date.

FieldDescription
contract requiredVesting/lockup contract address (0x...)
chainData chain. Default ethereum.
nowUNIX time for progress calc (optional; otherwise taken from block).
{
  "contract": "0x...",
  "chain": "ethereum",
  "standard": "OZ VestingWallet",
  "start": 1700000000,
  "end": 1731536000,
  "percentVested": 42.5
}

POST /v1/wallet-score $0.006

Composite 0–100 wallet score from lifetime activity, counterparty/token diversity (multi-day window) and balance. Gauges organic behavior (anti-sybil) and wallet "quality". Known infrastructure is flagged, not scored.

FieldDescription
address requiredWallet address (0x...)
chainData chain. Default ethereum.
{
  "address": "0x...",
  "chain": "ethereum",
  "score": 73,
  "tier": "good",
  "breakdown": {
    "activity": 26,
    "diversity": 32,
    "balance": 15
  },
  "stats": {
    "txCount": 412,
    "uniqueCounterparties": 180,
    "uniqueTokens": 24
  }
}

POST /v1/wallet-graph $0.008

Transfer graph around a wallet with risk-classified nodes (sanctioned/exploit/scam/mixer/infra) and edges — for tracing flows and connections. Powers the interactive investigation view.

FieldDescription
address requiredWallet/contract address (0x...)
chainData chain. Default ethereum.
depthGraph depth 1–2 (2 expands active neighbors to reveal paths). Default 1.
{
  "address": "0x...",
  "chain": "ethereum",
  "depth": 1,
  "nodes": [
    {
      "id": "0x...",
      "category": "clean",
      "label": "",
      "subject": true
    }
  ],
  "edges": [
    {
      "from": "0x...",
      "to": "0x...",
      "kind": "erc20",
      "count": 3
    }
  ],
  "stats": {
    "nodes": 24,
    "edges": 31,
    "flagged": 1
  },
  "scanned": {
    "fromBlock": 25160000,
    "toBlock": 25290000,
    "blocks": 130000,
    "incomplete": false
  }
}

Supported chains (13 mainnet)

ethereum, base, arbitrum, optimism, bsc, celo, linea, scroll, blast, mantle, zksync, fantom, mode — via the chain field (default ethereum).

FAQ

Is there a honeypot checker API?
Yes. Salvo's token-safety endpoint ($0.005) and pretrade endpoint ($0.003) are honeypot-checker APIs: POST a token address and chain to https://salvo.one/v1/token-safety and Salvo runs a real on-chain sell-simulation. If the sell reverts, you get a block verdict — a likely honeypot. Available via REST, MCP (npx -y salvo-mcp), or x402 pay-per-call.
Can I sell this token, or is it a honeypot?
Salvo answers this by funding a synthetic holder on-chain and simulating a sell against the live liquidity pair — not by guessing from the contract bytecode. If the token can be sold with no hidden tax it returns go/can-sell; if the sell is blocked or reverts it returns block. A passing sell-simulation is a strong indicator, not a guarantee.
What is the best token safety API for trading bots?
Salvo is built for bots and AI agents: one pretrade call ($0.003) before every buy returns a go/caution/block verdict combining on-chain safety, a real sell-simulation, and live liquidity depth across 13 EVM chains. Bots can pay per call with no account via x402, or use a prepaid API key, and branch on the verdict in one line.
Is there a rug check / rug pull detection API?
Yes. Salvo's pretrade and token-safety endpoints check the signals behind rug pulls: whether you can actually sell back (sell-simulation), hidden sell tax, whether trading is disabled, blacklist/mint/pause powers, owner-renounced status, and liquidity depth — returned as a single go/caution/block verdict for under a cent per call.
How do I do a pre-trade risk check before buying a token?
Call Salvo's pretrade endpoint with the token address and chain (POST https://salvo.one/v1/pretrade, or ask an AI assistant connected via the salvo-mcp MCP server). It reconciles on-chain safety, a sell-simulation against the live pair, and liquidity depth into one go/caution/block answer in about a second, for $0.003.
Is there an on-chain AML API / wallet risk score API?
Yes. Salvo's wallet-risk endpoint ($0.01) returns an explainable AML risk score for a wallet, screening against OFAC/SDN sanctions, Tornado Cash mixer contracts, and scam/drainer feeds (ScamSniffer, CryptoScamDB, Poison-Hunter, MEW), with an infrastructure allowlist to avoid false positives. The wallet-score endpoint ($0.006) returns a separate 0–100 wallet-quality/sybil score.
Is there an MCP server for on-chain / crypto risk checks?
Yes. Run npx -y salvo-mcp to expose Salvo's six tools (pretrade, token-safety, wallet-risk, wallet-score, token-unlock, wallet-graph) as native tools to any MCP-compatible AI assistant like Claude or Cursor. The assistant calls them by name and bills your prepaid balance; you just ask things like "is this token safe to buy on Base?".
Do you have an x402 paid API example?
Yes. Salvo is a live x402 pay-per-call API: a bot's own wallet pays a few sub-cent per request on-chain, with no account or key. Wrap fetch with an x402 signer — wrapFetchWithPayment(fetch, await createSigner(network, AGENT_PK)) — and POST to https://salvo.one/v1/pretrade. See https://salvo.one/docs for the full example.
What chains does Salvo support?
Salvo covers 13 EVM mainnets: Ethereum, Base, Arbitrum, Optimism, BNB Chain, Celo, Linea, Scroll, Blast, Mantle, zkSync Era, Fantom, and Mode. Pass the network in the chain field; it defaults to ethereum, so always specify the correct chain because an address on the wrong chain gives the wrong answer.
How much does Salvo cost?
Salvo is pay-per-call, all sub-cent: pretrade $0.003, token-unlock $0.004, token-safety $0.005, wallet-score $0.006, wallet-graph $0.008, and wallet-risk $0.01. New anonymous accounts get $0.25 of free credit (about 80 pretrade checks) with no email, card, or KYC required.
What is crypto risk intelligence for AI agents and trading bots?
It is a machine-callable safety check an autonomous agent runs before acting on-chain. Salvo provides this as one verdict-returning API/MCP: before a buy, an agent calls pretrade and gets go/caution/block (can I sell it back, is it a honeypot, is the wallet dirty) so it can skip traps automatically — paid per call via x402 or a prepaid key.
How is Salvo different from a normal token scanner?
Most scanners read the contract bytecode and guess. Salvo executes the sell: it funds a synthetic holder via state-override and simulates selling against the live liquidity pair, so a token that cannot be sold shows as block. Salvo is honest about the limit — a transfer to the pair is not a full router swap, so a GO is a strong indicator, not a guarantee.