Kalshi & Polymarket
datasets, ready to use.

No API wrangling. Download historical data as clean CSV files or query on BigQuery. Currently in beta. No sign-up required. Last 30 days of data available for free.

Watch our
5 minute tutorial

Download CSV files

Every day, usually by 03:00 UTC, we refresh the CSV contents of all series, events, markets files. Plus we add a trade file for the previous UTC calendar day.

Loading datasets… JavaScript must be enabled.

Query on BigQuery

Log into your Google Cloud Platform account and simply run queries against our public dataset. Every day by 03:00 UTC we refresh all metadata tables (series, events, markets) and upload trades for the previous UTC calendar day.

Project pmdsproject
Dataset pmdsbeta
Import our AI skill into ChatGPT, Claude, or any AI assistant to generate SQL queries without knowing the schema upfront.
Kalshi: fetching trades
SELECT * FROM `pmdsproject.pmdsbeta.kalshi_trades`
WHERE DATE(DT) = DATE_SUB(CURRENT_DATE('UTC'), INTERVAL 1 DAY)
ORDER BY DT
LIMIT 100;
Polymarket: fetching trades
SELECT * FROM `pmdsproject.pmdsbeta.polymarket_block_trades`
WHERE DATE(BLOCK_DT) = DATE_SUB(CURRENT_DATE('UTC'), INTERVAL 1 DAY)
ORDER BY BLOCK_NUMBER, TX_INDEX, LOG_INDEX
LIMIT 100;

Understanding the datasets

Update Frequency
Datasets are refreshed daily by 03:00 UTC. Each update includes the previous day's trades (00:00–23:59 UTC) and a full snapshot of all series, events, and markets. Please note that Kalshi trades for MVE markets are included, but the Kalshi event/market list does not include MVE's because it would 10x its size.
Polymarket Data Structure
Three-tier hierarchy for both CSV and BigQuery data: Series → Events → Markets → Trades. Join keys: SERIES_ID, EVENT_ID, MARKET_ID.
Kalshi Data Structure
Three-tier hierarchy for both CSV and BigQuery data: Series → Events → Markets → Trades. Join keys: SERIES_TICKER, EVENT_TICKER, MARKET_TICKER.
Kalshi Markets Caveat
Our Polymarket market list contains all markets since the beginning of time. For Kalshi, we are still in the process of ingesting the full historical catalog. However, all Kalshi markets that had at least one trade within our covered date range are guaranteed to be included.
Trade Prices
PRICE fields in trades datasets are stored in decimal format. A value of 0.55 corresponds to a visual price of 55 cents on the platform, i.e. the price you would see displayed on the website.
Why "Block Trades"?
Polymarket trades are called block trades because we ingest them from the Polygon blockchain. The BLOCK_DT timestamp reflects when the trade was finalized on-chain, typically a few seconds after off-chain matching.
Trades, Not Orders
A single Polymarket trade can encompass multiple orders filled together. A $10 bet might fill $2 at 0.55 and $8 at 0.56, resulting in an average price of 0.558. In this example, our dataset would report one trade at 0.558, exactly like Polymarket's own API trades responses.
Filtering by Tags
Some fields, including _TAGS fields, store multiple values wrapped individually in square brackets rather than using comma separation, e.g. [crypto][memecoins][solana]. This format makes it easy to filter with LIKE without ambiguity: WHERE EVENT_TAGS LIKE '%[crypto]%'.

Frequently asked questions

Everything you need to know about the datasets, schemas, and how to work with the data.

The complete list of available files is published as a JSON manifest at https://beta.kingsets.com/manifest.json. It includes every CSV download path and updated timestamp. Scripts and AI agents can fetch this manifest to programmatically discover and download all available datasets.
Yes, as a starting point. Download our skill file at kingsets.com/ai/bigquery_skill.md and attach it to a conversation in ChatGPT, Claude, or any AI assistant that supports file uploads. It'll get you writing queries quickly without needing to study the schema first. That said, Kalshi and Polymarket each have their own data structures and naming conventions that are worth understanding as your queries grow in complexity.
We aim to maintain schema stability for all current columns. However, the relative order of columns may change in the future, and new columns may be added as we expand our data offerings.
We standardized Kalshi and Polymarket terminology into three fields:
  • START_DT — when the market became available for trading. Maps to Kalshi's open_time and Polymarket's startDate.
  • END_DT — when trading is scheduled to stop. Maps to Kalshi's close_time and Polymarket's endDate.
  • CLOSED_DT — the final administrative resolution after outcome verification. Maps to Kalshi's settlement_ts and Polymarket's closedTime. This is the source of truth for when contracts were officially settled.
Sort by three fields in order: BLOCK_NUMBER, TX_INDEX, and LOG_INDEX. Since trades are ingested from the blockchain, there is no single standalone sequence number.
No, we currently only provide the trader's proxy wallet address via the TAKER_ADDRESS field. To identify a specific trader's address, view one of their "Buy" trades on a Polygon blockchain explorer; the first address in the "From" section of "ERC-20 Tokens Transferred" is the proxy address.
Yes for trades, no for events/markets. Ingesting a list of all multivariate events/markets would 10x the size of those files/tables. FYI, you can spot multivariate market trades because their MARKET_TICKER starts with KXMVE.
No. While the Kalshi API provides a unique trade ID, it does not include taker identities. Because Kalshi is a centralized exchange, this information is not publicly available.
Yes. When querying addresses or tickers, we recommend lowercase comparisons: WHERE LOWER(taker_address) = LOWER('0xABC123...').
Our dataset currently only includes trade activity. We do not ingest other contract-level actions such as REDEEM or MERGE. Track a specific user's history by filtering TAKER_ADDRESS with their proxy wallet address.
Copied to clipboard