Robinhood Chain API for token screeners
Build a Robinhood Chain token screener with the Crius API: new, trending and graduating lists, batch profiles, candles and risk badges, with credit costs.
A token screener is a live table of a chain’s tokens: newest launches, trending tokens, top gainers, tokens about to graduate from a bonding curve, each with price, change, market cap, liquidity, volume and a risk badge. With the Crius API the table comes from one list call per tab, the detail page from a handful of anonymous calls, and the risk badge from the same security check traders use. You don’t need to index Robinhood Chain or decode its launchpads.
Endpoints a screener uses
- GET
/tokensone call per tab:new,bonding,graduating,graduated,trending,top_volume,top_gainers,top_losers,top_market_cap. Filters:launchpad,quote,min_liquidity_usd,min_volume_usd,min_market_cap_usd/max_market_cap_usd,created_after_ts,windowandclean=true. - POST
/tokens/batchto refresh the rows a user is watching, trimmed to the fields you show. - GET
/pricesfor a watchlist’s prices and 24h change, 100 tokens per call. - GET
/token/{address}/candlesfor sparklines and the detail chart, with the launch curve merged in. - GET
/token/{address}/securityfor the risk badge (risk,score,flags). - GET
/searchfor the search box: names, symbols and exact addresses.
Suggested architecture
-
Refresh lists on the server. A worker calls each tab’s list on a timer and caches the result. Five tabs refreshed every 10 seconds is 43,200 calls a day, about 1.3 million credits a month: more than the Free plan’s 1,000,000, well within Starter. Every visitor is served from the cache.
-
Compute risk once per token. Call
/security(1 credit) the first time a token enters any list, store the badge, and re-check on a schedule or when thetax:<token>orlp:<token>stream channels report a change. -
Load detail pages on demand. A token page needs the profile (1 credit), candles (2), recent trades (2) and the cached security check (1): 6 credits. Cache it per
meta.block, and push live updates withcandles:<token>:<interval>andtrades:<token>on the stream. -
Let the user filter on the server. Pass
min_liquidity_usd,launchpadormin_market_cap_usdto the list instead of filtering 100 rows in the browser: you get full pages of matching tokens.
A trending tab in one call
Trending tokens in the last 24 hours
Which Robinhood Chain tokens are trending today, without rugs and wash trading?
curl "https://api.crius.sh/v1/robinhood/tokens?list=trending&window=24h&limit=3"const res = await fetch("https://api.crius.sh/v1/robinhood/tokens?list=trending&window=24h&limit=3");const { data, meta } = await res.json();import requests
r = requests.get( "https://api.crius.sh/v1/robinhood/tokens?list=trending&window=24h&limit=3",)body = r.json()print(body["data"])Real response 200 Captured Oct 28, 2026 · 281 lines (arrays trimmed)
{ "data": [ { "address": "0xd086f891229cd123aadfcae7c4b40150a80fd9d7", "buy_volume_usd": { "1h": 846676, "24h": 1760953, "5m": 213539, "6h": 1760953 }, "buyers": { "1h": 2862, "24h": 4951, "5m": 893, "6h": 4951 }, "buys": { "1h": 5160, "24h": 10660, "5m": 1143, "6h": 10660 }, "change_pct": { "1h": 219.677, "24h": 34319.8, "5m": 3.97796, "6h": 34319.8 }, "created_block": 100319502, "created_ts": 1793216058240, "decimals": 18, "fdv_usd": 2836574, "holders": 2857, "launchpad": null, "launchpad_name": null, "links": { "discord": null, "farcaster": null, "github": null, "telegram": null, "twitter": "https://x.com/search?q=0xd086f891229cd123aadfcae7c4b40150a80fd9d7&src=typed_query&f=live", "website": "https://xdcoinsol.lol" }, "liquidity_usd": 723990, "logo": "https://api.crius.sh/v1/robinhood/logo/0xd086f891229cd123aadfcae7c4b40150a80fd9d7.png?size=128", "market_cap_usd": 2552917, "name": "Pizza", "price_eth": 0.00000120424, "price_usd": 0.00283657, "progress_pct": null, "quote": "USDG", "sell_volume_usd": { "1h": 706205, "24h": 1465984, "5m": 207484, "6h": 1465984 }, "sellers": { "1h": 1951, "24h": 3642, "5m": 630, "6h": 3642 }, "sells": { "1h": 7995, "24h": 17196, "5m": 1833, "6h": 17196 }, "status": null, "symbol": "PIZZA", "traders": { "1h": 3401, "24h": 5197, "5m": 1288, "6h": 5197 }, "txns": { "1h": 8316, "24h": 17544, "5m": 1915, "6h": 17544 }, "volume_usd": { "1h": 1552881, "24h": 3226937, "5m": 421023, "6h": 3226937 } }, { "address": "0x2e8c31162b855a2ffa90f6f8634643ad6f111e18", "buy_volume_usd": { "1h": 68152.3, "24h": 3574310, "5m": 1310.32, "6h": 2375164 }, "buyers": { "1h": 168, "24h": 2815, "5m": 15, "6h": 1546 }, "buys": { "1h": 369, "24h": 11920, "5m": 17, "6h": 5582 }, "change_pct": { "1h": 0.783146, "24h": 25.2392, "5m": -1.01199, "6h": 21.3351 }, "created_block": 9721433, "created_ts": 1784051310300, "decimals": 18, "fdv_usd": 80269321, "holders": 58015, "launchpad": "long", "launchpad_name": "Long.xyz", "links": { "discord": null, "farcaster": null, "github": null, "telegram": null, "twitter": "https://x.com/artificiallyinu", "website": "https://artificialinu.com/" }, "liquidity_usd": 4181412, "logo": "https://api.crius.sh/v1/robinhood/logo/0x2e8c31162b855a2ffa90f6f8634643ad6f111e18.png?size=128", "market_cap_usd": 80102641, "name": "Artificial Inu", "price_eth": 0.0000343898, "price_usd": 0.0810048, "progress_pct": null, "quote": "PONS", "sell_volume_usd": { "1h": 50026.5, "24h": 3026550, "5m": 4390.97, "6h": 1840520 }, "sellers": { "1h": 151, "24h": 3051, "5m": 15, "6h": 1664 }, "sells": { "1h": 287, "24h": 12095, "5m": 20, "6h": 5933 }, "status": "launched", "symbol": "AI", "traders": { "1h": 272, "24h": 4132, "5m": 27, "6h": 2294 }, "txns": { "1h": 454, "24h": 14552, "5m": 28, "6h": 6627 }, "volume_usd": { "1h": 118179, "24h": 6600860, "5m": 5701.29, "6h": 4215684 } }, { "address": "0xd0601ce157db5bdc3162bbac2a2c8af5320d9eec", "buy_volume_usd": { "1h": 305614, "24h": 5466111, "5m": 20057.3, "6h": 2772574 }, "buyers": { "1h": 229, "24h": 1996, "5m": 56, "6h": 790 }, "buys": { "1h": 847, "24h": 16482, "5m": 104, "6h": 6874 }, "change_pct": { "1h": 0.3314, "24h": -1.40466, "5m": -0.235953, "6h": -1.21643 }, "created_block": 153563, "created_ts": 1782222069300, "decimals": 18, "fdv_usd": 18876187, "holders": 192283, "launchpad": null, "launchpad_name": null, "links": { "discord": null, "farcaster": null, "github": null, "telegram": null, "twitter": null, "website": null }, "liquidity_usd": 5815054, "logo": null, "market_cap_usd": 18876064, "name": "NVIDIA • Robinhood Token", "price_eth": 0.0911626, "price_usd": 214.732, "progress_pct": null, "quote": "USDG", "sell_volume_usd": { "1h": 159139, "24h": 6030012, "5m": 54077.9, "6h": 3340517 }, "sellers": { "1h": 224, "24h": 2645, "5m": 57, "6h": 1101 }, "sells": { "1h": 678, "24h": 18554, "5m": 151, "6h": 8629 }, "status": null, "symbol": "NVDA", "traders": { "1h": 325, "24h": 3519, "5m": 83, "6h": 1422 }, "txns": { "1h": 1413, "24h": 32946, "5m": 240, "6h": 14457 }, "volume_usd": { "1h": 464753, "24h": 11496124, "5m": 74135.1, "6h": 6113091 } } ], "meta": { "block": 100406892, "block_age_ms": 1238, "block_ts": 1793225087000, "chain": "robinhood", "finalized_block": 100397649, "lag_ms": 117, "list": "trending", "next_cursor": "3", "safe_block": 100401329, "stats_since": "chain_start", "window": "24h" }}What this tells you
- First is Pizza (
0xd086f891229cd123aadfcae7c4b40150a80fd9d7):change_pct.24h: 34319.8,volume_usd.24h: 3226937from 5,197 traders,market_cap_usd: 2552917andliquidity_usd: 723990, quoted in USDG. - Second is Artificial Inu (
0x2e8c31162b855a2ffa90f6f8634643ad6f111e18), a Long.xyz token (launchpad: "long") quoted in PONS, with 58,015 holders. - Third is NVIDIA’s Robinhood token (
0xd0601ce157db5bdc3162bbac2a2c8af5320d9eec,NVDA): tokenized stocks rank alongside meme tokens, here with 192,283 holders andvolume_usd.24h: 11496124. - Each row already has what a table row needs:
logo,links, price,change_pct,buys,sells,tradersand volume per window (5m,1h,6h,24h), plusstatusandprogress_pctfor launchpad tokens. meta.next_cursor: "3": pass it ascursorfor the next page.
Refresh a watchlist
Two watchlist rows, only the fields the table shows
How do I refresh price, 24h change, market cap and liquidity for the tokens a user is watching?
curl -X POST "https://api.crius.sh/v1/robinhood/tokens/batch" \ -H "content-type: application/json" \ -d '{"tokens":["0x7b8892cea949bc60d494681d1bc3ea96071ab0b8","0x0bd7d308f8e1639fab988df18a8011f41eacad73"],"fields":["symbol","price.usd","price.change_pct.24h","market.market_cap_usd","market.liquidity_usd"]}'const res = await fetch("https://api.crius.sh/v1/robinhood/tokens/batch", { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ "tokens": [ "0x7b8892cea949bc60d494681d1bc3ea96071ab0b8", "0x0bd7d308f8e1639fab988df18a8011f41eacad73" ], "fields": [ "symbol", "price.usd", "price.change_pct.24h", "market.market_cap_usd", "market.liquidity_usd" ] }),});const { data, meta } = await res.json();import requests
r = requests.post( "https://api.crius.sh/v1/robinhood/tokens/batch", json={"tokens":["0x7b8892cea949bc60d494681d1bc3ea96071ab0b8","0x0bd7d308f8e1639fab988df18a8011f41eacad73"],"fields":["symbol","price.usd","price.change_pct.24h","market.market_cap_usd","market.liquidity_usd"]},)body = r.json()print(body["data"])Real response 200 Captured Oct 28, 2026 · 40 lines (arrays trimmed)
{ "data": { "0x0bd7d308f8e1639fab988df18a8011f41eacad73": { "market": { "liquidity_usd": 73135530, "market_cap_usd": 90409474 }, "price": { "change_pct": { "24h": 0.286017 }, "usd": 2355.49 }, "symbol": "WETH" }, "0x7b8892cea949bc60d494681d1bc3ea96071ab0b8": { "market": { "liquidity_usd": 5611.8, "market_cap_usd": 3773.42 }, "price": { "change_pct": { "24h": -0.171971 }, "usd": 0.00000388948 }, "symbol": "CHARGE" } }, "meta": { "block": 100406780, "block_age_ms": 575, "block_ts": 1793225076000, "chain": "robinhood", "finalized_block": 100397649, "lag_ms": 196, "missing": [], "safe_block": 100401329 }}What this tells you
- One POST returns both tokens, trimmed to the five
fieldsin the body:symbol,price.usd,price.change_pct.24h,market.market_cap_usdandmarket.liquidity_usd. - CHARGE has
market_cap_usd: 3773.42andliquidity_usd: 5611.8. Liquidity counts both sides of each pool (2 × the quote side), so on a small token it can exceed the market cap. - WETH has
market_cap_usd: 90409474andliquidity_usd: 73135530across all its pools. meta.missing: []: every address was found. Unknown addresses are listed there instead of failing the request.
// Server-side list cache for a screener tab (anonymous plan; add a key for higher limits).const cache = new Map();
async function refresh(tab, query) { const res = await fetch(`https://api.crius.sh/v1/robinhood/tokens?list=${tab}&limit=100&${query}`); const { data, meta } = await res.json(); cache.set(tab, { block: meta.block, rows: data.map((t) => ({ address: t.address, symbol: t.symbol, logo: t.logo, price: t.price_usd, change24h: t.change_pct["24h"], mcap: t.market_cap_usd, liquidity: t.liquidity_usd, volume24h: t.volume_usd["24h"], launchpad: t.launchpad_name, progress: t.progress_pct, })), });}
setInterval(() => refresh("trending", "window=24h"), 10_000);setInterval(() => refresh("graduating", "min_liquidity_usd=1000"), 10_000);Step-by-step builds are in Build a token screener, and each tab has its own guide: new tokens, trending, by market cap and bonding and graduating.
Frequently asked questions
How do I keep rugs and wash trading off a Robinhood Chain screener?
Use list=trending, which only lists clean tokens: no crash of 90% from the window's peak, $1,000+ liquidity, 20+ real holders, no insider or wallet-farm launch, no bot distribution and no single wallet holding 40%+ of the liquidity unlocked. Add clean=true to any other list (top_volume, top_gainers, …) for the same checks.
How many tokens does one call return?
Token lists return up to 100 tokens per page (paginate with cursor). Batch prices and batch profiles take up to 100 addresses per call. Each of those calls costs 1 credit.
Can I show bonding-curve progress for launchpad tokens?
Yes. Every row of /tokens has status (bonding or graduated for launchpad tokens) and progress_pct toward graduation. list=graduating lists bonding tokens closest to graduation first.
Should my screener call the API from the browser?
Better from your backend. Without a key each visitor's browser gets 2 requests per second, and a key in front-end code must be origin-restricted. A backend that refreshes the lists on a timer and serves every visitor from its cache costs the same credits for 10 visitors or 10,000.
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