Sign each request with a fresh HMAC signature. The cURL and HTTP header values below are placeholders, not reusable credentials. For runnable signing code, use request signing examples. Python examples use the signed session from that page; Node.js examples use its
bravadoFetch helper.The problem
Prediction-market gains and losses need to be reported to tax authorities in most jurisdictions. On Polymarket, that means reconstructing every disposition (sale, merge, market resolution) with cost basis and proceeds; collecting the cash from a position that already resolved (a redemption) is a cash event, not a second disposition, over an entire tax year, and producing a document a preparer can hand to the tax authority. Wallet-level exports from Polymarket’s UI do not contain the required fields.What Bravado provides
- Tax reports via
GET /traders/{address}/tax-reportwith per-disposition detail and summary totals. - R1 statements via
GET /traders/{address}/statements/r1for standalone access to disposition rows without the parent wrapper. - Reconciliation statements via
GET /traders/{address}/reconciliationcross-checking Bravado’s computed balance against on-chain state. - PMWAS methodology documented in PnL methodology so a preparer can verify the numbers.
What each response states it cannot compute
Every tax-report response names its source indisclosure. Wallets in the PMWAS batch carry per-lot acquisition dates, SHORT/LONG terms and per-year income and flows. For every other wallet (disclosure.source: "engine-fallback"):
date_acquiredandtermare"UNKNOWN"on every 8949 row, andshort_term/long_termarenull: no holding period is claimed that cannot be computed.income_total_uusdc,deposits_uusdcandwithdrawals_uusdcarenulland listed innot_computed, never0. All-time program income isincome_all_timeand is not innet_taxable_uusdc.- Fees are inside proceeds and cost basis:
fees_uusdcis a memo andfees_deducted_from_net_taxableisfalse. - A redemption of an already-resolved position is a cash event reported as
years[].redemption_cash, not a disposition row. total_rows(andX-Total-Rowson the CSV) is the number of rows in the whole period; a CSV withoutlimitstreams all of them.
APIs used
Worked example
Generate a year-end statement CSV for a client wallet:UNKNOWN (see above).
Product patterns
- Turbotax-style import. Serve dispositions as CSV in the format a specific tax software ingests.
- CPA workflow. Bulk download for a portfolio of client wallets.
- Live tax dashboard. Show projected year-to-date liability with per-market drill-down.
Verifying the numbers
Every disposition returned by the API can be reconstructed from the underlying fills using the PMWAS methodology. If a client’s preparer disputes a number, cross-check by pulling the raw fills fromGET /traders/{address}/trades and applying the standard.