All tutorials

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 Polymarket
  • question -- the market question (e.g., "Will X happen by Y?")
  • token_0 / token_1 -- the Yes/No token addresses
  • orderbook_0 -- Yes token orderbook
  • orderbook_1 -- No token orderbook
  • last_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