---
title: "List markets (flat)"
method: GET
path: "/v1/markets/list"
tags: ["Markets"]
---

# List markets (flat)

`GET /v1/markets/list`

Returns a paginated list of individual markets, most-traded first. Unlike the event-grouped `GET /markets`, results aren't grouped by event and are never capped per event, so every market is reachable. Filter by venue, category, subcategory, or one or more series.

Paginate with `cursor` until it returns `null`; `meta.total` is the total number of matches. For a complete sync, de-duplicate by `ticker` — markets with equal volume aren't guaranteed a stable order between requests. Scoping to a `subcategory` or `series_ticker` set avoids this entirely.

## Query parameters

- `category` 'crypto' | 'economics' | 'finance' | 'sports' | 'politics' | 'tech' | 'entertainment' | 'weather' | 'all'
- `venue` 'kalshi' | 'polymarket' — Source venue for a market.
- `subcategory` 'nba' | 'ncaa' | 'nfl' | 'nhl' | 'mlb' | 'ufc' | 'lol' | 'epl' | 'efl' | 'la_liga' | 'world_cup' | 'bundesliga' | 'liga_portugal' | 'ligue_1' | 'f1' | 'ipl' | 'btc' | 'eth' | 'sol' | 'stocks' | 'indices' | 'etfs' | 'earnings' | 'rates' | 'inflation' | 'commodities' | 'fx' | 'jobs' | 'ai' | 'companies' | 'other' — Subcategory wire format (lowercase snake_case). Valid values depend on the selected `category` and are enforced server-side.
- `frequency` 'daily' | 'weekly' | 'monthly' | 'hourly'
- `series_ticker` string
- `status` string
- `cursor` string
- `limit` integer

## Response `200`

OK

- object
  - `data` object, required
    - `markets` Market[], required
      - `ticker` string — Unique market identifier on its venue. **Kalshi**: market ticker (e.g. `KXBTC-25FEB07-T100000`). **Polymarket**: `condition_id`, the 0x-prefixed hex string from Polymarket's CTF (e.g. `0x4d2…`); not the gamma id, question id, or market slug. Yes/no CLOB token ids are not returned by this API.
      - `event_ticker` string — Event identifier the market belongs to. **Kalshi**: event ticker (e.g. `KXBTC-25FEB07`). **Polymarket**: Gamma `event_slug` (falls back to `market_slug` when no parent event exists).
      - `series_ticker` string — Series identifier the event belongs to. **Kalshi**: series ticker (e.g. `KXBTC`). **Polymarket**: Gamma `market_slug` — Polymarket has no native series concept, so we key whitelisting on the market slug.
      - `title` string
      - `subtitle` string, nullable
      - `yes_sub_title` string, nullable
      - `no_sub_title` string, nullable
      - `bet_group` string, nullable — Polymarket-only: section label for the row (e.g. "Match O/U 21.5"). Always null on Kalshi rows.
      - `category` string
      - `subcategory` string, nullable
      - `frequency` string, nullable — Cadence of the underlying series: daily/weekly/monthly/hourly/other. Null for categories without timeframe pills.
      - `venue` 'kalshi' | 'polymarket' — Source venue for a market.
      - `status` string
      - `yes_bid` number
      - `yes_ask` number
      - `no_bid` number
      - `no_ask` number
      - `last_price` number
      - `price_to_beat` number, nullable — Reference price for Polymarket up/down markets. Null on Kalshi and on non-up/down Polymarket markets.
      - `volume` integer
      - `volume_24h` integer
      - `open_interest` integer
      - `venue_url` string, nullable — Canonical market URL on its source venue.
      - `open_time` string, date-time
      - `close_time` string, date-time
      - `expiration_time` string, date-time
      - `exclusion_keys` string[] — Parlay-correlation keys. Two markets **cannot co-exist in the same parlay if (and only if) their `exclusion_keys` arrays intersect** — i.e. share at least one string. Apply a pure set-intersection; there is no rule table to maintain client-side. The keys encode every correlation rule (cross-series exclusion groups, threshold ladders, same-game sports family/kind/participant correlation, Polymarket sub-events). Keys are opaque and namespaced by reason and scope (e.g. `kp:<gameKey>:moneyline|spread`, `grp:<idx>:<eventKey>`, `fam:<gameKey>:<series>`), and are derived solely from the market itself, so a selected leg can snapshot its keys and compare them later. The plain one-leg-per-event rule (same `event_ticker`) is intentionally not encoded here. Always present; an empty array means the market participates in no correlation rule.
  - `meta` object
    - `cursor` string, nullable
    - `has_more` boolean
    - `limit` integer — Maximum number of items requested for this page.
    - `offset` integer — Number of items skipped before this page.
    - `total` integer — Total markets matching the filters across all pages.

## Other responses

- `400` — Validation error
- `500` — Internal server error
- `503` — Market index unavailable

---

[API](https://skmtc.net/totalistrading/apis/totalis-rfq-api.md) · [All operations](https://skmtc.net/totalistrading/apis/totalis-rfq-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/totalistrading/totalis-rfq-api/revisions/b0adb9a590b4/schema)
