---
title: "The verified traders behind the live feed"
method: GET
path: "/api/v1/whales"
tags: ["Live (API key)"]
---

# The verified traders behind the live feed

`GET /api/v1/whales`

## Request

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

The ID-verified traders on the live feed's cards, largest open exposure first (sort=lifetime_pnl for richest; `rank` is by lifetime P&L): open markets, exposure, unrealized P&L, lifetime P&L, ROI, top category, up to 10 feed positions (open or settled) and form. Requires a KalshiSpy API key.

## Query parameters

- `limit` integer
- `sort` 'exposure' | 'lifetime_pnl'

## Response `200`

OK

- object
  - `ok` true, required
  - `data` Whale[], required
    - `nickname` string
    - `rank` integer
    - `open_markets_count` integer
    - `open_exposure_usd` number
    - `unrealized_pnl_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
    - `streak` integer, nullable
    - `last` string, nullable
    - `positions` object[]
      - `ticker` string
      - `question` string
      - `side` 'YES' | 'NO'
      - `status` 'open' | 'settled'
      - `position_value_usd` number
      - `market_pnl_usd` number
      - `closes_at` string, date-time, nullable
      - `kalshi_url` string, uri
    - `kalshi_profile_url` 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)
