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

Source: https://docs.crius.sh/guides/stream-new-tokens/ · Updated 2026-10-28

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.

[GET `/tokens`](https://docs.crius.sh/reference/discovery/token-lists/) [GET `/token/{address}/security`](https://docs.crius.sh/reference/security/security-checks/) [GET `/token/{address}/launch`](https://docs.crius.sh/reference/launchpads/launch-lifecycle/)

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](https://docs.crius.sh/reference/discovery/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](https://docs.crius.sh/reference/stream/). `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.

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

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

```bash
curl "https://api.crius.sh/v1/robinhood/tokens?list=new&launchpad=pons&limit=3"
```

**JavaScript**

```js
const res = await fetch("https://api.crius.sh/v1/robinhood/tokens?list=new&launchpad=pons&limit=3");
const { data, meta } = await res.json();
```

**Python**

```python
import requests

r = requests.get(
    "https://api.crius.sh/v1/robinhood/tokens?list=new&launchpad=pons&limit=3",
)
body = r.json()
print(body["data"])
```

**Real response 200 Captured Oct 28, 2026 · 281 lines (arrays trimmed)**

```json
{
  "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](https://docs.crius.sh/reference/discovery/token-lists/) Runs from your browser on the anonymous plan [Data looks wrong? Report it](mailto:support@crius.sh?subject=Wrong%20data%20in%20docs%20example%3A%20The%20three%20newest%20Pons%20launches&body=Page%3A%20https%3A%2F%2Fdocs.crius.sh%2Fguides%2Fstream-new-tokens%2F%23newest-pons%0ARequest%3A%20GET%20%2Fv1%2Frobinhood%2Ftokens%3Flist%3Dnew%26launchpad%3Dpons%26limit%3D3%0A%0AWhat's%20wrong%20or%20missing%3F%0A%0A)

## Check each token before you show it

A launch message tells you a token exists. Before you list or alert on it, call [security](https://docs.crius.sh/reference/security/security-checks/) (anonymous plan, 1 credit with a key). For a token this young, read the launch section as well as the score.

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

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

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

**JavaScript**

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

**Python**

```python
import requests

r = requests.get(
    "https://api.crius.sh/v1/robinhood/token/0xb1a7abcbe798bcd3302f71c0f274d6828bfa6302/security",
)
body = r.json()
print(body["data"])
```

**Real response 200 Captured Oct 28, 2026 · 104 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": 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](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%20Pons%20token%20under%20a%20minute%20after%20launch&body=Page%3A%20https%3A%2F%2Fdocs.crius.sh%2Fguides%2Fstream-new-tokens%2F%23fresh-token%0ARequest%3A%20GET%20%2Fv1%2Frobinhood%2Ftoken%2F0xb1a7abcbe798bcd3302f71c0f274d6828bfa6302%2Fsecurity%0A%0AWhat's%20wrong%20or%20missing%3F%0A%0A)

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

```js
// 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](https://docs.crius.sh/reference/launchpads/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.
    

Credits

The stream costs 1 credit per connection, a security check 1 credit and a token list call 1 credit. In the 24 hours of the [chain stats](https://docs.crius.sh/reference/chain/chain-stats/) sample, 3,527 new tokens came from known launchpads: checking each once is about 3,500 credits a day, roughly a tenth of the Free plan’s 1,000,000 monthly credits. Launches per launchpad are on [`/launchpads`](https://docs.crius.sh/reference/launchpads/launchpads/).

## 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](https://docs.crius.sh/reference/wallets/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.

## Related

[Guide **Find new tokens** List new Robinhood Chain tokens seconds after they are created, filter by launchpad, liquidity and creation time, with real responses from the Crius API. Read](https://docs.crius.sh/guides/find-new-tokens/) [Guide **Track bonding & graduating tokens** Track Pons, Flap and other Robinhood Chain launchpad tokens on their bonding curves, see which are closest to graduating and catch each graduation. Read](https://docs.crius.sh/guides/track-bonding-and-graduating-tokens/) [Concept **Launchpads** How token launchpads on Robinhood Chain work (bonding curves, graduation to Uniswap pools, LP locks) and which launchpads Crius attributes, including Pons, Flap.sh, Bankr, Long.xyz and Flywheel. Read](https://docs.crius.sh/concepts/launchpads/) [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/) [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/) [Launchpad **Pons** Pons v2 launchpad API for Robinhood Chain: launches, curve progress, graduations and fees, plus every contract (PonsV2LaunchFactory, PonsV2MemeHook, locker). Read](https://docs.crius.sh/launchpads/pons/)
