BubblesBubbles

Public API

Free, no key, CORS enabled. Please keep it under ~1 request/second. New maps are rate-limited per IP.

Holder map

GET https://bubblemaps.dev/api/map/8cHzQHUS2s2h8TzCmfqPKYiM4dSt4roa3n7MyRLApump

Returns {mint, job, map}. HTTP 202 while building (job.state queued/running, job.queuePos); map.nodes[] (address, share, cluster, label, kind), map.links[] (SOL / TOKEN / OTHER transfers), map.funderLinks[], map.clusters[] (size, share, members), map.phase fast|deep.

Launch health

Inside every map: map.launch = {status ok|unknown, score 0-100, breakdown[] (factor, share, penalty), sniperShare, bundleShare, devClusterShare, top10Share, topClusterShare, creator, createdSlot, earlyBuyers} and per-holder map.nodes[].flags (launch-slot, sniper, bundle, dev, dev-funded, dev-cluster). unknown = creation not reachable cheaply on the public RPC (mature tokens); top-10 and cluster share are still given.

Wallet

GET https://bubblemaps.dev/api/wallet/6rEiHJwqXoHKQ3BmGamGSoJ6wSG4Va7hn3aRcZvrrM8A

Every indexed token where the wallet is a top-250 holder: rank, share, cluster, cluster share, flags; serial = flagged in 2+ tokens. Page: /wallet/<address>.

Leaderboards

GET https://bubblemaps.dev/api/leaderboards

Boards: cleanest, concentrated, growing, devClusters, serialWallets. One board: /api/leaderboards/<board>. Pages: /leaderboards/<board>; OG image /og/leaderboards/<board>.png.

Suggest a label

POST /api/labels/suggest JSON {address, label, kind, note} → moderation queue (never public until approved). Approved labels: GET /api/labels.

Token index

GET https://bubblemaps.dev/api/tokens?sort=recent&limit=20

Params: sort = recent | lookups | concentrated | mcap | holders, tab=trending, q, source=pumpai, limit, offset.

WebMCP tools (in-browser agents)

Every Bubbles page and the Terminal load /webmcp.js. When the browser exposes document.modelContext.registerTool, it registers read-only tools (all readOnlyHint:true, strict schemas, no write tools) that call the same public API: map_token(mint), get_clusters(), get_top_holders(limit), wallet_xray(address), clawd_decide(mint), compare_tokens(a,b), get_trending(), search_tokens(query), get_page_context(), navigate(route). Without WebMCP support the script does nothing.

Bubbles Data API (/v0)

Paths and JSON are compatible with the Bubblemaps v0 API shape (0.3.2), so existing clients can switch their base URL to this site. All data comes from Bubbles' own Solana pipeline. Chain: solana only (others return 422). Shares are fractions 0-1. Responses carry an X-Dt-Update header. Spec: /v0/openapi.json.

Magic nodes: wallets outside the top holders that funded two or more of them. Time nodes: an exchange, DEX or whitelisted hub that funded a small group (2-12) of top holders. Exchanges, DEXes, contracts and hypernodes are hidden and excluded from clusters and scores; supernode-to-supernode links are ignored. timestamp reads from Bubbles' snapshot history. Anonymous use: 60 requests/min per IP; an X-ApiKey raises it to 600/min.

Trending

GET https://bubblemaps.dev/api/trending

Score, 1h/24h counts, velocity, sparkline snapshots and alerts.

Concentration history

GET https://bubblemaps.dev/api/history/8cHzQHUS2s2h8TzCmfqPKYiM4dSt4roa3n7MyRLApump

Resolve name / ticker

GET https://bubblemaps.dev/api/resolve?q=bonk

Live launches

GET https://bubblemaps.dev/api/live?limit=20&source=stonk

source = all | pump | stonk. SSE stream: /api/live/stream. Feeds: pumpai.ai, stonkfun.xyz. Stonk token details: /api/stonk/<mint>.

Progress stream

GET /api/stream/<mint> (SSE)

Embeds

Iframe: <iframe src="https://bubblemaps.dev/embed/<mint>" width="100%" height="560"></iframe>
Badge: <img src="https://bubblemaps.dev/badge/<mint>.svg">

Usage counts

GET https://bubblemaps.dev/api/stats

Daily aggregate counts only (lookups, requests, shares). No personal data.