MadeOnSolMade on Sol
RobinhoodBlogAdvertise
Sign in
MadeOnSolMade on Sol

Solana and Robinhood Chain intelligence — KOL wallet tracking, deployer intelligence, all-DEX trade streams, and a developer API. Discover, compare, and build.

Discover

  • All Tools
  • Stacks
  • KOL Tracker
  • Deployer Hunter
  • KOL Scout Leaderboard
  • Robinhood Chain
  • Robinhood Wallet Scanner
  • Robinhood API
  • Solana API
  • Token Surge Alerts
  • WebSocket Streaming
  • Sniper Deploy Alerts
  • MCP Servers & SDKs
  • Datasets
  • API Pricing
  • Enterprise API
  • x402 for AI agents
  • Robinhood Chain x402
  • Yields
  • Blog
  • Blog Archive
  • Solana Glossary

Best Of

  • Best Trading Bots
  • Best DEXs
  • Best Wallets
  • Best Analytics
  • Best DeFi
  • Best Snipers

Compare

  • Wallets
  • DEXs
  • Snipers
  • TG Bots
  • Terminals
  • Analytics
  • Portfolio
  • Copy Trading
  • Security
  • Liquid Staking
  • RPC Providers
  • Bridges
  • Launchpads
  • NFT Marketplaces
  • Lending
  • Bot Calculator
  • Perps
  • Scanners
  • Data APIs

Resources

  • Submit a Tool
  • API Docs
  • Get an API Key
  • For Businesses
  • Affiliate Program
  • Changelog
  • API Status
  • Tool Uptime
  • Signal Scorecard
  • Compare KOLs
  • Leaderboard
  • Community
  • Site Stats
  • Advertise

Legal

  • About
  • Contact
  • Terms
  • Privacy
  • Security
  • DPA
  • Disclaimer

© 2026 MadeOnSol

MadeOnSol — eenmanszaak, Hulshout, Belgium · KBO/BTW BE 1039.535.538 (art. 56bis, no VAT charged)

Follow us on XPowered by:constant·k — Private Solana RPC Services
Solana APIWebSocket streaming

Protocol and channel list verified 2026-08-28 against the live registry.

Solana + Robinhood Chain API · real-time

WebSocket streaming
with seq, replay and 19 channels.

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.

Stream from PRO (€43/mo) Three-line integration

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.

19
Channels

13 Solana · 6 RHC

15 s
Heartbeat

ghosts reaped in ≤ 30 s

~10 min
Replay window

20,000 frames in memory

0
Quota per frame

pushed events are free

Why stream

Polling pays twice: in latency and in quota.

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

Pushed events are not metered.

The daily limit meters authenticated REST calls; the stream service holds no counter and writes nothing to the request log. Mint one token at boot and receive as many frames as the channels produce.

Latency

Delivered on confirmation.

Frames ride the same internal event bus the site runs on — KOL trades and deployer alerts land within ~3 s of the on-chain transaction, sniper deploys before it confirms, surges the moment the sustain rule holds.

Recovery

Gaps are visible and fillable.

A missed frame shows up as a gap in seq; a reconnect passes replay_since_seq and gets the buffered frames back, stamped replayed: true, before live frames resume.

Channels

19 channels, one connection, one tier gate each.

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)

ChannelEventsWhat you getScopeGate
kol:tradeskol:tradeEvery buy/sell from tracked KOL wallets, with market cap and USD price at trade time.broadcastPRO+
kol:coordinationkol:coordinationMulti-KOL convergence clusters on one token with a 0–100 score.broadcastPRO+
kol:first_toucheskol:first_touchFirst tracked-KOL buy on a token — the scout signal, filterable by scout tier.broadcastPRO+
deployer:alertsdeployer:alert · deployer:bondTracked-deployer launches and graduations with reputation fields.broadcastPRO+
wallet_tracker:eventswallet_tracker:eventSwaps and transfers on the wallets in your own watchlist.user-scopedULTRA+
copytrade:signalscopytrade:signalFires from your own copy-trade rules.user-scopedPRO+
price_alert:eventsprice_alert:dip · price_alert:recoveryYour own market-cap dip / recovery alerts, sub-second on Solana.user-scopedPRO+
sniper:deployssniper:deployPre-confirmation pump.fun deploys from deshred; PRO receives elite/good deployers only.broadcastPRO+
token:graduationstoken:graduationEvery pump.fun graduation, tracked deployer or not.broadcastPRO+
token:pricestoken:pricePer-mint price / MC ticks (~250 ms coalesced) for the mints you name.mint-scopedPRO+
token:lockstoken:lockNew Streamflow / Jupiter Lock / Bonfida lock or vesting contracts.broadcastPRO+
token:fee_claimstoken:fee_claimpump.fun creator-fee distributions, social-handle claims, config changes.broadcastPRO+
token:surgestoken:surge · token:revivalToken momentum fires with risk flags — see /surges.broadcastPRO+

