Tax basics · Kalshi
How to File Kalshi Taxes (2026): Step by Step
How to file a Kalshi year: download the export, reconcile it, and fill Form 8949, Form 6781 or Schedule 1 line by line, with real Kalshi rows worked.
On this page
As of October 2026, Kalshi sends no form that reports your trading profit or loss, and its account page says it "does not report profits/losses to the IRS". Filing a Kalshi year means building that figure yourself: download the realized P&L export, reconcile it, add any position still open on December 31 if you file under Section 1256, and carry the totals to the forms your route uses. This guide walks each step with real Kalshi rows.
This page is the procedure. Which taxes apply to a Kalshi year, and how the three common routes compare on one worked year, is on Kalshi taxes. There is no IRS guidance on how event contracts are taxed. Federal only.
The whole job, before any of the detail:
- Download the export from the Documents page and read what it actually is: one row per closed position, and nothing at all about what you still hold.
- Reconcile it against Kalshi's own figure and drop the credit rows, which are not trades.
- Know which route your return uses. None of the three common routes is an election, so this is a question about what the contracts are, answered once rather than each April.
- For standard capital, derive proceeds and basis from the price and quantity columns, split by holding period, and total each part onto Form 8949 and Schedule D.
- For gambling, total the winning results onto Schedule 1 and, for people who itemize, the losing ones onto Schedule A.
- For Section 1256, add the one thing no export contains: every position still open on December 31 and a closing price for each, which is what forces the API. Then assemble Form 6781 Part I, which nets the year and splits it 40% short-term, 60% long-term.
What tax forms does Kalshi send you?
Open your account's Documents page before you read any further, because the rest of this guide is
about something you can verify in thirty seconds. It sits in the account menu between Transfers and
Settings, at kalshi.com/account/taxes. Kalshi's help article still sends you to "the Account tab
under the Tax Info page"; the label in the app is Documents.

Two different things live on that page, and conflating them is where most confusion starts.
The tax forms. Kalshi issues these only to users who cross IRS reporting thresholds, so depending on your year you may receive none of them. The Documents page lists three:
- 1099-INT, "interest payments from Kalshi"
- 1099-MISC, "credit/rewards from Kalshi (does not include profits/losses)"
- 1099-DA, "digital asset transaction reporting from ZeroHash"
Kalshi's help article lists a fourth, and read this one carefully: a 1099-B that "contains transaction proceeds from broker transactions (crypto transfers)". It covers moving crypto in and out, not trading contracts.

So the two lists differ by the 1099-B. Read your own account rather than either list. Forms also arrive by email from Zenwork, Kalshi's tax form provider, so check spam if you are expecting one. The short version, form by form, is in Kalshi tax forms.
These are the easy half. They carry a figure somebody else computed, and every mainstream preparer and filing service knows what to do with them.
The figures and the export. The same page shows a total P&L with fees and without, a per-year
table, and a download icon in the Transactions column. On the account captured above only 2026
has a row, though forms were issued for 2024 and 2025. The icon opens no menu: it downloads a zip
named for the year (2026-01-01_2027-01-01.zip) holding a single file,
realized_pnl_2026-01-01_2027-01-01.csv, one row per closed lot with entry and exit prices and fees
split across the open and the close.

