{
  "version": "1.0",
  "verified_on": "2026-09-12",
  "verified_on_note": "Oldest of the per-platform verification dates: every number in this file was checked against its primary source on or after this date.",
  "license": "CC-BY-4.0",
  "license_url": "https://creativecommons.org/licenses/by/4.0/",
  "attribution": "PolyKal (polykal.net)",
  "attribution_url": "https://polykal.net/fee-schedule/",
  "source_urls": {
    "kalshi": "https://kalshi.com/docs/kalshi-fee-schedule.pdf",
    "kalshi_help": "https://help.kalshi.com/trading/fees",
    "polymarket": "https://docs.polymarket.com/trading/fees"
  },
  "platforms": {
    "kalshi": {
      "formula": {
        "taker": "fee = round_up_to_cent( taker_multiplier x 0.07 x C x P x (1 - P) )",
        "maker": "fee = round_up_to_cent( maker_multiplier x 0.0175 x C x P x (1 - P) )",
        "variables": "C = number of contracts, P = contract price in dollars (0.01-0.99)"
      },
      "taker_rate": 0.07,
      "maker_rate": 0.0175,
      "default_multipliers": {
        "taker": 1,
        "maker": 0
      },
      "rounding": "Each fill's fee is rounded up to the next whole cent. The schedule's formula footnote says 'centicent', but the fee table printed in the same PDF uses whole cents (1 contract at 1c = $0.01, where the raw value is $0.000693), so whole-cent rounding is what the published numbers follow.",
      "maker_fee_applies_to": "Only series whose API fee_type is 'quadratic_with_maker_fees' (or the combo variant). On every other series resting orders pay no fee.",
      "api_fields": {
        "endpoint": "GET https://api.elections.kalshi.com/trade-api/v2/series/{series_ticker}",
        "taker_multiplier": "fee_multiplier",
        "fee_type": "fee_type"
      },
      "multiplier_combinations": {
        "description": "The taker / maker multiplier combinations that occur across Kalshi series, as [taker_multiplier, maker_multiplier].",
        "standard": [
          1,
          0
        ],
        "makerfee": [
          1,
          1
        ],
        "combo": [
          1,
          2
        ],
        "half": [
          0.5,
          0
        ],
        "free": [
          0,
          0
        ]
      },
      "series_multipliers_note": "Rows listed in the fee schedule's 'Non-Standard Fees' table. A ticker ending in * is a prefix. Any series not listed uses the default multipliers.",
      "series_multipliers": {
        "KXAAAGASM": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXATPMATCH": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXBALLONDOR": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXBTCMAX150": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXBTCY": {
          "taker_multiplier": 0,
          "maker_multiplier": 0
        },
        "KXCITRINI": {
          "taker_multiplier": 0,
          "maker_multiplier": 0
        },
        "KXCPI": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXCPIYOY": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXDOED": {
          "taker_multiplier": 0,
          "maker_multiplier": 0
        },
        "KXEGGS": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXELECTIRAN": {
          "taker_multiplier": 0,
          "maker_multiplier": 0
        },
        "KXEMMYCACTO": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXEMMYCACTR": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXEMMYCSERIES": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXEMMYDACTO": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXEMMYDACTR": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXEMMYDSERIES": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXETHY": {
          "taker_multiplier": 0,
          "maker_multiplier": 0
        },
        "KXFED": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXFEDDECISION": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXGAMBLINGREPEAL": {
          "taker_multiplier": 0,
          "maker_multiplier": 0
        },
        "KXGDP": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXGREENLAND": {
          "taker_multiplier": 0,
          "maker_multiplier": 0
        },
        "KXHEISMAN": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXINXY": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXIPO": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXIRANDEMOCRACY": {
          "taker_multiplier": 0,
          "maker_multiplier": 0
        },
        "KXLALIGA": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXLAYOFFSYINFO": {
          "taker_multiplier": 0,
          "maker_multiplier": 0
        },
        "KXLLM1": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXMARMAD": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXMENWORLDCUP": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXMLB": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXMLBAL": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXMLBASGAME": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXMLBGAME": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXMLBNL": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXNASDAQ100Y": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXNBA": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXNBAEAST": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXNBAMVP": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXNBAROY": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXNBAWEST": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXNCAAF": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXNCAAFACC": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXNCAAFB10": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXNCAAFB12": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXNCAAFGAME": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXNCAAFPLAYOFF": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXNCAAFSEC": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXNFLAFCCHAMP": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXNFLAFCEAST": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXNFLAFCNORTH": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXNFLAFCSOUTH": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXNFLAFCWEST": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXNFLCOTY": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXNFLCPOTY": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXNFLDPOTY": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXNFLDROTY": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXNFLGAME": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXNFLMVP": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXNFLNFCCHAMP": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXNFLNFCEAST": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXNFLNFCNORTH": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXNFLNFCSOUTH": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXNFLNFCWEST": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXNFLOPOTY": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXNFLOROTY": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXNHL": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXNHLEAST": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXNHLWEST": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXPAHLAVIHEAD": {
          "taker_multiplier": 0,
          "maker_multiplier": 0
        },
        "KXPAYROLLS": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXPGARYDER": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXPGASOLHEIM": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXPGATOUR": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXRATECUTCOUNT": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXSB": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXSUPERBOWLHEADLINE": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXU3": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXUCL": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXUCLGAME": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXWCGAME": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXWNBA": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXWNBAGAME": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXWTAMATCH": {
          "taker_multiplier": 1,
          "maker_multiplier": 1
        },
        "KXMVE*": {
          "taker_multiplier": 1,
          "maker_multiplier": 2
        }
      },
      "known_discrepancies": [
        {
          "series": "KXMLBGAME",
          "pdf_taker_multiplier": 1,
          "api_fee_multiplier": 0.5,
          "noted_on": "2026-09-12",
          "handling": "PolyKal uses the live API value for taker fees and shows no maker figure for this series."
        }
      ],
      "effective_date": "2026-07-07",
      "source_version": "Last updated and effective: July 7, 2026",
      "source_pdf_sha256": "c326a69f596a11e8f8be2620402d39a8d4823920c21cc97c93a114d862699601",
      "verified_on": "2026-09-12",
      "verification_method": "Multiplier table transcribed from the official fee schedule PDF and compared row by row; taker multipliers re-checked every day against Kalshi's series API."
    },
    "polymarket": {
      "formula": {
        "taker": "fee = C x feeRate x p x (1 - p)",
        "maker": "fee = 0",
        "variables": "C = number of shares, p = share price in dollars (0-1), feeRate = the market's rate"
      },
      "rounding": "Fees are rounded to 5 decimal places; the smallest fee charged is 0.00001 pUSD (Polymarket's USDC-backed trading dollar).",
      "maker_rate": 0,
      "categories": {
        "crypto": {
          "label": "Crypto",
          "taker_rate": 0.07,
          "maker_rate": 0,
          "maker_rebate_pct": 20
        },
        "sports": {
          "label": "Sports",
          "taker_rate": 0.05,
          "maker_rate": 0,
          "maker_rebate_pct": 15
        },
        "finance": {
          "label": "Finance",
          "taker_rate": 0.04,
          "maker_rate": 0,
          "maker_rebate_pct": 25
        },
        "politics": {
          "label": "Politics",
          "taker_rate": 0.04,
          "maker_rate": 0,
          "maker_rebate_pct": 25
        },
        "economics": {
          "label": "Economics",
          "taker_rate": 0.05,
          "maker_rate": 0,
          "maker_rebate_pct": 25
        },
        "culture": {
          "label": "Culture",
          "taker_rate": 0.05,
          "maker_rate": 0,
          "maker_rebate_pct": 25
        },
        "weather": {
          "label": "Weather",
          "taker_rate": 0.05,
          "maker_rate": 0,
          "maker_rebate_pct": 25
        },
        "other-general": {
          "label": "Other / General",
          "taker_rate": 0.05,
          "maker_rate": 0,
          "maker_rebate_pct": 25
        },
        "mentions": {
          "label": "Mentions",
          "taker_rate": 0.04,
          "maker_rate": 0,
          "maker_rebate_pct": 25
        },
        "tech": {
          "label": "Tech",
          "taker_rate": 0.04,
          "maker_rate": 0,
          "maker_rebate_pct": 25
        },
        "geopolitics": {
          "label": "Geopolitics",
          "taker_rate": 0.0,
          "maker_rate": 0,
          "maker_rebate_pct": null
        }
      },
      "rate_is_set_per_market": true,
      "per_market_note": "The table is the published per-category schedule. Polymarket sets the rate on each market (Gamma API: feeSchedule.rate, feesEnabled), so live markets can declare a rate that differs from their category's published one. live_check in the published JSON lists, per category, the rates live markets declare and, separately, which of those were confirmed against fees actually deducted on-chain.",
      "api_fields": {
        "endpoint": "GET https://gamma-api.polymarket.com/markets?slug={market_slug}",
        "rate": "feeSchedule.rate",
        "enabled": "feesEnabled",
        "fee_type": "feeType"
      },
      "effective_date": null,
      "verified_on": "2026-09-20",
      "verification_method": "Category table compared with docs.polymarket.com/trading/fees every day; per-market rates checked daily against the fee actually deducted on-chain in real taker fills."
    }
  },
  "changelog": [
    {
      "date": "2026-07-07",
      "platform": "kalshi",
      "change": "Fee schedule currently in force takes effect (the version this file transcribes).",
      "source": "https://kalshi.com/docs/kalshi-fee-schedule.pdf"
    },
    {
      "date": "2026-09-12",
      "platform": "kalshi",
      "change": "Full Non-Standard Fees table (87 rows) transcribed and checked against the PDF. Noted that KXMLBGAME is listed with taker multiplier 1 while the series API returns 0.5.",
      "source": "https://kalshi.com/docs/kalshi-fee-schedule.pdf"
    },
    {
      "date": "2026-09-20",
      "platform": "polymarket",
      "change": "Documented that rates are set per market: NFL and college-football game markets are charged 0% and season-long futures 3% while the published Sports rate is 5%. Confirmed against fees deducted on-chain. No change to the published category table.",
      "source": "https://docs.polymarket.com/trading/fees"
    },
    {
      "date": "2026-09-21",
      "platform": "both",
      "change": "Version 1.0 of this dataset published.",
      "source": "https://polykal.net/fee-schedule/",
      "rates_sha256": "7de508b4a13a00cda3eff1be2da1e1a9a59818a4dfc4a8dc5dc1332842e61444"
    }
  ],
  "data_url": "https://polykal.net/data/fees.json",
  "live_check": {
    "checked_at": "2026-10-12T08:36:30Z",
    "method": "Most-traded open Polymarket events sampled per category; for each category/rate pair up to 5 real taker fills are read from the Polygon chain and the fee actually deducted is compared with shares x rate x p x (1 - p).",
    "polymarket_declared_rates_on_live_markets": {
      "sports": [
        0.03,
        0.05
      ],
      "politics": [
        0.0,
        0.04
      ],
      "geopolitics": [
        0.0
      ],
      "crypto": [
        0.07
      ],
      "economics": [
        0.05
      ],
      "culture": [
        0.05
      ],
      "finance": [
        0.04
      ],
      "weather": [
        0.05
      ],
      "tech": [
        0.04
      ],
      "mentions": [
        0.04
      ]
    },
    "polymarket_onchain_verified": [
      {
        "category": "crypto",
        "declared_rate": 0.07,
        "status": "verified",
        "fills_checked": 2,
        "measured_rates": [
          0.07
        ]
      },
      {
        "category": "culture",
        "declared_rate": 0.05,
        "status": "verified",
        "fills_checked": 5,
        "measured_rates": [
          0.049983,
          0.05
        ]
      },
      {
        "category": "economics",
        "declared_rate": 0.05,
        "status": "verified",
        "fills_checked": 4,
        "measured_rates": [
          0.05
        ]
      },
      {
        "category": "finance",
        "declared_rate": 0.04,
        "status": "verified",
        "fills_checked": 5,
        "measured_rates": [
          0.039998,
          0.039999,
          0.04
        ]
      },
      {
        "category": "geopolitics",
        "declared_rate": 0.0,
        "status": "verified",
        "fills_checked": 5,
        "measured_rates": [
          0.0
        ]
      },
      {
        "category": "mentions",
        "declared_rate": 0.04,
        "status": "verified",
        "fills_checked": 2,
        "measured_rates": [
          0.04
        ]
      },
      {
        "category": "politics",
        "declared_rate": 0.04,
        "status": "verified",
        "fills_checked": 5,
        "measured_rates": [
          0.039991,
          0.039996,
          0.04
        ]
      },
      {
        "category": "politics",
        "declared_rate": 0.0,
        "status": "verified",
        "fills_checked": 4,
        "measured_rates": [
          0.0
        ]
      },
      {
        "category": "sports",
        "declared_rate": 0.05,
        "status": "verified",
        "fills_checked": 5,
        "measured_rates": [
          0.049999,
          0.05
        ]
      },
      {
        "category": "sports",
        "declared_rate": 0.03,
        "status": "verified",
        "fills_checked": 5,
        "measured_rates": [
          0.029974,
          0.029988,
          0.029998,
          0.03
        ]
      },
      {
        "category": "tech",
        "declared_rate": 0.04,
        "status": "verified",
        "fills_checked": 5,
        "measured_rates": [
          0.039996,
          0.039999,
          0.04
        ]
      },
      {
        "category": "weather",
        "declared_rate": 0.05,
        "status": "verified",
        "fills_checked": 2,
        "measured_rates": [
          0.049948,
          0.04998
        ]
      }
    ],
    "kalshi_api_vs_table": {
      "series_checked": 86,
      "mismatches": [
        "KXMLBGAME"
      ]
    }
  }
}
