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

Source: https://docs.crius.sh/use-cases/trading-bots/ · Updated 2026-10-28

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`](https://docs.crius.sh/reference/discovery/token-lists/) `list=new`, `list=bonding` and `list=graduating` for candidates, with `launchpad`, `min_liquidity_usd` and `clean=true` filters.
-   [GET`/token/{address}/security`](https://docs.crius.sh/reference/security/security-checks/) 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`](https://docs.crius.sh/reference/tokens/token-price/) for the price, the pool it came from and `liquidity_usd`, to size the order.
-   [GET`/token/{address}/pools`](https://docs.crius.sh/reference/tokens/token-markets/) 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`](https://docs.crius.sh/reference/trades/trade-tape/) for recent trades with the real trader, `executor` and the router used (`via`).
-   [GET`/token/{address}/launch`](https://docs.crius.sh/reference/launchpads/launch-lifecycle/) for a launchpad token’s curve, `progress` toward graduation and its launch fees, including Pons’s snipe tax.
-   The [WebSocket stream](https://docs.crius.sh/reference/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](https://docs.crius.sh/concepts/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

Example [Anonymous · no key · 1 credit](https://docs.crius.sh/reference/security/security-checks/)

### 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**

```bash
curl "https://api.crius.sh/v1/robinhood/token/0x8b5a7a19fbd3d8e8422643fc229b3ab08697c0be/security"
```

**JavaScript**

```js
const res = await fetch("https://api.crius.sh/v1/robinhood/token/0x8b5a7a19fbd3d8e8422643fc229b3ab08697c0be/security");
const { data, meta } = await res.json();
```

**Python**

```python
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)**

```json
{
  "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](https://docs.crius.sh/reference/security/security-checks/) Runs from your browser on the anonymous plan [Data looks wrong? Report it](mailto:support@crius.sh?subject=Wrong%20data%20in%20docs%20example%3A%20A%205%25%20sell%20tax%20and%20a%20hook%20that%20can%20block%20swaps%3A%20score%2070&body=Page%3A%20https%3A%2F%2Fdocs.crius.sh%2Fuse-cases%2Ftrading-bots%2F%23sell-tax%0ARequest%3A%20GET%20%2Fv1%2Frobinhood%2Ftoken%2F0x8b5a7a19fbd3d8e8422643fc229b3ab08697c0be%2Fsecurity%0A%0AWhat's%20wrong%20or%20missing%3F%0A%0A)

## Pick the pool to trade in

Example [Anonymous · no key · 1 credit](https://docs.crius.sh/reference/tokens/token-markets/)

### 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**

```bash
curl "https://api.crius.sh/v1/robinhood/token/0x7b8892cea949bc60d494681d1bc3ea96071ab0b8/pools?limit=3"
```

**JavaScript**

```js
const res = await fetch("https://api.crius.sh/v1/robinhood/token/0x7b8892cea949bc60d494681d1bc3ea96071ab0b8/pools?limit=3");
const { data, meta } = await res.json();
```

**Python**

```python
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)**

```json
{
  "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](https://docs.crius.sh/reference/tokens/token-markets/) Runs from your browser on the anonymous plan [Data looks wrong? Report it](mailto:support@crius.sh?subject=Wrong%20data%20in%20docs%20example%3A%20CHARGE's%20markets%3A%20one%20real%20pool%20and%20two%20traps&body=Page%3A%20https%3A%2F%2Fdocs.crius.sh%2Fuse-cases%2Ftrading-bots%2F%23pick-pool%0ARequest%3A%20GET%20%2Fv1%2Frobinhood%2Ftoken%2F0x7b8892cea949bc60d494681d1bc3ea96071ab0b8%2Fpools%3Flimit%3D3%0A%0AWhat's%20wrong%20or%20missing%3F%0A%0A)

```js
// 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](https://docs.crius.sh/guides/add-safety-checks-to-a-trading-bot/); for the feed, [Stream trades over WebSocket](https://docs.crius.sh/guides/stream-trades-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

[Guide **Safety checks for bots** Keep a Robinhood Chain trading bot away from honeypots, high taxes and pullable liquidity: pre-trade checks with Crius, then live tax and LP alerts. Read](https://docs.crius.sh/guides/add-safety-checks-to-a-trading-bot/) [Guide **Stream trades** Stream every trade of a Robinhood Chain token, pool or wallet over the Crius WebSocket, with Node.js and Python clients that reconnect, resume and backfill. Read](https://docs.crius.sh/guides/stream-trades-websocket/) [Guide **Detect a honeypot** Check whether a Robinhood Chain token can be sold before you buy it. One API call simulates a buy and a sell and checks real trades; a real honeypot example shows the evidence. Read](https://docs.crius.sh/guides/detect-honeypot/) [Guide **Check token taxes** Get the real buy and sell tax of any Robinhood Chain token in one call, measured from recent trades and checked by simulation. Real examples with a 5% sell tax and a 7% buy tax. Read](https://docs.crius.sh/guides/check-token-taxes/) [Guide **Price alerts** Build Robinhood Chain price alerts on the Crius WebSocket price channel, with a runnable Node.js alert bot that checks liquidity and token security first. Read](https://docs.crius.sh/guides/build-price-alerts/) [API reference **WebSocket stream** Real-time Robinhood Chain data over one WebSocket - trades, prices, live candles, new launches, graduations, new pools, LP and tax changes, wallet activity, with replay and reorg handling. Read](https://docs.crius.sh/reference/stream/)