The two totals already tell you something. On the account captured above, 2026 shows +$14.60
with fees and +$136.93 without, so the year so far carried $122.33 of fees. The export
reproduces both to the cent: summed over all 274 rows, credit rows included,
realized_pnl_with_fees_dollars comes to 14.60 and realized_pnl_without_fees_dollars to 136.93.
Run the same two sums on your own file before anything else.
So Kalshi is not withholding your numbers. In its own words, the page is "information helpful for you or an advisor", the P&L reflects "realized profit and loss from your closed positions, including fees and any credits or rebates you've received", and the figures are "updated monthly". Its help article says the figures are computed first in, first out and that "updates occur on the first morning of each month". The export behaved more current than that: downloaded on October 8, 2026, it already held positions closed earlier that day. Whichever applies to your download, the export says nothing about positions still open.
What is missing from Kalshi's numbers?
Not information. A form, an IRS filing, and your open positions.
No 1099-B for your trades. Kalshi does issue a 1099-B, but its help center defines it as covering crypto transfers, and the account page states plainly that Kalshi "does not report profits/losses to the IRS". Every other investment account you own works the other way: the institution computes your trading figure, files it, and sends you a copy. Here the reporting obligation lands on you alone, and nothing you file will be cross-checked against a statement, because for your contracts no statement exists.
That has a concrete consequence later on this page. Line 1 of Form 6781 Part I is where a broker's aggregate figure would go, copied from box 11 of a Form 1099-B. There is no box 11 to copy. The form anticipates this: its instructions say to list separately each transaction for which you did not receive a Form 1099-B, which here means all of them.
No open positions. This is the gap that actually costs money. The export is realized P&L on closed positions, which is what the filename says. If you are filing under a regime that marks open positions at year end, and section 1256 does, then the one set of numbers you need is the one set Kalshi does not give you. A year where you opened a large position and closed nothing produces an export that looks almost empty and a tax figure that is not.
And their number is not your number. The headline P&L includes credits and rebates, which are
not trading results. In the export they appear as their own rows, typed credit rather than trade,
so you can separate them, but only if you know to look.
So the important half of the return is yours to build. The rest of this guide is how.
Which filing route is your return using?
Of the people we've seen file a Kalshi year, three routes are the most common, and each reads the same export differently. What each route is, and how the three compare on one worked year, is on Kalshi taxes. For the procedure, what matters is which form each one fills and what it counts:
| Route | Forms | What it counts | A position open on December 31 |
|---|---|---|---|
| Standard capital | Form 8949, box C or F, totaled to Schedule D | Every closed position, short or long term by how long it was held | Nothing until it closes |
| Gambling | Schedule 1 line 8b for winnings, Schedule A line 16 for losses | Winning results in full; losses only for people who itemize, up to winnings, and 90% of them from 2026 | Nothing until it settles |
| Section 1256 | Form 6781 Part I, then Schedule D lines 4 and 11 | Every closed position, plus every open one marked at the December 31 close, split 40/60 | Marked and counted, and the mark becomes next year's cost |
None of the three is an election. §1256(a) says each section 1256 contract held at the close of the year "shall be treated as sold", so if it applies to an instrument it applies, and nothing checked on a form makes it. Whether a contract is a capital asset or a wagering transaction is likewise a question about what it is. The answer applies every year, and a prior year filed on a different basis is an amendment question, covered in how to amend a tax return for Kalshi losses. The only genuine elections on Form 6781 are the straddle ones and the box D carryback.
The three procedures follow in that order: standard capital first, because the export holds almost everything it needs; gambling, which reuses the same filtered rows; then Section 1256, which needs what no export contains.
How do you file Kalshi trades as capital gains?
For people filing a Kalshi year as standard capital, this is the shortest of the three procedures,
because the export already holds almost everything it needs. Every
row in realized_pnl_<start>_<end>.csv is a closed position, and a closed position is a disposition:
a thing you bought, a thing you sold, a date at each end. That is the whole shape of Form 8949.
What is actually in the file
Thirteen columns, and only some of them do any work here:
| Column | What it is for |
|---|---|
type | trade or credit. The filter that has to run first. |
market_ticker, side | Which contract, and which side of it you held. |
quantity_fp | Contracts. Fractional, which is what the _fp is warning you. |
entry_price_dollars, exit_price_dollars | The two prices, both from your side's point of view. |
open_fees_dollars, close_fees_dollars | Fees, split across the two ends of the position. |
open_timestamp, close_timestamp | The two dates Form 8949 asks for, and the holding period. |
realized_pnl_without_fees_dollars, ..._with_fees_dollars | Kalshi's own answer. Worth checking yours against, not filing. |
subtrader_id | An account identifier. Nothing to do with your return. |
Notice what is missing. There is no proceeds column and no basis column, and those are the two numbers Form 8949 is actually asking for.
Four steps, in order.
Drop everything that is not a trade. The type column separates them. A credit row is a
promotion or a rebate, arrives with no ticker, no side and no quantity, and is not the sale of
anything, so it has no business on Form 8949. It still sits in the same profit-and-loss columns as
your real dispositions, which is exactly how it ends up in a total that should not contain it.
Derive proceeds and basis, because the file does not state them. It gives you a net result per row and leaves the two numbers the form actually asks for to you:
proceeds = quantity_fp x exit_price_dollars
basis = quantity_fp x entry_price_dollars
This holds for the NO side too, with no sign flip, because Kalshi states both prices from the
holder's point of view: a NO position is a long position in the NO contract. Check your own file the
way you would check any arithmetic you are about to sign: proceeds - basis should reproduce
realized_pnl_without_fees_dollars on every row. It does on every row of the export this section was
written against.
The reason this step matters more than it looks: Form 8949 asks for proceeds in column (d) and basis in column (e), and the gain in column (h) is the difference. Copying the profit-and-loss column into column (h) and leaving (d) and (e) empty reports the right bottom line on a form that does not foot.
Split by holding period. Subtract open_timestamp from close_timestamp. More than one year is
long-term and goes in Part II; one year or less is short-term and goes in Part I. Expect almost all
of it, and quite possibly all of it, to land in Part I, for reasons covered below.
Total each part and carry it to Schedule D. Part I totals to Schedule D line 3, Part II to line 10, and the two net against each other there.
The boxes, and why they are the ones they are
Form 8949 opens by asking which box to check, and the answer follows directly from the fact this whole guide is about. Box A and Box B are for transactions reported to you on a Form 1099-B, with basis reported or not. You did not receive one. So short-term dispositions are Box C, "Short-term transactions, other than digital asset transactions, not reported to you on Form 1099-B or Form 1099-DA", and long-term ones are Box F, its Part II twin.
It is the same fact as the empty line 1 on Form 6781, surfacing somewhere else on a different form. If a 1099-DA did arrive, read it before assuming it changes the answer: Kalshi's is for digital-asset transfers, not for your contract trades, and the form has its own box on 8949 rather than sharing Box C.
One row, worked
A real closed position, exactly as it arrives:
type,quantity_fp,market_ticker,side,entry_price_dollars,exit_price_dollars,open_fees_dollars,close_fees_dollars,realized_pnl_without_fees_dollars,realized_pnl_with_fees_dollars,close_timestamp,open_timestamp
trade,17.55,KXNFLSPREAD-26SEP13BALIND-BAL4,no,0.57000000,0.00000000,0.30120000,0.00000000,-10.00350000,-10.30470000,2026-09-13T16:19:38-04:00,2026-09-13T12:51:15-04:00
Every column it needs lands somewhere on the form:
description = quantity_fp, side, market_ticker 17.55 NO on KXNFLSPREAD-26SEP13BALIND-BAL4
date acquired = open_timestamp 2026-09-13
date sold = close_timestamp 2026-09-13
proceeds = quantity_fp x exit_price_dollars 17.55 x 0.00 = 0.00
less close_fees_dollars less 0.00 = 0.00
basis = quantity_fp x entry_price_dollars 17.55 x 0.57 = 10.0035
plus open_fees_dollars plus 0.3012 = 10.3047
gain or loss = proceeds less basis = (10.3047)
Two things to take from it. The fractional quantity_fp is normal, not a glitch: 17.55 contracts is
what you owned. And that final figure is realized_pnl_with_fees_dollars to the cent, which is the
check worth running. If your arithmetic does not reproduce Kalshi's own column, one of you is wrong,
and a row-level check finds it before the total reaches a form. Do the same subtraction without the two fee columns and you should
get realized_pnl_without_fees_dollars, here (10.0035).
A worked year
Five real rows from the same file, chosen because each shows something different, followed by the year's actual totals across all 108 of them.
market_ticker | side | quantity_fp | entry to exit | Held | Fees | Proceeds | Basis | Gain or (loss) |
|---|---|---|---|---|---|---|---|---|
| KXNFLSPREAD-26SEP13BALIND-BAL4 | no | 17.55 | 0.57 to 0.00 | 3h 28m | 0.3012 | 0.0000 | 10.3047 | (10.3047) |
| KXNCAAFSPREAD-26SEP11RUTGBC-BC3 | yes | 7.28 | 0.55 to 1.00 | 9h 41m | 0.1262 | 7.2800 | 4.1302 | 3.1498 |
| KXOSCARSONG-26-LIE | yes | 29.00 | 0.16 to 0.00 | 3h 12m | 0.2800 | 0.0000 | 4.9200 | (4.9200) |
| KXWCROUND-26FINAL-NED | yes | 1.38 | 0.12 to 0.00 | 29 days | 0.0103 | 0.0000 | 0.1759 | (0.1759) |
| KXNFLSPREAD-26SEP09NESEA-SEA4 | yes | 2.13 | 0.47 to 0.46 | 4h 24m | 0.0742 | 0.9428 | 1.0383 | (0.0955) |
| Part I, Box C (all 108) | 6.67 | 148.75 | 201.79 | (53.04) | ||||
| Part II, Box F | 0 | 0 | 0 | 0 |
Each row is carrying a lesson.
KXNFLSPREAD-26SEP13BALIND-BAL4 and KXOSCARSONG-26-LIE both exited at 0.00: the contract expired
worthless. It is tempting to read those as nothing having happened, but they are sales for zero, they
belong on the form with 0.00 in the proceeds column, and dropping them removes the basis that makes
them a loss. Roughly half the rows of a losing year look like this.
KXNFLSPREAD-26SEP09NESEA-SEA4 is the only one of the five with a close_fees_dollars figure, and
it is the only one that did not settle. On Kalshi a contract that settles costs nothing to settle, so
a closing fee is the tell that you sold out early rather than letting it resolve.
KXWCROUND-26FINAL-NED is the longest hold in the entire file at twenty-nine days, and there is a
second row with the same ticker and the same two timestamps for 34.94 contracts at 0.13. That is not
a duplicate, it is one position filled at two prices. Deduplicating by ticker would have deleted real
basis.
Part II is empty, and that is the normal result
Every one of those 108 dispositions is short-term. The longest hold in the year was twenty-nine days and most opened and closed the same afternoon, which is what event contracts do: they resolve on an event, and the event happens. Expect your own Part II to be empty too.
A long-term row is possible, but it can only come from a position you opened in a previous
calendar year and closed in this one. Watch for it deliberately, because the export is keyed on the
date you closed: a contract bought in November 2025 and settled in 2026 appears in your 2026 file
with an open_timestamp that predates the window you asked for. It is the one row whose dates look
wrong and are not, and it is the only row that belongs in Part II under Box F.
Schedule D takes it from there. This year is a net short-term capital loss of 53.04, which under §1211(b) comes off ordinary income in full, being well under the 3,000.00 annual limit, with nothing left to carry forward under §1212(b). No itemizing, and the standard deduction does not touch it. A bigger year works the same way: deduct 3,000.00, carry the rest forward indefinitely with its short-term character intact.
What the export will not do for you
- Fees are a decision, not a given. The file splits them across
open_fees_dollarsandclose_fees_dollarsand reports the result both with and without. The ordinary convention is to add the opening fee to basis and net the closing fee out of proceeds. Settlement is free on Kalshi, so most rows carry a fee only at the open; the rows with a closing fee are the ones you exited early, which is a useful way to spot them. - Quantities are fractional. Most rows are not whole contracts, which is what the
_fpinquantity_fpis telling you. Round the totals, never the rows: rounding 108 rows to the cent and then adding them up does not reliably give you the same answer as adding them up and rounding once. - Nothing here flags a wash sale, and whether the wash-sale rule reaches event contracts at all is an open question, not a settled no: there is no IRS guidance either way.
How do you file Kalshi trades as gambling?
For people filing a Kalshi year as gambling under §165(d), the procedure is two lines and one condition, and it starts from the same filtered export as the capital route: trade rows only, credit rows dropped.
Winnings go on Schedule 1 (Form 1040), line 8b. The line takes your winning results added up, not the net for the year: a losing position does not reduce it. A year that nets to a small loss can still put a large figure on this line.
Losses go on Schedule A, line 16, and only for people who itemize. In the IRS's words, "You may deduct gambling losses only if you itemize your deductions on Schedule A (Form 1040) and kept a record of your winnings and losses. The amount of losses you deduct can't be more than the amount of gambling income you reported on your return" (IRS Topic No. 419). For tax years beginning after December 31, 2025, §165(d)(1) adds a second limit: the deduction "shall be equal to 90 percent of the amount of such losses", as amended by Pub. L. 119-21 §70114. Topic 419 does not mention the 90% yet; the statute does. Nothing carries forward to another year.
What counts as one win or one loss has no settled answer. The export gives one row per closed position, but nothing in the IRS's guidance says how results group on an exchange: per position, per market or per day. Realize's engine counts a session as every position in one market that closed on one Eastern day, netted, and labels that grouping unsettled. Positions still open on December 31 do not count until they settle.
The itemizing arithmetic and the 90% limit are covered in are prediction markets taxed as gambling and the OBBBA 90% loss limit.
How do you file Kalshi trades under Section 1256?
For people filing a Kalshi year under Section 1256 because of the 60/40 split, the procedure is the capital one plus a step no export supports. Everything above counted what you closed. Section 1256 also counts what you were still holding, and that single difference is why this route takes real work while the capital route mostly takes arithmetic. It also makes the holding-period split from the capital route irrelevant: under section 1256 the 60/40 character is fixed by statute regardless of how long anything was held, so the dates stop deciding anything and the December price starts.
§1256(a)(1) treats a contract held at the close of the tax year as sold at fair market value on the last business day of that year. The position is not closed and you have not received anything, but the gain or loss to that point is recognized anyway, and the position picks up a new basis at that marked value going into the next year.
Applied here, that produces a result people find genuinely surprising. Buy a contract on a Super Bowl market in September and hold it through year end, and the position is marked at the close of that year and lands on that year's return, months before the game is played and before anyone knows whether you were right. A year in which you opened a large position and resolved nothing can still produce a number.
Note the statute says last business day, not December 31. For an instrument that trades on a traditional exchange calendar those are the same day or a few days apart and the answer is obvious. For a venue that quotes continuously, including weekends and holidays, which day counts as the last business day is not something the text resolves, and there is no regulation or ruling construing it for this kind of market.
The mark has to come from somewhere, and for Kalshi that somewhere is the daily candle for the market: Get Market Candlesticks takes a period length in minutes, and 1440 is the daily bar. Two traps sit in that lookup, and both are the kind that produce a plausible wrong answer rather than an error:
- The daily candle closes at Eastern midnight, not UTC midnight. Whichever day you settle on, the candle carrying that day's trading is stamped the following day at 05:00Z in winter, 04:00Z in summer. Read that timestamp as a UTC date and you will name the wrong day, and the row you have just mispriced is a mark that goes on a return.
- Candles migrate to an archived tier once a market is old enough, with a different response shape from the live one. A live market returns 404 on the archived path and an archived market returns 404 on the live path, so a lookup that only knows one of them fails on roughly half your history.
There is also a case with no clean answer: a market that published no close on the relevant day. There is no published price to mark that position at. Realize leaves it off Form 6781 and says so, rather than substituting cost or the last trade and letting an invented number pass as a computed one.
Which is where the export runs out. It is realized profit and loss on closed positions, and a mark needs the opposite: the positions that were still open on December 31, and a price for each of them on that day. Neither exists in any file Kalshi will hand you, and no amount of care with the CSV produces them. That is the whole reason the rest of this guide is about the API.
How do you get a complete Kalshi trade history?
This is the step that goes wrong most often, and it goes wrong silently.
Kalshi serves a member's fills from two disjoint endpoints, and says so itself. The
Get Fills reference states that "fills
that occurred before the historical cutoff are only available via GET /historical/fills". The
Historical Data page gives the mechanism:
the boundary is a set of cutoff timestamps you can read from GET /historical/cutoff, they are
"regularly updated, advancing forward over time", and each data type has its own. For fills the
governing field is trades_created_ts.

