Protocol and channel list verified 2026-08-28 against the live registry.
Solana + Robinhood Chain API · real-time
One socket at wss://madeonsol.com/ws/v1/stream pushes KOL trades, deployer alerts, pre-confirmation deploys, price ticks, token surges and Robinhood Chain events the moment they are confirmed. Every frame carries a sequence number and a stable id, a dropped client can replay what it missed, and pushed events never spend your daily quota.
Heartbeat every 15 s · replay buffer 20,000 frames · slots PRO 2 / ULTRA 3 / BUSINESS 10 · stream token never expires
The stream
Counted from the live channel registry.
13 Solana · 6 RHC
ghosts reaped in ≤ 30 s
20,000 frames in memory
pushed events are free
Why stream
A poller that asks every second spends 86,400 calls a day to learn about a few hundred events. A stream delivers each event once, when it happens, and the delivery is not a request.
Quota
Latency
Recovery
seq; a reconnect passes replay_since_seq and gets the buffered frames back, stamped replayed: true, before live frames resume.Channels
Solana and Robinhood Chain channels ride the same socket and the same connection slots — subscribe to a mix in one message. A channel without an explicit gate is open to any tier that can mint a stream token (PRO and above). User-scoped channels deliver only your own rules' fires.
Solana (13)
| Channel | Events | What you get | Scope | Gate |
|---|---|---|---|---|
| kol:trades | kol:trade | Every buy/sell from tracked KOL wallets, with market cap and USD price at trade time. | broadcast | PRO+ |
| kol:coordination | kol:coordination | Multi-KOL convergence clusters on one token with a 0–100 score. | broadcast | PRO+ |
| kol:first_touches | kol:first_touch | First tracked-KOL buy on a token — the scout signal, filterable by scout tier. | broadcast | PRO+ |
| deployer:alerts | deployer:alert · deployer:bond | Tracked-deployer launches and graduations with reputation fields. | broadcast | PRO+ |
| wallet_tracker:events | wallet_tracker:event | Swaps and transfers on the wallets in your own watchlist. | user-scoped | ULTRA+ |
| copytrade:signals | copytrade:signal | Fires from your own copy-trade rules. | user-scoped | PRO+ |
| price_alert:events | price_alert:dip · price_alert:recovery | Your own market-cap dip / recovery alerts, sub-second on Solana. | user-scoped | PRO+ |
| sniper:deploys | sniper:deploy | Pre-confirmation pump.fun deploys from deshred; PRO receives elite/good deployers only. | broadcast | PRO+ |
| token:graduations | token:graduation | Every pump.fun graduation, tracked deployer or not. | broadcast | PRO+ |
| token:prices | token:price | Per-mint price / MC ticks (~250 ms coalesced) for the mints you name. | mint-scoped | PRO+ |
| token:locks | token:lock | New Streamflow / Jupiter Lock / Bonfida lock or vesting contracts. | broadcast | PRO+ |
| token:fee_claims | token:fee_claim | pump.fun creator-fee distributions, social-handle claims, config changes. | broadcast | PRO+ |
| token:surges | token:surge · token:revival | Token momentum fires with risk flags — see /surges. | broadcast | PRO+ |
Robinhood Chain (6)
| Channel | Events | What you get | Scope | Gate |
|---|---|---|---|---|
| rhc:kol_trades | rhc:kol_trade | Tracked-KOL trades on Robinhood Chain (EVM-native fields). | broadcast | PRO+ |
| rhc:dex_trades | rhc:dex_trade | The full Robinhood Chain DEX firehose (Uniswap v2/v3/v4 + launchpads), ~40–55 trades/s at tip. | broadcast | ULTRA+ |
| rhc:copytrade:signals | rhc:copytrade:signal | Fires from your own RHC copy-trade rules. | user-scoped | PRO+ |
| rhc:price_alert:events | rhc:price_alert:dip · rhc:price_alert:recovery | Your own RHC price alerts — polled every ~15 s, not sub-second. | user-scoped | PRO+ |
| rhc:kol:coordination | rhc:kol:coordination | Your own RHC coordination rules. | user-scoped | PRO+ |
| rhc:kol:first_touches | rhc:kol:first_touch | First tracked-KOL buy per RHC token. | broadcast | PRO+ |
RHC frames carry EVM-native fields (lowercase 0x addresses, eth_amount, tx_hash) — do not reuse a Solana deserializer unchanged. The Solana all-DEX firehose (14 programs) is a separate endpoint, wss://madeonsol.com/ws/v1/dex-stream, ULTRA and above.
Protocol
Everything a reconnect loop needs to know, in the order it will meet it.
Ordering
seq is a per-server-process monotonic ordinal — a gap means frames you missed. id is a stable identity for dedupe across reconnects, derived from the transaction signature or hash where the payload has one. The connected frame carries the current seq, an instance id and the replay window; if the instance changes the server restarted and seq reset — never compare seq across instances.Replay
replay_since_seq or replay_since_ts (ms). The last 20,000 event frames (~10 min on a busy day) are re-sent for the channels in that subscribe, through the same tier and filter path as live delivery, bracketed by replay_start and replay_end. Older than the buffer → replay_truncated with the oldest available seq; backfill from the REST feeds' since=.Liveness
{"type":"heartbeat"} frame plus a protocol ping every 15 s; a socket that does not pong by the next tick is closed 1006 ping-timeout, so a half-open ghost is gone within ~15–30 s. Miss two heartbeats: reconnect with replay.Connection slots
4002 naming how long the holder has been connected; GET /api/v1/stream/sessions lists your live sessions and DELETE /api/v1/stream/sessions/{id} frees a slot yourself. The DEX firehose has its own slots (ULTRA 2, BUSINESS 5).Credential
POST /api/v1/stream/token returns the same token on every call; expires_at is always null. It ends only when the plan lapses (cut within ~6 min) or you send {"rotate":true} — the old value then works for 60 s and live sockets get a token_refresh frame. Present as Authorization: Bearer (preferred) or ?token=, masked in our access logs. A 4001 means mint again, never a timer.Subscribe
{"type":"subscribe","channels":[...],"filters":{...}} after connect; the server sends a hint frame after 10 s if no channel is active. Filters are server-side and channel-specific (deployer tier, minimum SOL, KOL name, surge flags, mints for prices). A rejected channel comes back in channels_rejected with the reason — never a silent partial subscribe.Integration
curl for the token, wscat for the socket, one JSON line to subscribe. The SDKs wrap the same three steps with auto-reconnect and typed events.
TOKEN=$(curl -s -X POST https://madeonsol.com/api/v1/stream/token -H "Authorization: Bearer msk_YOUR_KEY" | jq -r .token)
wscat -c wss://madeonsol.com/ws/v1/stream -H "Authorization: Bearer $TOKEN"
> {"type":"subscribe","channels":["kol:trades","sniper:deploys","token:surges"],"filters":{"min_sol":1}}{"type":"connected","seq":48211,"instance":"a1b2c3d4e5f6","replay":{"oldest_seq":28212,"newest_seq":48211,"size":20000}}
{"type":"subscribed","channels":["kol:trades","sniper:deploys","token:surges"],"seq":48211}
{"channel":"kol:trades","event":"kol:trade","seq":48212,"id":"kol:trade:5Kd…","data":{...},"ts":1756382400123}
{"type":"heartbeat","ts":1756382415123}
// reconnect later with:
{"type":"subscribe","channels":["kol:trades"],"replay_since_seq":48212}import { MadeOnSol } from "madeonsol";
const client = new MadeOnSol({ apiKey: "msk_YOUR_KEY" });
const stream = await client.stream.connect(); // getToken() on every (re)connect, auto-backoff
stream.on("kol:trade", (t) => console.log(t.token_symbol, t.action));
stream.on("token:surge", (e) => console.log(e.tier, e.symbol, e.risk_flags));from madeonsol_x402 import MadeOnSolClient
client = MadeOnSolClient(api_key="msk_YOUR_KEY")
stream = client.stream()
@stream.on("kol:trade")
async def on_trade(t): print(t["token_symbol"], t["action"])The alternative
Serverless, cron-shaped or behind a strict egress policy: register a URL instead. The registry accepts 9 event types; rule engines (copy-trade, price alerts, coordination, first-touch) deliver from the rule's own URL with a per-rule secret.
Events
Delivery
x-madeonsol-signature. 3 retries at 5 s / 30 s / 2 min. Auto-disabled after 10 consecutive failures — and the owner is emailed, not just us. A new webhook starts receiving within ≤ 15 s.Limits
Honest limits
Read before you design around it.
token:prices
filters.mints is required; a subscribe above the cap is rejected, not truncated. Ticks are ~250 ms coalesced pricing updates, not per-trade — per-trade is the ULTRA firehose.Replay depth
RHC price alerts
PRO curation
Pricing for context: PRO €43/mo, ULTRA €131/mo (adds the all-DEX firehose), BUSINESS €400/mo (embed license, 10slots). Competitors' parsed WebSocket starts at $199 (Birdeye), $350 (Codex) and €397 (Solana Tracker), verified 2026-08-16.
FAQ
More for developers
Token surge & revival alerts
Momentum fires with risk flags and out-of-sample +1h outcomes.
Pre-confirmation deploy alerts
pump.fun deploys from deshred, ~500–800 ms before confirmation.
MCP servers & SDKs
Two MCP servers, 14 packages, one free key.
Full surface: Solana API overview, Robinhood Chain API, endpoint docs and the 9-provider data API comparison.
Start building
19 channels from PRO at €43/month; the all-DEX firehose from ULTRA at €131/month. Pushed events never spend quota.