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/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_OHGET /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/senateGET /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/P000197GET /api/v1/ratings?office=ALLDifficulty-adjusted accuracy for every forecaster, model, market and pollster on resolved races.
/api/v1/ratings?office=SENMCP 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 districtchamber_outlook— Senate or House control, and what has movedforecaster_accuracy— the track record, difficulty-adjustedmember_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
- Official MCP Registry — as
com.votepredictor/elections, verified by DNS - Smithery
- github.com/koconnor-lab/votepredictor — manifest and integration docs
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.