VotePredictor
For developers

API & MCP server

Everything on this site is available as JSON, and as an MCP server an assistant can call directly. Free, no key; the REST API has no rate limit worth mentioning and the MCP server allows 100 requests a day per address. Attribution to votepredictor.com is the only ask. Forecasts rebuild daily; last run 2026-10-10.

What it covers

House districts forecast
435House districts forecast
Senate races
35Senate races
Governor races
36Governor races
races with a race id
506races with a race id
REST endpoints
5REST endpoints
MCP tools
4MCP tools
forecasters & pollsters rated
63forecasters & pollsters rated

Forecasts last recomputed 2026-10-10. Counts are read from the published data at build time, not written down.

JSON API

Base URL https://votepredictor.com/api/v1. CORS is open, responses are edge-cached, and the index is self-describing — an agent can work out every call from it without reading this page.

GET /api/v1

A self-describing index. An agent can work out every call below from it.

/api/v1
GET /api/v1/race/{race_id}

One race: win probability, predicted margin, whether it came from polls or fundamentals, how far it has moved, and the candidates.

/api/v1/race/2026_SEN_OH
GET /api/v1/chamber/{senate|house}

Control probability, expected seats with an 80% range, every seat on the ballot, and the races that have moved most.

/api/v1/chamber/senate
GET /api/v1/member/{bioguide_id}

A member of Congress: party, state, ideology, reported net worth, and the 2026 race for their seat.

/api/v1/member/P000197
GET /api/v1/ratings?office=ALL

Difficulty-adjusted accuracy for every forecaster, model, market and pollster on resolved races.

/api/v1/ratings?office=SEN

MCP server

Streamable HTTP, so there is nothing to install — point a client at the URL. Tools take what a person actually says (“Ohio”, “CA-12”, “Pelosi”) rather than ids you would have to look up first.

{
  "votepredictor": {
    "url": "https://votepredictor.com/api/mcp"
  }
}
  • forecast_race — one 2026 race, by state or district
  • chamber_outlook — Senate or House control, and what has moved
  • forecaster_accuracy — the track record, difficulty-adjusted
  • member_profile — a member of Congress and their race

Three conventions

These are what make the data safe to quote. Please carry them through — an answer built on this should be no more confident than the forecast behind it.

Nothing is certain. p_dem_win is the Democratic win probability, clamped to 0.01–0.99. An election that has not happened is never 0% or 100%, however safe the seat.

Provenance is always stated. source is polls or fundamentals. Nobody surveys Wyoming, so its forecast comes from state lean, incumbency, the seat's prior result and the national environment instead. Statewide, polls lead wherever they exist — the poll model is shrunk toward that fundamentals forecast by inverse variance, about 7% of the weight — and the fundamentals model agrees with it on all 10 safe races and 10 of 13 competitive ones among the seats holding both. For a House district, polls means the district poll average is blended into the district model, never that it replaces it; n_polls says how many.

Some races publish nothing. Where a candidate has left the ballot, the endpoint returns forecast: null with a reason instead of a number. The stored probability describes a matchup that no longer exists. A race we hold nothing for returns 404 — a different answer, deliberately.

Also listed on

How the forecasts are made: methodology. How accurate they have been: the track record. A plain-text summary for crawlers lives at /llms.txt.

Something missing, or a field you need? The data behind every page is already public — open an issue on GitHub.