CRIUS Docs
API status Get API key
Real-time

Get new Robinhood Chain tokens and graduations in real time

Get new Robinhood Chain launchpad tokens, graduations and pools the moment they happen, with the Crius WebSocket and a Node.js client that checks each token.

Updated 3 min read
Short answer

Subscribe to launches:all (or launches:pons, launches:flap, …) and graduations:all on wss://api.crius.sh/v1/robinhood/stream. A launch message has the token address, launchpad, creator, curve, quote and tx; a graduation has token, launchpad and the new pool. Add pools:new for tokens that launch outside a launchpad. Free plan with a stream key.

The Crius WebSocket stream announces every new Robinhood Chain token as its launch transaction is decoded: one launches:all subscription covers Pons, Flap.sh, Bankr, Long.xyz, Flywheel and King of the Markets, and graduations:all tells you when a token leaves its bonding curve for a Uniswap pool. Tokens deployed without a launchpad appear on pools:new when their first pool is created. The stream needs a Free key with the stream scope; the REST token lists give you the same tokens when you start up or reconnect.

The channels and their messages

Channel Pushes data fields
launches:all, launches:<launchpad> A new launchpad token address, launchpad, creator, curve, quote (the quote token’s symbol, e.g. ETH), tx
graduations:all, graduations:<launchpad> A token completing its curve token, launchpad, pool (the pool it graduated into), position_id
pools:new Every new Uniswap v2, v3 or v4 pool pool, dex, token0, token1, fee, tick_spacing, hook (null, or address and permissions)
dev:<address> New tokens launched by one creator Same as a launch

Each message has the usual envelope (ch, seq, block, ts, data), described in the stream reference. launches:all counts as one subscription, so the Free plan’s 10 leave room for graduations, new pools and a few creators.

Catch up from REST first

Launches you missed while your client was down aren’t replayed after 60 seconds. On startup, read the newest launches from the token list, then let the stream take over.

The three newest Pons launches

Which tokens were launched on Pons in the last few minutes, and how are they doing?

