---
title: "Live Kalshi markets where the roster holds positions now"
method: GET
path: "/api/v1/markets/live"
tags: ["Live (API key)"]
---

# Live Kalshi markets where the roster holds positions now

`GET /api/v1/markets/live`

## Request

- Base URL: `https://kalshispy.com`
- URL: `https://kalshispy.com/api/v1/markets/live`
- Auth: HTTP bearer

Kalshi markets the roster holds right now, refreshed about every 30 seconds: open markets where two or more roster traders hold positions with combined unrealized P&L above zero, on either side (consensus_side and consensus_pct say how they split); while those number fewer than 40, also open markets one roster trader holds up $100 or more, and if still short, recently settled markets where two or more of them made a combined profit (status "settled", returned only with include_settled). Markets priced as all but decided are left out. Default order: combined P&L, largest first. Each market carries YES/NO prices in cents, consensus side and percentage, trader count, dollar flow, time to close, and every roster position (value, unrealized P&L, cost, lifetime P&L, ROI per dollar traded (null when no dollar volume is available), top category, when it was placed). This is the data a subscriber uses to decide which Kalshi market to take. Use the free-text search parameter on this tool to find held markets by keyword (for example "fed rate" or "super bowl"); it matches the market question, outcome, series ticker and ticker. Send it under the argument name this tool's own schema gives: an argument the tool does not take is refused, naming the ones it does. Requires a KalshiSpy API key (Elite or Lifetime plan). Before presenting a market, call searchSettledWins with its series_ticker so you can say how the same roster did on comparable past markets.

## Query parameters

- `q` string
- `limit` integer
- `category` 'politics' | 'elections' | 'sports' | 'entertainment' | 'economics' | 'financials' | 'crypto' | 'weather' | 'world' | 'scitech' | 'companies' | 'health' | 'social' | 'transportation' | 'mentions' | 'exotics' | 'other'
- `series` string
- `sort` 'whale_flow' | 'whale_count' | 'consensus' | 'lifetime_pnl' | 'closing_soon'
- `side` 'YES' | 'NO'
- `min_whales` integer
- `include_settled` boolean

## Response `200`

OK

- object
  - `ok` true, required
  - `data` LiveMarket[], required
    - `ticker` string
    - `event_ticker` string
    - `series_ticker` string
    - `question` string
    - `outcome` string
    - `category` string
    - `category_key` 'politics' | 'elections' | 'sports' | 'entertainment' | 'economics' | 'financials' | 'crypto' | 'weather' | 'world' | 'scitech' | 'companies' | 'health' | 'social' | 'transportation' | 'mentions' | 'exotics' | 'other'
    - `status` 'open' | 'settled'
    - `closes_at` string, date-time, nullable
    - `closes_in` string: Compact label such as "5h" or "2d".
    - `yes_price_cents` integer: The price to buy YES now (the ask), rounded up to whole cents within 1–99; 0 while nobody offers it or the quote is unavailable. Same for NO.
    - `no_price_cents` integer
    - `consensus_side` 'YES' | 'NO'
    - `consensus_pct` number
    - `whale_count` integer
    - `yes_count` integer
    - `no_count` integer
    - `whale_flow_usd` number, nullable
    - `traders_lifetime_pnl_usd` number
    - `realized_profit_usd` number, nullable
    - `whales` WhalePosition[]
      - `nickname` string
      - `side` 'YES' | 'NO'
      - `position_value_usd` number
      - `market_pnl_usd` number
      - `cost_usd` number
      - `lifetime_pnl_usd` number: Lifetime realized P&L in USD. 0 when it is not positive or not available.
      - `roi_pct` number, nullable: Lifetime realized P&L ÷ dollars traded, in percent (40.1 means +40.1%), matching how kalshi.com reports profit and volume. null when no dollar volume is available.
      - `markets_traded` integer
      - `top_category` string, nullable
      - `placed_at` string, date-time, nullable
    - `urls` object
      - `kalshi` string, uri
      - `kalshispy` string, uri
  - `meta` Meta, required
    - `generated_at` string, date-time
    - `definition` string
    - `verification` string
    - `docs` string, uri
    - `attribution` string
  - `hints` Hints, required
    - `tip` string
    - `next_steps` object[]
      - `label` string
      - `url` string, uri
      - `auth` 'api_key'
    - `similar` SettledWin[]
      - `ticker` string
      - `title` string
      - `outcome` string: Kalshi's short outcome label; empty for plain Yes/No markets.
      - `category` string
      - `category_key` 'politics' | 'elections' | 'sports' | 'entertainment' | 'economics' | 'financials' | 'crypto' | 'weather' | 'world' | 'scitech' | 'companies' | 'health' | 'social' | 'transportation' | 'mentions' | 'exotics' | 'other'
      - `series_ticker` string
      - `event_ticker` string
      - `result` 'yes' | 'no'
      - `settled_at` string, date-time
      - `whale_count` integer
      - `dissent_count` integer
      - `consensus_side` 'YES' | 'NO'
      - `consensus_pct` number
      - `net_profit_usd` number
      - `winners_profit_usd` number
      - `whales` SettledWhale[]
        - `nickname` string
        - `side` 'YES' | 'NO'
        - `profit_usd` number
      - `url` string, uri
      - `kalshi_url` string, uri

## Other responses

- `400`: Invalid parameter (`error.param` names it) or invalid cursor.
- `401`: Missing, malformed, unknown or revoked API key.
- `403`: The plan on this account has no API access (`error.upgrade_url`).
- `429`: Daily quota reached; `Retry-After` and `error.resets_at` say when it resets.
- `503`: Temporarily unavailable; retry shortly. The quota unit is given back, up to a daily refund budget.

---

[API](https://skmtc.dev/kalshispy/apis/kalshispy-api.md) · [All operations](https://skmtc.dev/kalshispy/apis/kalshispy-api/llms.txt) · [OpenAPI document](https://skmtc.dev/kalshispy/apis/kalshispy-api/revisions/5f483277dadc?raw)
