2026-03-27
How to Stream Polymarket Orderbooks in Real-Time
Polymarket is the largest prediction market platform. The Sailfish SDK provides real-time orderbook streaming for all active Polymarket markets via a dedicated WebSocket endpoint. This tutorial shows how to set up a live orderbook feed.
Polymarket WebSocket Endpoint
Sailfish exposes a dedicated Polymarket data feed:
- WebSocket:
wss://sailfish.0xfire.com/stream/polymarket/ws - REST API:
https://sailfish.0xfire.com
Stream Polymarket Orderbooks
Polymarket uses a specialized class, PolymarketSailfish, with its own callback:
import { PolymarketSailfish, SailfishTier } from "sailfish-sdk";
const sailfish = new PolymarketSailfish({
tier: SailfishTier.polymarket({ apiKey: "YOUR_API_KEY" }),
callbacks: {
onMarketOrdebooks: (data) => {
console.log(`Market: ${data.question}`);
console.log(`Slug: ${data.market_slug}`);
// Yes token orderbook
console.log("Yes orderbook:");
console.log(` Bids: ${JSON.stringify(data.orderbook_0.bids)}`);
console.log(` Asks: ${JSON.stringify(data.orderbook_0.asks)}`);
// No token orderbook
console.log("No orderbook:");
console.log(` Bids: ${JSON.stringify(data.orderbook_1.bids)}`);
console.log(` Asks: ${JSON.stringify(data.orderbook_1.asks)}`);
console.log(`Tick size: ${data.orderbook_0.tick_size}`);
console.log(`Last update: ${data.last_update_time}`);
},
},
});
sailfish.swim();
Orderbook Data Structure
Each MarketOrderbooks object contains:
market_slug-- the market identifier on Polymarketquestion-- the market question (e.g., "Will X happen by Y?")token_0/token_1-- the Yes/No token addressesorderbook_0-- Yes token orderbookorderbook_1-- No token orderbooklast_update_time-- timestamp of the latest update
Each orderbook has:
bids-- buy orders sorted by price (best bid first)asks-- sell orders sorted by price (best ask first)tick_size-- minimum price increment
Build a Market Monitor
Track best prices across all active markets:
const markets: Map<string, { yes: string; no: string; question: string }> = new Map();
const sailfish = new PolymarketSailfish({
tier: SailfishTier.polymarket({ apiKey: "YOUR_API_KEY" }),
callbacks: {
onMarketOrdebooks: (data) => {
const bestYesBid = data.orderbook_0.bids[0];
const bestNoBid = data.orderbook_1.bids[0];
markets.set(data.market_slug, {
yes: bestYesBid ? bestYesBid[0] : "N/A",
no: bestNoBid ? bestNoBid[0] : "N/A",
question: data.question,
});
},
},
});
sailfish.swim();
// Print market summary every 10 seconds
setInterval(() => {
for (const [slug, data] of markets) {
console.log(`${data.question}`);
console.log(` Yes: ${data.yes} | No: ${data.no}`);
}
}, 10000);
Calculate Implied Probability
On Polymarket, the Yes token price directly represents the market's implied probability (e.g., a price of 0.65 = 65% probability). Extract it from the best ask:
onMarketOrdebooks: (data) => {
const bestYesAsk = data.orderbook_0.asks[0];
if (bestYesAsk) {
const impliedProb = parseFloat(bestYesAsk[0]) * 100;
console.log(`${data.question}: ${impliedProb.toFixed(1)}% implied probability`);
}
},
Resources
- Sailfish SDK -- Real-time data streaming
- Sailfish Examples -- Working code samples
- API Documentation -- Endpoints, schemas, and SDK reference
- Free Polymarket Orderbook Viewer -- Live orderbook data