Campaign finance & influence
Campaign Contributions
Returns FEC Schedule A contribution data — money flowing INTO federal committees — in aggregated form: totals by employer, state, candidate, committee, or cycle, plus a top-donor leaderboard. Individual contributions are served as aggregates only (no per-record name search, no contact info), the presentation the FEC's sale-or-use rule (11 CFR 104.15) explicitly permits.
Endpoint
GET /v1/fec-contributionsSourceFEC Schedule A
Authx-api-key — a free key works
What it returns
Three modes, one endpoint:
- Aggregate totals (
group_by) — one row per group:group_by,cycle,key,label,total_amount,contribution_count, plus candidate/committee context (candidate_id,committee_id,party,office,individual_itemized_contributions,disbursements,cash_on_hand) andsource_urlprovenance. Served live from the FEC's own aggregate endpoints, so totals reconcile with fec.gov. - Donor leaderboard (
leaderboard=true) — top individual donors for one bounded scope:rank,contributor_name,contributor_employer,total_amount,contribution_count, with scope + itemization-floor +completemetadata. No addresses, city, or ZIP — aggregated totals only. - Per-record rows (non-individual only) (
entity_type) — itemized PAC / party / committee / organization contributions with full filing provenance (sub_id,receipt_type,report_type,pdf_url,source_url…). Individual (IND) rows are never returned per-record.
Filters
| group_by | Aggregate mode: employer | state | candidate | committee | cycle. employer/state require recipient_committee_id + cycle (the FEC computes those per committee); cycle requires candidate_id or recipient_committee_id. |
| leaderboard | Leaderboard mode: top individual donors (name + employer + summed total). Requires cycle + exactly one scope: recipient_committee_id | candidate_id | contributor_state | contributor_employer. |
| recipient_committee_id | FEC committee ID (e.g., 'C00401224'). Aggregate/leaderboard scope, or per-record filter. Use the FEC Candidates dataset to find a candidate's principal committee. |
| candidate_id | FEC candidate ID (e.g., 'S8GA00180'). Aggregate/leaderboard scope, or per-record filter. |
| contributor_state | 2-letter state code. Leaderboard scope (top donors from a state) or per-record filter. |
| contributor_employer | Employer name. Leaderboard scope only — top donors reporting this employer. |
| entity_type | Per-record mode — NON-INDIVIDUAL types only: COM, CCM, PAC, PTY, CAN, ORG. Individual (IND) rows are served aggregated only. |
| sub_id | Per-record direct lookup by FEC sub_id (returned only for non-individual rows). |
| cycle | Election cycle year (2-year transaction period). Common values: 2026, 2024, 2022. |
| min_amount | Leaderboard: itemization floor for aggregated rows (default 1000; 200 = FEC itemization floor). Per-record: inclusive lower bound on amount. |
| max_amount | Per-record mode: inclusive upper bound on amount. |
| since / until | Per-record mode: bounds on contribution_receipt_date (YYYY-MM-DD). |
| exclude_memos | Per-record mode: when true (DEFAULT), filters memoed_subtotal duplicates that double-count dollars. Leaderboards always exclude them. |
| sort_by / sort_order | Per-record mode sort. Default: contribution_receipt_date desc. |
| limit | Max rows / donors to return. Default 50 (leaderboard 100), max 500. |
Example request
curl "https://api.keyvex.com/v1/fec-contributions?group_by=candidate&cycle=2026&limit=1" \
-H "x-api-key: YOUR_KEY"
Response
{
"results": [
{
"group_by": "candidate",
"cycle": 2026,
"key": "S8GA00180",
"label": "OSSOFF, T. JONATHAN",
"candidate_id": "S8GA00180",
"candidate_name": "OSSOFF, T. JONATHAN",
"party": "DEM",
"office": "S",
"total_amount": 81146109.47,
"contribution_count": null,
"individual_itemized_contributions": 28672552.7,
"disbursements": 52973406.68,
"cash_on_hand": 32504436.28,
"source_url": "https://www.fec.gov/data/candidate/S8GA00180/?cycle=2026",
"scraped_at": "2026-07-15T18:20:11.000Z"
}
],
"count": 1,
"has_more": true,
"source": "live"
}
Example questions you can answer
- Who raised the most this cycle? (
group_by=candidate) - Top donors to a committee, as aggregated totals. (
leaderboard=true) - Which employers' workforces fund a committee? (
group_by=employer) - Where does a committee's money come from, state by state? (
group_by=state) - PAC-to-PAC transfer flows. (
entity_type=PAC)
Related datasets
Query Campaign Contributions from your AI
Hand any AI your key + the OpenAPI spec and it can pull this dataset directly. Free key = full data, 60 requests/day.
Get a free key OpenAPI spec → REST docs →