Fees
Exactly how Kalshi and Polymarket fees are modeled, with formulas, rounding, and primary sources.
Fees decide whether high-frequency prediction-market strategies are viable, so PredArena models them explicitly and stamps every trade with the fee formula, multiplier, liquidity role, and the source URL used — auditable from your CSV exports.
Kalshi — taker fees
fee = ceil_to_cent( multiplier × contracts × price × (1 − price) )- General taker multiplier: 0.07 (official fee schedule).
- Per-series and per-event multiplier overrides are fetched from Kalshi's API metadata and applied when present.
- Fee waivers: markets with an active
fee_waiver_expiration_timeare treated as $0, exactly as the venue does. - Rounding: fees round UP to the next cent (Kalshi's fee-rounding doc). PredArena applies ceil-to-cent per ORDER across its fill legs.
Kalshi — maker fees (modeling assumption)
Kalshi charges maker fees only on designated series (the general maker multiplier on those is 0.0175); most markets charge makers nothing. Kalshi's API metadata does not reliably expose which series charge makers, so PredArena treats ALL resting-order fills as $0 maker fees and labels them maker_default_zero. If you run a maker-heavy strategy on a maker-fee series, real costs will be higher — check your series against the official fee schedule PDF.
Polymarket — category-based taker fees
Verified June 2026 against Polymarket's fee docs and live per-market feeSchedule payloads (a top-100-markets survey matched the documented table exactly). Takers pay; makers never do. Most categories took effect March 30, 2026:
| Category | Taker rate (multiplier) |
|---|---|
| Crypto | 0.07 |
| Sports | 0.03 |
| Finance / Politics / Tech / Mentions | 0.04 |
| Economics / Culture / Weather / Other | 0.05 |
| Geopolitics | 0 (fees disabled) |
fee = contracts × rate × price × (1 − price) // rounded to 5 decimals, min 0.00001 USDCPolymarket's CLOB API reports taker_base_fee = 1000 bps on every fee-enabled market regardless of category — it is a fees-enabled flag / protocol upper bound, NOT the charged rate. PredArena reads the authoritative per-market feeSchedule from the Gamma API instead, and only falls back to the bps field (labeled as an upper bound) when no schedule is present.
Auditing fees on your trades
Every order response and trade record carries a fee_model object: fee_type, fee_multiplier, liquidity_role (taker/maker), the human-readable formula, and source / source_url. If you ever disagree with a fee, the receipt tells you exactly which rule produced it.