---
title: "Share of supply held now by all bundle wallets (PRO+)"
method: GET
path: "/tokens/{mint}/bundle-share"
tags: ["Tokens"]
---

# Share of supply held now by all bundle wallets (PRO+)

`GET /tokens/{mint}/bundle-share`

## Request

- Base URL: `https://madeonsol.com/api/v1`
- URL: `https://madeonsol.com/api/v1/tokens/{mint}/bundle-share`
- Auth: HTTP bearer

ONE figure for a terminal (2026-10-15): `bundled_pct_of_supply_now`, the share of circulating supply held RIGHT NOW by every bundle wallet: the launch bundle (first-20 early buyers flagged as bundle) plus every wallet of a coordinated buy cluster in the window (`/tokens/{mint}/bundles`), each wallet counted once, read from chain balances (one getTokenAccountsByOwner per wallet, at most 60). Null when not every wallet could be read, never a partial sum. Cached 30 seconds per token and shared by every caller (`as_of`), so polling it is cheap. Before migration 501 is applied it counts the launch bundle only and says so (`scope: launch_cohort_only`).

## Path parameters

- `mint` string, required

## Query parameters

- `window` '1h' | '6h' | '24h'
- `min_wallets` integer

## Response `200`

OK

- object
  - `mint` string
  - `window` string
  - `min_wallets` integer
  - `bundled_pct_of_supply_now` number, nullable: RATIO in [0, 1]: share of supply held now by every bundle wallet. Null unless the wallet set is known complete (clusters_complete true) AND every wallet was read (see held_now.incomplete_reason).
  - `scope` 'launch_and_clusters' | 'launch_cohort_only': launch_cohort_only = the cluster function was not available; only the launch bundle is counted.
  - `clusters_status` 'ok' | 'unavailable' | 'timeout' | 'error'
  - `clusters_complete` boolean: True only when every coordinated buy cluster in the window was read: clusters_status ok AND fewer than clusters_limit clusters came back. False when the cluster list hit clusters_limit (older clusters in the window may be missing; held_now.incomplete_reason clusters_truncated) or the cluster function was not available (scope launch_cohort_only). bundled_pct_of_supply_now is null whenever this is false (2026-10-15).
  - `clusters_limit` integer: Most clusters read per request (200). A response with this many clusters is treated as possibly truncated.
  - `wallets` object
    - `total` integer
    - `launch_cohort_wallets` integer
    - `cluster_wallets` integer
    - `overlap` integer
    - `clusters_counted` integer
    - `verified` integer
    - `holding` integer
    - `max` integer
  - `held_now` object: Same shape as the bundle held_now of this chain. incomplete_reason adds clusters_truncated (the cluster list hit clusters_limit; balances are not read) next to cluster_wallets_truncated (a cluster has more wallets than the 50 listed).
  - `as_of` string, date-time
  - `note` string

## Other responses

- `400`: Invalid address or query parameters
- `401`: Missing or invalid API key, or an expired free-tier key. Authentication-stage error: no `X-RateLimit-*` headers, no `_rid`.
- `403`: Tier gate - PRO required.
- `429`: Too many requests. Every 429 carries `Retry-After`. A quota 429 (`rate_limit_exceeded`, with `X-RateLimit-*`), a heavy-query concurrency 429 (`error_kind` `concurrency`/`capacity`), or the per-IP authentication-failure block (30 failed auths/min; plain `error` + `retry_after_seconds`, no `X-RateLimit-*`).
- `500`: Unexpected server error from the route (`Internal server error`, with `_rid`). Safe to retry with backoff. A failed API-key lookup is a 503 `auth_backend_unavailable`, never a 500.
- `503`: The API-key or subscription lookup could not be answered (authentication stage). Retryable and not your fault: it is never counted as a failed authentication. Honour `Retry-After`; no `X-RateLimit-*`, no `_rid`.

---

[API](https://skmtc.dev/madeonsol/apis/madeonsol-api.md) · [All operations](https://skmtc.dev/madeonsol/apis/madeonsol-api/llms.txt) · [OpenAPI document](https://skmtc.dev/madeonsol/apis/madeonsol-api/revisions/96ce84657f55?raw)