Passing min_ts=0 to the live endpoint does not reach back past the cutoff. It returns what the live
tier holds and nothing else, with no error and no indication that anything is missing. Kalshi's own
migration guide names the remedy: "For fills and other partitioned records, query the corresponding
live and historical endpoints."
Kalshi does not publish how long the live window is. On the accounts Realize reads, the fills window has run about three months, a quarter of a tax year, so any complete reconstruction has to read both. On one real account we measured 98 fills in the live tier against 47 in the archive that a single-endpoint pull never sees. That is not a rounding difference. On top of that, the fills that fall through the gap are the oldest ones, which are disproportionately the opening legs of positions still held, so the trades you lose are the ones carrying cost basis. Six open positions on that account existed only in the archive, which meant that reading one endpoint produced positions with proceeds and no basis at all.
The tell, if you want to check work you have already done: a market that shows a settlement but no fills. The settlement survived and the opening trade did not.
There is a second version of the same trap over longer timescales. If you stop pulling for longer than the live window, fills recorded during the outage cross the cutoff and become reachable from neither endpoint on a naive incremental sync. Anything keying off "the last fill I saw" has to compare against the current cutoff rather than against its own high-water mark.
None of this is exotic. It is the ordinary consequence of a two-tier storage design that the API documents but does not warn you about, and it is the single most likely reason a hand-built Kalshi figure is wrong.
Without the API, the activity export. Kalshi's "Your activity" page, in the same account menu,
has a download icon of its own. It offers All time, Today, This week, This month, This year, Last
year and Custom dates, and saves Kalshi-Recent-Activity-All.csv: one row per order, trade,
settlement, deposit, withdrawal or credit, across 25 columns that include Fee_In_Dollars,
Direction, Price_In_Cents and, on settlement rows, Profit_In_Dollars. It is a ledger, not a
profit-and-loss statement: nothing in it matches lots or computes basis. For a reader rebuilding a
year without code, it is the file that carries the fills, including the opening trades of positions
still open on December 31.

