It's a familiar storyline: incumbents out-raise challengers. The raw numbers from the FEC's candidate summary tables back it up — in almost every recent cycle, the median House incumbent has raised substantially more than the median House challenger. But stopping the analysis there misses the interesting part.
This post walks through what you can actually see in the fec_candidate and fec_candidate_committee tables about incumbency, and what those tables cannot tell you.
The incumbent_challenger Field
The FEC tags every federal candidate in the bulk cn.txt file with a one-letter status code:
I— IncumbentC— ChallengerO— Open seat candidate
LobbyVault surfaces this as the incumbentChallenger field on candidate detail pages. It's the starting point for almost every incumbency analysis.
Caveat: the status is coded at filing time. A candidate who loses a primary and later files for another office can appear with an outdated tag for a while. The stable join key is cand_id, not the human-readable status.
What the Receipts Tell You
Aggregating receipts by incumbency status produces three patterns that show up cycle after cycle:
- Incumbents lead in PAC money, by a lot. Trade association and industry PACs disproportionately donate to sitting members of Congress, because those members vote on the relevant legislation. Challenger PAC receipts are almost entirely from ideological or party-affiliated committees.
- Challengers over-index on small-dollar individual contributions. Especially in high-profile races, challengers often raise a majority of their cash from contributions under $200, which don't even require itemization in the FEC's individual contribution file.
- Open-seat races look nothing like either. When there's no incumbent, PAC money fragments across multiple candidates, and the timing of contributions is compressed — most of the money arrives after the primary, not throughout the cycle.
These patterns fall straight out of SQL on the FEC tables. A defensible "PAC dependency ratio" per candidate is pac_contributions / (pac_contributions + individual_contributions), pulled from the candidate summary table.
Timing Is the Underrated Signal
Most analyses stop at totals. The more useful analysis is when the money arrived.
Incumbent receipts are spread across the cycle, with a bump at each FEC quarterly deadline (incumbents know their calendar). Challenger receipts often show a sharp inflection point — a viral moment, a debate, a news cycle — after which small-dollar contributions spike. That inflection is visible in the FEC individual contribution file's transaction_dt column.
LobbyVault's candidate detail page shows a cycle-over-cycle spending chart sourced from this data. For challengers, the shape of that chart often tells the race's story more clearly than the totals.
What FEC Filings Cannot Tell You
Three important caveats:
- Dark money doesn't appear here. 501(c)(4) social welfare organizations and 501(c)(6) trade groups can run issue ads that help or hurt candidates without disclosing donors or, in many cases, filing with the FEC at all. If your race has a lot of outside advertising but not much Super PAC IE activity, you're probably looking at dark money that the FEC doesn't capture.
- State and local races aren't here. The FEC only covers federal candidates: President, Senate, House. Governor's races, state legislatures, and municipal races are tracked by state election commissions with wildly different schemas and disclosure rules.
- Self-funding sits in a weird place. A candidate's personal loans to their committee appear as
loansrather than contributions, and the payback of those loans later in the cycle can distort "raised" and "spent" totals. Filter ontransaction_type_codewhen it matters.
A Practical Read
If you're researching a specific race:
- Pull the candidate's summary line from
fec_candidate. - Join to
fec_candidate_committeeto find their principal committee ID. - Look at the monthly or quarterly breakdown in
fec_form_3filings to see when the receipts came in. - Pull independent expenditures targeting that
cand_idseparately — they're in a different table and often dwarf the candidate's own spending.
The numbers on a candidate's page are the aggregation of these joins. When a page shows a big gap between "total raised" and "total spent on behalf of candidate (including IE)," that's the story.
Further Reading
- FEC: Bulk data downloads
- CRS: Campaign Finance Policy in the United States (search "campaign finance overview")
- OpenSecrets incumbent advantage data