FEC API: Search federal candidates
Lists federal candidates for an office and election year from FEC data, ranked by total money raised. Senate and House searches require a state; a House search can be narrowed to one district.
Unofficial. Not affiliated with or endorsed by FEC.
Inputs
Values from the run on Oct 31, 2026, shown under Output.
- State optional
state State or territory name or two-letter code, for example Texas or TX. Required for Senate and House.
Texas
- Office, required
office Federal office to search, for example house.
senate
One of
president,senate,house.- District optional
district House district number, for example 12. Use 0 for an at-large district.
Not set
Whole number from 0 to 99.
- Max Results optional
max_results Maximum candidates to return, for example 50.
5
Whole number from 1 to 200. Default
50.- Election Year, required
election_year Election year, for example 2026.
2026
Whole number from 1900 to 2100.
- Raised Money Only optional
raised_money_only Use yes to include only candidates who have raised money; use no for all candidates. For example yes.
yes (default)
One of
yes,no.
Input as JSON
{ "state": "Texas", "office": "senate", "max_results": 5, "election_year": 2026}Output
{ "candidates": [ { "party": "DEMOCRATIC PARTY", "state": "Texas", "district": null, "incumbency": "Challenger", "candidate_id": "S6TX00479", "candidate_url": "https://www.fec.gov/data/candidate/S6TX00479/?cycle=2026" , "candidate_name": "TALARICO, JAMES", "candidate_status": "Present candidate", "cash_on_hand_usd": 21548155.08, "total_raised_usd": 68560930.42, "coverage_end_date": "2026-06-30" }, { "party": "REPUBLICAN PARTY", "state": "Texas", "district": null, "incumbency": "Incumbent", "candidate_id": "S2TX00106", "candidate_url": "https://www.fec.gov/data/candidate/S2TX00106/?cycle=2026" , "candidate_name": "CORNYN, JOHN SEN", "candidate_status": "Present candidate", "cash_on_hand_usd": 542119.97, "total_raised_usd": 14261513.59, "coverage_end_date": "2026-06-30" }, { "party": "DEMOCRATIC PARTY", "state": "Texas", "district": null, "incumbency": "Challenger", "candidate_id": "S6TX00552", "candidate_url": "https://www.fec.gov/data/candidate/S6TX00552/?cycle=2026" , "candidate_name": "CROCKETT, JASMINE", "candidate_status": "Present candidate", "cash_on_hand_usd": 0, "total_raised_usd": 11096965.96, "coverage_end_date": "2026-08-13" } ]}Code
curl https://api.fous.com/v1/runs \ -H "Authorization: Bearer $FOUS_API_KEY" \ -H "Content-Type: application/json" \ -d '{"method":"fec.gov/search_candidates","input":{"state":"Texas","office":"senate","max_results":5,"election_year":2026}}' # Save as fous.py, then run: python3 fous.pyimport json, os, timefrom urllib.error import HTTPErrorfrom urllib.request import Request, urlopenAPI = "https://api.fous.com/v1/runs" KEY = os.environ["FOUS_API_KEY"]HEADERS = { "Authorization": f"Bearer {KEY}", "Content-Type": "application/json" ,}def call(url, body=None): data = json.dumps(body).encode() if body else None request = Request(url, data, HEADERS) try: with urlopen(request, timeout=120) as r: return r.status, json.load(r) except HTTPError as error: message = json.load(error)["error"]["message"] raise RuntimeError(message) from errorstatus, run = call(API, { "method": "fec.gov/search_candidates" , "input": { "state": "Texas", "office": "senate", "max_results": 5, "election_year": 2026 }})# 202: still going after 30 s. Ask again until it ends.while status == 202: time.sleep(2) status, run = call(f"{API}/{run['id']}")print(json.dumps(run["data"], indent=2))// Save as fous.mjs, then run: node fous.mjsconst api = "https://api.fous.com/v1/runs" ;const headers = { Authorization: `Bearer ${process.env.FOUS_API_KEY}`, "Content-Type": "application/json" ,};let response = await fetch(api, { method: "POST", headers, body: JSON.stringify({ "method": "fec.gov/search_candidates" , "input": { "state": "Texas", "office": "senate", "max_results": 5, "election_year": 2026 } }), signal: AbortSignal.timeout(120_000),});let run = await response.json();// 202: still going after 30 s. Ask again until it ends.while (response.status === 202) { await new Promise((done) => setTimeout(done, 2_000)); response = await fetch(`${api}/${run.id}`, { headers }); run = await response.json();}if (!response.ok) throw new Error(run.error.message);console.log(run.data);# Connect your agent to Fous once, over MCP (Streamable HTTP):# https://api.fous.com/mcp# Set FOUS_API_KEY first: create a key at https://app.fous.com/keys.# Claude Codeclaude mcp add \ --scope user \ --transport http fous https://api.fous.com/mcp \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Codexcodex mcp add fous \ --url https://api.fous.com/mcp \ --bearer-token-env-var FOUS_API_KEY# Cursor, VS Code, Windsurf, Cline and morenpx -y add-mcp https://api.fous.com/mcp -g -n fous \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Then ask your agent:# "Use Fous to run fec.gov/search_candidates# with {"state":"Texas","office":"senate","max_results":5,"election_year":2026}"Over HTTP, the answer’s data holds the output. A run still going after 30 seconds answers 202 with its id: ask GET /v1/runs/{id} until it ends.
Schema
Input schema
{ "type": "object", "required": [ "office", "election_year" ], "properties": { "state": { "type": "string", "description": "State or territory name or two-letter code, for example Texas or TX. Required for Senate and House." }, "office": { "enum": [ "president", "senate", "house" ], "type": "string", "description": "Federal office to search, for example house." }, "district": { "type": "integer", "maximum": 99, "minimum": 0, "description": "House district number, for example 12. Use 0 for an at-large district." }, "max_results": { "type": "integer", "default": 50, "maximum": 200, "minimum": 1, "description": "Maximum candidates to return, for example 50." }, "election_year": { "type": "integer", "maximum": 2100, "minimum": 1900, "description": "Election year, for example 2026." }, "raised_money_only": { "enum": [ "yes", "no" ], "type": "string", "default": "yes", "description": "Use yes to include only candidates who have raised money; use no for all candidates. For example yes." } }}Output schema
{ "type": "object", "required": [ "candidates" ], "properties": { "candidates": { "type": "array", "items": { "type": "object", "required": [ "candidate_name", "party", "state", "district", "incumbency", "candidate_status", "total_raised_usd", "cash_on_hand_usd", "coverage_end_date", "candidate_url", "candidate_id" ], "properties": { "party": { "type": [ "string", "null" ] }, "state": { "type": [ "string", "null" ] }, "district": { "type": [ "integer", "null" ] }, "incumbency": { "type": [ "string", "null" ] }, "candidate_id": { "type": [ "string", "null" ] }, "candidate_url": { "type": [ "string", "null" ] }, "candidate_name": { "type": [ "string", "null" ] }, "candidate_status": { "type": [ "string", "null" ] }, "cash_on_hand_usd": { "type": [ "number", "null" ] }, "total_raised_usd": { "type": [ "number", "null" ] }, "coverage_end_date": { "type": [ "string", "null" ] } }, "additionalProperties": false } } }, "additionalProperties": false}- Price
- 1 credit per completed run (1¢ with pay as you go); failed runs are free.
- Method
fec.gov/search_candidates- Returns
- candidate name, party, state, district, incumbency, status, total raised, cash on hand, coverage end date, FEC URL
Use it from your agent
Give your agent this line. It reads SKILL.md, gets a Fous API key and connects the Fous MCP server. Its run then takes the method fec.gov/search_candidates with the inputs above.
Ask your agent
- Who's running for the Senate in Arizona in 2026, and how much has each candidate raised so far?
- Pull up the FEC list of House candidates for Texas's 28th district in the 2024 election, including the ones who haven't raised any money.
- Top 10 fundraisers among 2024 presidential candidates, with their cash on hand and party
- I need every candidate filed for Wyoming's at-large House seat in 2022 — party, incumbent or challenger, total receipts, and the date their reports cover through.
- Using fec.gov data, show me the Georgia Senate race candidates for 2020 ranked by money raised, with links to their FEC pages.
See more
All FEC methodsGets a federal candidate's fundraising and spending for a two-year FEC cycle. If several names match, returns the match with the most reported receipts.
fec.gov/get_candidate_fundraisingSearches USAJOBS federal jobs by keywords, location, salary threshold and applicant group, in website relevance order. Salary ranges may start below the threshold; annual pay or remote status is null when the announcement does not state it.
usajobs.gov/search_jobsFind Federal Register rules, proposed rules, notices, and presidential documents by topic, agency, publication dates, and comment status. Significant means designated significant by the source; documents without that designation show no.
federalregister.gov/search_rulesSearches USAspending federal awards by keywords, awarding agency, state of performance and date across contracts, grants, loans and direct payments. Searches from October 1, 2007 onward.
usaspending.gov/search_federal_awardsFinds PolitiFact fact checks matching a claim, topic, or person, newest first. An exact person match returns that person's checked statements; otherwise fact-check text is searched. An optional Truth-O-Meter rating filters the results.
politifact.com/search_fact_checksFinds FDA food recall enforcement reports by product, brand, or allergen, newest first. Reports are updated weekly and recall statuses may lag.
open.fda.gov/search_food_recallsFinds SEC EDGAR company filings that mention an exact phrase, optionally limited to a company, a filing category and a filing date range, ranked by search relevance; one entry per filing.
sec.gov/search_filingsFinds U.S. federal grant opportunities by topic, agency, applicant type and status, with funding and eligibility details. Open results exclude opportunities whose closing date has passed.
grants.gov/search_grants