Skip to main content
GET
cURL
Use this endpoint to list games and their markets without matching team names across separate searches. Each row includes both competitors, kickoff, provider status, available moneyline prices, traded volume, each winner market’s liquidity, and a tennis game’s tournament. The catalog changes as Polymarket updates games. To refresh one game after a webhook event, use Game. To see what is on now, send window=now. Without it you get the whole catalog in kickoff order, and its first page can hold only games from earlier days that Polymarket still keeps open.

Parameters

When either kickoff bound is present, games without a published kickoff are excluded.

Key response fields

Identity

event_slug identifies a game, for example nfl-buf-nyj-2026-09-22. Use it with Game to read one game. The live_sports_updated webhook also includes this ID. game_id is Polymarket’s gameId for the event and its related markets. It is omitted when the source data does not establish a single ID for the slug.

Both sides

competitors is the two sides in the provider’s own order. For a team league the provider lists the home side first. score is a string because the provider sends one. A set score, a map score and a run total are not all integers. Read coverage.competitors before matching competitors with other data. provider_ids means both have provider IDs; labels means only names are available, which can make matching ambiguous. unavailable means neither competitor could be identified.

Status

status.state is one of scheduled, live, paused, ended, postponed, cancelled, suspended, delayed or unknown. Keep postponed, cancelled, and suspended distinct in your client. Each status has a different consequence for when or whether play can resume. A passed kickoff does not make a game live. status.state stays scheduled until Polymarket reports a change. status.match_status uses a shared status vocabulary across leagues. status.provider_status preserves the live-score feed’s original string, including when match_status is unknown. status.match_status, status.provider_status, and status.live come only from a live-score feed. A game no feed has reported yet, which is most scheduled games, omits all three, so read status.state to tell a scheduled game from a live one.

When the game ended

status.ended_at is when the game ended, as first observed, in RFC 3339 UTC. status.ended_at_source says who observed it. Both are on every game, and both are null unless status.state is ended and an end was observed. We never infer an end from the kickoff, the game clock, or the market’s resolution. A null on an ended game means the end time is unknown, and games that ended before this field shipped have null. To measure the time from the end to settlement, compare ended_at with markets[].settlement.resolved_at.

Markets

markets holds the game’s winner markets, ordered by condition_id: the moneyline, or a soccer game’s three 1X2 legs. Spreads, totals, team totals, period lines and player props are not here. List game markets returns them. draw_offered says whether the game has a draw leg at all. Do not assume a two-outcome moneyline: a soccer 1X2 game has three.

Market prices

Read markets[].prices.provider.state before using moneyline prices: binding_provenance explains how prices were matched to competitors. Use those competitor identities instead of inferring them from YES and NO. prices.observed_at dates the cached market data when prices come from Polymarket’s market API (Gamma). For a pair from its order-book API (CLOB), it is the older of the 2 price timestamps. prices.observation_source identifies which basis was used. A null timestamp means the observation time is unknown; Gamma supplies no source timestamp for this data. The game’s freshness block describes the source used. Markets without a classified moneyline price pair omit prices.

Volume and liquidity

volume is the game’s traded volume as Polymarket reports it. It is omitted when the provider reports none. markets[].liquidity is the liquidity Polymarket’s market API reports for that market: value, source (always gamma) and observed_at, when we read it. It describes the market’s resting order book, not traded volume, and Polymarket documents no unit for it. A market whose provider read carried none omits it. Neither field is ever sent as 0 in place of a missing figure. Per-market volume is not included: the catalog holds no sourced, dated figure for each market. A finished game read after it leaves the live board carries neither field.

Tennis tournament

A tennis game carries tournament: the tournament edition its game page states. The facts come from 0xinsider’s reviewed registry, curated from official ATP, WTA and ITF pages, which source_urls lists. Polymarket supplies only the competition label and the tour. tier, location and timezone are omitted when no official page states them. tournament itself is omitted outside tennis, when the registry holds no single edition for the game’s label, players’ tour and kickoff, and on a finished game read after it leaves the live board. It is never guessed.

Coverage