Robinhood Chain (6)

ChannelEventsWhat you getScopeGate
rhc:kol_tradesrhc:kol_tradeTracked-KOL trades on Robinhood Chain (EVM-native fields).broadcastPRO+
rhc:dex_tradesrhc:dex_tradeThe full Robinhood Chain DEX firehose (Uniswap v2/v3/v4 + launchpads), ~40–55 trades/s at tip.broadcastULTRA+
rhc:copytrade:signalsrhc:copytrade:signalFires from your own RHC copy-trade rules.user-scopedPRO+
rhc:price_alert:eventsrhc:price_alert:dip · rhc:price_alert:recoveryYour own RHC price alerts — polled every ~15 s, not sub-second.user-scopedPRO+
rhc:kol:coordinationrhc:kol:coordinationYour own RHC coordination rules.user-scopedPRO+
rhc:kol:first_touchesrhc:kol:first_touchFirst tracked-KOL buy per RHC token.broadcastPRO+

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

seq, id, replay, heartbeat, slots, token.

Everything a reconnect loop needs to know, in the order it will meet it.

Ordering

seq and id on every event frame.

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

Bounded, filtered, honest about truncation.

Subscribe with 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

Heartbeat every 15 s.

A {"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

PRO 2 · ULTRA 3 · BUSINESS 10.

Enforced in memory per key. A refused reconnect closes 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

The stream token never expires.

Since 2026-08-27 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

Nothing arrives until you subscribe.

Send {"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

Three lines from a key to live frames.

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.

shell · token, connect, subscribe
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}}
frames · what comes back
{"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}
typescript · madeonsol 2.26
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));
python · madeonsol-x402 1.28 (pip install "madeonsol-x402[stream]")
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

Webhooks, when you cannot hold a socket.

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

9 registry events

kol:trade · kol:coordination · deployer:alert · deployer:bond · wallet_tracker:event · sniper:deploy · rhc:kol_trade · token:surge · token:revival

Delivery

Signed, retried, self-reporting.

HMAC-SHA256 in 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

PRO 3 · ULTRA 10 · BUSINESS 30

Same server-side filters as the stream where the event supports them. The RHC DEX firehose is WebSocket-only; price-alert events are not registry events — they deliver per rule.

Honest limits

What the stream is not.

Read before you design around it.

token:prices

Mint-scoped, capped at 25 / 100 / 250 mints.

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

~10 minutes, in memory, per process.

Enough to survive a redeploy or a flapping link, not a night. For hours of replay on raw chain data use gRPC from an RPC provider (Helius publishes 24 h) and decode yourself.

RHC price alerts

~15 s polled, not sub-second.

The RHC price-alert engine polls on the core box; Solana price alerts are pushed. The channel says so in its docs and its SDK type.

PRO curation

sniper:deploys is curated on PRO.

PRO receives elite/good-tier deployers only, applied per message at delivery; ULTRA receives every tier plus custom watchlists. See /sniper.

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

Streaming questions, answered.

