Detect bundled launches, snipers and insiders
Find out who bought a Robinhood Chain token's launch, how much of the supply snipers and bundles took and whether they still hold it, with a real insider launch that fell 97%.
Call GET /v1/robinhood/token/{address}/bundles (Starter plan, 10 credits). It analyses the first 300 blocks of trading: snipers (wallets that bought in the first 10 blocks, their supply_pct and still_holding_pct), bundles (launch-transaction buys, multi-recipient transactions, same-block buys from one funder), funding clusters, the developer's buys and insider_launch. Without a key, /security returns the launch summary: sniper_supply_pct, sniper_top_wallet_pct and flags.
Snipers are wallets that buy a token in its first seconds of trading, before most people can see it. Bundles are coordinated buys that spread one buyer’s purchase over several wallets. When insiders take most of the supply this way, the token can have a clean contract and locked liquidity and still be a pump and dump: they sell into everyone who buys after them. Crius analyses the first 300 blocks of every Robinhood Chain token’s trading to show who bought, how they were funded, and whether they still hold.
See who bought the launch
An insider launch: Rebot (61% sniped, all of it sold)
Rebot (0x192b126efea71ca5e7767bc6fc53038d869fbbba) fell 97% within hours of launching. Who bought it first?
curl "https://api.crius.sh/v1/robinhood/token/0x192b126efea71ca5e7767bc6fc53038d869fbbba/bundles" \ -H "x-api-key: $CRIUS_API_KEY"const res = await fetch("https://api.crius.sh/v1/robinhood/token/0x192b126efea71ca5e7767bc6fc53038d869fbbba/bundles", { headers: { "x-api-key": process.env.CRIUS_API_KEY },});const { data, meta } = await res.json();import os, requests
r = requests.get( "https://api.crius.sh/v1/robinhood/token/0x192b126efea71ca5e7767bc6fc53038d869fbbba/bundles", headers={"x-api-key": os.environ["CRIUS_API_KEY"]},)body = r.json()print(body["data"])Real response 200 Captured Oct 28, 2026 · 99 lines (arrays trimmed)
{ "data": { "bundle_supply_pct": 1, "bundle_supply_pct_now": 0, "bundled": true, "bundles": [ { "block": 100238938, "bought": 10000000.000000000905969664, "cost_eth": 0.0174316, "funder": null, "id": "b_1", "still_holding_pct": 0, "supply_pct": 1, "type": "launch_tx_buy", "wallets": [ "0xa6aeefb9c26ec96eb5fbde3ade8632ab2a8ac864" ] } ], "clusters": [], "dev": { "address": "0xa6aeefb9c26ec96eb5fbde3ade8632ab2a8ac864", "bought_in_launch_tx": true, "first_buy_pct": 1, "funded_by": null, "holding_pct": 0 }, "early_buyers_analyzed": 54, "insider_launch": true, "launch": { "flags": [ "insider_launch" ], "lp_top_wallet": { "address": "0x6e8244ba97cbb7d136aafc667e8da302140dbc5b", "liquidity_usd": 5.70259, "pct": 0.0996139 }, "sniper_supply_pct": 60.9726, "sniper_top_wallet_pct": 53.1794, "sniper_wallets": 4, "sniper_window_blocks": 10, "uniform_holders": null, "wallet_farm": null }, "snipers": { "count": 4, "still_holding_pct": 0, "supply_pct": 60.9726, "wallets": [ { "address": "0xa6aeefb9c26ec96eb5fbde3ade8632ab2a8ac864", "tags": [ "dev", "sniper" ] }, { "address": "0x0f0bb85fddc70f04344bc7704bb940e387ae7762", "tags": [ "sniper" ] }, { "address": "0x5051e45b2dbecf1b2041af3937bd85fc0dc43cd4", "tags": [ "sniper" ] }, { "address": "0x217be8970fa83b0864ca06d3c18ea6d9ac04e3a5", "tags": [ "sniper" ] } ], "window_blocks": 10 }, "trader_funding": { "bridge": 18, "dev_linked": 1, "other_wallets": 21, "protocol": 3, "unknown": 6, "unlabeled_hub": 5 } }, "meta": { "block": 100406882, "block_age_ms": 1103, "block_ts": 1793225086000, "chain": "robinhood", "finalized_block": 100397649, "lag_ms": 134, "safe_block": 100401329, "scope": "first 300 blocks of trading" }}What this tells you
insider_launch: true.snipers.count: 4wallets boughtsnipers.supply_pct: 60.9726of the supply in the first 10 blocks (window_blocks: 10), andlaunch.sniper_top_wallet_pct: 53.1794shows one of them took more than half on its own.snipers.still_holding_pct: 0: every sniper has sold everything. That is the dump.- The developer
0xa6aeefb9c26ec96eb5fbde3ade8632ab2a8ac864is one of the snipers (tags: ["dev", "sniper"]).dev.bought_in_launch_tx: true,first_buy_pct: 1,holding_pct: 0. bundleshas one entry,type: "launch_tx_buy": the developer’s buy of 10,000,000 tokens (1% of supply) for 0.0174316 ETH inside the launch transaction, at block 100238938.still_holding_pct: 0.bundle_supply_pct: 1andbundle_supply_pct_now: 0: bundles were a small part of this launch. The insiders bought as separate wallets in the first blocks instead.clusters: []: no early buyers share a funder that links them.trader_fundingshows the 54 analysed buyers (early_buyers_analyzed) were funded through bridges (18), other wallets (21), protocols (3), hub funders (5), the developer (1) or unknown sources (6).
A busy launch that isn't an insider launch: sockets
sockets (0xddccd4690cc99cf19d2e0bdbcb390d17e913958a) had snipers too. Is that a problem?
curl "https://api.crius.sh/v1/robinhood/token/0xddccd4690cc99cf19d2e0bdbcb390d17e913958a/security"const res = await fetch("https://api.crius.sh/v1/robinhood/token/0xddccd4690cc99cf19d2e0bdbcb390d17e913958a/security");const { data, meta } = await res.json();import requests
r = requests.get( "https://api.crius.sh/v1/robinhood/token/0xddccd4690cc99cf19d2e0bdbcb390d17e913958a/security",)body = r.json()print(body["data"])Real response 200 Captured Oct 28, 2026 · 187 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": { "address": "0xe5e702641ea86f4ae6cc3cdaed2b886f976be044", "capabilities": { "can_block_swaps": false, "can_gate_liquidity": false, "can_modify_liquidity_amounts": false, "can_modify_swap_amounts": true }, "code": { "admin_functions": [], "checked_ts": 1793207140434, "code_hash": "0xc21b1e6c1b45403e81a581f22ed6d9c747997af1cfdac1b1dc9f4b1d346a10db", "family": "0xabda3266e50c", "kind": "contract", "logic": null, "owner": "0x263ed295dafae1d9aadd6e56c4b6f9f38ee019dd", "ownership": "active", "size": 15167 }, "family": { "honeypot_pct": 0, "hooks": 22, "id": "0xabda3266e50c", "liquidity_pulled_pct": 0.684086, "pools_traded": 10525, "taxed_pct": 51.9715, "verified_hooks": 1 }, "flags": [], "name": "PonsV2MemeHook", "observed": { "dynamic_tax_pools": 13, "first_trade_ts": 1785866942000, "honeypot_pools": 0, "last_trade_ts": 1793223683000, "liquidity_pulled_pct": 0.66813, "liquidity_pulled_pools": 70, "max_buy_tax_pct": 10.99, "max_sell_tax_pct": 0.7, "median_pool_life_min": 53423.5, "pools": 10478, "pools_traded": 10477, "tax_measured_pools": 10392, "taxed_10pct_pools": 35, "taxed_pools": 5463, "volume_usd": 5384607135 }, "pattern": { "description": "hooks that change swap amounts only", "honeypot_pct": 0.0696347, "id": "swap_delta_only", "liquidity_pulled_pct": 7.93603, "pools_traded": 43082, "taxed_pct": 15.7537 }, "permissions": [ "beforeInitialize", "afterSwap", "afterSwapReturnDelta" ], "risk": [ "can_modify_swap_amounts" ], "risk_level": "low" }, "known_asset": false, "launch": { "flags": [], "lp_top_wallet": { "address": "0x34062c5519d27d399b1deb897b6c769683ec7fa3", "liquidity_usd": 106.386, "pct": 0.549474 }, "sniper_supply_pct": 30.1177, "sniper_top_wallet_pct": 24.0035, "sniper_wallets": 6, "sniper_window_blocks": 10, "uniform_holders": null, "wallet_farm": null }, "limits": {}, "liquidity": { "status": "partially_locked", "summary": { "burned_pct": 0, "locked_pct": 98.9946, "next_unlock_ts": null, "protocol_fee_pct": 0, "unlocked_in_wallets_pct": 1.00542, "weighting": "by pool liquidity_usd" } }, "primary_dex": "uniswap_v4", "risk": "low", "score": 95, "tax": { "buy_pct": 2.69, "confidence": "high", "realized": { "buy_pct": 2.69, "by_wallet_class": { "dev_sell_pct": null, "others_sell_pct": 0 }, "last_sample_ts": 1793225076000, "max_sell_pct_seen": 65.93, "samples": { "buys": 4144, "sells": 3423 }, "sell_pct": 0, "window": "30d" }, "sell_pct": 0, "simulated": null, "source": "realized", "transfer_pct": null }, "tax_history": [ { "from_block": 100193859, "pct": 0, "side": "buy" }, { "from_block": 100193869, "pct": 0, "side": "sell" }, { "from_block": 100213206, "pct": 3, "side": "buy" }, { "from_block": 100342818, "pct": 0, "side": "buy" }, { "from_block": 100344806, "pct": 3, "side": "buy" } ], "tax_history_total": 7, "tax_mode": "dynamic", "token": "0xddccd4690cc99cf19d2e0bdbcb390d17e913958a" }, "meta": { "block": 100406831, "block_age_ms": 624, "block_ts": 1793225081000, "chain": "robinhood", "finalized_block": 100397649, "lag_ms": 32, "safe_block": 100401329, "simulation": "no V2 WETH pair: realized tax only" }}What this tells you
launch.sniper_wallets: 6boughtlaunch.sniper_supply_pct: 30.1177in the first 10 blocks; the largest tooksniper_top_wallet_pct: 24.0035.- That is under both thresholds (50% for one wallet, 80% for all snipers), so
launch.flagsis empty and the token keepsscore: 95. launch.lp_top_walletshows the largest unlocked liquidity holder has 0.55% of the liquidity, anduniform_holdersandwallet_farmarenull: no other insider pattern either.
What the fields mean
| Field | Meaning |
|---|---|
insider_launch | true when the launch is flagged insider_launch, wallet_farm or uniform_holders (see launch.flags). |
snipers | count, supply_pct bought, still_holding_pct now, window_blocks, and wallets with their tags (dev, sniper, …). |
bundles[] | id, type (launch_tx_buy, multi_recipient_tx, same_block_shared_funder), block, wallets, funder, bought, supply_pct, cost_eth, still_holding_pct. |
bundled, bundle_supply_pct, bundle_supply_pct_now | Whether any bundle was found, and the share of supply bundled wallets bought and still hold. |
clusters[] | Early buyers linked by a shared funder, funding between them or token transfers between them. |
dev | The developer's address, bought_in_launch_tx, first_buy_pct, holding_pct and funded_by. |
trader_funding | How the early buyers got their first ETH, by funder type (bridge, protocol, the developer, hub funders, other wallets, unknown). |
launch | The same launch summary as /security: sniper_supply_pct, sniper_top_wallet_pct, sniper_wallets, wallet_farm, uniform_holders, lp_top_wallet, flags. |
What each insider pattern means and the exact thresholds are in Launch risk.
Use it in your app
-
Screen every token with
/security.launch.flagsandflagsincludeinsider_launch,wallet_farmanduniform_holders, each of which makes the tokenhighrisk or costs points. No key needed. -
Call
/bundlesfor the tokens you show in detail. It costs 10 credits on the Starter plan, so fetch it when a user opens a token, not for every new launch. -
Show who still holds.
snipers.still_holding_pctandbundle_supply_pct_nowmatter more than what was bought: supply that’s already sold can’t be dumped again. -
Follow the developer. If
dev.holding_pctis high, or the developer is a sniper, check their past launches with/dev/{address}.
// Summarize a token's launch for a token page.const token = "0x192b126efea71ca5e7767bc6fc53038d869fbbba"; // Rebotconst res = await fetch(`https://api.crius.sh/v1/robinhood/token/${token}/bundles`, { headers: { "x-api-key": process.env.CRIUS_API_KEY },});const { data } = await res.json();const { snipers, dev } = data;
console.log(`${snipers.count} snipers bought ${snipers.supply_pct}%, still hold ${snipers.still_holding_pct}%`);console.log(`${data.bundles.length} bundles, ${data.bundle_supply_pct_now}% of supply still in them`);if (dev) console.log(`developer holds ${dev.holding_pct}%${snipers.wallets.some((w) => w.tags?.includes("dev")) ? " and sniped" : ""}`);if (data.insider_launch) console.warn("insider launch:", data.launch.flags.join(", "));Frequently asked questions
How do I detect snipers on a Robinhood Chain token?
Call /v1/robinhood/token/{address}/bundles with a Starter key. snipers.wallets lists every wallet that bought in the first window_blocks blocks of trading (10 by default), snipers.supply_pct how much they bought and snipers.still_holding_pct how much they hold now. For a quick check without a key, /security returns launch.sniper_supply_pct and launch.sniper_top_wallet_pct.
What's the difference between a sniper and a bundle?
A sniper is any wallet that bought in the first blocks of trading, often a bot. A bundle is a set of buys that were coordinated: one transaction buying for several wallets, a buy inside the launch transaction itself, or two or more wallets buying in the same block with ETH from the same funder. Bundles hide one buyer behind many wallets.
Is every heavily sniped launch an insider launch?
No. Crius flags insider_launch when one sniping wallet bought 50% or more of the supply, or all snipers together 80% or more. Six wallets sniping 30% of sockets (score 95) is a busy launch, not an insider one; four wallets taking 61% of Rebot, one of them 53%, is.
Can I change the sniper window?
Yes: window_blocks sets it for /bundles (default 10, up to 1,000). The launch summary and the insider_launch flag always use 10 blocks, so they stay comparable across tokens.
Why are some early buyers not linked even though they were funded by the same address?
Exchanges, bridges, app relayers and other funders that pay hundreds of wallets never link wallets, or every exchange user would be one cluster. Funding is counted only from sends of at least 0.00001 ETH, and links between lookalike addresses (address poisoning) are dropped. trader_funding shows how the early buyers were funded.
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