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

# kalshi.market_trades

> Kalshi per-fill trade table — one row per fill with P(Yes), USD notional, and estimated taker and maker fees.

export const TableSample = ({tableName, tableSchema}) => <>
    <div className="hidden dark:block">
      <iframe src={`https://dune.com/embeds/3419983/5785629?table_schema_t6f0df=${tableSchema}&table_name_t6f0df=${tableName}&darkMode=true`} style={{
  width: '100%',
  height: '500px',
  border: 'none',
  marginTop: '10px'
}} />
    </div>
    <div className="dark:hidden">
      <iframe src={`https://dune.com/embeds/3419983/5785629?table_schema_t6f0df=${tableSchema}&table_name_t6f0df=${tableName}`} style={{
  width: '100%',
  height: '500px',
  border: 'none',
  marginTop: '10px'
}} />
    </div>
  </>;

The `kalshi.market_trades` table contains per-fill trade activity on Kalshi. Grain: one row per Kalshi fill (`trade_id`). Rows are written once and never change. Each row carries the side the taker bought, prices for both sides, the probability of Yes, the USD value of the fill, and estimated taker and maker fees.

Market metadata is not repeated here. Join [`kalshi.market_details`](/data-catalog/curated/prediction-markets/kalshi/market_details) on `market_id` for the current title, status, result, category and fee terms; every fill has a matching market row. Fills on tickers Kalshi never published a market record for are excluded.

<Note>
  Kalshi nets positions, so every fill is reported as a buy of the side the taker ends up long: selling Yes appears as buying No (`taker_outcome_side = 'no'`).
</Note>

## Table Schema

| Column | Type | Description |
| - | - | - |
| `trade_id` | `VARCHAR` | Unique trade identifier |
| `market_id` | `VARCHAR` | Market identifier (Kalshi ticker). Every value has a row in `kalshi.market_details` |
| `created_time` | `TIMESTAMP` | When the trade occurred |
| `block_month` | `DATE` | First day of the calendar month of `created_time` (partition key) |
| `taker_outcome_side` | `VARCHAR` | Side the taker bought: `yes` or `no` |
| `num_contracts` | `DOUBLE` | Number of contracts traded. May be fractional |
| `yes_price_dollars` | `DOUBLE` | Price paid for the Yes side |
| `no_price_dollars` | `DOUBLE` | Price paid for the No side |
| `price` | `DOUBLE` | Probability of Yes implied by this fill, equal to `yes_price_dollars`. Matches the price convention of the `prediction_markets` tables |
| `amount_usd` | `DOUBLE` | Cash value of the fill in USD: the taker's price (Yes or No price, per `taker_outcome_side`) times `num_contracts` |
| `fee_usd` | `DOUBLE` | Estimated taker fee in USD. Kalshi publishes no per-fill fee, so this is derived from its fee schedule and rounded up to the centicent as Kalshi does: `ceil(0.07 × fee_multiplier × yes_price × (1 − yes_price) × num_contracts × 10000) / 10000`. Uses the series' current fee terms. NULL when the series has no fee terms |
| `maker_fee_usd` | `DOUBLE` | Estimated maker fee in USD, charged on top of `fee_usd` to the resting order. Same formula as `fee_usd` with coefficient `0.0175` on `quadratic_with_maker_fees` series and `0.035` on `quadratic_with_combo_maker_fees`; `0` on `quadratic` series, which charge no maker fee. NULL when the series has no fee terms. Total exchange fee on the fill is `fee_usd + maker_fee_usd` |
| `event_id` | `VARCHAR` | Parent event identifier |
| `series_id` | `VARCHAR` | Recurring series the market's event belongs to |
| `_updated_at` | `TIMESTAMP` | When this row was last written by the pipeline |

## Table sample

<TableSample tableSchema="kalshi" tableName="market_trades" />

## Query performance

`block_month` is the partition key. Always include a `block_month` or `created_time` filter for trade-history queries.

```sql theme={null}
-- ✅ Good: bounded by partition
SELECT * FROM kalshi.market_trades
WHERE block_month >= DATE '2026-04-01'
  AND market_id = 'KXNHLGAME-26MAY03MINCOL-MIN'
```

## Example query

```sql theme={null}
-- Top markets by USD volume and fees in the last 7 days
SELECT
  t.market_id,
  md.title,
  COUNT(*) AS num_trades,
  SUM(t.amount_usd) AS total_volume_usd,
  SUM(t.fee_usd + COALESCE(t.maker_fee_usd, 0)) AS estimated_fees_usd
FROM kalshi.market_trades t
JOIN kalshi.market_details md
  ON md.market_id = t.market_id
WHERE t.block_month >= DATE_TRUNC('month', CURRENT_DATE) - INTERVAL '1' MONTH
  AND t.created_time >= NOW() - INTERVAL '7' DAY
GROUP BY 1, 2
ORDER BY 4 DESC
LIMIT 20
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.