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: plan_required (not in your plan), limit_exceeded (every socket your plan allows for that stream is in use, or a second token of candles on Free) or rate_limited with retryAfterMs. Each carries plan and, below Developer, upgrade: see when you reach a limit.
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 key is not recognized, or a new one replaced it. Send no key for Free. |
| 403 | plan_required | Not in your plan; plan names the plan that has it. |
| 404 | not_found | Pool/mint isn't registered (yet). |
| 429 | rate_limited | Past your plan's rate (Plans and limits). Retry-After and retryAfterMs say when to 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 your plan's limit, the candle events answer limit_exceeded or rate_limited; a stream whose sockets are all in use answers limit_exceeded; a stream your plan doesn't have answers plan_required.
Limits
| Value | |
|---|---|
| Max concurrent Socket.IO subscriptions per connection | 50 |
| Open sockets per stream type | your plan's: 2 on Free, 5 on Lite, 50 on Developer. Counted per key, or per IP without one |
| REST | Metadata and SOL price at your plan's rate; other reads 3 requests a second per IP |
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. subscribe_wallet is counted in wallets rather than sockets: 1 on Free, 3 on Lite, 20 on Developer. Following several pools on one type from one socket is fine and takes one socket of that type; a socket past your plan's number for a type gets limit_exceeded. The trade endpoints have their own rates per plan (Plans and limits) and answer rate_limited with Retry-After: 1.