Do WebSocket events count against my API quota?+
No. The daily and per-minute limits meter authenticated REST requests; a frame pushed over the stream is not a request and is never written to the request log. The only REST call involved is POST /api/v1/stream/token, which has its own 10-per-minute bucket exempt from the daily and burst pools, and since 2026-08-27 returns the same token forever, so a client calls it once at boot. A PRO key with 10,000 calls/day can receive an unlimited number of pushed events.
How do seq, id and replay work?+
Every event frame carries seq (a per-server-process monotonic ordinal — a gap means you missed frames) and id (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, so a seq reset after a server restart is detectable rather than silent. On subscribe you may pass replay_since_seq (the last seq you processed) or replay_since_ts (ms epoch): the server keeps the last 20,000 event frames in memory (roughly 10 minutes on a busy day) and re-delivers the missing ones through the same tier and filter path as live delivery, each stamped replayed: true, bracketed by replay_start and replay_end. If your cursor is older than the buffer you get replay_truncated with the oldest seq still available; backfill anything older from the REST feeds' since= cursors. token:prices ticks are a state stream and are not sequenced or buffered.
Does the stream token expire?+
No, since 2026-08-27. POST /api/v1/stream/token returns the same token on every call, forever; expires_at and next_refresh_at are always null. It stops working only when the subscription is no longer an active PRO/ULTRA/BUSINESS plan, or when you explicitly send {"rotate": true} — after which the previous value keeps working for 60 seconds and live sockets receive a token_refresh frame. Present it as Authorization: Bearer <token> on the handshake (preferred) or ?token=; an msk_ API key is never accepted as a stream token and is closed with an explicit reason. A 4001 close means mint again, never a timer.
How many connections can I hold?+
PRO 2, ULTRA 3, BUSINESS 10 concurrent connections on the main stream, enforced in memory by the service. PRO was raised from 1 to 2 on 2026-08-16 because with a single slot a reconnecting client evicts its own live socket. When a reconnect is refused the 4002 close reason names 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 without support. The DEX firehose (wss://madeonsol.com/ws/v1/dex-stream) is a separate endpoint with its own slots: ULTRA 2, BUSINESS 5.
What is the heartbeat and when should I reconnect?+
The server sends a {"type":"heartbeat"} frame and a protocol ping every 15 seconds and terminates a socket that does not answer the ping by the next tick (close code 1006, ping-timeout). If you miss two heartbeats, reconnect and pass replay_since_seq on your subscribe. Nothing is delivered until you send a subscribe message; the server sends a hint frame after 10 s if no channels are active.
What are the limits of token:prices?+
token:prices is mint-scoped: filters.mints is required and capped per connection at 25 mints on PRO, 100 on ULTRA and 250 on BUSINESS. A subscribe above the cap is rejected outright, never truncated, so you never silently watch fewer mints than you asked for; a later subscribe replaces the watched set. Ticks are the pricing bus's ~250 ms coalesced updates — the same feed the site's charts run on — not per-trade. Per-trade delivery across all 14 DEX programs is the ULTRA DEX firehose.
Should I use webhooks instead?+
Use webhooks when you cannot hold a socket open (serverless, batch jobs). The registry accepts 9 event types (kol:trade, kol:coordination, deployer:alert, deployer:bond, wallet_tracker:event, sniper:deploy, rhc:kol_trade, token:surge, token:revival); payloads are HMAC-SHA256 signed in the x-madeonsol-signature header, retried 3 times (5 s, 30 s, 2 min) and auto-disabled after 10 consecutive failures, with the owner emailed. PRO 3, ULTRA 10, BUSINESS 30 webhooks. Copy-trade, price-alert, coordination and first-touch rules deliver from the rule's own webhook_url with a per-rule secret, not through this registry; the RHC DEX firehose is WebSocket-only.
How does this compare to other providers' streaming?+
Parsed real-time delivery starts at €43/month here (2 connections, 19 channels) and the full all-DEX firehose at €131/month; Birdeye unlocks WebSocket at $199, Codex at $350, Solana Tracker's Datastream at €397 (all verified 2026-08-16). Helius gRPC offers 24-hour replay and Bitquery Kafka 4 hours — both deeper than our ~10-minute in-memory buffer, but on raw or partially decoded data; among parsed WebSocket vendors we found none that publishes per-frame seq and client-side replay. If you need hours of replay on raw chain data, gRPC from an RPC provider is the better tool.

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

Stop polling. Subscribe.

19 channels from PRO at €43/month; the all-DEX firehose from ULTRA at €131/month. Pushed events never spend quota.

See plans & pricing Endpoint docs