Every page carries a top-level coverage with sports, leagues and sources_unavailable. An empty data with a full coverage means no games matched; an empty data with your sport missing from coverage.sports means the sport is not served. A sport or status outside the published vocabulary returns an empty page, never a 400. EuroLeague games use sport=Basketball and league=euroleague. Filter with ?sport=Basketball&league=euroleague; coverage.leagues includes euroleague even when the provider has no matching games. NCAA men’s college basketball games use sport=Basketball and league=cbb. Filter with ?sport=Basketball&league=cbb; coverage.leagues includes cbb even when the provider has no matching games. NCAA women’s college basketball games use sport=Basketball and league=cwbb. Filter with ?sport=Basketball&league=cwbb; coverage.leagues includes cwbb even when the provider has no matching games. Most of these games are thinly traded. K League 1 games use sport=Soccer and league=kor. Filter with ?sport=Soccer&league=kor; coverage.leagues includes kor even when the provider has no matching games. This scope covers K League 1; K League 2 games are not included. UEFA Europa League games use sport=Soccer and league=uel, and UEFA Conference League games use sport=Soccer and league=uecl. Filter with ?sport=Soccer&league=uel or ?sport=Soccer&league=uecl; coverage.leagues includes both keys even when the provider has no matching games. The Champions League stays league=ucl. sources_unavailable names any scope whose source half did not answer this read, as <sport>:<half>.

Sharp money

Send expand=sharp_money to attach a sharp_money object to every game on the page. It is the same object Game sharp money returns for 1 game, and it needs a Pro or Max key. A key whose account has no active Pro or Max subscription gets 402 subscription_required. On the list, a game the current board did not evaluate has status not_computed. Read it with Game sharp money, which evaluates that game on request. status unavailable means its sport’s money could not be read for this request; the rest of the page is still served. A list read does not wait while a sport’s money is computed again, so the first read after a quiet spell can be unavailable, and a read a few seconds later carries the figures. Without expand, rows carry no sharp_money key.

Settlement

Send expand=settlement to attach settlement to every winner market on the page. It is the same block List game markets returns on each row: status, Polymarket’s oracle_status, payouts, result (outcome or the 50-50 split), winning_outcome_index, was_disputed, resolved_at and observed_at. Any plan can send it, and it adds 2 to the request cost. The list never waits for Polymarket. A winner market we have seen settle carries its settled block. Any other market of a game that no read has asked about lately has status unavailable, and the game’s read starts at once, so a read a second or two later carries the block. Treat unavailable as “ask again shortly”, never as unsettled. Without expand=settlement, markets carry no settlement key.

What is on now

window=now keeps these games:
  • Every game Polymarket reports in play, with status.state live or paused, however long ago it kicked off.
  • Every other game whose kickoff was at most 3 hours ago or is still to come. A game can start late, and some competitions get no live status from Polymarket, so a recent kickoff stays in the list.
  • Games with no published kickoff. They sort last.
It leaves out games that are ended, postponed or cancelled. It also leaves out a game that is not in play and kicked off more than 3 hours ago, such as a match suspended weeks ago that Polymarket still keeps open. The window is measured from the time of your request, and it combines with every other filter.

Ordering and paging

Ordered by kickoff, then by event_slug. Games the provider has published no kickoff for sort last. The gms_v1_ cursor records a page position. Since the catalog can change between requests, games may be added or removed while you fetch pages.

Example

To list what is on now:
To list live soccer games:
To list K League 1 games across statuses:

Caching

Send the response’s weak ETag in If-None-Match on your next request. If the catalog has not changed, the server returns 304 with no body. request_id, cost, and as_of do not affect the validator.

What it does not return

  • Order books, midpoints or a market-specific price history. Use GET /api/v1/market/{condition_id}/snapshot for its fuller market card.
  • Holder identity. It stays on GET /api/v1/market/{condition_id}/holders under its own access rules.
  • Sharp money, unless you send expand=sharp_money. See Sharp money.
  • Settlement, unless you send expand=settlement. See Settlement.
  • Every Polymarket sports event. coverage.sports and coverage.leagues name what this deployment serves; a game outside them is not in this catalog.
  • A derived or normalized score. Scores are the provider’s strings, and a game with no live-score frame reads coverage.scores: "unavailable" rather than zero.

Authorizations

Authorization
string
header
required

Legacy default or named integration API key, or OAuth 2.1 access token, in the Authorization header as Bearer oxi_sk_live_... or Bearer oxi_at_.... Default keys retain full access; integration keys are limited to their approved read, webhooks, export and usage scopes and expire within 90 days. All credentials share the owner's account limits. Data calls require an active Pro subscription and return live data. A 401 carries WWW-Authenticate: Bearer resource_metadata="https://api.0xinsider.com/.well-known/oauth-protected-resource" (RFC 6750 section 3, RFC 9728).

Headers

X-Query-Validation
enum<string>

