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

Source: https://docs.crius.sh/guides/detect-bundles-and-snipers/ · Updated 2026-10-28

Short answer

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.

[GET `/token/{address}/bundles`](https://docs.crius.sh/reference/wallet-graph/snipers-bundles-clusters/) [GET `/token/{address}/security`](https://docs.crius.sh/reference/security/security-checks/)

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

Example [Starter plan · 10 credits](https://docs.crius.sh/reference/wallet-graph/snipers-bundles-clusters/)

### An insider launch: Rebot (61% sniped, all of it sold)

Rebot (0x192b126efea71ca5e7767bc6fc53038d869fbbba) fell 97% within hours of launching. Who bought it first?

GET/v1/robinhood/token/0x192b126efea71ca5e7767bc6fc53038d869fbbba/bundles

 

**cURL**

```bash
curl "https://api.crius.sh/v1/robinhood/token/0x192b126efea71ca5e7767bc6fc53038d869fbbba/bundles" \
  -H "x-api-key: $CRIUS_API_KEY"
```

**JavaScript**

```js
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();
```

**Python**

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

```json
{
  "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: 4` wallets bought `snipers.supply_pct: 60.9726` of the supply in the first 10 blocks (`window_blocks: 10`), and `launch.sniper_top_wallet_pct: 53.1794` shows 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 `0xa6aeefb9c26ec96eb5fbde3ade8632ab2a8ac864` is one of the snipers (`tags: ["dev", "sniper"]`). `dev.bought_in_launch_tx: true`, `first_buy_pct: 1`, `holding_pct: 0`.
-   `bundles` has 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: 1` and `bundle_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_funding` shows 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).

[Snipers, bundles & clusters reference](https://docs.crius.sh/reference/wallet-graph/snipers-bundles-clusters/) [Data looks wrong? Report it](mailto:support@crius.sh?subject=Wrong%20data%20in%20docs%20example%3A%20An%20insider%20launch%3A%20Rebot%20\(61%25%20sniped%2C%20all%20of%20it%20sold\)&body=Page%3A%20https%3A%2F%2Fdocs.crius.sh%2Fguides%2Fdetect-bundles-and-snipers%2F%23insider-launch%0ARequest%3A%20GET%20%2Fv1%2Frobinhood%2Ftoken%2F0x192b126efea71ca5e7767bc6fc53038d869fbbba%2Fbundles%0A%0AWhat's%20wrong%20or%20missing%3F%0A%0A)

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

### A busy launch that isn't an insider launch: sockets

sockets (0xddccd4690cc99cf19d2e0bdbcb390d17e913958a) had snipers too. Is that a problem?

GET/v1/robinhood/token/0xddccd4690cc99cf19d2e0bdbcb390d17e913958a/security

  

**cURL**

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

**JavaScript**

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

**Python**

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

```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": {
      "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: 6` bought `launch.sniper_supply_pct: 30.1177` in the first 10 blocks; the largest took `sniper_top_wallet_pct: 24.0035`.
-   That is under both thresholds (50% for one wallet, 80% for all snipers), so `launch.flags` is empty and the token keeps `score: 95`.
-   `launch.lp_top_wallet` shows the largest unlocked liquidity holder has 0.55% of the liquidity, and `uniform_holders` and `wallet_farm` are `null`: no other insider pattern either.

[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%20busy%20launch%20that%20isn't%20an%20insider%20launch%3A%20sockets&body=Page%3A%20https%3A%2F%2Fdocs.crius.sh%2Fguides%2Fdetect-bundles-and-snipers%2F%23sniped-not-insider%0ARequest%3A%20GET%20%2Fv1%2Frobinhood%2Ftoken%2F0xddccd4690cc99cf19d2e0bdbcb390d17e913958a%2Fsecurity%0A%0AWhat's%20wrong%20or%20missing%3F%0A%0A)

## 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](https://docs.crius.sh/concepts/launch-risk/).

## Use it in your app

1.  **Screen every token with `/security`.** `launch.flags` and `flags` include `insider_launch`, `wallet_farm` and `uniform_holders`, each of which makes the token `high` risk or costs points. No key needed.
    
2.  **Call `/bundles` for 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.
    
3.  **Show who still holds.** `snipers.still_holding_pct` and `bundle_supply_pct_now` matter more than what was bought: supply that’s already sold can’t be dumped again.
    
4.  **Follow the developer.** If `dev.holding_pct` is high, or the developer is a sniper, check their past launches with [`/dev/{address}`](https://docs.crius.sh/guides/check-developer-history/).
    

```js
// Summarize a token's launch for a token page.
const token = "0x192b126efea71ca5e7767bc6fc53038d869fbbba"; // Rebot
const 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(", "));
```

Tokens indexed after launch

Snipers are measured from the token’s first trades. For a token whose launch happened before Crius saw its history, `launch.sniper_supply_pct` is `null` and no sniper flag is set. `/bundles` always covers the first 300 blocks of trading Crius has (`meta.scope`).

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

[Concept **Launch risk** How Crius spots insider control of a Robinhood Chain token with a clean contract (snipers, wallet farms, uniform holders, LP control) and the thresholds it uses. Read](https://docs.crius.sh/concepts/launch-risk/) [Guide **Read a bubble map** Get a Robinhood Chain token's top holders as a graph, with the funding and transfer links that group them. Real examples, with and without clusters. Read](https://docs.crius.sh/guides/read-a-bubble-map/) [Guide **Developer history** Check a Robinhood Chain token creator's track record in one call: every token they launched, peak and current market cap, graduations, rugs, dev selling. Read](https://docs.crius.sh/guides/check-developer-history/) [Guide **Connected wallets** Find who funded a Robinhood Chain wallet, which wallets it funded, who it swaps tokens with and who shares its funder, to spot alt wallets, dev links, sybils. Read](https://docs.crius.sh/guides/find-connected-wallets/) [Guide **Token security score** Score any Robinhood Chain token from 0 to 100 with one API call. Honeypot, buy and sell taxes, owner powers, LP locks, v4 hook risk and insider launches, with real examples. Read](https://docs.crius.sh/guides/token-security-score/) [API reference **Snipers, bundles & clusters API** Snipers (bought within the first blocks after trading opened), bundles, funding clusters and the share of supply they hold. Read](https://docs.crius.sh/reference/wallet-graph/snipers-bundles-clusters/)
