# Polymarket 2026 US midterm scorecard: methods, frozen before the election

Vultax Research, OmniOS OÜ, Tallinn. Questions and corrections: research@vultax.com.
Protocol version v1, frozen 17 October 2026. Published before the 3 November 2026 general election. The result is not known and is not on this page.

## The question

How did every in-scope Polymarket contract about the 2026 United States midterm elections perform against the result it was about, at prices captured before the result? Polymarket is an international venue; this study measures its prices and says nothing about who its users are.

## Universe

Every market of every event in Polymarket's public Gamma catalogue that carries the `midterms` tag, open or already closed at the freeze, plus 45 events found by a title screen of 22 related tags and the whole active catalogue and confirmed by hand (California's governor, lieutenant governor and propositions, state ballot measures, Senate-and-governor combinations). The sweep finished at 03:34:08 UTC on 17 October 2026 and found 1,352 events with 13,186 markets. Every discovered contract keeps a row in the manifest, scored or not.

The manifest (`manifest-v1.json`, `manifest-v1.csv`) records, per contract: Gamma market id, condition id, question id, event id and slug, question and outcome labels, Yes and No token ids, negative-risk flag, category, party or candidate subject, race key, scoring tier, a placeholder flag, creation and end dates, resolution source, the full rule text, tags and the capture time; the JSON also carries one record per event with its description. The manifest's SHA-256 (`5b607bded8bd47c8f41ec083f54d6319d7178027c7914c64ab77f069c4a79dca`) covers the canonical JSON of the events and rows without the capture time. Prices are not part of the manifest; the Gamma fields seen at the freeze are in `freeze-snapshot-v1.json` with their own hash.

Coverage limit, stated plainly: Gamma's offset paging stops at 2,400 events per query, so the sweep combined 22 tag queries, open and closed, with a pass over all 22,858 events of the active catalogue through the keyset endpoint. An event that carries none of the swept tags, has no midterm word in its title and is not in the manual list is not in the universe. "Every" means every contract the public catalogue exposed under those rules at the freeze time, nothing more. The manual decisions, with reasons, are in `manual-review.json` inside the code bundle.

Three tiers. Tier A, 4,552 contracts: race winners and chamber control (Senate, House and governor winners; which party controls each chamber). Tier B, 7,254 contracts: other contracts settled by the general election (margins, seat counts, county winners, turnout, ballot measures, other statewide offices, combinations whose every leg is an election result, exit-poll shares). Tier C, 1,380 contracts, listed and never scored: contracts determined before the freeze (1,058, mostly primaries), contracts settled by something other than an election outcome (a forecaster's or the venue's own odds, a campaign event, a leadership vote, a redistricting decision), and combinations with a non-election leg (an oil price, a ceasefire, a bill).

Placeholder outcomes: 2,621 listed outcomes carry a lettered stand-in label (Candidate A, Party B). They keep their rows and are scored in the all-contracts tables, but they are left out of the Tier A means and calibration bins, because a stand-in that never names a person is a near-certain No and would flatter the average.

Markets Polymarket lists after the freeze are not added to version 1. Each checkpoint capture re-sweeps the tag; new markets go to a separately versioned supplement that is scored and reported on its own.

## Clocks

Primary checkpoint 2 November 2026, 23:59:59 UTC. Secondary checkpoint 27 October 2026, 23:59:59 UTC. Captures run hourly from 25 October to 4 November and every five minutes around both checkpoint instants. The checkpoint reading comes from the latest capture that finished at or before the instant whose order-book requests answered for at least 99% of manifest tokens; a token the venue holds no order book for is an answered request and becomes a contract without a two-sided quote. If no capture reaches 99%, the best earlier capture is used and the shortfall reported. A capture that finished after the instant is never used for that checkpoint. No reading is carried forward from an earlier capture, and no later trade or revised end date chooses the forecast timestamp.

## Prices

Primary price: the midpoint of the best bid and best ask of the Yes token's order book in the checkpoint capture. A contract has a price only if that book shows at least one bid and one ask; otherwise it is `no_two_sided_quote`, stays in every table, and is counted as missing. A spread wider than 10¢ keeps its price and is flagged `wide`; Tier A is reported with and without wide rows. The last trade price from the same book record, the price Polymarket displays (Gamma `outcomePrices`) and the CLOB midpoint endpoint are kept as secondary readings. No normalisation in the primary analysis; for multi-outcome events a sensitivity divides each Yes midpoint by the event's sum when that sum lies between 0.90 and 1.10. Probability scoring only: no fees, order sizes, executable profit or strategy are computed or implied.

## Two outcome records

Record 1, official: the result published by the state or territorial election authority, as unofficial counts and then certified totals, with the source URL and retrieval time. An Associated Press call is recorded as an interim status, never as the official record. Statuses: pending, called, unofficial complete, certified, recount, runoff pending, contested.

Record 2, venue: Polymarket's own payout, read from Gamma (outcome prices of exactly 1 and 0 with resolution status resolved, closing time, dispute statuses). Statuses: open, proposed, disputed, resolved yes, resolved no, resolved split, voided.

The official record decides the scoring outcome wherever it can; the venue record is shown beside it and any disagreement is flagged and listed. Where no election authority answers the question (a bucket read from the venue's named source), the venue record decides and the row is flagged `venue_only`. Voided, cancelled or split resolutions are excluded from every mean and counted. A contract without an outcome at a scoring run is pending: shown with its price, excluded from that run's means, filled in a later dated run. A contract whose rule text changed between the freeze and a checkpoint is flagged `rules_changed`, scored on the frozen text and listed.

## Score

Brier score per contract, (p − o)². Contract-level mean by tier and in total; Tier A means exclude placeholders. Race-level mean: each race's contracts are averaged first and races carry equal weight, so a race with many contracts does not count as many independent results. Favourites: for every Tier A race the highest-priced contract at the checkpoint is its favourite; a table reports, per 10¢ band, how many favourites there were and how many won, and the Brier mean over favourites. For multi-outcome events, the multi-class Brier sum is a secondary table. Calibration: ten bins of width 10¢ with contract count, mean price and share resolved Yes, for Tier A and for all scored contracts. Baselines on the same contracts: a constant 0.5 (Brier 0.25) and the 27 October price, so the last week's information is measured on matched questions. Log loss with prices clipped to [0.01, 0.99] is secondary. Uncertainty: a cluster bootstrap over race keys, 2,000 resamples, seed 20261103, 90% intervals. No comparison with polls, forecasters or another venue is made in this release: none has a matched, rights-cleared benchmark. One election supplies limited independent information, and the text will say so.

## Runs and release

Run 1 on 4 to 6 November 2026 is a first cut labelled by status, using called and unofficial-complete results where they exist. Later dated runs add certifications, recounts and runoffs and never rewrite an earlier run's file, the checkpoint captures or the manifest. Every release carries per-contract rows (CSV and JSON), the calibration and favourites tables, the bootstrap intervals, field definitions, capture receipts with SHA-256, the scoring code and this document. Corrections are dated and say what changed, why, and which figures moved.

## Code

`enumerate.mjs` (the sweep and manifest), `capture.mjs` (checkpoint captures), `score.mjs` (the scoring run), all in the `code` folder of the published bundle with `manual-review.json`. Their SHA-256 at the freeze are in `rules-hashes-v1.json`. Public endpoints only, no account.
