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, no rate limit worth mentioning. Attribution to votepredictor.com is the only ask. Forecasts rebuild daily; last run 2026-08-26.

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 this cycle, and the candidates. Race ids are {year}_{OFFICE}_{location}491 on file, e.g. 2026_SEN_OH, 2026_HOUSE_CA-12. The API covers the current cycle; resolved races back to 1998 are published as pages rather than JSON, and their ids return not_in_api with a link.

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

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

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

A member of Congress: party, ideology score, reported net worth from financial disclosures, and the 2026 race for their seat.

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

Difficulty-adjusted accuracy for every forecaster, model, prediction market and pollster on resolved races — the answer to “whose forecast should I trust”.

/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 and the national environment instead. Polls take precedence wherever they exist: measured against the seats holding both, the fundamentals model agrees with the poll-driven one on 15 of 16 safe races but only 3 of 7 competitive ones.

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.

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.