Data & API

Everything on this site is static, CORS-open JSON/GeoJSON — free to use with attribution

How it works

There's no server — every dataset is a static file served from this site (GitHub Pages), refreshed every ~10 minutes (~2 min for results on Election Day). All files are CORS-enabled, so you can fetch() them directly from the browser. Please cache politely and credit "2026 Turnout & Results Tracker."

Endpoints

WhatPath
State registryassets/states.json
Status manifest (all states + results)data/status.json
State turnout (per state)data/<st>/latest.json
State turnout historydata/<st>/history.jsonl (one JSON per line)
County result margins (per state)data/<st>/results_county.json
Final archive (after certification)data/<st>/final_2026_general.json
Results (by office)data/results/{senate,governor,house,measures}.json
Race slate + chambersconfig/results_races.json, config/chambers.json
County geometryassets/<st>-counties.geojson (AK: -boroughs, LA: -parishes)
National states geometryassets/us-states.geojson
Town→county crosswalksassets/crosswalks/<st>-town-county.json

Turnout schema (latest.json)

{
  "state": "fl", "state_name": "Florida",
  "election": { "date": "2026-11-03", "name": "2026 General" },
  "source_compiled": "...", "generated_at": "2026-..Z",
  "methods_present": ["mail_voted","early_voted","election_day",...],
  "statewide": { "cast": {"rep","dem","oth","npa","total","margin"},
                 "mail_voted": {...}, "registered": N, "turnout_pct": P },
  "counties": { "Miami-Dade": { "fips":"12086",
                 "cast": {"rep","dem","oth","npa","total","margin"},
                 "<method>": {...}, "registered": N, "turnout_pct": P } },
  "partisan": true, "data_hash": "..."
}

Turnout-only states set partisan:false and use party-less blocks (total only). Margin > 0 = Republican registration lean; < 0 = Democratic.

Examples

// national early-vote totals
fetch(BASE + "data/status.json").then(r => r.json())
// Florida county turnout
fetch(BASE + "data/fl/latest.json").then(r => r.json())
// live Senate results + balance of power
fetch(BASE + "data/results/senate.json").then(r => r.json())

Embeds

Drop-in iframes: embed.html?w=balance&chamber=senate, embed.html?w=state&state=fl, embed.html?w=national.

Downloads

Per-state turnout JSON + history, and results files:

Loading…