How do you pull a full year from the Kalshi API?
This section is for readers who will write the code. If you are not, skip to Form 6781 below; nothing here changes the earlier sections.
Kalshi authenticates with an API key ID and a private key, signing each request. Keys are created under Account & security, in the API keys section, and the "Create API key" dialog has two defaults worth knowing before you press Create. As captured on October 8, 2026:
- Key type defaults to Ed25519, labeled "Recommended. Faster signing, smaller signatures". The other option is RSA, "For clients that support only RSA-PSS".
- Permissions default to both broad scopes checked: "Read all data" (
read) and "Full access" (write), and Full access includes Trade and Transfers. An untouched dialog creates a key that can trade and move money. A key that only reads is one where you uncheck Full access and keep Read all data.

Leave the optional public-key field empty and Kalshi generates the pair for you; the dialog says that adding your own public key creates "a key without generating a downloadable private key". The signing recipe below is the RSA-PSS one.
Signing. Build the string from the millisecond timestamp, the HTTP method and the request path,
then sign it with RSA-PSS over SHA-256 with the salt length equal to the digest length, base64 the
result, and send it with the key ID and the timestamp in the three KALSHI-ACCESS-* headers. Two
details in that sentence cause almost every valid-looking 401:
- Sign the full path including the API prefix (
/trade-api/v2/portfolio/fills), not the endpoint fragment. - Exclude the query string from the signed path, while still sending it on the request URL.
Sign as late as possible, too. The timestamp is inside the signature, so if you pace requests after stamping them you hand the venue a signature that has already aged.
Pagination. Every list endpoint is cursor-based: read the cursor off the response, pass it back, stop on an empty one. Limits run 1 to 1000 and the default is 100.
Rate limits. Kalshi meters in tokens rather than requests, and
publishes the budgets. The entry tier carries
200 tokens a second in its read bucket against a default cost of 10 per request, so the sustained
ceiling is about 20 reads a second. A cursor walk issues requests back to back, which means a single
connection on a fast link crosses that line by itself with no concurrency at all. Two details that
matter when you hit it: a 429 carries no Retry-After header and there is no cooldown, so back off on
your own clock; and reads and writes draw on separate buckets, which for a tax pull means you are only
ever spending the read one.
Direction. Use outcome_side, which describes the exposure a fill leaves you holding. Kalshi's
order direction page calls it "the
canonical way to determine direction going forward" and marks the legacy action and side fields
deprecated. The reason they break for tax purposes is in its own equivalence table: buy-yes and
sell-no produce the same exposure, so action alone does not tell you what a fill did to your
position. Key disposals off it and you drop closing sales, leave sold positions apparently open, and
date disposals at settlement rather than at the trade.
Precision. Per the fixed-point page, prices are fixed-point dollar strings carrying up to four decimal places and contract quantities carry up to two. So quantities really are fractional and a whole-cent field cannot represent a deci-cent market. Carry the finer-grained fields and round once, at the end, on the difference.
One number will not reconcile, by design. If the account ever received a promotional credit, your computed figure will disagree with the headline Kalshi shows. No API endpoint reconstructs credits; the only surface that states them is the member's own CSV export from the documents page. Compare against the fee-inclusive trading column, not the headline.
A useful independent check: trading profit and loss is fully reconstructible from
/historical/positions for the pre-cutoff period, per market, as realized profit and loss less fees
paid, plus /portfolio/settlements after it. If your fill-derived figure and that one disagree, the
fill history is the thing to suspect first.
What does a full section 1256 year look like?
You now have the two things the export could not give you: every position that closed during the year, and every position that was still open on December 31 with a price for each. This is what they turn into, if section 1256 applies.
The figures below are worked cases rather than a real account, and they are the same cases our own engine is tested against, which is why they are the ones we are willing to publish. They are small on purpose so the arithmetic stays visible. The real export used in the capital section above could not be used here for a reason worth stating: that account has no December 31 in it at all, so it has no year-end mark to show.
A position that spans a year end
This is the case that surprises people, and it is the one the marking rule exists for.
You buy 1,000 YES contracts at $0.30 on November 3, 2025. Cost, $300.00. The market does not resolve in 2025, and on December 31 the venue's close for it is $0.18.
31 Dec 2025 deemed sale 1,000 x 0.18 = 180.00
less basis 300.00
year 1 result (120.00)
1 Jan 2026 deemed repurchase at the same price, 180.00, which is now your basis
9 Feb 2026 resolves YES 1,000 x 1.00 = 1,000.00
less basis 180.00
year 2 result 820.00
Nothing was bought or sold on either December 31 or January 1. The pair is a bookkeeping device for what §1256(a)(1) and §1256(a)(2) require: recognize the move to year end now, and carry the marked value forward as the new basis.
Check it across the two years, because that check is the whole point. Year 1's (120.00) plus year 2's 820.00 is 700.00, and the true economic result of the position is $1.00 less $0.30 on 1,000 contracts, which is also 700.00. The mark pulled $120 of it into an earlier year. It did not create any.
That is the concrete version of a claim made several times above: under section 1256 the year-end mark is timing, not extra tax. Get the basis reset wrong and you pay on that $120 twice.
The year, assembled
A 2026 return with one of each kind of position. The middle row is the position from the example above, arriving in its second year.
| Position | Basis | Proceeds or mark | Result on this return |
|---|---|---|---|
| Closed during 2026 | 100.00 | 40.00 closed | (60.00) |
| Carried in on last year's mark | 180.00 | 1,000.00 closed | 820.00 |
| Open on 31 Dec 2026, marked | 50.00 | 20.00 mark | (30.00) |
| Line 2, column (b) total | 90.00 | ||
| Line 2, column (c) total | 820.00 | ||
| Line 3, the net | 730.00 | ||
| Line 7, after lines 4 to 6 | 730.00 | ||
| Line 8, 40% short-term | 292.00 | ||
| Line 9, 60% long-term | 438.00 |
The three positions are the line 1 rows themselves, since with no Form 1099-B to copy from the instructions have you list each transaction separately. Line 2 is where each column is added up, and line 3 is where the two columns finally meet.
Line 7 repeats line 3 here only because there is nothing in between: no Form 1099-B adjustment on line 4 and no carryback election on line 6. The 40/60 split is always taken from line 7, not from line 3, and the two come apart the moment either of those lines carries a figure.
Four more things in that table are doing work.
Losses and gains travel in different columns until line 3. The two losses land in column (b) and total 90.00; the gain sits in column (c) at 820.00. Nothing nets until line 3, which is why a year that feels like a small net loss can still show a large gain figure on the way there.
The marked position is a real number on a real return even though you still hold it and have received nothing. That is the 30.00 loss in the third row, and under plain capital treatment it would be zero.
The carried position is priced off 180.00, not off its original $300.00 cost. Using the original cost here is the single most expensive mistake available on this form, and nothing in any export flags it, because the export does not know last year's mark happened.
The 40/60 split ignores how long anything was held, per §1256(a)(3). The closed position in row one might have been held an afternoon and the carried one fifteen months; neither fact appears anywhere in the arithmetic. Where the split does not divide cleanly, round one piece and take the other as the remainder rather than rounding both independently, so the two always sum back to line 7 with no stranded cent.
The same shape, on a year with real volume
Three positions fit in a table. A real year does not, and the working paper behind it is where the two terms stop being a formula and start being a list you can check. This is the lot detail Realize generates for one account of a demo return, and it is the same two groups in the same order:

Two details in table 1B are worth pausing on, because they are the ones a hand-built version gets wrong. Every marked row names the price it used and where it came from, the venue's own published daily close for December 31, so a preparer can check the number rather than take it. And the fees column is a dash rather than 0.00, because nothing was traded: a deemed sale is not a transaction anyone charged you for, and printing a zero there would imply a fee was looked up and found to be nil.
What these figures leave out
- Fees belong in the closed-position term, subtracted along with basis. A deemed sale carries no fee at all, because nothing was traded: you did not sell anything on December 31, the statute did.
- A position the venue published no close for on December 31 is not in this table, and is not marked at cost to make it fit. It stays off the form, as described above.
- A filed year does not move. Once a year end has been reported, its mark is the number you filed, even if you later rebuild your history and the venue's data has been revised underneath you. Recomputing a prior year's mark and quietly using the new figure as this year's basis breaks the two-year check above.
How do you put it on Form 6781?
Under section 1256, the year goes on Form 6781 Part I, and the totals flow from there to Schedule D as 40% short-term and 60% long-term.
Line 1 takes your contracts, and because no 1099-B arrived you list them yourself rather than copying a broker's total. What goes into it is two terms, not three:
line 1 = every position closed during the year proceeds less basis, less fees
+ every position still open on December 31 December 31 price x quantity, less basis
A position carried in from last year is not a third term, and that is the part people get wrong. It was deemed sold on December 31 at that day's close and rebought at the same price opening January 1, so its cost this year is last year's mark. The prior year's mark is already inside that figure, and subtracting it again counts it twice.
Those two terms are what any working paper behind this line has to show, because they are the only two things that produce it. Here is that reconciliation on a statement Realize generates, for one account of a demo return:

A note on how the statute actually words this, because the shorthand everyone uses is loose. §1256(a)(2) does not adjust your basis; it says "proper adjustment shall be made in the amount of any gain or loss subsequently realized" for what paragraph (1) already took into account. The arithmetic comes out the same, which is why "the mark becomes your basis" is the useful way to hold it, but the mechanism is an adjustment to the later gain rather than a change to what you paid.
Two things about the line itself, both easy to miss on a form you are seeing for the first time. Column (a) is captioned Identification of account. Where a broker did send a Form 1099-B, the instructions have you write "Form 1099-B" and the broker's name there and carry across the single figure from its box 11; where none arrived, they have you list each transaction separately instead. And columns (b) and (c) are separate loss and gain columns, so losses and gains stay apart all the way down to line 3 rather than canceling as you go.
Lines 2 and 3 subtotal and net it. Line 4 is a different thing that catches people out, because it is captioned as a Form 1099-B adjustment: it is for straddle and hedging adjustments, not for a missing broker total, so leave it alone unless you actually have one. Lines 8 and 9 split the net 40/60, and those go to Schedule D lines 4 and 11 respectively. Line numbering moves between revisions, so work from the current form rather than from a guide.

Box D is the §1212(c) carryback election: you check it and enter the amount on line 6, then file Form 1045 or amended returns with an amended Form 6781 and Schedule D for each year reached. It carries a net section 1256 loss back three years against prior-year section 1256 gains only.
Read that limit precisely before dismissing it, because it is narrower than it sounds in one way and wider in another. §1212(c) measures the prior year by "taking into account only gains and losses from section 1256 contracts", which is a question about the instruments, not about where you traded them. A profitable year in index options or futures inside the last three can absorb this year's event-contract loss even if every Kalshi year you have ever had was a losing one. With no prior section 1256 gain of any kind, the election is worth nothing, and that is the common case for someone whose only contracts are event contracts.
Two further limits worth knowing before you count on it. The amount a year can absorb is also capped by that year's total capital gain net income, so large capital losses elsewhere in the carryback year shrink what it can take. And the loss goes to the earliest of the three years first, with only the excess moving forward to the other two. The mechanics, and when it is worth making, are in how to amend a tax return for Kalshi losses.
Parts II and III are almost certainly not yours, and it is worth knowing why rather than wondering. Part II is straddles: offsetting positions held so that one leg's loss is cushioned by the other's gain, listed individually with their components. Part III is captioned Unrecognized Gains From Positions Held on Last Day of Tax Year, it is a memo entry that feeds no other line, and its columns want the fair market value of a position you were still holding against your basis in it.
The reason a section 1256 filer leaves Part III empty is the marking itself. Every position you held on December 31 was deemed sold at that day's price and its gain or loss recognized on line 1, so there is no unrecognized gain left on it to report. The exception is a position the venue published no price for: it was never marked, so its gain or loss was never recognized either.
What this guide deliberately does not compute for you is Schedule D and the capital loss carryover worksheet. Both net your contract results against capital activity elsewhere in your return that nothing here can see, so a version produced from Kalshi data alone would be incomplete by construction, and incomplete in a direction that looks finished.
What else belongs on the same Form 6781?
One more thing about that form, and it is the thing most likely to be missed by anyone who trades more than event contracts: Form 6781 is per return, not per account and not per venue. Column (a) of line 1 asks you to identify accounts precisely because it expects there to be more than one.
Section 1256 is a definition about instruments, not about where you traded them. §1256(b)(1) names five kinds: regulated futures contracts, foreign currency contracts, nonequity options, dealer equity options and dealer securities futures contracts. The exclusions that follow at §1256(b)(2) are where the argument about event contracts actually lives, and that argument is in the Section 1256 60/40 guide rather than here.
The kind that catches ordinary investors is nonequity options. Listed broad-based index options, SPX and NDX among them, are section 1256 contracts, and unless you are a registered options dealer your options on individual stocks are not. A lot of people hold the first sort without ever having heard of this form.
If you do hold others, the asymmetry this whole guide is about turns into two different kinds of row on one line 1. A futures or index-options broker sends a Form 1099-B carrying box 11, "Aggregate profit or (loss) on contracts", and you write "Form 1099-B" and the broker's name in column (a) and carry that single figure across. Kalshi sends no box 11, so its row is one you built yourself. The completed form above is that shape: two accounts, each keeping its own row.
They then net, at line 3, and split 40/60 together. A loss on event contracts meets a gain on index options there. It is also why the carryback election above reaches further than people assume, since the prior-year gain it looks for is a section 1256 gain from anywhere.
Two limits on that netting, and they matter more than the netting itself:
- It only works inside one treatment. Both sides net because both are being filed as section 1256. A leg characterized as wagering does not net against a capital or section 1256 leg at all, which is the trap set out in arbitrage betting taxes.
- Consistency is per instrument, not blanket. Filing event contracts under section 1256 commits you to nothing about the rest of what you hold, and it does not follow that two venues offering superficially similar contracts reach the same answer. A venue's regulatory status is part of the facts, not a detail around them.
How Realize helps
Realize does the work for all three routes, so the numbers exist for whichever route a return uses. Gambling needs winning and losing results. Capital treatment needs every disposition. Section 1256 needs every disposition plus a complete history that does not silently truncate, plus a sourced mark on every position open at year end. Those last two are the parts that go wrong by hand, and they are the parts the product exists to remove.
Concretely: we connect to Kalshi read-only with an API key you create. Realize's connect flow takes RSA keys only and asks for one that reads: in Kalshi's dialog that means choosing RSA rather than the Ed25519 default, unchecking Full access and keeping Read all data. From there we pull the raw fills from both the live and archived tiers to cover the full year, rebuild cost basis by matching closing fills against opening ones, compute year-end marks from published closes, and produce the Form 6781 Part I figures and a transaction statement behind them. The work this page describes is the work the product does, which is why we can describe it in this much detail.
Being exact about what is and is not shipped: what runs in production today is an on-screen estimate, showing your net figure, the 60/40 split, what a loss year is worth, the carryback and carryforward position, a comparison across the three common routes, and a trace of how each number was reached. The forms open in production for the 2026 filing season. Realize builds Form 6781 with the transaction statement behind it, Form 8949 for the capital route, and the gambling session log for Schedule 1 and Schedule A. It gives figures for Schedule D and does not produce Schedule D or a 1040-X, and Realize itself does not sign or file a return. We also do not tell you that a characterization is correct. How each figure is checked, and who reviewed the engine, is in how Realize checks its numbers.
For the wider picture, start at the Prediction Market Tax Center. How a Kalshi year is taxed under each route is on Kalshi taxes, and what Kalshi charges per trade is on Kalshi fees; the 60/40 and marking mechanics are in the Section 1256 60/40 guide; prior years are in how to amend a tax return for Kalshi losses; and if the records themselves are the obstacle, see how to track prediction market trades for taxes. You can price a year against all three treatments with our free Kalshi tax calculator.
The bottom line
Kalshi gives you a realized figure that covers closed positions only and reports nothing to the IRS, so the number that decides your year is one you build. The export and a reconciliation against Kalshi's own totals cover standard capital and gambling. Section 1256 needs two things more: a complete fill history, which means reading both the live and archived tiers rather than one, and a year-end mark for anything still open, which means pulling the right daily close and reading its timestamp in Eastern time. Everything after that is arithmetic.
Status as of October 8, 2026. The documents Kalshi issues, its API behavior and the open tax questions described here can all move.
Questions people ask
Does Kalshi send a 1099 for your trades?
Not for the trades. Kalshi's help center lists a 1099-INT for interest, a 1099-MISC for credits and rewards, a 1099-B that it defines as covering crypto transfers, and a 1099-DA for digital assets, each only above an IRS reporting threshold, so many users receive none. The Documents page in your account lists three of them, omitting the 1099-B, and states that Kalshi does not report profits or losses to the IRS. It does show a realized profit-and-loss figure and a per-position export, but that is information rather than a filed form, and it covers closed positions only.
Where do I find my Kalshi tax documents?
On the Documents page of your Kalshi account, at kalshi.com/account/taxes, reached from the account menu. Kalshi's help article still calls it Account > Tax Info. The page shows a realized profit and loss for each year with and without fees, a transactions download per year, and any 1099s issued. Forms are also delivered by email from Zenwork, Kalshi's tax form provider.
How do I calculate my Kalshi profit and loss for taxes?
Start from the transactions export on the Documents page, which gives one row per closed position with entry and exit prices and fees. Two things it will not do for you: it excludes anything still open, which is exactly what a mark-to-market regime needs, and it mixes promotional credits in with trades, though it types them separately. Rebuilding from the API instead avoids the credits but hits a different trap: recent and older fills come from two different endpoints, and reading only one silently truncates the year.
Which forms do you file for a Kalshi year?
It depends on the route the return uses, and there is no IRS guidance on how event contracts are taxed. Of the people we have seen file, the three most common routes are standard capital, on Form 8949 (box C or F, because no 1099-B arrives) totaled to Schedule D; Section 1256, on Form 6781 Part I, which sends 40% of the net to Schedule D line 4 and 60% to line 11; and gambling, with winnings on Schedule 1 line 8b and, for people who itemize, losses on Schedule A line 16.
What happens to Kalshi positions that are still open on December 31?
It depends on the route. Under section 1256 a contract held at year end is treated as sold at fair market value on the last business day of the year, so an unresolved market still produces a number on that year's return, and the mark becomes the starting point for next year. Under standard capital and gambling treatment nothing is marked and only closed positions count. Which regime applies to event contracts is unsettled.
What goes on line 1 of Form 6781?
Two terms, not three. Every position you closed during the year, at proceeds less basis less fees, plus every position still open on December 31, at the venue closing price for that day less basis. A position carried in from the previous year is not a third term: section 1256(a)(2) adjusts the gain you later realize for what was already taken into account, so the prior year mark is effectively your cost going in and subtracting it again counts it twice. Two details on the line itself: column (a) identifies the account rather than the trade, and columns (b) and (c) keep losses and gains in separate columns until they net at line 3.
Do Kalshi trades share a Form 6781 with futures or index options?
For people filing them under section 1256, yes. The form is per return, not per venue. Section 1256(b)(1) reaches regulated futures contracts, foreign currency contracts, nonequity options, dealer equity options and dealer securities futures contracts, and listed broad-based index options such as SPX are the kind ordinary investors hold without knowing this form exists. A broker reports those on a Form 1099-B carrying box 11, an aggregate figure you copy across, while an event-contract row is one you build yourself, and the two net together at line 3. That also makes the section 1212(c) carryback wider than people assume, since the prior-year gain it looks for is a section 1256 gain from any source. Whether event contracts qualify under section 1256 at all is unsettled.
How do you report a losing Kalshi year?
On the same forms as a winning year, for whichever route the return uses. Under standard capital the losing rows go on Form 8949, box C or F, and net on Schedule D, where up to $3,000 of a net loss ($1,500 married filing separately) comes off ordinary income and the rest carries forward. Under section 1256 the net loss lands on Form 6781 Part I and splits 40/60 to Schedule D; checking box D can carry it back three years against prior section 1256 gains, filed on Form 1045 or amended returns. Under gambling treatment winnings still go on Schedule 1 line 8b, and losses go on Schedule A line 16 only for people who itemize, only up to winnings, and at 90% for tax years beginning after December 31, 2025.
Keep reading
- Guide
How to Fill Out Form 6781 for Event Contracts
Form 6781 Part I for an event-contract year, line by line, in a winning year and a losing one.
Read the guide - Guide
Prediction Market Capital Gains and Form 8949
One Form 8949 row per closed position, settlement as a sale, nothing marked on December 31, and a $3,000 loss limit with an indefinite carryforward.
Read the guide - Guide
How to Track Prediction Market Trades for Taxes
What to track, how to pull your Kalshi and Polymarket history, and the mistakes to avoid.
Read the guide - Guide
How to Amend a Tax Return for Kalshi Losses
Amend up to three prior years on Form 1040-X to claim losses you never deducted. The carryback is a different move.
Read the guide