GET/v1/robinhood/tokens?list=new&launchpad=pons&limit=3
curl "https://api.crius.sh/v1/robinhood/tokens?list=new&launchpad=pons&limit=3"
Real response 200 Captured Oct 28, 2026 · 281 lines (arrays trimmed)
{
"data": [
{
"address": "0x5132c73e282f15e156d43fe1757115c4bda208be",
"buy_volume_usd": {
"1h": 1425.88,
"24h": 1425.88,
"5m": 1425.88,
"6h": 1425.88
},
"buyers": {
"1h": 8,
"24h": 8,
"5m": 8,
"6h": 8
},
"buys": {
"1h": 29,
"24h": 29,
"5m": 29,
"6h": 29
},
"change_pct": {
"1h": 6.40071,
"24h": 6.40071,
"5m": 6.40071,
"6h": 6.40071
},
"created_block": 100409067,
"created_ts": 1793225312360,
"decimals": 18,
"fdv_usd": 17454,
"holders": 7,
"launchpad": "pons",
"launchpad_name": "Pons",
"links": {
"discord": null,
"farcaster": null,
"github": null,
"telegram": null,
"twitter": "https://x.com/1vampnation1/status/2115566407018565807",
"website": "https://trustinnom.xyz/"
},
"liquidity_usd": 2392,
"logo": "https://api.crius.sh/v1/robinhood/logo/0x5132c73e282f15e156d43fe1757115c4bda208be.png?size=128",
"market_cap_usd": 17454,
"name": "paycat",
"price_eth": 0.00000000740993,
"price_usd": 0.000017454,
"progress_pct": 3.19647,
"quote": "PYPL",
"sell_volume_usd": {
"1h": 285.934,
"24h": 285.934,
"5m": 285.934,
"6h": 285.934
},
"sellers": {
"1h": 2,
"24h": 2,
"5m": 2,
"6h": 2
},
"sells": {
"1h": 2,
"24h": 2,
"5m": 2,
"6h": 2
},
"status": "bonding",
"symbol": "PAYCAT",
"traders": {
"1h": 8,
"24h": 8,
"5m": 8,
"6h": 8
},
"txns": {
"1h": 31,
"24h": 31,
"5m": 31,
"6h": 31
},
"volume_usd": {
"1h": 1711.82,
"24h": 1711.82,
"5m": 1711.82,
"6h": 1711.82
}
},
{
"address": "0x3736c3daeb6bee85b8086354424e31e23d39a416",
"buy_volume_usd": {
"1h": 2368.93,
"24h": 2368.93,
"5m": 2368.93,
"6h": 2368.93
},
"buyers": {
"1h": 16,
"24h": 16,
"5m": 16,
"6h": 16
},
"buys": {
"1h": 16,
"24h": 16,
"5m": 16,
"6h": 16
},
"change_pct": {
"1h": 349.859,
"24h": 349.859,
"5m": 349.859,
"6h": 349.859
},
"created_block": 100408733,
"created_ts": 1793225280300,
"decimals": 18,
"fdv_usd": 9653.95,
"holders": 18,
"launchpad": "pons",
"launchpad_name": "Pons",
"links": {
"discord": null,
"farcaster": null,
"github": null,
"telegram": null,
"twitter": null,
"website": null
},
"liquidity_usd": 4794.48,
"logo": "https://api.crius.sh/v1/robinhood/logo/0x3736c3daeb6bee85b8086354424e31e23d39a416.png?size=128",
"market_cap_usd": 9653.95,
"name": "Ronald",
"price_eth": 0.00000000409848,
"price_usd": 0.00000965395,
"progress_pct": 47.1712,
"quote": "MCD",
"sell_volume_usd": {
"1h": 0,
"24h": 0,
"5m": 0,
"6h": 0
},
"sellers": {
"1h": 0,
"24h": 0,
"5m": 0,
"6h": 0
},
"sells": {
"1h": 0,
"24h": 0,
"5m": 0,
"6h": 0
},
"status": "bonding",
"symbol": "RONALD",
"traders": {
"1h": 16,
"24h": 16,
"5m": 16,
"6h": 16
},
"txns": {
"1h": 16,
"24h": 16,
"5m": 16,
"6h": 16
},
"volume_usd": {
"1h": 2368.93,
"24h": 2368.93,
"5m": 2368.93,
"6h": 2368.93
}
},
{
"address": "0x82c43abb2ab9633be5a98b76500acbd700344cec",
"buy_volume_usd": {
"1h": 0.00000040181,
"24h": 0.00000040181,
"5m": 0.00000040181,
"6h": 0.00000040181
},
"buyers": {
"1h": 1,
"24h": 1,
"5m": 1,
"6h": 1
},
"buys": {
"1h": 1,
"24h": 1,
"5m": 1,
"6h": 1
},
"change_pct": {
"1h": -8.2549,
"24h": -8.2549,
"5m": -8.2549,
"6h": -8.2549
},
"created_block": 100408402,
"created_ts": 1793225246200,
"decimals": 18,
"fdv_usd": 14966.5,
"holders": 5,
"launchpad": "pons",
"launchpad_name": "Pons",
"links": {
"discord": null,
"farcaster": null,
"github": null,
"telegram": null,
"twitter": "https://x.com/MiamiMinty/status/2115551765949218980?a=JCtZDJI2ZOGh-1E1Kfw&s=20",
"website": "https://trustinnom.xyz/"
},
"liquidity_usd": 0.000000264611,
"logo": "https://api.crius.sh/v1/robinhood/logo/0x82c43abb2ab9633be5a98b76500acbd700344cec.png?size=128",
"market_cap_usd": 14966.5,
"name": "paycat",
"price_eth": 0.00000000635386,
"price_usd": 0.0000149665,
"progress_pct": 0.000000000353605,
"quote": "PYPL",
"sell_volume_usd": {
"1h": 0.000000269439,
"24h": 0.000000269439,
"5m": 0.000000269439,
"6h": 0.000000269439
},
"sellers": {
"1h": 1,
"24h": 1,
"5m": 1,
"6h": 1
},
"sells": {
"1h": 1,
"24h": 1,
"5m": 1,
"6h": 1
},
"status": "bonding",
"symbol": "PAYCAT",
"traders": {
"1h": 1,
"24h": 1,
"5m": 1,
"6h": 1
},
"txns": {
"1h": 2,
"24h": 2,
"5m": 2,
"6h": 2
},
"volume_usd": {
"1h": 0.000000671249,
"24h": 0.000000671249,
"5m": 0.000000671249,
"6h": 0.000000671249
}
}
],
"meta": {
"block": 100409873,
"block_age_ms": 333,
"block_ts": 1793225393000,
"chain": "robinhood",
"finalized_block": 100401329,
"lag_ms": 1,
"list": "new",
"next_cursor": "3",
"safe_block": 100405028,
"stats_since": "chain_start",
"window": "24h"
}
}

