# Bundles & bubble maps

> Sniper, bundle and cluster detection and holder bubble-map graphs for Robinhood Chain tokens.

Source: https://crius.sh/docs/reference/wallet-graph/

Graph analytics over holders. A **bundle** is one transaction buying for several recipients, a launch transaction that also buys, two or more wallets buying in the same block that share a funder, or wallets forwarding tokens to a common wallet.

| Endpoint | Method | Plan | Credits |
|---|---|---|---|
| [Snipers, bundles & clusters](#snipers-bundles-clusters) | `GET /v1/{chain}/token/{address}/bundles` | Starter | 10 |
| [Bubble map](#bubble-map) | `GET /v1/{chain}/token/{address}/bubblemap` | Starter | 10 |

## Snipers, bundles & clusters

**GET** `/v1/{chain}/token/{address}/bundles`

**Plan:** Starter and above · **Cost:** 10 credits per call

Snipers (bought within the first blocks after trading opened), bundles, funding clusters and the share of supply they hold. `window_blocks` sets the sniper window (default 10 blocks).

> First 300 blocks of trading.

### Parameters

| Name | In | Type | Default | Description |
|---|---|---|---|---|
| `chain` | path, required | string |  | Chain slug (`robinhood`) or chain id (`4663`). |
| `address` | path, required | string |  | Contract or wallet address, any case (`0x…`, 20 bytes). |
| `window_blocks` | query | integer | `10` | Sniper window after trading opened, in blocks. |

### Request

**cURL**

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

**JavaScript**

```js
const res = await fetch("https://api.crius.sh/v1/robinhood/token/0x7b8892cea949bc60d494681d1bc3ea96071ab0b8/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/0x7b8892cea949bc60d494681d1bc3ea96071ab0b8/bundles",
    headers={"x-api-key": os.environ["CRIUS_API_KEY"]},
)
body = r.json()
print(body["data"])
```

## Bubble map

**GET** `/v1/{chain}/token/{address}/bubblemap`

**Plan:** Starter and above · **Cost:** 10 credits per call

The top holders (`top`, up to 500) as nodes and the links between them as edges: funding, transfers, common funders and same-block buys. Pass `block` for a historical map. Ready to render with any force-directed graph library.

> Nodes = holders (+ external funders), edges = funding / transfers.

### Parameters

| Name | In | Type | Default | Description |
|---|---|---|---|---|
| `chain` | path, required | string |  | Chain slug (`robinhood`) or chain id (`4663`). |
| `address` | path, required | string |  | Contract or wallet address, any case (`0x…`, 20 bytes). |
| `top` | query | integer | `100` | Number of top holders to include as nodes. Up to 500. |
| `edges` | query | string | `funding,transfers,common_funder` | Which links to include between holders. |
| `exclude` | query | string | `infra` | Comma list of holder classes to leave out, such as `infra` (pools, lockers, burn) or `bots`. |
| `block` | query | integer |  | Build the map as of this block (historical). |

### Request

**cURL**

```bash
curl "https://api.crius.sh/v1/robinhood/token/0x7b8892cea949bc60d494681d1bc3ea96071ab0b8/bubblemap?top=100" \
  -H "x-api-key: $CRIUS_API_KEY"
```

**JavaScript**

```js
const res = await fetch("https://api.crius.sh/v1/robinhood/token/0x7b8892cea949bc60d494681d1bc3ea96071ab0b8/bubblemap?top=100", {
  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/0x7b8892cea949bc60d494681d1bc3ea96071ab0b8/bubblemap?top=100",
    headers={"x-api-key": os.environ["CRIUS_API_KEY"]},
)
body = r.json()
print(body["data"])
```
