Open data API · v1.0.0
Build on the 2026 elections data
Everything on our candidate, race, bill and issue pages, as a free JSON API. Every fact comes with its source and the day we read it, so whatever you build can show its work too.
Connect your own AI
SuperCitizen is also a remote MCP server, so the AI you already use can look things up here with sources. Public election tools work right away, with no account. The two tools that read your own account ask you to sign in the first time one is used, and you choose what the app can see. You can disconnect it any time from your profile.
https://supercitizen.org/mcp
- Claude (web, desktop and mobile): go to Customize → Connectors, choose Add custom connector, and paste the URL above.
- ChatGPT: with developer mode on, add a new connector with the URL above and choose OAuth when it asks how to sign in.
- Claude Code: run
claude mcp add --transport http supercitizen https://supercitizen.org/mcp, then type/mcpin Claude Code to sign in when a tool needs your account. - Scripts and headless agents: send an API key instead of signing in, as
Authorization: Bearer sc_live_…(in Claude Code,--header). A key reads your account only if you gave it that scope.
| Tool | What it does | Sign-in |
|---|---|---|
find_my_races | The races on the ballot at a U.S. street address (not stored or logged) | None |
get_race | One race with every candidate on its ballot | None |
search_candidates | Candidates by name, state, office, race or incumbency | None |
get_candidate | A candidate’s full record, every fact with its source | None |
search_bills | Tracked bills by title words, issue, kind or Congress | None |
get_bill | One bill: summary, status, sponsors and roll-call outcomes | None |
list_issues | The issues the guide tracks | None |
get_issue | One issue and its spectrum of stances | None |
compare_positions | What each candidate in a race has said on one issue | None |
get_my_account | Your name, email, access tier and remaining model quota | account:read |
get_my_donations | Your donations and year-end statements | donations:read |
Every tool is read-only and returns the same envelope as the API below, with its sources map. The server asks the AI to cite those sources and to stay neutral: no endorsements or ratings of candidates. Sign-in uses OAuth 2.1 with PKCE; apps identify themselves with a Client ID Metadata Document, so there is nothing to register. The discovery documents are at /.well-known/oauth-protected-resource/mcp and /.well-known/oauth-authorization-server. The same sign-in also works for the API’s /api/v1/me endpoints: request resource=https://supercitizen.org/api/v1.
Quick start
- Sign in and create a key. Keys are free and look like
sc_live_…. - Send it with every request as
Authorization: Bearer sc_live_…(orX-API-Key: sc_live_…).
curl -H "Authorization: Bearer $SUPERCITIZEN_KEY" \
"https://supercitizen.org/api/v1/races?state=GA"
curl -H "Authorization: Bearer $SUPERCITIZEN_KEY" \
"https://supercitizen.org/api/v1/candidates/<candidate-id>"
curl -X POST -H "Authorization: Bearer $SUPERCITIZEN_KEY" \
-H "Content-Type: application/json" \
-d '{"address":"1100 Congress Ave, Austin, TX 78701"}' \
"https://supercitizen.org/api/v1/lookup"Endpoints
| Method | Path | What it returns |
|---|---|---|
GET | /api/v1/races | List races |
GET | /api/v1/races/{id} | Get a race with its candidates |
GET | /api/v1/candidates | List candidates |
GET | /api/v1/candidates/{id} | Get a candidate’s full record |
GET | /api/v1/candidates/{id}/votes | A candidate’s recorded votes (not published at this time) |
GET | /api/v1/bills | List tracked bills |
GET | /api/v1/bills/{id} | Get a bill: summary, status, roll call outcomes |
GET | /api/v1/issues | List issues and their spectra |
GET | /api/v1/issues/{id} | Get an issue |
GET | /api/v1/positions | Candidates’ public statements, by issue |
GET | /api/v1/votes | Recorded votes of 2026 candidates (not published at this time) |
GET | /api/v1/me | Your account: name, email, access tier and remaining model quota |
GET | /api/v1/me/donations | Your donations and year-end statements |
POST | /api/v1/lookup | Races on the ballot at an address |
List endpoints take limit (1–500, default 100) and offset, and return a page object with the total. Full parameters and response shapes are in the OpenAPI 3.1 document.
Responses and sources
Every response is an envelope: data, a sources map, and meta. Facts point at sources by id (in fields named sources or sourceIds), and every id resolves in the sources map with its URL, publisher and retrieval date. Text we drafted with AI is marked in each candidate's origin field and is made of individually cited sentences.
{
"data": {
"id": "2026-ga-us-senate",
"state": "GA",
"office": "us-senate",
"division": "ocd-division/country:us/state:ga",
"title": "U.S. Senate · Georgia",
"format": "majority-runoff",
"candidates": [ { "id": "…", "name": "…", "partyLabels": ["…"], … } ],
"sourceIds": ["ballot:GA:sos-cert"]
},
"sources": {
"ballot:GA:sos-cert": {
"url": "https://…",
"title": "…",
"publisher": "Georgia Secretary of State",
"retrieved": "2026-10-27",
"kind": "election-office"
}
},
"meta": { "version": "1.0.0", "election": "2026-11-03", … }
}IDs
- Races are cycle-qualified:
2026-tx-us-house-37,2026-oh-us-senate-special,2026-ga-governor. Each race also carries an Open Civic Datadivisionid. - Candidates are people, with durable slugs that will carry across future elections:
jane-q-doe, or with a state added when two people share a name. - Bills are type, number and Congress:
hr1-119,s5-118,hjres7-118. - Candidates also carry their
fecCandidateIdand, for members of Congress, theirbioguideId, so you can join with other datasets.
Limits, errors and versions
- Each key gets 60 requests a minute and 10,000 a day, shared between the API and the MCP server (a connected app gets the same budget per person). Every response carries
X-RateLimit-Limit,X-RateLimit-RemainingandX-RateLimit-Reset(seconds). Over the limit you get429withRetry-After. Need more? Email [email protected]. - Errors look like
{ "error": { "code": "not_found", "message": "…" } }with a matching HTTP status: 400, 401, 403, 404, 422, 429 or 503. - Versioning: the path carries the major version (
/api/v1). Within v1 we only add fields and endpoints; anything that would break a client ships as v2, announced here first, with v1 kept running alongside it. - Responses may be cached for five minutes (the
/api/v1/meendpoints never are). Data changes when sources change — new FEC reports, corrections — and the corrections log records every fix.
Using the data
Facts come from public records — state election offices, the FEC, Congress — and candidates' own public statements. Summaries we wrote are licensed CC BY-SA 4.0. Please credit SuperCitizen and keep the links to original sources. If you build a voter guide, keep it nonpartisan in the same spirit: same rules for every candidate, no claims without sources.