> ## Documentation Index
> Fetch the complete documentation index at: https://enterprise.predexon.com/llms.txt
> Use this file to discover all available pages before exploring further.

# List Markets

> List sports markets grouped by game, with per-venue metadata and outcomes

## 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](/concepts/sports-markets):

```
games[]
  └── market_types[]
       └── venues[]
            └── outcomes[] with event_id and canonical predexon_id
```

## 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](/concepts/sports-markets#venue-coverage) 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 returned `pagination.pagination_key` into the next request. Do not use offset-based pagination.

### Filter Semantics

* **Date timezone convention:** `game_date`, `game_date_from`, and `game_date_to` follow 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 a `game_date_timezone` field (`"US/Eastern"` or `"UTC"`) so you can interpret dates programmatically.
* `status=open` filters out games whose `game_date` is 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 to `closed` regardless of date.
* `status=closed` returns explicitly closed games and any past-dated games.
* When both `game_date_from` and `game_date_to` are provided, `from` must be `<=` `to` (400 otherwise).
* Invalid enum values for `sport`, `status`, `venue`, or `sort_by` return **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](/concepts/sports-markets#dates-times). |
| `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`

```json theme={null}
{
  "games": [
    {
      "game_id": "mlb-ari-pit-2026-05-07",
      "league": "mlb",
      "league_name": "MLB",
      "sport": "baseball",
      "game_date": "2026-05-07",
      "game_date_timezone": "US/Eastern",
      "title": "Arizona Diamondbacks vs Pittsburgh Pirates",
      "status": "open",
      "market_types": [
        {
          "market_type": "game_winner",
          "venues": [
            {
              "venue": "kalshi",
              "market_title": "Pittsburgh vs Arizona Winner?",
              "volume": 41567.16,
              "liquidity": 25030.64,
              "end_time": "2026-05-07T22:20:55+00:00",
              "outcomes": [
                {
                  "outcome": "ari",
                  "outcome_label": "Arizona Diamondbacks",
                  "event_id": "mlb-ari-pit-2026-05-07",
                  "market_id": "KXMLBGAME-26MAY071540PITAZ-AZ",
                  "tokens": {
                    "yes": { "predexon_id": "px-xz7fw6lsywv2rnwr", "price": 0.0 }
                  }
                },
                {
                  "outcome": "pit",
                  "outcome_label": "Pittsburgh Pirates",
                  "event_id": "mlb-ari-pit-2026-05-07",
                  "market_id": "KXMLBGAME-26MAY071540PITAZ-PIT",
                  "tokens": {
                    "yes": { "predexon_id": "px-c3dftfrdu5unmk3g", "price": 0.99 }
                  }
                }
              ]
            },
            {
              "venue": "polymarket",
              "market_title": "Pittsburgh Pirates vs. Arizona Diamondbacks",
              "volume": 853880.442333,
              "liquidity": 15200.91,
              "end_time": "2026-05-14T19:40:00+00:00",
              "outcomes": [
                {
                  "outcome": "ari",
                  "outcome_label": "Arizona Diamondbacks",
                  "event_id": "mlb-ari-pit-2026-05-07",
                  "condition_id": "0x8a70942639237613...",
                  "market_slug": "mlb-pit-ari-2026-05-07",
                  "tokens": {
                    "yes": { "token_id": "927526441864...", "predexon_id": "px-xz7fw6lsywv2rnwr", "price": 0.0 }
                  }
                },
                {
                  "outcome": "pit",
                  "outcome_label": "Pittsburgh Pirates",
                  "event_id": "mlb-ari-pit-2026-05-07",
                  "condition_id": "0x8a70942639237613...",
                  "market_slug": "mlb-pit-ari-2026-05-07",
                  "tokens": {
                    "yes": { "token_id": "232120875852...", "predexon_id": "px-c3dftfrdu5unmk3g", "price": 1.0 }
                  }
                }
              ]
            }
          ],
          "event_id": "mlb-ari-pit-2026-05-07"
        }
      ]
    }
  ],
  "pagination": { "limit": 1, "has_more": true, "pagination_key": "eyJybyI6MS..." }
}
```

### EPL game - 3-way (Limitless)

Each outcome has its own `condition_id` and `market_slug` because on-chain venues create a separate binary market per outcome.

```json theme={null}
{
  "venue": "limitless",
  "market_title": "Mallorca vs Valencia",
  "volume": 6.25,
  "outcomes": [
    {
      "outcome": "mal",
      "outcome_label": "Mallorca",
      "condition_id": "0xeea091acc0bd...",
      "market_slug": "mallorca-1775552414517",
      "tokens": {
        "yes": { "token_id": "123...", "predexon_id": "px-aaa", "price": 0.38 },
        "no": { "token_id": "456...", "predexon_id": "px-bbb", "price": 0.62 }
      }
    },
    {
      "outcome": "val",
      "outcome_label": "Valencia",
      "condition_id": "0x1b790d83ff2b...",
      "market_slug": "valencia-1775552414526",
      "tokens": {
        "yes": { "token_id": "789...", "predexon_id": "px-ccc", "price": 0.32 },
        "no": { "token_id": "012...", "predexon_id": "px-ddd", "price": 0.68 }
      }
    },
    {
      "outcome": "draw",
      "outcome_label": "Draw",
      "condition_id": "0xf6617995abf1...",
      "market_slug": "draw-1775552414544",
      "tokens": {
        "yes": { "token_id": "345...", "predexon_id": "px-eee", "price": 0.31 },
        "no": { "token_id": "678...", "predexon_id": "px-fff", "price": 0.69 }
      }
    }
  ]
}
```

<Info>
  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`.
</Info>

## Caching

Responses are cached for 60 seconds. Identical query parameters will return the same cached response during that window.


## OpenAPI

````yaml GET /v2/sports/markets
openapi: 3.1.0
info:
  title: Predexon Enterprise API
  description: Unified cross-venue prediction market discovery
  version: 1.0.0
servers:
  - url: https://api.predexon.com
security:
  - apiKey: []
paths:
  /v2/sports/markets:
    get:
      tags:
        - sports
      summary: List Markets
      description: >-
        List canonical sports markets grouped by broad game. Returns game ->
        market_types -> venues -> outcomes with venue-native identifiers and
        canonical predexon_ids.
      operationId: list_markets_v2_sports_markets_get
      parameters:
        - name: sport
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: Filter by sport (basketball, soccer, etc.)
            title: Sport
          description: Filter by sport (basketball, soccer, etc.)
        - name: league
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: Filter by league code (nba, epl, etc.)
            title: League
          description: Filter by league code (nba, epl, etc.)
        - name: status
          in: query
          required: false
          schema:
            type: string
            description: 'Market status: open or closed'
            default: open
            title: Status
          description: 'Market status: open or closed'
        - name: game_date
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: Exact game date (YYYY-MM-DD)
            title: Game Date
          description: Exact game date (YYYY-MM-DD)
        - name: game_date_from
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: Games on or after date (YYYY-MM-DD)
            title: Game Date From
          description: Games on or after date (YYYY-MM-DD)
        - name: game_date_to
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: Games on or before date (YYYY-MM-DD)
            title: Game Date To
          description: Games on or before date (YYYY-MM-DD)
        - name: venue
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: Filter to games with this venue (polymarket, kalshi, etc.)
            title: Venue
          description: Filter to games with this venue (polymarket, kalshi, etc.)
        - name: search
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: Search game/market titles
            title: Search
          description: Search game/market titles
        - name: sort_by
          in: query
          required: false
          schema:
            type: string
            default: game_date_asc
            enum:
              - game_date_asc
              - game_date_desc
          description: 'Sort order: game_date_asc or game_date_desc.'
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            maximum: 200
            minimum: 1
            description: Max games to return
            default: 50
            title: Limit
          description: Max games to return
        - name: pagination_key
          in: query
          required: false
          schema:
            type: string
          description: Cursor from the previous response. Omit on the first request.
      responses:
        '200':
          description: Successful response
          content:
            application/json:
              schema: {}
              example:
                games:
                  - game_id: mlb-ari-pit-2026-05-07
                    league: mlb
                    league_name: MLB
                    sport: baseball
                    game_date: '2026-05-07'
                    game_date_timezone: US/Eastern
                    status: open
                    title: Arizona Diamondbacks vs Pittsburgh Pirates
                    market_types:
                      - market_type: game_winner
                        venues:
                          - venue: kalshi
                            market_title: Pittsburgh vs Arizona Winner?
                            outcomes:
                              - outcome: ari
                                outcome_label: Arizona Diamondbacks
                                event_id: mlb-ari-pit-2026-05-07
                                market_id: KXMLBGAME-26MAY071540PITAZ-AZ
                                tokens:
                                  'yes':
                                    predexon_id: px-xz7fw6lsywv2rnwr
                                    price: 0
                                  'no':
                                    predexon_id: px-c3dftfrdu5unmk3g
                              - outcome: pit
                                outcome_label: Pittsburgh Pirates
                                event_id: mlb-ari-pit-2026-05-07
                                market_id: KXMLBGAME-26MAY071540PITAZ-PIT
                                tokens:
                                  'yes':
                                    predexon_id: px-c3dftfrdu5unmk3g
                                    price: 0.99
                                  'no':
                                    predexon_id: px-xz7fw6lsywv2rnwr
                            volume: 41567.16
                            liquidity: 25030.64
                            end_time: '2026-05-07T22:20:55+00:00'
                          - venue: polymarket
                            market_title: Pittsburgh Pirates vs. Arizona Diamondbacks
                            outcomes:
                              - outcome: ari
                                outcome_label: Arizona Diamondbacks
                                event_id: mlb-ari-pit-2026-05-07
                                condition_id: 0x8a70942639237613...
                                market_slug: mlb-pit-ari-2026-05-07
                                tokens:
                                  'yes':
                                    token_id: 927526441864...
                                    predexon_id: px-xz7fw6lsywv2rnwr
                                    price: 0
                                  'no':
                                    predexon_id: px-c3dftfrdu5unmk3g
                              - outcome: pit
                                outcome_label: Pittsburgh Pirates
                                event_id: mlb-ari-pit-2026-05-07
                                condition_id: 0x8a70942639237613...
                                market_slug: mlb-pit-ari-2026-05-07
                                tokens:
                                  'yes':
                                    token_id: 232120875852...
                                    predexon_id: px-c3dftfrdu5unmk3g
                                    price: 1
                                  'no':
                                    predexon_id: px-xz7fw6lsywv2rnwr
                            volume: 853880.442333
                            liquidity: 15200.91
                            end_time: '2026-05-14T19:40:00+00:00'
                        event_id: mlb-ari-pit-2026-05-07
                pagination:
                  limit: 1
                  has_more: true
                  pagination_key: eyJybyI6MS...
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
components:
  schemas:
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
              - type: string
              - type: integer
          type: array
          title: Location
        msg:
          type: string
          title: Message
        type:
          type: string
          title: Error Type
      type: object
      required:
        - loc
        - msg
        - type
      title: ValidationError
  securitySchemes:
    apiKey:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        Data key provided by Predexon. The trading key used by the Order Router
        on trade.predexon.com is a separate credential.

````