List Markets
Sports Discovery API
List Markets
List sports markets grouped by game, with per-venue metadata and outcomes
GET
List Markets
Overview
The primary per-venue discovery endpoint for sports markets. Returns a paginated list of games, each containing every venue that lists that game, nested with the venue’s native market metadata and canonical outcomes. Responses are grouped per the structure described on the Sports Markets concept page:Query Parameters
| Param | Type | Default | Description |
|---|---|---|---|
sport | string | - | Filter by sport. Must be one of basketball, soccer, hockey, baseball. |
league | string | - | Filter by league code. See coverage matrix for valid values. |
status | string | open | open (currently tradeable) or closed (resolved or past-dated). |
game_date | string | - | Exact game date, YYYY-MM-DD. Dates follow the sport’s timezone convention — see note below. |
game_date_from | string | - | Inclusive lower bound, YYYY-MM-DD. |
game_date_to | string | - | Inclusive upper bound, YYYY-MM-DD. |
venue | string | - | Only return games that include the given venue. One of polymarket, kalshi, limitless, opinion, predict. |
search | string | - | Case-insensitive substring search against venue-level market_title. |
sort_by | string | game_date_asc | game_date_asc (soonest first) or game_date_desc (latest first). |
limit | int | 50 | 1-200. |
pagination_key | string | - | Opaque cursor from the previous response. Omit on the first request. |
Pagination
Sports list endpoints use cursor pagination. Pass the returnedpagination.pagination_key into the next request. Do not use offset-based pagination.
Filter Semantics
- Date timezone convention:
game_date,game_date_from, andgame_date_tofollow the sport’s local convention. US sports (NBA, NHL, MLB, NFL, CFB, MLS) use Eastern Time dates. European football (EPL, La Liga, etc.) uses UTC dates. Each game in the response includes agame_date_timezonefield ("US/Eastern"or"UTC") so you can interpret dates programmatically. status=openfilters out games whosegame_dateis in the past. Games from yesterday are included to account for late-night US games (an NBA game at 10:30 PM ET has a game_date in ET but may not end until after midnight UTC). Once the upstream venue reports the market as closed, the game status flips toclosedregardless of date.status=closedreturns explicitly closed games and any past-dated games.- When both
game_date_fromandgame_date_toare provided,frommust be<=to(400 otherwise). - Invalid enum values for
sport,status,venue, orsort_byreturn 400 Bad Request with a descriptive error. - Invalid date formats return 400 Bad Request.
Response Fields
Top level
| Field | Type | Description |
|---|---|---|
games[] | array | Games matching the filter. |
pagination.limit | int | Echoes the request limit. |
pagination.has_more | boolean | Whether another page is available. |
pagination.pagination_key | string? | Cursor for the next page. null when has_more=false. |
Game
| Field | Type | Description |
|---|---|---|
game_id | string | Canonical game identifier, e.g. nba-atl-nyk-2026-04-18. |
league | string | League code, e.g. nba. |
league_name | string | Human-readable league name, e.g. "NBA". |
sport | string | Sport name, e.g. "basketball". |
game_date | string | Calendar date of the game, YYYY-MM-DD. See date semantics. |
game_date_timezone | string | Timezone convention for game_date: "US/Eastern" (US sports) or "UTC" (European football). |
title | string | Canonical display title, e.g. "Atlanta Hawks vs New York Knicks". |
status | string | "open" or "closed". |
market_types[] | array | Types of markets available for this game (e.g. game_winner). |
market_type entry
| Field | Type | Description |
|---|---|---|
market_type | string | Canonical market type identifier. Currently always "game_winner". |
venues[] | array | One entry per venue that lists this market type for this game. |
event_id | string | Canonical market/question identifier for this market type. In sports v1 this usually equals game_id. |
Venue Block
| Field | Type | Description |
|---|---|---|
venue | string | "polymarket", "kalshi", "limitless", "opinion", or "predict". |
market_title | string | Venue’s native market title. |
volume | number? | USD traded volume. null when the venue doesn’t expose volume. For 3-way markets this is the sum across all underlying child markets. |
liquidity | number? | USD liquidity. null for venues that don’t expose liquidity. |
end_time | string? | ISO-8601 UTC timestamp of market close (e.g. "2026-04-18T22:00:00+00:00"). null for venues without an indexed close time. |
outcomes[] | array | Tradeable sides of this market on this venue. |
Outcome
Each outcome represents one venue question/selection (e.g. “Mallorca wins”).tokens.yes and tokens.no are both included when the venue exposes executable sides for that exact selection.
| Field | Type | Description |
|---|---|---|
outcome | string | Canonical outcome code - either a team code ("atl", "mal") or "draw". Same across venues. |
outcome_label | string | Human-readable label, e.g. "Atlanta Hawks", "Mallorca". |
event_id | string | Canonical market/question identifier. |
condition_id | string? | On-chain CTF conditionId for this specific outcome’s market. Present for Polymarket, Limitless, Predict. Each outcome in a 3-way game has its own condition_id. |
market_slug | string? | Venue-native slug for this outcome’s market. |
market_id | string? | Venue-native non-condition identifier. Present for Kalshi (ticker) and Opinion (integer). |
tokens | object | Tradeable side entries with prices and identifiers. |
tokens.yes.price | number? | YES-side price (0.0 - 1.0). Cost to bet FOR this outcome. null if unpriced. |
tokens.yes.token_id | string? | Venue-native token ID. Present for on-chain venues (Polymarket, Limitless, Predict, Opinion). Not present for Kalshi. |
tokens.yes.predexon_id | string | Canonical Predexon outcome ID. Same outcome across venues shares this ID. |
tokens.no.price | number? | NO-side price (0.0 - 1.0). Cost to bet AGAINST this outcome. |
tokens.no.token_id | string? | Venue-native token ID. Same presence rules as YES. |
tokens.no.predexon_id | string? | Canonical Predexon ID for buying NO on that exact venue question/selection when exposed. In 2-way games this may equal the sibling YES outcome ID; in 3-way soccer it points to an explicit negation outcome such as “Draw does not happen.” |
Examples
MLB game - 2-way (Kalshi + Polymarket + Predict)
GET /v2/sports/markets?league=mlb&limit=1
EPL game - 3-way (Limitless)
Each outcome has its owncondition_id and market_slug because on-chain venues create a separate binary market per outcome.
For 3-way football on Polymarket, Limitless, and Predict.fun, each outcome is a separate on-chain market natively. Predexon aggregates them into a single venue block and sums the
volume/liquidity across the constituent markets. Each outcome retains its own condition_id and market_slug.Caching
Responses are cached for 60 seconds. Identical query parameters will return the same cached response during that window.Authorizations
Data key provided by Predexon. The trading key used by the Order Router on trade.predexon.com is a separate credential.
Query Parameters
Filter by sport (basketball, soccer, etc.)
Filter by league code (nba, epl, etc.)
Market status: open or closed
Exact game date (YYYY-MM-DD)
Games on or after date (YYYY-MM-DD)
Games on or before date (YYYY-MM-DD)
Filter to games with this venue (polymarket, kalshi, etc.)
Search game/market titles
Sort order: game_date_asc or game_date_desc.
Available options:
game_date_asc, game_date_desc Max games to return
Required range:
1 <= x <= 200Cursor from the previous response. Omit on the first request.
Response
Successful response
