CRIUS Docs
API status Get API key
Use cases

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.

Updated 3 min read

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/tokens list=new, list=bonding and list=graduating for candidates, with launchpad, min_liquidity_usd and clean=true filters.
  • GET/token/{address}/security before every first buy: honeypot verdict, realized buy and sell tax, owner powers, LP lock status and the v4 hook’s risk.
  • GET/token/{address}/price for the price, the pool it came from and liquidity_usd, to size the order.
  • GET/token/{address}/pools for every pool of the token (v2, v3, v4 with hook and fee, bonding curve), to pick the one to route through.
  • GET/token/{address}/trades for recent trades with the real trader, executor and the router used (via).
  • GET/token/{address}/launch for a launchpad token’s curve, progress toward graduation and its launch fees, including Pons’s snipe tax.
  • The WebSocket stream: launches:all and graduations:all for new tokens, trades:<token> and price:<token> for positions, tax:<token> and lp:<token> for changes that should make the bot exit.

Suggested architecture

  1. Discover on the stream. Subscribe to launches:all and graduations:all (a Free key, 1 credit per connection). Without a key, poll /tokens?list=new instead: 1 credit per call, up to 100 tokens.

  2. Gate every candidate. Call /security once per token (1 credit, cached). Skip critical and high, then check taxes against your target. Just before a large buy, fresh=1 re-runs the buy → transfer → sell simulation at the head block (20 credits, Starter).

  3. Size from depth. Read /price and keep the order a small share of quote_liquidity_usd. Skip confidence: "low": that price has under $1,000 behind it.

  4. Route through a real pool. /token/{address}/pools lists every market. Avoid pools with tiny liquidity or extreme fees, as the example below shows.

  5. Watch open positions on the stream, not by polling. price:<token> for exits, tax:<token> and lp:<token> because taxes and liquidity can change after launch.

  6. Reconcile on safe. Act on latest events for speed. Book PnL from events whose block is safe (see finality).

OperationCallCredits
Screen a new tokenGET /token/{address}/security1
Re-simulate before a large buyGET /token/{address}/security?fresh=1 (Starter)20
Price and depthGET /token/{address}/price1
Pick a poolGET /token/{address}/pools1
Recent tradesGET /token/{address}/trades2
Live feed for every positionWebSocket 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?

GET/v1/robinhood/token/0x8b5a7a19fbd3d8e8422643fc229b3ab08697c0be/security
curl "https://api.crius.sh/v1/robinhood/token/0x8b5a7a19fbd3d8e8422643fc229b3ab08697c0be/security"
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, but score: 70 and risk: "medium", with flags tax_over_5pct, hook_can_block_swaps, hook_medium_risk and unverified.
  • 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_history shows 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 beforeSwap and beforeSwapReturnDelta permissions, an owner (code.ownership: "active") and risk_level: "medium": it could change what a swap pays.
  • meta.simulation is “no V2 WETH pair: realized tax only”, so the taxes here come from real trades, not from a simulation.
Security checks reference Runs from your browser on the anonymous plan Data looks wrong? Report it

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

GET/v1/robinhood/token/0x7b8892cea949bc60d494681d1bc3ea96071ab0b8/pools?limit=3
curl "https://api.crius.sh/v1/robinhood/token/0x7b8892cea949bc60d494681d1bc3ea96071ab0b8/pools?limit=3"
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, has is_price_pool: true, liquidity_usd: 5604.57 and the Pons hook (pons_v2_meme_hook) with fee: 0. This is the market.
  • The second, 0xe928234e515b0c000dd6aa1c60cf5a009082367cda4775a5b63b4ff0c83dcdd3, is a USDG pool with fee: 850000 (Uniswap’s units of one millionth: an 85% swap fee) and liquidity_usd: 6.29539.
  • The third, 0x1a184f0aa1978e7b543ee944a30df88dd34fcb667aa5a9142bb399ef582481b8, takes 45% (fee: 450000) and holds liquidity_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.
Token markets reference Runs from your browser on the anonymous plan Data looks wrong? Report it
// 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.

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