What this tells you

  • All three are status: "bonding": still on Pons’s curve, with progress_pct showing how far toward graduation they are. Ronald (0x3736c3daeb6bee85b8086354424e31e23d39a416) is at about 47% after 16 buys and no sells.
  • Pons curves are quoted in tokenized stocks: quote is PYPL for both paycat tokens and MCD for Ronald.
  • Two tokens are named paycat, launched 66 seconds apart (created_ts 1793225246200 and 1793225312360), and both link to the same website. Names are not unique on Robinhood Chain: always key your data by address.
  • created_block and created_ts give you the cut-off for the stream: anything launched after the newest created_ts will arrive on launches:pons. For a window, use created_after_ts.
Token lists reference Runs from your browser on the anonymous plan Data looks wrong? Report it

Check each token before you show it

A launch message tells you a token exists. Before you list or alert on it, call security (anonymous plan, 1 credit with a key). For a token this young, read the launch section as well as the score.

A Pons token under a minute after launch

Tendies (0xb1a7abcbe798bcd3302f71c0f274d6828bfa6302) launched on Pons seconds ago. What can be checked already?

GET/v1/robinhood/token/0xb1a7abcbe798bcd3302f71c0f274d6828bfa6302/security
curl "https://api.crius.sh/v1/robinhood/token/0xb1a7abcbe798bcd3302f71c0f274d6828bfa6302/security"
Real response 200 Captured Oct 28, 2026 · 104 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": null,
"ownership": "none",
"pausable": false,
"proxy_kind": null,
"self_destruct": false,
"trading_switch": false,
"upgradeable": false,
"verified": null
},
"flags": [
"unverified"
],
"honeypot": {
"is_honeypot": false,
"reason": null,
"selective": false
},
"hook": null,
"known_asset": false,
"launch": {
"flags": [],
"lp_top_wallet": null,
"sniper_supply_pct": 16.1626,
"sniper_top_wallet_pct": 3.00308,
"sniper_wallets": 6,
"sniper_window_blocks": 10,
"uniform_holders": null,
"wallet_farm": null
},
"limits": {},
"liquidity": {
"status": "no_liquidity",
"summary": {
"burned_pct": null,
"locked_pct": null,
"next_unlock_ts": null,
"protocol_fee_pct": null,
"unlocked_in_wallets_pct": null,
"weighting": "by pool liquidity_usd"
}
},
"primary_dex": "pons_curve",
"risk": "low",
"score": 95,
"tax": {
"buy_pct": 0,
"confidence": "high",
"realized": {
"buy_pct": 0,
"by_wallet_class": {
"dev_sell_pct": 0,
"others_sell_pct": 0
},
"last_sample_ts": 1793225661000,
"max_sell_pct_seen": 0,
"samples": {
"buys": 89,
"sells": 16
},
"sell_pct": 0,
"window": "30d"
},
"sell_pct": 0,
"simulated": null,
"source": "realized",
"transfer_pct": null
},
"tax_history": [
{
"from_block": 100412111,
"pct": 0,
"side": "buy"
},
{
"from_block": 100412321,
"pct": 0,
"side": "sell"
}
],
"tax_history_total": 2,
"tax_mode": "static",
"token": "0xb1a7abcbe798bcd3302f71c0f274d6828bfa6302"
},
"meta": {
"block": 100412355,
"block_age_ms": 496,
"block_ts": 1793225662000,
"chain": "robinhood",
"finalized_block": 100401329,
"lag_ms": 22,
"safe_block": 100405028,
"simulation": "no V2 WETH pair: realized tax only"
}
}

What this tells you

  • score: 95, risk: "low": the only flag is unverified. A score this early mostly says no trap has been found yet.
  • primary_dex: "pons_curve" and liquidity.status: "no_liquidity": the token trades on its bonding curve, so there’s no LP to lock until it graduates.
  • launch.sniper_wallets: 6 bought 16.16% of the supply (sniper_supply_pct) in the first 10 blocks (sniper_window_blocks); the largest took about 3% (sniper_top_wallet_pct). This is the number to watch on a new launch.
  • tax.realized.samples already counts 89 buys and 16 sells with 0% tax both ways (tax.source: "realized"). meta.simulation says no simulation ran yet: "no V2 WETH pair: realized tax only".
Security checks reference Runs from your browser on the anonymous plan Data looks wrong? Report it

A launch watcher in Node.js

This client follows every launch and graduation, waits 60 seconds after a launch so the first trades have happened, checks the token, and prints only the ones that pass. It reconnects, resumes and skips reorged launches.

