Robinhood Chain API for trading bots
What a Robinhood Chain trading bot needs from the Crius API: new launches, live prices, pools and safety checks before every buy, with credit costs.
A trading bot on Robinhood Chain (sniping, copy trading, momentum, market making) needs four things from a data API: candidates to trade, a check that each one can be sold at a fair cost, a live price with the depth behind it, and a fast feed of what happens after it buys. The Crius API covers all four from its own archive nodes, over REST and one WebSocket, so the bot can spend its time on strategy instead of decoding Uniswap v4 hooks and launchpad events.
Endpoints a trading bot uses
- GET
/tokenslist=new,list=bondingandlist=graduatingfor candidates, withlaunchpad,min_liquidity_usdandclean=truefilters. - GET
/token/{address}/securitybefore every first buy: honeypot verdict, realized buy and sell tax, owner powers, LP lock status and the v4 hook’s risk. - GET
/token/{address}/pricefor the price, the pool it came from andliquidity_usd, to size the order. - GET
/token/{address}/poolsfor every pool of the token (v2, v3, v4 with hook and fee, bonding curve), to pick the one to route through. - GET
/token/{address}/tradesfor recent trades with the real trader,executorand the router used (via). - GET
/token/{address}/launchfor a launchpad token’s curve,progresstoward graduation and its launch fees, including Pons’s snipe tax. - The WebSocket stream:
launches:allandgraduations:allfor new tokens,trades:<token>andprice:<token>for positions,tax:<token>andlp:<token>for changes that should make the bot exit.
Suggested architecture
-
Discover on the stream. Subscribe to
launches:allandgraduations:all(a Free key, 1 credit per connection). Without a key, poll/tokens?list=newinstead: 1 credit per call, up to 100 tokens. -
Gate every candidate. Call
/securityonce per token (1 credit, cached). Skipcriticalandhigh, then check taxes against your target. Just before a large buy,fresh=1re-runs the buy → transfer → sell simulation at the head block (20 credits, Starter). -
Size from depth. Read
/priceand keep the order a small share ofquote_liquidity_usd. Skipconfidence: "low": that price has under $1,000 behind it. -
Route through a real pool.
/token/{address}/poolslists every market. Avoid pools with tiny liquidity or extreme fees, as the example below shows. -
Watch open positions on the stream, not by polling.
price:<token>for exits,tax:<token>andlp:<token>because taxes and liquidity can change after launch. -
Reconcile on
safe. Act onlatestevents for speed. Book PnL from events whose block issafe(see finality).
| Operation | Call | Credits |
|---|---|---|
| Screen a new token | GET /token/{address}/security | 1 |
| Re-simulate before a large buy | GET /token/{address}/security?fresh=1 (Starter) | 20 |
| Price and depth | GET /token/{address}/price | 1 |
| Pick a pool | GET /token/{address}/pools | 1 |
| Recent trades | GET /token/{address}/trades | 2 |
| Live feed for every position | WebSocket stream (Free key or higher) | 1 per connection |
Screening 500 new tokens a day with /security and /price costs 1,000 credits a day, about 30,000 a month: a small part of the Free plan’s 1,000,000. Polling /price every second for 20 open positions would cost 1,728,000 credits a day and hit the Free plan’s 10 requests per second. The stream does the same job for 1 credit per connection.
Check a token before buying
A 5% sell tax and a hook that can block swaps: score 70
Ruby (0x8b5a7a19fbd3d8e8422643fc229b3ab08697c0be) passes the honeypot check. Should the bot buy it?
curl "https://api.crius.sh/v1/robinhood/token/0x8b5a7a19fbd3d8e8422643fc229b3ab08697c0be/security"const res = await fetch("https://api.crius.sh/v1/robinhood/token/0x8b5a7a19fbd3d8e8422643fc229b3ab08697c0be/security");const { data, meta } = await res.json();import requests
r = requests.get( "https://api.crius.sh/v1/robinhood/token/0x8b5a7a19fbd3d8e8422643fc229b3ab08697c0be/security",)body = r.json()print(body["data"])Real response 200 Captured Oct 28, 2026 · 191 lines (arrays trimmed)
{ "data": { "contract": { "blacklist": false, "can_change_limits": false, "can_change_tax": false, "cooldown": false, "implementation": null, "is_proxy": false, "mintable": false, "owner": "0x000000000000000000000000000000000000dead", "ownership": "renounced", "pausable": false, "proxy_kind": null, "self_destruct": false, "trading_switch": false, "upgradeable": false, "verified": "none" }, "flags": [ "tax_over_5pct", "hook_can_block_swaps", "hook_medium_risk", "unverified" ], "honeypot": { "is_honeypot": false, "reason": null, "selective": false }, "hook": { "address": "0x97240e95756c7b70db1ffaeee85a6c091c33a4ce", "capabilities": { "can_block_swaps": true, "can_gate_liquidity": false, "can_modify_liquidity_amounts": true, "can_modify_swap_amounts": true }, "code": { "admin_functions": [], "checked_ts": 1793207142599, "code_hash": "0x5cb5a35842eb82ff5c9dbed2dca84d023823d841a2c0fc642568bc8ff276f72f", "family": "0xaa8854cbf2bd", "kind": "contract", "logic": null, "owner": "0x33acedd086ee7fec19764b5f4a93a6ef067953f5", "ownership": "active", "size": 24040 }, "family": { "honeypot_pct": 0, "hooks": 3, "id": "0xaa8854cbf2bd", "liquidity_pulled_pct": 0, "pools_traded": 10, "taxed_pct": 90, "verified_hooks": 0 }, "flags": [ { "evidence": "7 of its 7 measured pools take 1%+ per trade (median per pool, up to 6.3%); only 10.83% of traded hooked pools tax at all", "flag": "tax_observed", "severity": "medium" }, { "evidence": "can take part of every swap (return delta); 4.55% of traded pools of hooks that can block swaps and change swap amounts taxed, 0.61% became honeypots", "flag": "can_modify_swap_amounts", "severity": "low" } ], "name": null, "observed": { "dynamic_tax_pools": 0, "first_trade_ts": 1793119940000, "honeypot_pools": 0, "last_trade_ts": 1793223286000, "liquidity_pulled_pct": 0, "liquidity_pulled_pools": 0, "max_buy_tax_pct": 2.545, "max_sell_tax_pct": 6.28, "median_pool_life_min": 1380, "pools": 18, "pools_traded": 8, "tax_measured_pools": 7, "taxed_10pct_pools": 0, "taxed_pools": 7, "volume_usd": 924751 }, "pattern": { "description": "hooks that can block swaps and change swap amounts", "honeypot_pct": 0.608377, "id": "before_swap_with_delta", "liquidity_pulled_pct": 21.5893, "pools_traded": 18574, "taxed_pct": 4.55475 }, "permissions": [ "beforeInitialize", "afterAddLiquidity", "beforeSwap", "afterSwap", "beforeSwapReturnDelta" ], "risk": [ "can_block_or_reprice_swaps", "can_modify_swap_amounts", "can_modify_liquidity_amounts", "unverified" ], "risk_level": "medium" }, "known_asset": false, "launch": { "flags": [], "lp_top_wallet": { "address": "0x20ac92362ead44f457913ca1a6c24fae049078d9", "liquidity_usd": 23.0571, "pct": 0.214633 }, "sniper_supply_pct": 1.77655, "sniper_top_wallet_pct": 1.77655, "sniper_wallets": 1, "sniper_window_blocks": 10, "uniform_holders": null, "wallet_farm": null }, "limits": {}, "liquidity": { "status": "partially_locked", "summary": { "burned_pct": 99.2777, "locked_pct": 0, "next_unlock_ts": null, "protocol_fee_pct": 0, "unlocked_in_wallets_pct": 0.722259, "weighting": "by pool liquidity_usd" } }, "primary_dex": "uniswap_v4", "risk": "medium", "score": 70, "tax": { "buy_pct": 0.84, "confidence": "high", "realized": { "buy_pct": 0.84, "by_wallet_class": { "dev_sell_pct": null, "others_sell_pct": 5.28 }, "last_sample_ts": 1793221716000, "max_sell_pct_seen": 16.65, "samples": { "buys": 8, "sells": 240 }, "sell_pct": 5.28, "window": "30d" }, "sell_pct": 5.28, "simulated": null, "source": "realized", "transfer_pct": null }, "tax_history": [ { "from_block": 99421932, "pct": 5, "side": "sell" }, { "from_block": 99791485, "pct": 1, "side": "buy" } ], "tax_history_total": 2, "tax_mode": "static", "token": "0x8b5a7a19fbd3d8e8422643fc229b3ab08697c0be" }, "meta": { "block": 100406622, "block_age_ms": 595, "block_ts": 1793225060000, "chain": "robinhood", "finalized_block": 100397649, "lag_ms": 100, "safe_block": 100401329, "simulation": "no V2 WETH pair: realized tax only" }}What this tells you
honeypot.is_honeypot: false, butscore: 70andrisk: "medium", with flagstax_over_5pct,hook_can_block_swaps,hook_medium_riskandunverified.tax.sell_pct: 5.28, measured from 240 real sells (tax.realized.samples.sells); the highest sell tax seen in 30 days was 16.65% (max_sell_pct_seen). A bot aiming for 3% per trade loses money on every round trip.tax_historyshows a 5% sell tax from block 99421932 and a 1% buy tax from block 99791485: the token’s taxes changed after launch.- The pool’s hook has
beforeSwapandbeforeSwapReturnDeltapermissions, an owner (code.ownership: "active") andrisk_level: "medium": it could change what a swap pays. meta.simulationis “no V2 WETH pair: realized tax only”, so the taxes here come from real trades, not from a simulation.
Pick the pool to trade in
CHARGE's markets: one real pool and two traps
Which pool should a bot use to trade Charge AI (0x7b8892cea949bc60d494681d1bc3ea96071ab0b8)?
curl "https://api.crius.sh/v1/robinhood/token/0x7b8892cea949bc60d494681d1bc3ea96071ab0b8/pools?limit=3"const res = await fetch("https://api.crius.sh/v1/robinhood/token/0x7b8892cea949bc60d494681d1bc3ea96071ab0b8/pools?limit=3");const { data, meta } = await res.json();import requests
r = requests.get( "https://api.crius.sh/v1/robinhood/token/0x7b8892cea949bc60d494681d1bc3ea96071ab0b8/pools?limit=3",)body = r.json()print(body["data"])Real response 200 Captured Oct 28, 2026 · 123 lines (arrays trimmed)
{ "data": [ { "amounts": { "token0": 1.18969, "token1": 720478686 }, "base": { "address": "0x7b8892cea949bc60d494681d1bc3ea96071ab0b8", "logo": "https://api.crius.sh/v1/robinhood/logo/0x7b8892cea949bc60d494681d1bc3ea96071ab0b8.png?size=128", "symbol": "CHARGE" }, "created_block": 88461321, "dex": "uniswap_v4", "dynamic_fee": false, "fee": 0, "hook": { "address": "0xe5e702641ea86f4ae6cc3cdaed2b886f976be044", "name": "pons_v2_meme_hook" }, "is_price_pool": true, "liquidity_usd": 5604.57, "pool": "0x871b166182fd708d5d16a4daa9a42f05a653fa51ee2b195097f425e0d9ca4913", "price_usd": 0.00000388948, "quote": { "address": "0x0000000000000000000000000000000000000000", "logo": null, "symbol": "ETH" }, "quote_liquidity_usd": 2802.29, "state": { "liquidity": 29277002188455996438188, "reserve0": 0, "reserve1": 0, "sqrt_price_x96": 1949728392666469411451966154432124, "tick": 202227 }, "swaps_indexed": 432, "tick_spacing": 200 }, { "amounts": { "token0": 3.1477, "token1": 115029 }, "base": { "address": "0x7b8892cea949bc60d494681d1bc3ea96071ab0b8", "logo": "https://api.crius.sh/v1/robinhood/logo/0x7b8892cea949bc60d494681d1bc3ea96071ab0b8.png?size=128", "symbol": "CHARGE" }, "created_block": 88461495, "dex": "uniswap_v4", "dynamic_fee": false, "fee": 850000, "hook": null, "is_price_pool": false, "liquidity_usd": 6.29539, "pool": "0xe928234e515b0c000dd6aa1c60cf5a009082367cda4775a5b63b4ff0c83dcdd3", "price_usd": 0.0000273644, "quote": { "address": "0x5fc5360d0400a0fd4f2af552add042d716f1d168", "logo": null, "symbol": "USDG" }, "quote_liquidity_usd": 3.1477, "state": { "liquidity": 601728037770030, "reserve0": 0, "reserve1": 0, "sqrt_price_x96": 15145615706034675540349663040887263187, "tick": 381391 }, "swaps_indexed": 3, "tick_spacing": 60 }, { "amounts": { "token0": 0.328859, "token1": 35779.5 }, "base": { "address": "0x7b8892cea949bc60d494681d1bc3ea96071ab0b8", "logo": "https://api.crius.sh/v1/robinhood/logo/0x7b8892cea949bc60d494681d1bc3ea96071ab0b8.png?size=128", "symbol": "CHARGE" }, "created_block": 88466617, "dex": "uniswap_v4", "dynamic_fee": false, "fee": 450000, "hook": null, "is_price_pool": false, "liquidity_usd": 0.657719, "pool": "0x1a184f0aa1978e7b543ee944a30df88dd34fcb667aa5a9142bb399ef582481b8", "price_usd": 0.00000919127, "quote": { "address": "0x5fc5360d0400a0fd4f2af552add042d716f1d168", "logo": null, "symbol": "USDG" }, "quote_liquidity_usd": 0.328859, "state": { "liquidity": 108473206521826, "reserve0": 0, "reserve1": 0, "sqrt_price_x96": 26133147987752847079481471382601445977, "tick": 392302 }, "swaps_indexed": 4, "tick_spacing": 4500 } ], "meta": { "block": 100406784, "block_age_ms": 826, "block_ts": 1793225076000, "chain": "robinhood", "finalized_block": 100397649, "lag_ms": 11, "next_cursor": "3", "safe_block": 100401329, "total": 10 }}What this tells you
- The first pool,
0x871b166182fd708d5d16a4daa9a42f05a653fa51ee2b195097f425e0d9ca4913, hasis_price_pool: true,liquidity_usd: 5604.57and the Pons hook (pons_v2_meme_hook) withfee: 0. This is the market. - The second,
0xe928234e515b0c000dd6aa1c60cf5a009082367cda4775a5b63b4ff0c83dcdd3, is a USDG pool withfee: 850000(Uniswap’s units of one millionth: an 85% swap fee) andliquidity_usd: 6.29539. - The third,
0x1a184f0aa1978e7b543ee944a30df88dd34fcb667aa5a9142bb399ef582481b8, takes 45% (fee: 450000) and holdsliquidity_usd: 0.657719. meta.total: 10: the token has ten pools. A bot that routes to “any pool with the token” can lose most of its order in fees.
// Safety gate before a first buy (anonymous plan: no key needed).const API = "https://api.crius.sh/v1/robinhood";const get = async (p) => (await (await fetch(API + p)).json()).data;
async function canBuy(token, targetProfitPct) { const [sec, px] = await Promise.all([get(`/token/${token}/security`), get(`/token/${token}/price`)]); if (!sec || !px) return { ok: false, why: "unknown token or no market" }; if (sec.risk === "critical" || sec.risk === "high") return { ok: false, why: `${sec.risk}: ${sec.flags.join(", ")}` }; const roundTrip = (sec.tax.buy_pct ?? 0) + (sec.tax.sell_pct ?? 0); if (roundTrip >= targetProfitPct) return { ok: false, why: `taxes ${roundTrip}% eat the target` }; if (px.confidence === "low") return { ok: false, why: `thin market: $${px.liquidity_usd}` }; return { ok: true, pool: px.source_pool, maxOrderUsd: px.quote_liquidity_usd * 0.02 };}The 2% order cap is an example, not a rule; pick yours from the price impact you accept. For the full checklist, see Add safety checks to a trading bot; for the feed, Stream trades over WebSocket.
Frequently asked questions
Can the Crius API execute trades for my bot?
No. The Crius API is read-only data. Your bot signs and sends its own transactions through its wallet and an RPC endpoint; Crius tells it what to trade, what it costs and whether it can be sold.
How fast does a bot see a new token or trade?
Stream messages are pushed as soon as a block is decoded, typically well under a second after it was produced. Every REST response carries meta.lag_ms, the time since the index applied that block.
Do I need a paid plan for a trading bot?
Not to start. Prices, pools, trades, token lists and the cached security check work without a key at 2 requests per second. The WebSocket stream needs a Free key. A fresh honeypot re-simulation on demand (/security?fresh=1, 20 credits) needs Starter or higher.
How does a bot avoid honeypots and high taxes?
Call /token/{address}/security before the first buy. Skip risk: "critical" (a honeypot), and compare tax.buy_pct plus tax.sell_pct with the profit you're aiming for. Taxes are measured from real trades, so they include Uniswap v4 hook taxes the contract code doesn't show.
Related
Get your free Crius API key
Every example on this page works with a free key: higher rate limits than the anonymous plan, holders, wallets and the WebSocket stream. No card needed.
- Robinhood Chain (4663) only, from our own archive nodes
- REST + WebSocket
- Pay on-chain or by card