Trade history
Buy a date range once and download one file per wallet per day.
Trade history: one-off
By the day, and the rate falls as the range grows. The tiers are marginal: a 90-day range is charged $0.07 for its first 30 days, $0.06 for the next 30 and $0.05 for the last 30, $5.40 in all. The later tier never reprices the earlier days.
Per-day rate, per entity (several entities cost that many times the price):
| Days | Per day |
|---|---|
| 1–30 | $0.07 |
| 31–60 | $0.06 |
| 61–90 | $0.05 |
| 91–180 | $0.03 |
| 181–365 | $0.02 |
| 366+ | $0.01 |
The first 90 days cost more because recent activity helps assess a wallet’s performance now.
Minimum 30 days, maximum 25 entities per order. This is a one-off purchase; you keep the data without renewing.
Exports: price a range first
A quote is free and is not stored. It does not read data about the wallets you name. The price depends on the date range and how many entities it covers. It does not report a row count: an exact count over a range identifies a wallet, and a free quote would then be a way to test an address against a board handle. The real count is on the order once it is bought.
curl -X POST https://api.pmwallets.com/v1/account/exports/quote \ -H 'content-type: application/json' \ -H "Authorization: Bearer $PMW_KEY" \ -d '{"entityIds":["0x9a3f…21e8"],"from":"2026-06-01","to":"2026-08-29"}' # → 201 (a POST, although nothing is created)
{ "window": { "from": "2026-05-04", "to": "2026-09-19", "days": 139 }, "from": "2026-06-01", "to": "2026-08-29", "days": 90, "sellable": true, "entities": 1, "orderPriceCents": 540, "perEntityCents": 540, "discount": 1, "price": { "cents": 540, "usd": 5.4, "cny": 35 }, "breakdown": [ { "fromDay": 1, "toDay": 30, "days": 30, "perDayCents": 7, "cents": 210 }, { "fromDay": 31, "toDay": 60, "days": 30, "perDayCents": 6, "cents": 180 }, { "fromDay": 61, "toDay": 90, "days": 30, "perDayCents": 5, "cents": 150 } ] }
A range we cannot sell comes back with sellable: false and a reason, below_minimum or no_data, without an error. A date picker can show the range and explain why it is unavailable. window is the span we actually hold; anything you ask for is clamped into it.
GET /v1/account/exports/window returns that span with the four quick ranges (30, 60, 90 days, and everything) already priced.
Exports: buy, then download
Same body as the quote. The server recomputes the price from the rate card. The displayed quote is not used to calculate the charge. The files are already available: the order comes back ready, because what you buy is access to files that already exist. We write one file per wallet per UTC day once that day has closed, so the newest day on sale is yesterday. Buying spends one unit of the daily distinct-entity allowance per entity (403 past it); the quote spends none.
# same body as the quote, plus the price you accepted as a ceiling — the price is recomputed here, # and if it is now above maxPriceCents nothing is charged: 409 price_changed with the new quote curl -X POST https://api.pmwallets.com/v1/account/exports \ -H 'content-type: application/json' -H "Authorization: Bearer $PMW_KEY" \ -d '{"entityIds":["0x9a3f…21e8"],"from":"2026-06-01","to":"2026-08-29","maxPriceCents":540}' # → 201 {"id":"7c1e…","priceCents":540,"days":90,"rows":12483,"status":"ready"} # the files it grants: one per wallet per UTC day (a wallet with no fill that day has none) curl https://api.pmwallets.com/v1/account/exports/7c1e…/files -H "Authorization: Bearer $PMW_KEY" # → {"files":[{"wallet":"0x5b71…0cd2","day":"2026-06-01","rows":212,"bytes":9841, # "path":"/v1/account/data/0x5b71…0cd2/2026-06-01"}, …]} # each path answers with a 302 to a short-lived link; -L follows it curl -L -o 0x5b71…0cd2-2026-06-01.csv.zst \ https://api.pmwallets.com/v1/account/data/0x5b71…0cd2/2026-06-01 -H "Authorization: Bearer $PMW_KEY"
GET /v1/account/exports/:id/files lists what an order grants; GET /v1/account/data/:wallet/:day checks that your account bought that wallet on that day and answers with a 302 to a signed link that lasts 5 minutes. Both take an API key. Links are minted per request and never stored; the files do not expire, so fetch them again whenever you need to. A wallet with no fills on a day has no file for it, and asking for one is the same 404 as asking for a day you did not buy.
Each file is a zstd-compressed CSV (.csv.zst), oldest first. The wallet and day are in the path, so they are not repeated on every row; amounts are the ledger integers (6 decimals). pandas, polars and DuckDB read .csv.zst directly.
ts,block,blockHash,txHash,logIndex,exchange,side,role,tokenId,price,shares,usdc,fee 2026-06-01 14:02:11,93912410,0x8f2c…,0x4d0e…,41,pm_ctf_v2,BUY,taker,3200000000…,0.57,3200000000,1824000000,0
The export contains the full on-chain ledger rather than an API sample. Polymarket’s own trade endpoint stops at 10,000 historical trades per wallet; that cap does not exist here because the rows are read from the Polygon logs we ingest, and an entity’s addresses are all included, one file per address.