---
title: "List Markets"
method: GET
path: "/markets"
tags: ["Markets"]
---

# List Markets

`GET /markets`

List active markets grouped by event across supported venues (Kalshi and Polymarket). Filters: `category`, `venue`, `subcategory` (validated against the selected category), `frequency` (`daily`/`weekly`/`monthly`/`hourly`), `date_filter` (time bucket), and `search`. Pagination is cursor-based at the event level. The response includes `available_subcategories` and `available_frequencies` so clients can drive filter chips from the same result set.

## Query parameters

- `category` 'politics' | 'sports' | 'crypto' | 'finance' | 'economics' | 'entertainment' | 'weather' | 'tech' | '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'
- `date_filter` '1h' | '1h-1d' | '1d-7d' | 'today' | 'this_week' | 'this_month' | 'all'
- `search` string
- `cursor` string
- `limit` integer
- `markets_per_event` integer

## Response `200`

Events grouped by event_ticker, plus subcategory/frequency facets for the current result set

- object
  - `data` object
    - `events` EventGroup[]
      - `event_ticker` string, required — Event identifier. **Kalshi**: event ticker (e.g. `KXBTC-25FEB07`). **Polymarket**: Gamma `event_slug` (falls back to `market_slug` when no parent event exists).
      - `series_ticker` string, required — Series identifier. **Kalshi**: series ticker (e.g. `KXBTC`). **Polymarket**: Gamma `market_slug`.
      - `series_title` string, nullable
      - `event_title` string, nullable
      - `event_sub_title` string, nullable
      - `category` string, required
      - `image_url` string, nullable
      - `total_markets` integer, 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 number of items available across all pages, when returned by the endpoint.
    - `total_events` integer
    - `available_subcategories` SubcategorySlug[]
    - `available_frequencies` string[]

## Other responses

- `400` — Validation error
- `500` — Internal server error

---

[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/versions/b0adb9a590b4/schema)
