Polymarket Sports API (2026): Live Scores, Markets and Streams

The Short Answer
Polymarket's sports data comes from two public sources, and neither needs a key. The Gamma API at https://gamma-api.polymarket.com has sports endpoints: GET /sports for leagues, GET /sports/market-types for the valid market types and GET /teams for teams. Each game is an event with a gameId, and each market carries a sportsMarketType, such as moneyline, spreads or totals. Live scores and game state stream over a public Sports WebSocket at wss://sports-api.polymarket.com/ws, which starts sending updates as soon as you connect. In our checks on 3 October 2026, /sports listed 473 sports and leagues and /sports/market-types listed 292 market types.
Key Takeaways
/sportsmaps each league to its tag IDs and series ID, which you use to list its games.- Every sports market reports a
sportsMarketType, from moneyline, spreads and totals to quarter, half and player prop lines. - A game's markets can span a main event and companion events, all sharing one
gameId. - The Sports WebSocket broadcasts every live game update with no subscription message, keyed by the same
gameId. - Resting limit orders on sports markets are cancelled automatically at the official start time.
What sports endpoints does the Polymarket API have?
| Endpoint | Returns |
|---|---|
GET /sports | Each league's code, name, tag IDs, series ID and official resolution source |
GET /sports/market-types | Every valid sportsMarketType value |
GET /teams | Teams with league, abbreviation and record, filtered by league, name or abbreviation |
GET /events/keyset?series_id= | A league's events, with start_time_min and live filters |
GET /events/keyset?game_id= | Every event for one game, main and companion |
GET /markets/keyset?sports_market_types= | Markets of one or more types, such as spreads |
wss://sports-api.polymarket.com/ws | Live scores, periods and game status |
All of it is public. The keyset routes page with a next_cursor that you pass back as after_cursor, and events take up to 100 results a page. In our checks, the NFL entry in /sports had the series ID 12185, and /teams?league=nfl returned each team's current record, such as 3-0-0 for the Buffalo Bills.
How do you list a league's upcoming games?
Find the league in /sports, take its series ID, and ask for its open events that start after now. This prints the next NFL games with their moneyline prices, with Node 18 or newer and no key:
const GAMMA = 'https://gamma-api.polymarket.com';
const get = async (path) => (await fetch(GAMMA + path)).json();
const nfl = (await get('/sports')).find((s) => s.sport === 'nfl');
const now = new Date().toISOString();
const { events } = await get(`/events/keyset?series_id=${nfl.series}&closed=false&start_time_min=${now}&limit=20`);
for (const event of events) {
const ml = event.markets.find((m) => m.sportsMarketType === 'moneyline');
if (!ml) continue;
const teams = JSON.parse(ml.outcomes);
const prices = JSON.parse(ml.outcomePrices);
console.log(event.startTime, event.gameId, teams.map((t, i) => `${t} ${prices[i]}`).join(' / '));
}
The outcomes and outcomePrices fields arrive as JSON strings, so parse them before use. The moneyline check skips companion events that hold only props. In our run on 3 October 2026, it printed 20 games, including Patriots 0.255 and Bills 0.745 for their 4 October game. To tell home from away, read the event's teams array, where each team carries an ordering of home or away.
What sports market types does Polymarket offer?
Moneyline, spreads and totals are the core, and Polymarket's docs describe them as which team wins, win by how much, and over or under a combined score. The full list runs far wider, through first-half and quarter lines, team totals, exact margins, both teams to score, and player props such as baseball_player_hits. Pass any of them to /markets/keyset?sports_market_types= to filter.
One NFL game can carry hundreds of markets. In our checks, the Patriots and Bills event for 4 October held 328, including 42 totals, 34 spreads and 32 first-half spreads. A spread market reads like "Spread: Bills (-1.5)" with line set to -1.5, and a total like "O/U 47.5". Soccer works differently: the live Moroccan league game we checked had three separate yes or no markets, for a home win, a draw and an away win.
Some games also split their markets across companion events, with slugs that extend the main slug with suffixes such as -player-props, -halftime-result or -more-markets. Rather than guessing suffixes, read the main event's gameId and list every event with /events/keyset?game_id=. That live soccer game returned six events, from the main match to its exact score and more-markets events.
How do you get live scores from the Polymarket API?
Connect to the Sports WebSocket. It is public, needs no subscription message, and broadcasts every live game update: when a game goes live, when the score or period changes, and when it ends. Each message is the game object itself, with no envelope:
const ws = new WebSocket('wss://sports-api.polymarket.com/ws');
ws.onmessage = ({ data }) => {
if (data === 'ping') return ws.send('pong');
const g = JSON.parse(data);
console.log(g.gameId, g.leagueAbbreviation, `${g.homeTeam} ${g.score} ${g.awayTeam}`, g.period ?? '', g.status);
};
This needs Node 22 or newer for the built-in WebSocket. The score field is one string with the home score first, so soccer shows "0-1", tennis "3-6, 3-0" and Counter-Strike "000-000|1-0|Bo3", all of which we saw on 3 October 2026. The socket's gameId for a live Moroccan league game matched the gameId on its Gamma event, so join scores to markets on it. Not every feed has the same shape: the cricket updates we saw on 8 October 2026 carried a metadataGameId in place of gameId and no team or status fields, so guard for missing fields.
Two details matter in production. Status values vary by sport and are case-sensitive: NFL games use InProgress and Final, tennis uses inprogress and esports use running. And Polymarket's docs describe a text ping every 5 seconds that must get a pong within 10. In our 80-second capture, the pings came as WebSocket protocol frames every 15 seconds, which standard clients answer on their own, so handle both, as the code above does.
If you only need the state now and then, Gamma events carry it too, in live, score, period, elapsed and ended. The official TypeScript client exposes the same updates through client.subscribe([{ topic: "sports" }]). PolyBolt, Polymarket's newer real-time socket, carries crypto, equity and TWAP reference prices rather than game data. Polymarket also warns that sports data "may be delayed, contain errors, or omit recent events", so treat it as a convenience, not a settlement source.
How do sports markets trade differently?
Two rules catch bots out. First, resting limit orders on sports markets are cancelled automatically once the game begins, and Gamma markets carry a clearBookOnStart flag. Start times can shift, so an early kickoff may beat the clearing, and Polymarket advises watching your orders closely around the start. Second, configured sports markets hold a marketable order for a delay window before it can match, set in secondsDelay, and the order sits in delayed status and cannot be cancelled until the window ends. In our checks, every market on the Patriots and Bills event had clearBookOnStart: true and secondsDelay: 1.
Live sports prices move fast, and trading them carries real risk. The full trading setup is covered in the Polymarket API guide.
How do you compare Polymarket sports prices with other venues?
The same game often trades on several venues at different prices. The Predictefy API covers sports and prediction markets across 15+ venues, and its sports screen lines up the same game, bet type, period and exact line from venue to venue, one price per venue, with Polymarket and Kalshi among the venues you can pick. Each price comes as a probability, American odds and decimal odds, next to Predictefy's own best price including known fees, a cross-venue average and a no-vig fair probability. Which venues suit which sports is covered in the best prediction market for sports betting.
Frequently Asked Questions
Does Polymarket have a sports API?
Yes. The Gamma API has public sports endpoints, /sports, /sports/market-types and /teams, and sports fields on events and markets. Live scores stream over the public Sports WebSocket at wss://sports-api.polymarket.com/ws. Neither needs an API key.
How do I get live scores from Polymarket?
Connect to wss://sports-api.polymarket.com/ws. No subscription message is needed, and each message is one game's update, with gameId, teams, score, period, status, live and ended. Gamma events also carry live, score, period and elapsed if you only need occasional reads.
What sports market types does Polymarket support?
GET /sports/market-types lists them, and it returned 292 values on 3 October 2026. The core types are moneyline, spreads and totals, and the rest cover halves, quarters, team totals, exact margins, both teams to score and player props.
How do I find every market for one game?
Read the gameId from the game's main event in Gamma, then call /events/keyset?game_id= with it. That returns the main event and every companion event, such as player props, halftime result or more markets.
What happens to my Polymarket orders when a game starts?
Resting limit orders on sports markets are cancelled automatically at the official start time. Start times can shift, so watch orders near kickoff. Some markets also hold marketable orders for a short delay, set in secondsDelay, during which they cannot be cancelled.
Do I need an API key for Polymarket sports data?
No. The Gamma sports endpoints and the Sports WebSocket are public. You need Polymarket's CLOB credentials only to place and manage orders.