Reference View as Markdown

Token check

POST /v1/check/token answers "is this token safe to buy?" Use it before every swap into a token. About a second; $0.03 over x402.

The request

{ "chain": "base", "address": "0x4ed4E862860beD51a9570b96d89aF5E1B0Efefed", "context": "swap", "amount_usd": 500 }
  • chainRequired. base or ethereum. The chain ID (8453, 1) or its CAIP-2 name (eip155:8453) works too.
  • addressRequired. The token's contract address: 0x and 40 hex characters. If it mixes upper and lower case, the case must match its checksum (EIP-55), so a typo is refused instead of checked.
  • amount_usdOptional. The size of the trade you intend, in US dollars (0.01 to 1,000,000,000). The check then also tries a trade of that size: see below. Same price.
  • contextOptional: swap, pay or hold. Sent back in the answer as you sent it; it doesn't change the checks.

The body is JSON, at most 2 KB. Fields we don't know are ignored, so you can send your own. A wallet's address sent here gets 422 NOT_A_CONTRACT: use the address check.

What is checked

  • A real tradeWe buy the token and sell it back in a simulation, through its deepest real pool (Uniswap V2, V3 and V4, Aerodrome and others). A sale that fails is a block; a tax on buying or selling is measured.
  • The contractWhat its owner can still do: mint, a mint hidden in transfers, pause, block addresses, set fees, replace the code. Whether that power sits with one wallet, a multisig or a timelock. Whether the source is verified.
  • The pool's moneyWho can withdraw the liquidity: burned, locked, or a wallet that can pull it at any time. How much a seller can actually reach.
  • Its creatorWho deployed it, and who paid the creator first: a sanctioned address, a mixer, or a wallet that funded the creators of earlier rugs.
  • Its pool's hookOn Uniswap V4, whether the hook is a copy of a known honeypot hook.
  • Holders and ageHow concentrated the supply is, and how new the token is.
  • Fakes and listsWhether it copies a major token's name or ticker. A ticker spelled with look-alike letters, or a fake of USDC, USDT, ETH and the like with no market, is a block that says plainly it is not the real token. And the sanctions and scam lists.

The trade size

With amount_usd, the check also buys and sells that amount in the simulation. The answer gets EXIT_LIQUIDITY_INSUFFICIENT (never allow) when a buy of that size is priced 10% or more worse than a small one, is larger than all the money a seller can reach in the token's pools, can't be taken whole by the pool, or reverts where a small one goes through.

The token facts in the answer

Beside the usual fields, a token check returns token:

// AERO on Base, asked for a $2,500 trade (14 Oct 2026) "token": { "name": "Aerodrome", "symbol": "AERO", "age_days": 1143.1, "launchpad": null, "main_pool": { "dex": "aerodrome", "quote": "USDC", "id": "0x6cdc…971d", "liquidity_usd": 42153532 }, "simulation": { "buy_tax_pct": 0, "sell_tax_pct": 0, "round_trip_loss_pct": 0.6, "sold": true }, "trade": { "amount_usd": 2500, "simulated_usd": 1687.82, "pools": 41, "exit_liquidity_usd": 31218967, "price_impact_pct": 0, "filled_pct": 100, "round_trip_loss_pct": 0.6, "bought": true, "sold": true } }
  • main_poolThe deepest pool we found, where the simulation traded. null when there is none.
  • simulationWhat a small buy and sell-back lost, in percent. null if it couldn't be simulated.
  • tradeOnly with amount_usd: what a trade of that size did. The order is split across the token's pools by depth, and simulated_usd is the main pool's share. price_impact_pct is how much worse than a small buy it was priced; filled_pct is under 100 when the pool couldn't take it all; exit_liquidity_usd is the money a seller can reach across the pools.

A token can be dangerous and still trade normally in the simulation: the trap may be in who controls it. That is why the answer weighs every finding, not the simulation alone.