FEC Campaign Finance Search
Pricing
from $2.00 / 1,000 record fetcheds
FEC Campaign Finance Search
Search US federal campaign finance data. Find political donations by donor name, candidate, committee, employer, and state. Returns amounts, dates, PDF filing links. Free FEC API, no key required.
Pricing
from $2.00 / 1,000 record fetcheds
Rating
0.0
(0)
Developer

ryan clinton
Actor stats
0
Bookmarked
3
Total users
0
Monthly active users
4 hours ago
Last modified
Categories
Share
What does FEC Campaign Finance Search do?
FEC Campaign Finance Search is an Apify actor that lets you search and extract US federal campaign finance data directly from the Federal Election Commission (FEC) public API. It returns structured data on individual political contributions and candidate filings, covering every federal election cycle from presidential races down to House and Senate campaigns.
Whether you are a journalist investigating donor networks, a researcher studying political spending patterns, or a compliance professional tracking contributions, this actor gives you programmatic access to the same FEC data that powers opensecrets.org and other campaign finance databases -- without writing a single line of code.
Why use FEC Campaign Finance Search on Apify?
- Two search modes in one actor -- Search individual contributions (Schedule A filings) or look up candidate information. Switch between modes with a single input toggle.
- No API syntax required -- The FEC API requires constructing URL parameters, handling cursor-based pagination, and decoding office/challenge codes. This actor handles all of that.
- Sorted by amount -- Contributions are returned sorted by amount (largest first), so you immediately see the biggest donors and donations.
- Full donor details -- Each contribution includes the donor's name, employer, occupation, city, state, ZIP, plus the receiving committee, candidate linkage, and PDF filing links.
- Automatic pagination -- Fetches up to 10,000 results across multiple API pages with built-in 500 ms rate limiting.
- Schedule for monitoring -- Run weekly to track new contributions to specific committees or from specific donors across election cycles.
- Free to use -- Works with the FEC's free DEMO_KEY (1,000 requests/hour) or your own free API key for higher limits.
Key features
- Flexible filtering -- Filter contributions by donor name, committee/PAC name, employer, state, and minimum dollar amount. Filter candidates by name, state, and election year.
- Committee and candidate linkage -- Every contribution is linked to its receiving committee and, where available, the associated candidate, office, and party.
- PDF filing links -- Direct links to the original PDF filings on the FEC website for source verification.
- Aggregate year-to-date totals -- See how much each donor has given in total during the current reporting period.
- Office and status decoding -- Office codes (H/S/P) and incumbent/challenger status are decoded to human-readable labels.
How to use FEC Campaign Finance Search
- Navigate to the FEC Campaign Finance Search actor on the Apify Store.
- Click Try for free to open the actor in Apify Console.
- Select your Search Mode: "Individual Contributions" to find donations, or "Candidates" to look up candidate filings.
- Fill in your search filters. For contributions mode, enter a donor name (e.g., "Elon Musk"), committee name, employer, state, or minimum amount. For candidates mode, enter a candidate name (e.g., "Trump") and optionally a state.
- Set the Election Year (defaults to 2024) and Max Results (defaults to 100, max 10,000).
- Optionally enter your free FEC API key from api.open.fec.gov for higher rate limits.
- Click Start and wait for the run to complete.
- Download results as JSON, CSV, or Excel from the Dataset tab, or connect via API.
Input parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
searchMode | select | No | contributions | Choose between "Individual Contributions" or "Candidates" search |
contributorName | string | No | -- | Donor name to search for (e.g., "Elon Musk", "Warren Buffett"). Used in contributions mode. |
candidateName | string | No | -- | Candidate name to search for (e.g., "Trump", "Biden"). Used in candidates mode. |
committeeName | string | No | -- | Committee or PAC name to filter by (e.g., "America PAC"). Contributions mode only. |
contributorEmployer | string | No | -- | Filter by donor's employer (e.g., "Google", "Goldman Sachs"). Contributions mode only. |
contributorState | string | No | -- | Two-letter state code (e.g., "CA", "TX", "NY"). Works in both modes. |
minAmount | integer | No | -- | Minimum contribution amount in US dollars. Contributions mode only. |
electionYear | integer | No | 2024 | Federal election cycle year (even years: 2020, 2022, 2024, 2026) |
maxResults | integer | No | 100 | Maximum number of results to return (1 to 10,000) |
apiKey | string | No | DEMO_KEY | Free FEC API key from api.open.fec.gov for higher rate limits. Secret field. |
Input examples
Find large donors to a specific PAC:
{"searchMode": "contributions","committeeName": "America PAC","minAmount": 100000,"electionYear": 2024,"maxResults": 500}
Search contributions by employer:
{"searchMode": "contributions","contributorEmployer": "Goldman Sachs","contributorState": "NY","electionYear": 2024,"maxResults": 1000}
Look up presidential candidates:
{"searchMode": "candidates","candidateName": "Trump","electionYear": 2024,"maxResults": 50}
All candidates in a state:
{"searchMode": "candidates","contributorState": "CA","electionYear": 2024,"maxResults": 500}
Input tips
- Use specific donor names for best results. The FEC API matches partial names, so "MUSK" will return all donors with that surname. Use "MUSK, ELON" for more precise results.
- FEC names are uppercase. The FEC stores names in uppercase format (e.g., "BUFFETT, WARREN"). Your search is case-insensitive, but output will be uppercase.
- Filter by employer to find corporate donor patterns. Search "GOOGLE" or "META" to see all contributions from employees of those companies.
- Use minAmount to find large donors. Setting it to 10000 filters out small contributions and focuses on major donors.
- Election years are always even numbers. Federal elections occur every 2 years. Use 2024 for the most recent presidential cycle, 2022 for midterms.
- Get a free API key for production use. The DEMO_KEY works fine for testing but is rate-limited. Register at api.open.fec.gov for a free key with higher quotas.
Output examples
Contribution record (contributions mode)
{"contributorName": "MUSK, ELON","contributorFirstName": "ELON","contributorLastName": "MUSK","amount": 50000000,"aggregateYtd": 50000000,"date": "2024-07-15","committeeName": "AMERICA PAC","committeeId": "C00873893","candidateName": null,"candidateId": null,"candidateOffice": null,"candidateParty": null,"contributorEmployer": "SPACEX","contributorOccupation": "CEO","contributorCity": "AUSTIN","contributorState": "TX","contributorZip": "78701","isIndividual": true,"electionType": "GENERAL","reportYear": 2024,"pdfUrl": "https://docquery.fec.gov/pdf/...","extractedAt": "2025-01-15T12:00:00.000Z"}
Candidate record (candidates mode)
{"candidateId": "P80001571","name": "TRUMP, DONALD J.","party": "REPUBLICAN PARTY","office": "President","state": "FL","district": "","incumbentChallenge": "Incumbent","isActive": true,"electionYears": [2016, 2020, 2024],"firstFileDate": "2015-06-16","hasRaisedFunds": true,"federalFunds": false,"extractedAt": "2025-01-15T12:00:00.000Z"}
Contribution output fields
| Field | Type | Description |
|---|---|---|
contributorName | string | Full donor name as filed (e.g., "MUSK, ELON") |
contributorFirstName | string | Donor's first name |
contributorLastName | string | Donor's last name |
amount | number | Contribution amount in US dollars |
aggregateYtd | number | Total amount the donor has given year-to-date to this committee |
date | string | Date of the contribution (YYYY-MM-DD) |
committeeName | string | Name of the receiving committee or PAC |
committeeId | string | FEC committee ID (e.g., "C00873893") |
candidateName | string|null | Associated candidate name, if linked (null for PAC/party donations) |
candidateId | string|null | FEC candidate ID, if linked |
candidateOffice | string|null | Office sought by the candidate (House, Senate, President) |
candidateParty | string|null | Candidate's party affiliation |
contributorEmployer | string|null | Donor's employer as reported |
contributorOccupation | string|null | Donor's occupation as reported |
contributorCity | string|null | Donor's city |
contributorState | string|null | Donor's state (2-letter code) |
contributorZip | string|null | Donor's ZIP code |
isIndividual | boolean | Whether this is an individual (vs. organization) contribution |
electionType | string|null | Election type: GENERAL, PRIMARY, etc. |
reportYear | number|null | Year of the filing report |
pdfUrl | string|null | Direct URL to the original PDF filing on FEC website |
extractedAt | string | ISO 8601 timestamp of extraction |
Candidate output fields
| Field | Type | Description |
|---|---|---|
candidateId | string | FEC candidate ID (e.g., "P80001571") |
name | string | Candidate name as filed |
party | string | Party affiliation (e.g., "REPUBLICAN PARTY") |
office | string | Office sought: House, Senate, or President (decoded from H/S/P codes) |
state | string | Candidate's state (2-letter code) |
district | string | Congressional district (empty for Senate/President) |
incumbentChallenge | string | Incumbent, Challenger, or Open seat (decoded from I/C/O codes) |
isActive | boolean | Whether the candidate is currently active |
electionYears | number[] | Array of election years the candidate has filed for |
firstFileDate | string|null | Date of the candidate's first filing with FEC |
hasRaisedFunds | boolean | Whether the candidate has raised any funds |
federalFunds | boolean | Whether the candidate has received federal matching funds |
extractedAt | string | ISO 8601 timestamp of extraction |
Use cases
- Journalism and investigative reporting -- Track which individuals and corporations are funding specific candidates, PACs, or super PACs. Follow the money trail across election cycles.
- Political research and academia -- Build datasets of political contributions for analysis of donor demographics, giving patterns, geographic distribution, and partisan trends.
- Compliance and due diligence -- Verify whether individuals or companies have made political contributions as part of KYC, anti-corruption, or lobbying disclosure requirements.
- Nonprofit and advocacy -- Monitor campaign finance activity around specific issues, candidates, or legislative districts.
- Competitive intelligence -- Understand which politicians and committees are receiving funding from companies in your industry.
- Civic engagement tools -- Power apps and dashboards that help voters understand who funds their elected officials.
Programmatic access (API)
Python:
from apify_client import ApifyClientclient = ApifyClient("YOUR_API_TOKEN")run = client.actor("ryanclinton/fec-campaign-finance").call(run_input={"searchMode": "contributions","contributorEmployer": "Google","electionYear": 2024,"minAmount": 5000,"maxResults": 500,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(f"${item['amount']:,.0f} from {item['contributorName']} "f"({item['contributorOccupation']}) -> {item['committeeName']}")
JavaScript:
import { ApifyClient } from "apify-client";const client = new ApifyClient({ token: "YOUR_API_TOKEN" });const run = await client.actor("ryanclinton/fec-campaign-finance").call({searchMode: "contributions",contributorEmployer: "Google",electionYear: 2024,minAmount: 5000,maxResults: 500,});const { items } = await client.dataset(run.defaultDatasetId).listItems();for (const item of items) {console.log(`$${item.amount.toLocaleString()} from ${item.contributorName} -> ${item.committeeName}`);}
cURL:
# Start a runcurl "https://api.apify.com/v2/acts/ryanclinton~fec-campaign-finance/runs" \-X POST \-H "Content-Type: application/json" \-H "Authorization: Bearer YOUR_API_TOKEN" \-d '{"searchMode": "contributions","contributorEmployer": "Google","electionYear": 2024,"minAmount": 5000,"maxResults": 500}'# Fetch results (after run completes)curl "https://api.apify.com/v2/datasets/DATASET_ID/items?format=json" \-H "Authorization: Bearer YOUR_API_TOKEN"
How it works -- technical details
Input (searchMode, filters, electionYear)│├── mode = "contributions" ├── mode = "candidates"│ │▼ ▼┌──────────────────────────┐ ┌──────────────────────────┐│ Schedule A Endpoint │ │ Candidates Endpoint ││ /schedules/schedule_a/ │ │ /candidates/search/ ││ │ │ ││ Filters: │ │ Filters: ││ • contributor_name │ │ • name ││ • committee_name │ │ • state ││ • contributor_employer │ │ • election_year ││ • contributor_state │ │ ││ • min_amount │ │ Sort: -receipts ││ • two_year_txn_period │ │ Pagination: page-based ││ │ │ (page=1, page=2, ...) ││ Sort: -contribution_amt │ │ ││ Pagination: cursor-based │ │ 100 per page, 500ms delay││ (last_index + last_amt) │ └─────────┬────────────────┘│ │ ││ 100 per page, 500ms delay│ │└─────────┬────────────────┘ ││ │▼ ▼┌─────────────────────────────────────────────┐│ Code Decoder ││ • Office: H→House, S→Senate, P→President ││ • Challenge: I→Incumbent, C→Challenger, ││ O→Open seat ││ • is_individual: boolean → isIndividual ││ • candidate_inactive: false → isActive: true│└──────────────────┬──────────────────────────┘│▼┌─────────────────────────────────────────────┐│ Output & Summary ││ • Each record → Apify dataset ││ Contributions: ││ • Total $ amount across all results ││ • Count of unique committees ││ Candidates: ││ • Parties represented │└─────────────────────────────────────────────┘
API endpoints
| Mode | FEC Endpoint | Sort | Pagination |
|---|---|---|---|
| Contributions | /v1/schedules/schedule_a/ | -contribution_receipt_amount (largest first) | Cursor-based: last_index + last_contribution_receipt_amount |
| Candidates | /v1/candidates/search/ | -receipts (most funded first) | Page-based: page=1, page=2, etc. |
Both endpoints use per_page=100 (API maximum) and a 500 ms delay between page requests to respect rate limits.
Cursor vs. page pagination
The FEC API uses cursor-based pagination for Schedule A contributions because this endpoint can return millions of records. Each response includes pagination.last_indexes with cursor values for the next page. The actor passes these as last_index and last_contribution_receipt_amount parameters on subsequent requests.
For candidates, the API uses standard page-based pagination with a page parameter and pagination.pages indicating total pages available.
Code maps
| Raw code | Decoded value | Field |
|---|---|---|
H | House | office |
S | Senate | office |
P | President | office |
I | Incumbent | incumbentChallenge |
C | Challenger | incumbentChallenge |
O | Open seat | incumbentChallenge |
How much does it cost to use?
| Scenario | Results | Pages | Time | Est. cost |
|---|---|---|---|---|
| Quick search | 100 | 1 | ~10 sec | ~$0.005 |
| Medium search | 500 | 5 | ~30 sec | ~$0.01 |
| Large dataset | 5,000 | 50 | ~2 min | ~$0.02 |
| Maximum extraction | 10,000 | 100 | ~3 min | ~$0.03 |
The FEC API is completely free. The actor runs on 256 MB of memory. Apify's free tier includes $5 of monthly platform usage.
Limitations
- 10,000 result maximum -- The actor caps at 10,000 results per run. For larger datasets, use date ranges or state filters to split across multiple runs.
- DEMO_KEY rate limit -- The default DEMO_KEY allows 1,000 API requests per hour. For high-volume use, register for a free FEC API key at api.open.fec.gov.
- Single-mode per run -- Each run operates in either contributions or candidates mode. To search both, run the actor twice with different modes.
- Filing lag -- FEC data depends on when campaigns file their reports. Quarterly and monthly filing deadlines produce data within days, but there can be gaps between filings.
- Uppercase names -- The FEC stores all names in uppercase. Output will always be uppercase (e.g., "MUSK, ELON" not "Musk, Elon").
- PAC contributions may lack candidate linkage -- Donations to PACs, party committees, and other organizations may not have an associated candidate. The
candidateNameandcandidateIdfields will be null. - No aggregate analytics -- The actor returns individual records, not aggregated summaries. Use the output in spreadsheets or BI tools for summary analysis.
- Contributions only include Schedule A -- Only individual contributions (Schedule A) are searched. Other filing types (disbursements, independent expenditures, etc.) are not included.
Responsible use
- Campaign finance data is public record under federal law. However, use this data responsibly and avoid harassment or intimidation of donors.
- Follow the FEC API Terms of Service when using the data.
- Do not use the DEMO_KEY for production workloads. Register for a free API key to avoid impacting other users.
- When publishing donor data, provide appropriate context. Individual contributions do not necessarily reflect organizational positions.
- Be aware that contribution data does not prove quid pro quo relationships between donors and candidates.
FAQ
Do I need an API key? No. The actor works out of the box using the FEC's free DEMO_KEY, which allows 1,000 API requests per hour. For heavier usage, register for a free key at api.open.fec.gov.
What election years are available? The FEC API has data going back to the 1980s. You can search any even-numbered year (e.g., 2020, 2022, 2024). The most comprehensive data is for recent cycles.
Can I search for PAC and super PAC contributions? Yes. Use the committee name filter to search for specific PACs, super PACs, or other political committees. Contributions to these entities are filed as Schedule A receipts.
Why are some candidate fields null in contribution records? Not all contributions are linked directly to a candidate. Donations to PACs, party committees, and other organizations may not have an associated candidate. The committee information is always present.
How fresh is the data? The FEC updates its data regularly as campaigns file their reports. Quarterly and monthly filing deadlines typically produce data within days. The actor always queries live FEC data.
What is the difference between this and the FEC website? This actor provides the same data as fec.gov but in a structured, machine-readable format. You can automate searches, export to CSV/Excel, integrate with other tools via API, and process results programmatically.
Integrations and related actors
The output dataset can be exported in JSON, CSV, or Excel format, or accessed programmatically via the Apify API. Use webhooks to trigger automated workflows when a run completes.
| Related Actor | Description | Use with |
|---|---|---|
| Congress Bill Search | Search US congressional legislation | Cross-reference donors with legislative activity |
| Congressional Stock Trade Tracker | Track stock trades by members of Congress | Analyze financial activity alongside campaign funding |
| SEC EDGAR Filing Analyzer | Search SEC financial filings | Link corporate donors to public company filings |
| Federal Register Search | Search federal rules and regulations | Track regulatory activity alongside campaign funding |
| OFAC Sanctions Search | Search US Treasury sanctions list | Compliance screening of donors |
| SAM.gov Contract Monitor | Search federal contracts | Connect campaign donors to government contracts |
Connect with any Apify integration including Google Sheets, Zapier, Make (Integromat), Amazon S3, and custom API endpoints to build automated campaign finance monitoring workflows.