Skip to main content
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-report with per-disposition detail and summary totals.
  • R1 statements via GET /traders/{address}/statements/r1 for standalone access to disposition rows without the parent wrapper.
  • Reconciliation statements via GET /traders/{address}/reconciliation cross-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 in disclosure. 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_acquired and term are "UNKNOWN" on every 8949 row, and short_term / long_term are null: no holding period is claimed that cannot be computed.
  • income_total_uusdc, deposits_uusdc and withdrawals_uusdc are null and listed in not_computed, never 0. All-time program income is income_all_time and is not in net_taxable_uusdc.
  • Fees are inside proceeds and cost basis: fees_uusdc is a memo and fees_deducted_from_net_taxable is false.
  • A redemption of an already-resolved position is a cash event reported as years[].redemption_cash, not a disposition row.
  • total_rows (and X-Total-Rows on the CSV) is the number of rows in the whole period; a CSV without limit streams all of them.

APIs used

Worked example

Generate a year-end statement CSV for a client wallet:
Each row of a PMWAS-batch wallet has enough detail to file a Form 8949-style report; for other wallets use the tax-report 8949 rows, whose acquisition date and term are 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 from GET /traders/{address}/trades and applying the standard.
Bravado provides accounting data, not tax advice. Confirm the correct treatment of prediction-market gains and losses in your jurisdiction with a qualified tax professional.