How to export your Polymarket trade history for your records
Five ways to get a complete, per-transaction record out of Polymarket or Polymarket US — and the defaults that silently cut it short.
On international Polymarket the record is public: page the Data API's activity feed for your wallet address, from the beginning and with every activity type, or hand the address to a tool that does it and writes the CSV. On Polymarket US the record is your account's, read with signed keys. Either way, a trade list alone is not the whole record: splits, merges, redemptions, rewards and transfers move money without being trades.
The short way
Find the address that holds your positions, then page the activity feed for it from the very beginning, with every activity type, until the cursor runs out. Everything else on this page is a way of doing that without writing the loop, or a reason the obvious version comes back short.
Polymarket's Data API is keyless and free, and its GET /v2/activity
route is the account's timeline rather than its trades: the OpenAPI description calls it an
activity feed of "trades, splits, merges, redeems, …", ordered by block timestamp, up to 1,000 rows
a page, paged by an opaque cursor until next_cursor comes back null. The two parameters that make
it complete are the ones a first draft leaves out.
# Full history: start=1 (omitting start floors the window to three years back).
# Deposits and withdrawals are excluded unless you say otherwise.
curl "https://data-api.polymarket.com/v2/activity?user=YOUR_WALLET_ADDRESS&start=1&limit=1000&sort_direction=ASC&exclude_deposits_withdrawals=false"
# Then repeat with &cursor=NEXT_CURSOR_FROM_THE_RESPONSE, keeping sort_direction, until next_cursor is null.
Each row carries type, timestamp, condition_id, token_id, outcome, side, size in
shares, usdc_size in collateral, price and transaction_hash, which is the part an accountant
or an auditor actually wants: every line can be found again on Polygon by anyone. Save the raw JSON
as well as whatever spreadsheet you flatten it into, because the flattening is where decisions get
made.
What the options are
polymarket-client, Polymarket's own Python SDK, wraps the same feed.
Its list_activity method pages for you, takes an activity_types filter, and accepts
full_history=True so that the default window does not quietly drop the start of an old account.
Data API v2 support arrived in version 0.10.0 on 10 September 2026, and the library is on a 0.x line
whose minor releases break things, so pin the version you exported with.
PolyTaxes is the version for someone who wants the rows already matched. It takes a public address, a profile URL or a username — no key, no signature — and reads the chain itself, decoding order-book buys and sells, splits, merges, redemptions, neg-risk conversions, token transfers, deposits, withdrawals and maker rebates, then matches lots first in, first out. The output is a Form 8949 CSV, a Schedule D summary, a transaction list and a TurboTax upload file. The preview is free and shows the totals; the files are 29 US dollars per tax year, and the vendor's own pages state that price three different ways, so confirm before paying for more than one wallet. Wash-sale flagging is on by default, which is a treatment choice, not a reading of the record.
PredictFolio is free and lighter. Its beta yearly transaction report covers each verified wallet, with realised profit and loss and fees, as a PDF or a CSV. It does not say which cost-basis method it uses or which country's rules it follows, so it is a ledger to hand on rather than a form. Its importer will take another venue's export, Kalshi's included, so a two-venue year can sit in one place.
The Polymarket US API is a different system under the same brand, and
nothing above reaches it. Polymarket US is a regulated exchange run by QCX LLC, settling in dollars
in an account rather than on a chain, so there is no address to paste. Your history comes from
GET /v1/portfolio/activities on the signed trading host, filtered by type — trades, position
resolutions, deposits, withdrawals, referral bonuses, transfers, taker-fee rebates and liquidity
program payments — and paged by cursor. Each trade row carries its price, a decimal quantity, a
cost basis, realised profit and loss, and whether you were the taker. The exchange's institutional
reporting track adds CSV downloads and two streaming ledger exports, position and cash, that start
on 1 May 2026 and cannot reach before it.
Where this breaks
The default window is three years, not forever. On /v2/activity and /v2/trades, an omitted
or zero start floors to three years back; the description says to pass start=1 for full
history. An account from the 2022 or 2023 cycle exported with the default looks complete and is
not. The SDK's full_history=True exists for the same reason.
A trade list is not the record. /v2/trades is the obvious endpoint and the wrong one for this
job. It serves fills only — and by default each fill once, on its taker side, above a minimum size
of 0.01 — so a maker's resting orders, splits, merges, redemptions, rewards and rebates are all
missing. Splitting collateral into a YES and NO pair, merging a pair back, redeeming after
resolution and converting in a multi-outcome market each move value with no trade attached, and a
position closed by redemption has no sell at all. That is why the activity feed, not the trade
feed, is the export.
Some rows are opt-in even on the activity feed. Deposits and withdrawals are excluded unless
exclude_deposits_withdrawals=false is passed — the wallet-activity page notes they stay excluded
"even when type requests them". Tips, user-to-user collateral transfers that are not trades, are
never in the default set and appear only when TIP is named in type.
A partly filled order is several rows with nothing joining them. The activity row has no order identifier: an order that filled against three counterparties in three transactions is three rows, each with its own hash, size and price. Summing them is your step, and so is deciding whether they are one lot or three. On Polymarket US the documentation draws the line explicitly — an execution is a state change on one order, a trade is a matched event between two, and a trade moves through states before it is final — so filter on state before you sum.
There is no fee column on the row. The v2 activity schema carries price, size and usdc_size
and no fee field; Polymarket's position objects carry entry fees separately and already exclude
them from entry cost. Whatever reconciles your cash has to bring fees and rebates in from those
other rows rather than out of the trade line.
"USDC" in a field name is not USD, and is no longer even USDC. Trading collateral on Polymarket
is now pUSD, an ERC-20 on Polygon backed by USDC and wrapped from USDC.e, while the API's fields
are still named usdc_size and entry_cost_usdc. None of it is a dollar amount in a bank. A
record that needs a fiat value per row needs a dated conversion the export does not provide, and
some practitioners treat the stablecoin leg as its own layer — which is exactly the question
PolyTaxes' pages leave unanswered. Polymarket US rows are in dollars and have no such leg.
The wrong address returns an empty, valid history. Polymarket trades from a smart wallet, not
the key that signs: a Deposit Wallet for accounts created from 4 May 2026, a Proxy wallet for older
email and Google logins, a Safe for older browser-wallet logins. The address the API keys rows on
is proxy_wallet. Paste the signer and the feed answers with nothing, which reads like a quiet
year. Several addresses are several exports, and the totals do not deduplicate themselves.
Two Polymarkets, two records, never one. A US resident on Polymarket US and anyone who also traded the international venue holds two histories in two units under two operators, and no tool on this page reads both. PolyTaxes says plainly that off-chain US activity cannot be inferred from a wallet. Keep them as separate record sets.
If you outgrow this
If the export becomes a recurring job rather than a once-a-year one, pull it monthly and keep the raw pages: a retrieval floor like Polymarket US's 1 May 2026 is not something you can wait out, and the Data API's own v1 routes retire on 24 October 2026, so a script written against them stops then. If you want the same events without trusting anyone's API at all, the transaction hashes are the bridge to the chain itself — what wallet tracking shows covers what that record can and cannot tell you. And for which venue sends paperwork, and whether it is a form or a statement, read who sends you a tax form before January rather than in it.
The approaches, in order
Cards in the catalogue that do this, ordered editorially. Paid placement does not affect this order.
1.Polymarket Data API
Page /v2/activity yourself, keyless: every row a trade, split, merge, redeem, reward or transfer, with a transaction hash to check it against the chain.
Polymarket's keyless read API for trades, positions, holders and price history.
FreeFree tier
2.polymarket-client
Polymarket's own Python SDK, whose list_activity walks the cursor for you and takes full_history=True so the default window does not cut the start off.
Polymarket's own unified Python SDK - sync and async, data through order signing.
FreeFree tierOpen source
3.PolyTaxes
Paste a public address and get the whole history lot-matched FIFO into Form 8949 and TurboTax CSVs — 29 USD a tax year, preview free.
Turns a Polymarket wallet's on-chain history into Form 8949 rows and a TurboTax CSV.
$29 onceFree tier
4.PredictFolio
Free, with a beta yearly transaction report per verified wallet as PDF or CSV, and an importer for a Kalshi export beside it.
Free Polymarket P&L tracker for any wallet, with a yearly PDF or CSV tax report in beta.
FreeFree tier
5.Polymarket US API
The US exchange, a different system — your account's activities over Ed25519-signed REST, in dollars, with no wallet address involved.
A keyless public gateway for reading, and a signed key behind KYC for trading.
Per-trade feeFree tier
FAQ
Does Polymarket send me a statement or a tax form?
The international, on-chain Polymarket holds no account in your legal name and we found nothing it issues at year end; the record is the chain, read through its Data API. Polymarket US is a regulated exchange with KYC, but we could not find a document of its own saying which forms it issues or when. The guide on who sends you a tax form has the detail.
Which address do I export — the wallet I log in with, or another one?
The one that holds your positions. Polymarket trades from a smart wallet — a Deposit Wallet for accounts created from 4 May 2026, a legacy Proxy or Safe wallet before that — and the Data API returns it as proxy_wallet. A signing key or a browser-extension address that only signs will show an empty history.
Is this page telling me how to report the result?
No. It covers what a complete record contains and how to get it out. Whether a position is a capital asset, what cost-basis method applies and which form it goes on are questions for your tax authority and your adviser. PolyTaxes, the one product here that fills a form, says the same in its own FAQ.
Sources
- Wallet Activity — Polymarket, read
- Polymarket Data API v2, OpenAPI description (/v2/activity and /v2/trades parameters) — Polymarket, read
- Migrate from Data API v1 to v2 — Polymarket, read
- Polymarket USD — Polymarket, read
- Wallets and Authentication — Polymarket, read
- Get Activities (GET /v1/portfolio/activities) — Polymarket US, read
- Reporting Data (trader guide) — Polymarket US, read
The catalogue next door
This page names a handful of cards. The rest of them are in Prediction Market Analytics & Dashboards, each filled in against the same schema, with the fields to narrow it yourself.
Last updated . Corrected in place: this is a reference page, not a dated post.