Understanding FEC Bulk Data Files

If you want to work with campaign finance data, you need to understand where it comes from. The answer is more complicated than it should be.

Federal election data has one authoritative source: the FEC. State and local election data? That’s a different story entirely - one of fragmentation, inconsistency, and hundreds of separate systems.

This post covers both: what the FEC provides and why the broader landscape makes comprehensive campaign finance analysis so challenging.

Federal Data: The FEC

The Federal Election Commission publishes bulk data files covering every federal election since 1980. This is the good news. The data exists, it’s free, and it’s comprehensive.

What’s Available

FEC bulk files are organized by type and election cycle (even years). The main categories:

Candidate Data (cn) Master records for every candidate who has filed with the FEC. Includes name, party, office sought, state, district, and candidate status (a one-letter code for current, future, not-yet-a-candidate, or prior-cycle candidates).

Committee Data (cm) Master records for political committees - campaign committees, PACs, Super PACs, party committees. Includes name, type, designation, treasurer, address, and connected organization (for PACs sponsored by corporations or unions).

Committee-Candidate Linkage (ccl) The connections between committees and candidates they support. A candidate’s principal campaign committee and the other committees authorized by - or designated for - that candidate.

Individual Contributions (itcont) The big one. Every itemized contribution from an individual to a committee. Includes donor name, address, employer, occupation, amount, and date. This is the core dataset for donor analysis - and it’s massive. Expect several gigabytes per cycle.

Committee Contributions (pas2) Contributions from committees to candidates. When a PAC writes a check to a campaign, it shows up here.

Committee Transactions (oth) Transfers between committees. PAC-to-PAC money flow, party committee coordination, joint fundraising distributions.

Operating Expenditures (oppexp) Where the money goes. Payments from committees to vendors - media buyers, consultants, printers, caterers, everyone who gets paid by a campaign.

Candidate and PAC Summaries (weball, webk) Pre-aggregated totals: total raised, total spent, cash on hand, debts. Useful for quick lookups, but derived from the transaction-level data.

The Fragmentation Starts Here

Even within the FEC’s relatively organized system, there are complications:

Separate Header Files The bulk data files are pipe-delimited text, and the column headers live in separate files. You need to know which header file goes with which data file.

Changing Schemas Field names and positions have shifted over the decades. Code that works for 2024 data may break on 2004 data.

Derived vs. Reported Data The summary files (weball, webk) are convenient, but they are aggregates. When a summary and the underlying transactions disagree - amendments, refunds, late filings - the transactions are the record, and reconciling the two takes real work.

Inconsistent Identifiers The FEC assigns IDs to candidates (H0CA12345) and committees (C00123456), but individuals have no unique identifier. The same person donating to multiple campaigns appears as separate records with potentially different name spellings.

State and Local Data: The Wild West

Federal data is the easy part. State and local campaign finance? That’s where things get complicated.

50+ Systems, No Standards

Every state has its own campaign finance disclosure system. Some states have county-level systems on top of that. Major cities often have their own reporting requirements.

This means:

Different Filing Thresholds One state might require disclosure at $100, another at $500. Some states have no itemization requirement at all for small donors.

Different Data Formats PDFs. Scanned images. CSV exports with different schemas. XML. Sometimes just HTML tables you’d have to scrape.

Different Identifiers No cross-state identifier for donors, candidates, or committees. The same person donating in California and Nevada appears in two completely separate systems with no connection.

Different Update Frequencies Some states publish real-time data. Others update quarterly. Some only after elections are certified.

Different Retention Policies Historical data availability varies wildly. Some states have decades of digital records. Others have purged older data or never digitized it.

Why This Matters

A complete picture of money in politics requires:

  • Federal FEC data (what elect.info currently covers)
  • 50 state-level systems (each with unique formats and rules)
  • Hundreds of local jurisdictions (for mayoral races, city councils, ballot measures)
  • IRS data for 501(c) organizations (political nonprofits)
  • Lobbying disclosure data (separate from campaign finance)

Integrating all of this is a huge job. The fragmentation is a feature, not a bug - local control of elections means local control of election data.

Aggregation Efforts

Some organizations have made progress:

OpenSecrets - which merged with the National Institute on Money in Politics (FollowTheMoney) in 2021 - covers federal data and decades of aggregated state-level data. That standardization work is heroic, and it still runs into the fact that the underlying data quality varies by state.

State-specific projects exist (California’s Cal-Access, New York’s BOE, etc.) but each is its own silo.

elect.info focuses on federal data for now. The state and local problem is real, but solving it requires either massive manual effort or cooperation from jurisdictions that have little incentive to standardize.

The Quirks You’ll Encounter

After working with FEC data for any length of time, you accumulate a list of surprises. Here are the ones that matter:

Amendments

Committees amend their reports, sometimes many times. A single contribution can appear in an original report and again in one or more amendments. Know which version you’re counting.

Party Codes

Party codes are three-letter abbreviations, and there are a lot of them - minor parties, write-ins, independents, and historical codes that don’t map cleanly onto today’s parties.

Minnesota’s Democratic-Farmer-Labor Party

The Democratic Party in Minnesota is the DFL (Democratic-Farmer-Labor). In FEC data, this appears as both “DFL” and “DEM” depending on the cycle and filing. Entity resolution needs to handle this.

Name Format Chaos

FEC filings accept names in various formats:

  • SMITH, JOHN Q
  • JOHN Q SMITH
  • SMITH JOHN
  • john smith
  • SMITH, JOHN Q. JR.
  • SMITH, JOHN Q JR

These might all be the same person. Or five different people. Name normalization is essential and imperfect.

Employer Variations

The same employer appears dozens of ways:

  • GOOGLE
  • GOOGLE INC
  • GOOGLE INC.
  • GOOGLE LLC
  • ALPHABET INC
  • ALPHABET

Treating these as separate entities dramatically understates corporate political activity.

Encoding Issues

Older files may have encoding issues - special characters that don’t parse correctly as UTF-8. Accent marks in names, non-ASCII characters in addresses.

Negative Amounts

Contributions can be negative (refunds). Expenditures can be negative (corrections). Your aggregation logic needs to handle these.

Future-Dated Transactions

Some transactions have dates in the future relative to their filing. Data entry errors, presumably, but they’re in the official record.

Working With FEC Data

Given these challenges, how do you actually work with FEC data?

Start with a specific question. Don’t try to ingest everything at once. Pick a candidate, a committee, or a time period. Get that working before expanding scope.

Plan for entity resolution. Unique individuals don’t have unique IDs. Any serious analysis requires matching records that should be the same person/organization. This is hard, imperfect, and necessary.

Document your assumptions. When you decide that “GOOGLE INC” and “ALPHABET” are the same employer, write it down. When you exclude records with invalid dates, note why. Future you will thank present you.

Expect iteration. Your first pass will miss things. Your second pass will find bugs in your first pass. This is normal. Budget for it.

What elect.info Does

elect.info ingests FEC bulk data for every cycle from 1980 through the current, still-in-progress 2026 cycle. We perform entity resolution across individuals and employers, build a knowledge graph of relationships, and generate searchable pages for every entity.

The quirks listed above? We’ve hit all of them. The pipeline handles the schema changes, the encoding issues, and the name and employer variations.

But we only cover federal data. State and local fragmentation is still an open problem - for us, and for anyone trying to understand money in American politics.