Data API
Live + historical data across PumpFun, PumpSwap, Bonk and StonkFun (Raydium LaunchLab), Meteora DBC and DAMM v2, Raydium (CPMM/CLMM/AMM v4) and Orca Whirlpool. Most of it is free and keyless: the per-token streams, the launch and migration feeds, candle history, GET /metadata and GET /sol-price need no key, no account and no sign-up. Live candles (subscribe_ohlcv) take a free key, which you ask for in the Telegram group. The Lite plan adds the Advanced Data Stream and the 24-hour replay, Developer the Ultra Fast Shred Stream. See Plans and limits.
30-second start
No key needed - connect and subscribe:
import { io } from "socket.io-client";
const socket = io("https://sol.shrine.trade");
socket.on("token_update", (u) => console.log(u.pool, u.priceUSD));
socket.emit("subscribe", { mint: "Gc6r…pump" });
Need the past as well as the present? Historical replay archives every stream event by the hour, free.
Keys
The free streams and reads need no key, with one exception: live candles (subscribe_ohlcv) need a key on every plan; on Free that is a free key you ask for in the Telegram group. Elsewhere a key is optional and raises the limits to your plan's: candles for every token instead of one, history every second instead of once a minute, more sockets. The Advanced Data Stream and the 24-hour replay need a key from Lite or Developer, Ultra Fast Shred Stream one from Developer. The limits per plan are on Plans and limits.
Get your key on the dashboard once you have a plan, and pass it in the Socket.IO handshake:
import { io } from "socket.io-client";
const socket = io("https://sol.shrine.trade", {
auth: { api_key: "sk_…" },
});
A connection with no key gets everything on the Free plan. A connection that does present a key must present a valid one: unknown or disabled keys are rejected at the handshake. Over a limit, the call's ack says so: limit_exceeded (one token of candles without a key) or rate_limited with retryAfterMs.
Errors
All errors are JSON with the same shape:
{ "error": "not_found" }
| Status | error | Meaning |
|---|---|---|
| 400 | mint_or_pool_required | Missing required param. |
| 401 | unknown_key / key_disabled | The handshake carried a key that is not recognized, or one that has been switched off. |
| 404 | not_found | Pool/mint isn't registered (yet). |
| 429 | rate_limited | More than 3 requests a second from your IP to one endpoint. Wait a second and retry. |
| 503 | unavailable | GET /sol-price before the first SOL/USD tick (cold start); retry shortly. |
WebSocket subscribe errors come as a callback ack: { error: "…", message: "…" }. Live candles without a key answer api_key_required; past a Free limit, the candle events answer limit_exceeded or rate_limited; a stream type another socket from your address already holds answers too_many_connections.
Limits
| Value | |
|---|---|
| Max concurrent Socket.IO subscriptions per connection | 50 |
| Open streams per IP | one per stream type - a second socket from the same address can hold other types, not one already held |
| REST | 3 requests per second per IP per endpoint |
OHLCV history limit | 1 – 500 (default 200) |
The stream types are subscribe (price), subscribe_trades, subscribe_ohlcv, subscribe_new_tokens, subscribe_migrations, subscribe_sol_price and subscribe_stream. Following several pools on one type from one socket is fine; a second socket asking for a type your address already holds gets too_many_connections. The trade endpoints share the REST cap and answer rate_limited with Retry-After: 1.