Opt into strict query-name validation. The default is compatible: unknown names are ignored and reported in X-Query-Ignored. With strict, an unknown name returns 400 bad_request with error.reason unknown_query_parameter before the handler runs, including when its percent escape is incomplete.

Available options:
strict
If-None-Match
string

Conditional GET using a weak semantic ETag from an earlier response. A matching payload returns 304 with an empty body; request_id, cost and as_of are excluded from the validator, so a rebuilt but unchanged catalog still revalidates.

Query Parameters

sport
string

Canonical sport bucket, case-insensitive, with - and _ read as a space: table-tennis and Table Tennis are the same bucket. Omit for every covered sport. A bucket this deployment does not serve returns an empty page, not an error, and the response names sport in X-Query-Unmatched; coverage.sports lists the served buckets.

league
string

League tag, case-insensitive, as this list's coverage.leagues spells it (GET /api/v1/coverage lists no leagues): nfl, epl, cs2, euroleague, cbb, cwbb. EuroLeague games use sport=Basketball and league=euroleague; NCAA men's and women's college basketball games use sport=Basketball with league=cbb and league=cwbb. Omit for every league inside the selected sports.

status
enum<string>

Keep only games in this state. ended, cancelled and postponed also list finished games that have left the live board, read from their stored records, for kickoffs within starts_after..starts_before (default: the 7 days before now). Without status, or with any other state, the list is the live and upcoming board. A value outside the enum answers 400 invalid_query with error.param=status, and its message lists the accepted values: upcoming games are scheduled.

Available options:
scheduled,
live,
paused,
ended,
postponed,
cancelled,
suspended,
delayed,
unknown
starts_after
string<date-time>

RFC 3339 instant. Keep only games whose kickoff is at or after it. Games with no published kickoff are excluded whenever either bound is set. With a finished status, the stored games' look-back starts here; omitted, it starts 7 days before starts_before, and nothing caps an earlier value.

starts_before
string<date-time>

RFC 3339 instant. Keep only games whose kickoff is at or before it. Must be at or after starts_after.

window
enum<string>
default:all

Which games to read. all, the default, lists the whole covered catalog, which can start with games the provider still holds open weeks after kickoff. now lists what is on now: every game the provider reports in play (live or paused), plus any other game whose kickoff was at most 3 hours ago or is still to come; ended, postponed and cancelled games are left out, and a game with no published kickoff stays and sorts last. Combines with every other filter. A value other than all or now returns 400 invalid_query with error.param=window.

Available options:
all,
now
limit
integer
default:20

Page size. Out-of-range values are clamped to 1..100.

Required range: 1 <= x <= 100
cursor
string

Opaque gms_v1_ cursor from next_cursor. It pins the page position (kickoff and event_slug), not a snapshot: the catalog is live, so a game added or removed between pages moves with it. With a finished status, a page that spent its read budget carries a cursor past everything it read, which may be past the last game it returned. A cursor this endpoint did not issue returns 400 with error.param=cursor.

expand[]
enum<string>[]

Backward-compatible alias for expand. Repeatable: sharp_money, settlement.

Available options:
sharp_money,
settlement
expand
enum<string>[]

sharp_money adds each game's sharp_money, the GameSharpMoney object GET /api/v1/games/{event_slug}/sharp-money returns, read from the sport board's cached aggregate: one board read per sport on the page, never a per-game compute. A game the board did not evaluate carries status not_computed (read the per-game route for it); a sport whose aggregate could not be read carries status unavailable while the rest of the page is served. Pro and Max only; adds 3 to the request cost. settlement adds settlement to each winner market, the GameMarketSettlement block GET /api/v1/games/{event_slug}/markets serves, from the same per-game store. It never waits for Polymarket: a settled market carries its recorded settlement even on a game not read lately, and any other market of such a game carries status unavailable while its read starts, so a read a moment later may answer. Every plan; adds 2 to the request cost. Repeatable; the two combine.

Available options:
sharp_money,
settlement

Response

A page of covered games with the deployment's published coverage

object
string
required
Allowed value: "list"
data
object[]
required
has_more
boolean
required
as_of
string<date-time>
required

When this read assembled the catalog; with status ended, cancelled or postponed, when it read the stored records. Per-source vintage is on each game's freshness.

coverage
object
required

What this deployment covers, published with every page so a client never has to guess whether an empty list means no games or no coverage.

meta
object
required
next_cursor
string

Pass as cursor for the next page. Present only when has_more is true.