Whalefax
How to

How to export your Kalshi trade history

It takes about a minute, it is only on the website, and there are two traps in the file that quietly produce wrong numbers.

Updated August 7, 2026. Written by Whalefax, which builds free P&L and tax reporting tools for prediction market traders. Informational only, not tax advice.

The steps

  1. Sign in at kalshi.com on a desktop browser. The export is not in the mobile app, which is the single most common reason people conclude it does not exist.
  2. Open the account menu and go to Documents.
  3. Download the transaction history CSV. It comes one file per calendar year.
  4. Download every year you traded, not just the current one. Positions opened in one year and settled in the next need both files to be matched correctly.

Do this now rather than in filing season. Exports change, accounts get restricted, and a file already on your disk is unaffected by either.

What is in the file

Rows are individual fills and settlements, not positions. Expect market identifier, side, action, contract count, price, fee and timestamp. The exact column names shift between exports, so match on meaning rather than assuming a fixed header.

Trap one: cents or dollars, and it depends when you exported

Kalshi is partway through moving from cent-denominated integers to fixed-point dollars. An older export writes a sixty three cent fill as 63. Newer fields write the same fill as 0.63. Assume the wrong one and every number you produce is out by a factor of one hundred, in whichever direction.

The test takes a second: if the price column is whole numbers and any of them exceed 1, you are looking at cents, because a contract can never be worth more than a dollar. If they are decimals below 1, they are already dollars. Do that check before you total anything, and redo it on every file, because two exports taken months apart may not agree.

Trap two: your export may not contain your whole year

Since February 2026 Kalshi splits your data across a live tier and a historical tier. Recent activity sits on the normal endpoints, and once a market settles or a fill ages past the cutoff it moves to a separate historical one. Kalshi also does not publish how far back fill history is retained.

The practical consequence is that a single pull can hand you a partial year and nothing tells you it is partial. Count your positions against your own memory of the year before you trust a total, and if you traded across the cutoff, export more than once and reconcile. This is the strongest argument for exporting now rather than in April: the further you get from a trade, the more likely it has moved somewhere you did not think to look.

Trap three: a worthless expiry is still a disposal

When a contract expires against you, no money moves. It is tempting to treat rows with no cash movement as noise. They are not. That position has to appear in your record as a disposal at zero, on the resolution date, or the loss is never claimed and your reported gain is too high. Filtering the file down to rows where cash moved is the fastest way to overpay.

Fills are not positions

This is the part that makes the file hard rather than tedious. One position is routinely many rows.

You buy one hundred contracts. The book fills you in four pieces at four different prices. A week later you sell sixty across two more fills. The remaining forty run to expiry. That is seven rows describing one trade, and none of them individually is a reportable event you can copy anywhere.

To get a reportable line, the sixty sold contracts have to be matched against specific purchase lots in a consistent order, normally first in first out, so that each disposal has a real acquired date and a real cost basis attached. Do it inconsistently between positions and the totals will not reconcile.

Getting from the CSV to something filable

  1. Work out whether the file is in cents or dollars, then normalise everything to dollars.
  2. Group rows by market and outcome so each position is assembled from its fills.
  3. Match sells and settlements against buys, first in first out, carrying the acquired date through.
  4. Capitalize opening fees into cost basis; subtract closing fees from proceeds.
  5. Book expiries against you as disposals at zero.
  6. Bucket every row by a single consistent calendar so year end settlements land in the right year.

That is a full afternoon in a spreadsheet for an active account and it is genuinely easy to get wrong in ways that do not announce themselves. It is also what Whalefax does automatically, in your browser, without the file being uploaded anywhere.

Common questions

Where is the Kalshi CSV export?
Sign in at kalshi.com on a desktop browser, open the account menu, and go to Documents. Transaction history downloads as CSV, one file per calendar year. It is not available in the mobile app.
Why are the prices in my Kalshi CSV wrong by 100x?
They are probably in cents, and older Kalshi exports are: a sixty three cent fill appears as 63 rather than 0.63, so divide by one hundred. Newer fields are fixed-point dollars and already read 0.63, so dividing again would be wrong. Check before you convert. If the column is whole numbers with any value above 1 it is cents, because a contract can never settle above a dollar.
How far back does the Kalshi export go?
Files are produced per calendar year, so download each year you traded rather than only the current one. Positions opened in one year and closed in the next need both files present to match correctly.
Can I get my Kalshi history through the API instead?
Yes, Kalshi has a documented API and a read-only key can pull fills and settlements programmatically. It is a better route for a high-frequency account. For most traders the CSV holds the same information with far less setup.
Got the CSV? Turn it into real numbers
Matched lots, realized P&L, fees handled correctly, per-position detail. Drop the file in and it stays in your browser.
Open the tool