// launches.mjs: node launches.mjs (Node.js 22+, CRIUS_API_KEY with the stream scope)
const KEY = process.env.CRIUS_API_KEY;
const API = "https://api.crius.sh/v1/robinhood";
const CHANNELS = ["launches:all", "graduations:all"];
const CHECK_AFTER_MS = 60_000; // give the first trades time to happen
const MAX_SNIPED_PCT = 30;
const lastSeq = {};
const pending = new Map(); // token address -> timer, so a reorged launch can be cancelled
let backoff = 1000;
async function get(path) {
const res = await fetch(`${API}${path}`, { headers: { "x-api-key": KEY } });
return (await res.json()).data;
}
async function check(launch) {
pending.delete(launch.address);
const s = await get(`/token/${launch.address}/security`);
if (!s || s.risk === "critical" || s.risk === "high") return console.log(`skip ${launch.address}: ${s?.risk}`);
if ((s.launch?.sniper_supply_pct ?? 0) > MAX_SNIPED_PCT) return console.log(`skip ${launch.address}: sniped`);
console.log(`NEW ${launch.launchpad} ${launch.address} by ${launch.creator} (quote ${launch.quote}), score ${s.score}`);
}
function onMessage(m) {
if (m.ch.startsWith("launches:")) {
const l = m.data;
if (l.removed) {
clearTimeout(pending.get(l.address)); // the launch block was reorged out
pending.delete(l.address);
} else if (!pending.has(l.address)) {
pending.set(l.address, setTimeout(() => check(l).catch(console.error), CHECK_AFTER_MS));
}
} else if (m.ch.startsWith("graduations:") && !m.data.removed) {
console.log(`GRADUATED ${m.data.launchpad} ${m.data.token} into pool ${m.data.pool}`);
} else if (m.ch === "error") {
console.error(m.data);
}
}
function connect() {
const ws = new WebSocket(`wss://api.crius.sh/v1/robinhood/stream?api_key=${KEY}`);
let idle;
const touch = () => {
clearTimeout(idle);
idle = setTimeout(() => ws.close(), 45_000);
};
ws.onopen = () => {
backoff = 1000;
touch();
ws.send(JSON.stringify({ op: "subscribe", channels: CHANNELS }));
if (Object.keys(lastSeq).length) ws.send(JSON.stringify({ op: "resume", seqs: lastSeq }));
};
ws.onmessage = (e) => {
touch();
const m = JSON.parse(e.data);
if (m.seq) lastSeq[m.ch] = m.seq;
onMessage(m);
};
ws.onclose = () => {
clearTimeout(idle);
setTimeout(connect, backoff + Math.random() * 500);
backoff = Math.min(backoff * 2, 30_000);
};
ws.onerror = () => ws.close();
}
connect();
  1. Start from REST. Call /tokens?list=new (with launchpad= if you follow one) and remember the newest created_ts. After an outage longer than 60 seconds, call it again with created_after_ts set to that time.

  2. Delay the check. A security call right after the launch sees few or no trades. Waiting a minute costs nothing and gives realized tax and sniper numbers to judge.

  3. Re-check at graduation. On a graduations: message the token moves to a Uniswap pool (for Pons, a v4 pool with its hook). Call security again: liquidity and hook risk only exist from this point, and launch lifecycle gives the curve’s final state.

  4. Add pools:new for everything else. Tokens deployed directly, without a launchpad, first appear when someone creates a pool for them. Filter pools:new on token0 / token1 you haven’t seen, and check hook.permissions on v4 pools.

Frequently asked questions

How fast do new Robinhood Chain tokens show up on the stream?

A launches: message is pushed as soon as the launch block is decoded, typically well under a second after the block. The REST list /tokens?list=new has the same tokens, which is how you catch up after downtime.

Which launchpads have launch and graduation channels?

Every launchpad Crius attributes, by its id: pons, flap, bankr, long, flywheel and standard_reserve (King of the Markets). /v1/robinhood/launchpads lists them. launches:all and graduations:all cover all of them in one subscription each.

How do I see tokens that weren't launched on a launchpad?

They have no launch event. Subscribe to pools:new: every new Uniswap v2, v3 or v4 pool arrives with token0, token1, fee, tick_spacing and, for v4, the hook address with its decoded permissions.

Can I follow one developer's new tokens?

Yes: dev:<address> pushes every token that creator launches, in the same shape as a launch message. Pair it with the developer profile to see how their earlier tokens did.

Is a brand-new token safe to buy if its security score is high?

Not on its own. In its first minutes a token has few trades and nothing has gone wrong yet, so the score is often high. Check it again after the first wave of trades and look at launch.sniper_supply_pct, which already shows who bought the first blocks.

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