Skip to main content
AdvancedFastest-path route for snipers, from a wallet only your API key can open. To sign on your own machine instead, use the Buy & Sell API.

Advanced Data Stream

wss://rh-lightspeed.shrine.trade/api/lightspeed/stream?key=…

Every Pons launch, trade and liquidity change, from the box that trades, and you pick what you want: launches, trades and liquidity changes, for the tokens and wallets you name or the whole tape. Launches and trades come from Robinhood's own feed the moment Robinhood has ordered them, before any node has the block, so a launch arrives with its token and curve address predicted from the launch call and a Lightspeed buy can go out at once. The advanced data stream waits for a node to execute the block first.

The same Pons trades on both streams: the Lightspeed stream shows each one a median 170 ms before the node-based advanced data stream

Measured on 2026-10-06 from one machine, both sockets open side by side, 119 trades matched by hash: the Lightspeed stream had each one first, by 86 ms at the tenth percentile, 170 ms at the median and 277 ms at the ninetieth. On this chain that is one to three blocks.

Key​

By request: ask in the Telegram group for a stream key. A Lightspeed account key works too, and then connected names the account. Pass it as ?key= or in the x-api-key header.

Where to run​

The stream leaves Chicago. A bot in Chicago reads it about a millisecond later; one in Europe, a hundred milliseconds later, which on this chain is a block or two. The copy trade tutorial has the setup.

Your bot in Chicago, a millisecond from shrine.trade Lightspeed, which is a few milliseconds from Robinhood Chain
const ws = new WebSocket("wss://rh-lightspeed.shrine.trade/api/lightspeed/stream?key=…&launches=1");
ws.onmessage = (m) => {
const e = JSON.parse(m.data);
if (e.type === "launch" && e.token) {
// e.token is predicted from the launch call; buy it now
ws.send(JSON.stringify({ subscribe: [e.token] })); // and follow its trades
}
if (e.type === "trade") console.log(e.side, e.symbol, e.amountIn.formatted, e.trader);
};

Subscriptions​

Say what you want as query parameters at connect time, or as messages afterwards; subscribed confirms each change. Trades and liquidity changes are sent for the tokens and wallets you follow; launches are not tied to a token yet, so they are simply on or off.

QueryMessage
tokens=0x…,0x…{"subscribe": [...]}, {"unsubscribe": [...]}Follow these tokens (up to 500).
wallets=0x…,0x…{"subscribeWallets": [...]}, {"unsubscribeWallets": [...]}Follow these wallets: everything they do on any Pons token.
launches=1{"launches": true}Every new launch. Off by default.
trades=0{"trades": false}Trades of what you follow. On by default.
liquidity=0{"liquidity": false}Liquidity changes of what you follow. On by default.
all=1{"all": true}The whole Pons tape: every launch, trade and liquidity change.
{"ping": true}Answered with {"type": "pong"}.

Events​

connected comes once, with the feed position (feedSeq), the subscriptions in force and, for an account key, your account.

launch​

{
"type": "launch", "source": "feed",
"seq": 81687334, "block": 81687334, "timestamp": 1791325200, "hash": "0x…",
"via": "factory",
"token": "0x…", "curve": "0x…",
"deployer": "0x…", "creator": "0x…",
"name": "…", "symbol": "…", "logo": "…", "description": "…",
"socials": { "twitter": "…", "telegram": "…", "discord": "…", "website": "…", "farcaster": "…" },
"creatorTaxBps": 0,
"quoteAsset": { "address": "ETH", "symbol": "ETH", "decimals": 18 },
"devBuy": { "quoteIn": { "raw": "…", "formatted": "0.05" }, "minTokensOut": { "raw": "…", "formatted": "…" } }
}

token and curve are predicted from the launch call (the same CREATE2 the factory will run) and are what you pass to trade. via is the call that made it: factory or launch_and_buy. A launch made through a contract we cannot read arrives from the factory's log a moment later instead, with "source": "log" and only token, curve, quoteAsset, block and timestamp; token is then null on the earlier feed event, if one was sent.

trade​

{
"type": "trade", "side": "buy", "venue": "pons_curve", "via": "shrine_router",
"seq": 81687340, "block": 81687340, "timestamp": 1791325201, "hash": "0x…",
"trader": "0x…", "recipient": "0x…",
"token": "0x…", "name": "…", "symbol": "…",
"quoteAsset": { "address": "ETH", "symbol": "ETH", "decimals": 18 },
"currencyIn": "ETH",
"amountIn": { "raw": "10000000000000000", "formatted": "0.01" },
"minOut": { "raw": "…", "formatted": "…" },
"estimatedOut": { "raw": "…", "formatted": "…" }
}

A buy or sell the chain has ordered, on the curve (pons_curve) or in the graduated pool (uniswap_v4): what went in, the minimum the trader asked for, and our estimate of the fill from the curve's state with the trades ahead of it counted in (estimatedOut, curve trades only). via is the call: curve (the curve directly), shrine_router, lightspeed_router or universal_router. It is ordered, not yet executed: it can still revert.

liquidity​

{
"type": "liquidity", "source": "log",
"action": "add", "venue": "uniswap_v4",
"block": 81687350, "logIndex": 4, "hash": "0x…",
"token": "0x…", "name": "…", "symbol": "…",
"quoteAsset": { "address": "ETH", "symbol": "ETH", "decimals": 18 },
"provider": "0x…",
"liquidityDelta": "184467440737095516",
"tickLower": -887200, "tickUpper": 887200
}

Liquidity added (add, a positive liquidityDelta) or removed (remove, negative) in a token's pool, Uniswap v4 for a graduated Pons v2 token or v3 for a Pons v1 token, by provider. These come from the chain's logs once the block has executed, so they trail launches and trades by a block or so.

Connection messages​

{"type": "lagged", "dropped": n} means your client read too slowly and n events were skipped; {"type": "error", "message": …} answers a bad message. Reconnect with the subscriptions in the query string to pick up where you were.