🗳️ fec¶
Federal Election Commission campaign finance data. Contains candidate and committee registrations, itemized contributions, expenditures, and inter-committee transfers. Covers all federal elections (President, Senate, House) with data from 1980 to present. Bulk downloads are pipe-delimited files with no headers.
19 datasets · 377 columns
candidates · table¶
All federal candidates registered with the FEC. Includes candidate ID, name, party, office sought, state, district, incumbent/challenger status, and principal campaign committee. One record per candidate per election cycle. Source: cn{YY}.zip bulk download (pipe-delimited, no header).
| Column | Type | Null | Description |
|---|---|---|---|
candidate_ |
string | no | FEC candidate ID (e.g., H0AL01234, S0AK00567, P80000722) |
candidate_ |
string | yes | Candidate name (LAST, FIRST MIDDLE) |
party |
string | yes | Party affiliation code (DEM, REP, LIB, GRN, IND, etc.) |
office |
string | yes | Office sought (H=House, S=Senate, P=President) |
state |
string | yes | Two-letter state abbreviation (US postal code) |
district |
string | yes | Congressional district number (00 for at-large/Senate/President) |
cd_ |
string | yes | Enriched 4-digit congressional-district FIPS (state_fips + zero-padded district) — FK to geo.congressional_districts.cd_fips. Computed at materialization for House candidates only (office=H); NULL for Senate/President/unmapped jurisdictions. Mirrors the candidate_district_profile view join logic. |
incumbent_ |
string | yes | Incumbent/challenger/open status (I, C, O) |
candidate_ |
string | yes | Candidate status (C=statutory candidate, F=statutory candidate for future, N=not yet, P=statutory candidate in prior) |
principal_ |
string | yes | Principal campaign committee ID |
street1 |
string | yes | Mailing address street line 1 |
street2 |
string | yes | Mailing address street line 2 |
city |
string | yes | Mailing address city |
state_ |
string | yes | Mailing address state |
zip |
string | yes | Mailing address ZIP code |
election_ |
integer | yes | Election year (even-numbered) |
committees · table¶
All political committees registered with the FEC. Includes PACs, party committees, campaign committees, and Super PACs. Contains committee type, designation, connected organization, treasurer, and filing frequency. Source: cm{YY}.zip bulk download (pipe-delimited, no header). To reach a committee's connected organization FROM another schema rather than by name, join ref.canonical_org_entity on fec_committee_id = committee_id — that table carries one foreign key per source, so the org's LEI/SEC CIK and its committee_id sit in the same row and the join is exact. Matching connected_org_name as text finds the wrong entities and misses orgs filing under a differently-worded name.
| Column | Type | Null | Description |
|---|---|---|---|
committee_ |
string | no | FEC committee ID (e.g., C00000042) |
committee_ |
string | yes | Committee name |
treasurer_ |
string | yes | Committee treasurer name |
street1 |
string | yes | Committee street address line 1 |
street2 |
string | yes | Committee street address line 2 |
city |
string | yes | Committee city |
state |
string | yes | Committee state (two-letter postal) |
zip |
string | yes | Committee ZIP code |
designation |
string | yes | Committee designation: A=Authorized by candidate, B=Lobbyist/Registrant PAC, D=Leadership PAC, J=Joint fundraiser, P=Principal campaign committee, U=Unauthorized |
committee_ |
string | yes | Committee type code: H=House, S=Senate, P=Presidential, D=Delegate, U=Single-candidate independent, V=PAC with non-contribution account, W=PAC with non-contribution account (nonqualified), X=Party nonqualified, Y=Party qualified, Z=National party nonfederal, N=PAC nonqualified, Q=PAC qualified, I=Independent expenditure filer (person), C=Communication cost filer, E=Independent expenditure filer (not a committee), O=Super PAC |
connected_ |
string | yes | Connected organization name (for corporate/labor/trade PACs) |
candidate_ |
string | yes | Candidate ID (for authorized committees) |
filing_ |
string | yes | Filing frequency (A=administratively terminated, D=debt, M=monthly, Q=quarterly, T=terminated, W=waived) |
org_ |
string | yes | Interest group category (C=corporation, L=labor, M=membership, T=trade, V=cooperative, W=corp without capital stock) |
party |
string | yes | Party affiliation |
candidate_committee_linkages · table¶
Links between candidates and their authorized committees. Shows which committees are authorized by which candidates, including the linkage type and election year context. Source: ccl{YY}.zip (pipe-delimited, no header).
| Column | Type | Null | Description |
|---|---|---|---|
candidate_ |
string | no | FEC candidate ID (e.g., H0AL01234, S0AK00567, P80000722) |
election_ |
integer | yes | Election year (even-numbered) |
fec_ |
integer | yes | FEC election year for this record |
committee_ |
string | no | FEC committee ID (e.g., C00000042) |
committee_ |
string | yes | Committee type code: H=House, S=Senate, P=Presidential, D=Delegate, U=Single-candidate independent, V=PAC with non-contribution account, W=PAC with non-contribution account (nonqualified), X=Party nonqualified, Y=Party qualified, Z=National party nonfederal, N=PAC nonqualified, Q=PAC qualified, I=Independent expenditure filer (person), C=Communication cost filer, E=Independent expenditure filer (not a committee), O=Super PAC |
committee_ |
string | yes | Committee designation (A=authorized, P=principal) |
linkage_ |
long | yes | Unique linkage identifier |
individual_contributions · table¶
Itemized individual (donor-level) contributions to federal committees exceeding $200 per cycle. transaction_type spans both ordinary contributions (15/15E/22Y) AND code 10 (giving to Super PACs/Hybrid PACs/nonfederal soft-money accounts) — 10 is uncapped and by dollar volume is typically the single largest code (2024: $6.2B vs. $3.6B for 15), so a query that only knows 15/15E/22Y silently undercounts total giving, especially per-donor. See the transaction_type column comment for the full code list. Largest FEC dataset (~4-5GB per cycle, 20M+ records); contains donor name, employer, occupation, amount, date, and memo text (vectorized for inferred relationship discovery). Distinct from committee_contributions (committee-to-candidate money) and intercommittee_transactions (committee-to-committee transfers). Source: indiv{YY}.zip (pipe-delimited, no header). DIRECTION: committee_id is the RECIPIENT committee (join fec.committees on committee_id + year for its details) and contributor_name is genuinely the donor (individual) here — unlike committee_contributions/intercommittee_transactions, this table's column names match their roles. PERFORMANCE: always filter on the year partition first — this is the largest FEC table by row count and an unfiltered or non-partition-filtered aggregate can exceed a 30s query timeout. Donor-name lookup ("what has this person given") is NOT currently supported even with a year filter: contributor_name has no sort order/clustering, so a name-filtered scan of one year's partition (tens of millions of rows) still exceeds the 30s statement timeout in production — confirmed 2026-09-29 (see kenstott/govdata-ops#780). Do not attempt a name-filtered query against this table until #780's remediation (a donor-summary table or sortOrder+ reprocess) lands.
| Column | Type | Null | Description |
|---|---|---|---|
committee_ |
string | no | FEC committee ID (e.g., C00000042) |
amendment_ |
string | yes | Amendment indicator (N=new, A=amendment, T=termination) |
report_ |
string | yes | Report type (e.g., 12G=pre-general, 12P=pre-primary, 30G=post-general, Q1-Q3=quarterly, YE=year-end) |
transaction_ |
string | yes | Primary/general indicator (P=primary, G=general) |
image_ |
string | yes | Microfilm image number |
transaction_ |
string | yes | FEC transaction type code (source: FEC transaction-type-code-descriptions). 15=contribution (individual/partnership/LLC), 15C=contribution from candidate, 15E=earmarked contribution, 22Y=contribution refund, 10=contribution to Super PAC/Hybrid PAC/nonfederal soft-money account (uncapped, no 15/15E individual limit — usually the largest single code by dollar volume, e.g. $6.2B vs $3.6B for 15 in 2024), 11=Native American Tribe contribution, 21Y=Native American Tribe refund, 20Y=nonfederal refund, 24I=earmarked passed by intermediary committee (intermediary out), 24T=earmarked passed from intermediary's treasury (treasury out), 19=electioneering communication donation received, 30/30E/30T=Convention Account receipt (individual/earmarked/tribe), 31/31E/31T=Headquarters Account receipt (individual/earmarked/tribe), 32/32E/32T=Recount Account receipt (individual/earmarked/tribe), 41Y=Headquarters Account refund, 42Y=Recount Account refund. |
entity_ |
string | yes | Entity type (IND=individual, COM=committee, ORG=organization, PAC=PAC, CAN=candidate) |
contributor_ |
string | yes | Contributor name (LAST, FIRST MIDDLE) |
city |
string | yes | Contributor city |
state |
string | yes | Contributor state (two-letter postal) |
zip_ |
string | yes | Contributor ZIP code |
employer |
string | yes | Contributor employer name |
occupation |
string | yes | Contributor occupation |
transaction_ |
date | yes | Transaction date |
amount |
double | yes | Transaction amount in USD (negative for refunds) |
other_ |
string | yes | Other committee ID (for transfers/earmarks) |
transaction_ |
string | yes | Transaction ID assigned by filer |
filing_ |
long | yes | FEC filing ID number |
memo_ |
string | yes | Memo code (X=memo item, not counted in totals) |
memo_ |
string | yes | Memo text (earmark info, conduit, purpose descriptions) |
sub_ |
long | yes | FEC unique record identifier |
committee_contributions · table¶
Committee-to-candidate transactions (PACs, party committees), spanning direct contributions and coordinated/independent spending via transaction_type codes (24K=direct contribution, 24C=coordinated party expenditure, 24E=independent for, 24A=independent against, 24F=communication cost for). Each row carries a candidate_id, distinguishing it from intercommittee_transactions (committee-to-committee transfers with no candidate link). Source: pas2{YY}.zip (pipe-delimited, no header). DIRECTION: committee_id is the DONOR/filing committee (the PAC or party committee that made this expenditure — join fec.committees on committee_id + year for its name/type/connected organization); contributor_name and other_id both identify the RECIPIENT (candidate's authorized committee) — contributor_name is its name despite the field's name, other_id is its FEC committee ID (join fec.committees on other_id + year for the recipient's own details), and candidate_id is the recipient candidate. amount is signed per transaction_type — a negative value is a refund/adjustment against a prior contribution, not new money moving; net (don't just sum) amount when computing a total given/received. PERFORMANCE: always filter on the year partition — an aggregate filtered only by candidate_id (or any other non-partition column) across all years can exceed a 30s query timeout.
| Column | Type | Null | Description |
|---|---|---|---|
committee_ |
string | no | FEC committee ID (e.g., C00000042) |
amendment_ |
string | yes | Amendment indicator (N=new, A=amendment, T=termination) |
report_ |
string | yes | Report type |
transaction_ |
string | yes | Primary/general indicator |
image_ |
string | yes | Microfilm image number |
transaction_ |
string | yes | Transaction type code (24A=independent against, 24C=coordinated, 24E=independent for, 24F=comm cost for, 24K=direct contribution) |
entity_ |
string | yes | Entity type of the DONOR named by committee_id (CAN=candidate, CCM=candidate committee, COM=committee, IND=individual, ORG=organization, PAC=political action committee, PTY=party organization) |
contributor_ |
string | yes | RECIPIENT committee name (the candidate's authorized committee receiving this transaction, e.g. "MCCONNELL SENATE COMMITTEE" — despite the field name, this is not the donor; see table comment for the full direction mapping) |
city |
string | yes | Contributor city |
state |
string | yes | Contributor state |
zip_ |
string | yes | Contributor ZIP code |
employer |
string | yes | Employer (if applicable) |
occupation |
string | yes | Occupation (if applicable) |
transaction_ |
date | yes | Transaction date |
amount |
double | yes | Transaction amount in USD (negative for refunds) |
other_ |
string | yes | RECIPIENT committee's FEC committee ID (the candidate's authorized committee named in contributor_name — join fec.committees on other_id + year for its details) |
candidate_ |
string | no | FEC candidate ID (e.g., H0AL01234, S0AK00567, P80000722) |
transaction_ |
string | yes | Transaction ID |
filing_ |
long | yes | FEC filing ID number |
memo_ |
string | yes | Memo code |
memo_ |
string | yes | Memo text (purpose, earmark info) |
sub_ |
long | yes | FEC unique record identifier |
intercommittee_transactions · table¶
Transactions between political committees — transfers, joint fundraising allocations, and other inter-committee financial activity — with no candidate_id column, unlike committee_contributions (which links each row to a specific candidate). Shows the flow of money between PACs, party committees, and campaign committees. Source: oth{YY}.zip (pipe-delimited, no header). DIRECTION: committee_id is the FILING committee (whose oth-schedule report this row came from) and is constant across every row for one filer; entity_type, contributor_name, and other_id together describe the COUNTERPARTY committee/entity for that one transaction (entity_type/contributor_name vary row to row even though committee_id doesn't — join fec.committees on other_id + year for the counterparty's details). Unlike committee_contributions, whether money moved INTO or OUT OF the filing committee is NOT fixed by column position — it depends on transaction_type (see FEC Schedule L code descriptions); amount is signed (negative = refund/reversal) regardless. PERFORMANCE: always filter on the year partition first.
| Column | Type | Null | Description |
|---|---|---|---|
committee_ |
string | no | FEC committee ID (e.g., C00000042) |
amendment_ |
string | yes | Amendment indicator (N=new, A=amendment, T=termination) |
report_ |
string | yes | Report type |
transaction_ |
string | yes | Primary/general indicator |
image_ |
string | yes | Microfilm image number |
transaction_ |
string | yes | Transaction type code |
entity_ |
string | yes | Entity type of the COUNTERPARTY committee named by other_id/contributor_name, not of committee_id (CAN=candidate, CCM=candidate committee, COM=committee, IND=individual, ORG=organization, PAC=political action committee, PTY=party organization) |
contributor_ |
string | yes | COUNTERPARTY committee/entity name for this transaction (not necessarily the payer — see table comment; committee_id is the filing committee, this is the other party) |
city |
string | yes | City |
state |
string | yes | State |
zip_ |
string | yes | ZIP code |
employer |
string | yes | Employer |
occupation |
string | yes | Occupation |
transaction_ |
date | yes | Transaction date |
amount |
double | yes | Transaction amount in USD (negative for refunds) |
other_ |
string | yes | Counterparty committee's FEC committee ID (join fec.committees on other_id + year for its details); direction (sender vs. receiver relative to committee_id) is governed by transaction_type, not by this column |
transaction_ |
string | yes | Transaction ID |
filing_ |
long | yes | FEC filing ID number |
memo_ |
string | yes | Memo code |
memo_ |
string | yes | Memo text |
sub_ |
long | yes | FEC unique record identifier |
operating_expenditures · table¶
Itemized operating expenditures by political committees. Shows how committees spend their money — consultants, media buys, travel, rent, staffing, etc. Purpose text is vectorized for spending pattern analysis. Source: oppexp{YY}.zip (pipe-delimited, no header).
| Column | Type | Null | Description |
|---|---|---|---|
committee_ |
string | no | FEC committee ID (e.g., C00000042) |
amendment_ |
string | yes | Amendment indicator (N=new, A=amendment, T=termination) |
report_ |
integer | yes | Report year |
report_ |
string | yes | Report type |
image_ |
string | yes | Microfilm image number |
line_ |
string | yes | Line number on form |
form_ |
string | yes | Form type (SB/F3, etc.) |
schedule_ |
string | yes | Schedule type description |
payee_ |
string | yes | Name of payee |
city |
string | yes | Payee city |
state |
string | yes | Payee state |
zip_ |
string | yes | Payee ZIP code |
transaction_ |
date | yes | Transaction date |
amount |
double | yes | Transaction amount in USD (negative for refunds) |
transaction_ |
string | yes | Primary/general indicator |
purpose |
string | yes | Purpose of expenditure (e.g., MEDIA BUY, CONSULTING, TRAVEL, RENT) |
category |
string | yes | Disbursement category code |
category_ |
string | yes | Disbursement category description |
memo_ |
string | yes | Memo code |
memo_ |
string | yes | Memo text |
entity_ |
string | yes | Entity type |
sub_ |
long | yes | FEC unique record identifier |
filing_ |
long | yes | FEC filing ID number |
transaction_ |
string | yes | Transaction ID |
back_ |
string | yes | Back-reference transaction ID |
independent_expenditures · table¶
Independent expenditures — spending by committees and individuals for or against candidates that is not coordinated with the candidate's campaign. Includes Super PAC spending. Source: independent_expenditure_{YYYY}.csv (CSV with headers). FEC accepts filings without amount-plausibility vetting, so the bulk file carries spam/prank line items of $50M to $10B (e.g. 2022 and 2024 candidates filing $9,999,999,999-scale "expenditures"); a raw SUM(amount) is inflated roughly 10x to 23x in 2022, 2024 and 2026. Every row is kept and amount is never altered; amount_implausible marks the rows to exclude. Any total, ranking or per-candidate aggregate of amount must filter WHERE amount_implausible IS NOT TRUE. A filer amending a filing resubmits the whole thing under a new file_num (amendment_indicator A1/A2/A3, prev_file_num naming the file_num it replaces) rather than correcting it in place, so the superseded filing's rows stay in this table alongside the amendment — use the independent_expenditures_current view (superseded_by_amendment) to exclude them from a SUM/count.
| Column | Type | Null | Description |
|---|---|---|---|
candidate_ |
string | yes | FEC candidate ID |
candidate_ |
string | yes | Candidate name |
spender_ |
string | yes | Committee/spender ID |
spender_ |
string | yes | Committee/spender name |
election_ |
integer | yes | FEC election year |
support_ |
string | yes | Support/oppose indicator (S=support, O=oppose). Case is normalized to upper case because some filers enter a lowercase 's'. A value that is not S or O (a filer keystroke error such as the digit 0) is NULL; the amendment rows that supersede such a filing carry the corrected indicator. |
purpose |
string | yes | Purpose of expenditure |
payee |
string | yes | Payee name |
transaction_ |
date | yes | Expenditure date as filed (source exp_date, DD-MON-YY). NULL where the filer left exp_date blank (about 20% of 2026 rows and 35-41% of 2022-2024 rows); the dissemination and receipt dates are not carried in this table. |
amount |
double | yes | Expenditure amount in USD |
candidate_ |
string | yes | Office sought (H/S/P) |
candidate_ |
string | yes | Candidate state |
candidate_ |
string | yes | Candidate district |
candidate_ |
string | yes | Candidate party |
prev_ |
long | yes | Previous file number (for amendments) |
amendment_ |
string | yes | Amendment indicator |
filing_ |
long | yes | FEC filing ID number |
transaction_ |
string | yes | Transaction ID |
image_ |
string | yes | Image number |
amount_ |
boolean | yes | True when amount is at or above $50,000,000. The largest independent expenditure line item that corroborates against a real ad buy in the 2010-2026 bulk files is about $32M (a 2020 Future Forward USA PAC ad buy); the 45 line items at or above $50M come from spender names such as 'TANKING', 'Republican Emo Girl' and candidate 'SquarePants, SpongeBob', filings FEC published unvetted. The flag is a fixed cutoff, so smaller spam entries (e.g. a $25M line item from the same filer as a $850M one) are not caught. The row and its amount are kept as filed. Exclude with WHERE amount_implausible IS NOT TRUE before summing or ranking amount. NULL when amount is NULL. |
electioneering_communications · table¶
Electioneering communications — broadcast, cable, or satellite ads that mention a federal candidate within 30 days of a primary or 60 days of a general election. Carries the reported disbursement amount plus, when one ad buy names multiple candidates, number_of_candidates and calculated_candidate_share to apportion the cost per candidate. Source: ElectioneeringComm_{YYYY}.csv (CSV with headers).
| Column | Type | Null | Description |
|---|---|---|---|
candidate_ |
string | yes | FEC candidate ID |
candidate_ |
string | yes | Candidate name |
candidate_ |
string | yes | Office sought (H/S/P) |
candidate_ |
string | yes | Candidate state |
candidate_ |
string | yes | Candidate district |
committee_ |
string | yes | Committee ID |
committee_ |
string | yes | Committee/organization name |
payee_ |
string | yes | Payee name |
disbursement_ |
string | yes | Description of the communication/disbursement |
disbursement_ |
date | yes | Disbursement date |
communication_ |
date | yes | Communication date |
amount |
double | yes | Reported disbursement amount in USD |
number_ |
integer | yes | Number of candidates targeted |
calculated_ |
double | yes | Calculated per-candidate share of disbursement |
communication_costs · table¶
Communication costs reported by corporations and labor organizations for internal communications (to employees, members) mentioning federal candidates, with a support_oppose (S/O) flag per candidate. Distinct from electioneering_communications, which covers public broadcast/cable/satellite ads rather than internal member communications. Source: CommunicationCosts_{YYYY}.csv (CSV with headers).
| Column | Type | Null | Description |
|---|---|---|---|
committee_ |
string | yes | Committee ID |
committee_ |
string | yes | Reporting organization name |
candidate_ |
string | yes | FEC candidate ID |
candidate_ |
string | yes | Candidate name |
candidate_ |
string | yes | Office sought (H/S/P) |
candidate_ |
string | yes | Candidate state |
candidate_ |
string | yes | Candidate district |
party |
string | yes | Candidate party affiliation |
support_ |
string | yes | Support/oppose indicator (S=support, O=oppose) |
communication_ |
string | yes | Communication type code (24A, 24N, etc.) |
communication_ |
string | yes | Communication class |
transaction_ |
date | yes | Transaction date. Unlike every other FEC bulk table (which use MMDDYYYY_OR_SLASH), CommunicationCosts_{year}.csv's TRANSACTION_DT is YYYYMMDD (e.g. "20260330") — verified directly against the raw cached response for both 2024 and 2026, not assumed from the shared *transaction_date_column anchor other tables use. |
amount |
double | yes | Transaction amount in USD |
purpose |
string | yes | Purpose of communication |
filing_ |
long | yes | FEC filing ID number |
candidate_summaries · table¶
Aggregated per-candidate financial summary for each election cycle — one row per candidate, not a transaction. Includes total receipts, disbursements, cash on hand, debts, and individual contributions split into itemized (>$200) vs unitemized (<=$200), plus party/other-committee contribution totals. Rolls up the transaction-level individual_contributions and committee_contributions tables rather than replacing them. Source: candidate_summary_{YYYY}.csv (CSV with headers).
| Column | Type | Null | Description |
|---|---|---|---|
candidate_ |
string | no | FEC candidate ID (e.g., H0AL01234, S0AK00567, P80000722) |
candidate_ |
string | yes | Candidate name (LAST, FIRST MIDDLE) |
incumbent_ |
string | yes | Incumbent/challenger/open status |
office |
string | yes | Office sought (H=House, S=Senate, P=President) |
state |
string | yes | Two-letter state abbreviation (US postal code) |
district |
string | yes | Congressional district number (00 for at-large/Senate/President) |
party |
string | yes | Party affiliation (DEM, REP, LIB, GRN, IND, etc.) |
total_ |
double | yes | Total receipts |
transfers_ |
double | yes | Transfers from authorized committees |
total_ |
double | yes | Total disbursements |
transfers_ |
double | yes | Transfers to authorized committees |
cash_ |
double | yes | Cash on hand at beginning of period |
cash_ |
double | yes | Cash on hand at end of period |
contributions_ |
double | yes | Contributions from the candidate |
loans_ |
double | yes | Loans from the candidate |
other_ |
double | yes | Other loans |
loan_ |
double | yes | Candidate loan repayments |
other_ |
double | yes | Other loan repayments |
debts_ |
double | yes | Debts owed by committee |
total_ |
double | yes | Total individual contributions |
individual_ |
double | yes | Itemized individual contributions (>$200) |
individual_ |
double | yes | Unitemized individual contributions (<=$200) |
pac_ |
double | yes | Contributions from political party committees |
other_ |
double | yes | Contributions from other political committees |
coverage_ |
date | yes | Coverage end date |
refunds_ |
double | yes | Refunds to individuals |
refunds_ |
double | yes | Refunds to committees |
committee_summaries · table¶
Aggregated per-committee financial summary for each election cycle — one row per committee, not a transaction. Includes total receipts, disbursements, cash on hand, debts, independent expenditures, party coordinated expenditures, and the nonfederal (non-election-account) share of transfers and expenditures. Rolls up the transaction-level committee_contributions and intercommittee_transactions tables rather than replacing them. Party affiliation and connected organization are not in this file; join to committees on committee_id for them. Source: committee_summary_{YYYY}.csv (CSV with headers).
| Column | Type | Null | Description |
|---|---|---|---|
committee_ |
string | no | FEC committee ID (e.g., C00000042) |
committee_ |
string | yes | Committee name |
committee_ |
string | yes | Committee type code |
designation |
string | yes | Committee designation |
filing_ |
string | yes | Filing frequency |
total_ |
double | yes | Total receipts |
transfers_ |
double | yes | Transfers from affiliates |
individual_ |
double | yes | Total individual contributions |
other_ |
double | yes | Contributions from other political committees |
candidate_ |
double | yes | Candidate contributions |
candidate_ |
double | yes | Candidate loans |
total_ |
double | yes | Total loans |
total_ |
double | yes | Total disbursements |
transfers_ |
double | yes | Transfers to affiliates |
refunds_ |
double | yes | Refunds to individuals |
refunds_ |
double | yes | Refunds to committees |
candidate_ |
double | yes | Candidate loan repayments |
total_ |
double | yes | Total loan repayments |
cash_ |
double | yes | Cash on hand beginning of period |
cash_ |
double | yes | Cash on hand end of period |
debts_ |
double | yes | Debts owed by committee |
nonfederal_ |
double | yes | Nonfederal transfers received |
contributions_ |
double | yes | Contributions to federal candidates and other committees |
independent_ |
double | yes | Independent expenditures |
party_ |
double | yes | Party coordinated expenditures |
nonfederal_ |
double | yes | Shared non-federal operating expenditures |
coverage_ |
date | yes | Coverage end date |
state |
string | yes | Committee state |
ca_contributions · table¶
Itemized contributions received by California state candidates, parties, and ballot-measure committees (Cal-Access Form 401/460/465 Schedule A/C/I), including intermediary/conduit and loan-interest detail. One row per contribution line item; PK is (filing_id, amend_id, line_item, form_type) — an intermediary contribution files a companion record (form_type I) alongside its underlying contribution (form_type A) sharing the same filing_id/amend_id/line_item, so form_type is required to disambiguate. rec_type is 'RCPT' for the vast majority of rows but a real minority (~0.006%) are 'E530' — Form 497 24-hour/10-day late contribution reports, co-mingled into the same TSV by the source. Source: Cal-Access full-database export, RCPT_CD.TSV member. Covers 2000-present. A small number of source rows (<0.001%) have a NULL filing_id/amend_id/line_item — a known Cal-Access export data-quality gap, not a transform defect.
| Column | Type | Null | Description |
|---|---|---|---|
filing_ |
long | no | Cal-Access filing ID (PK component; joins across all CA tables) |
amend_ |
integer | no | Amendment sequence (0 = original filing) |
line_ |
integer | no | Line item number within the filing's schedule |
rec_ |
string | yes | Record type — constant per file (RCPT in RCPT_CD, EXPN in EXPN_CD, S496 in S496_CD) |
form_ |
string | yes | Schedule/form code (A=contributions, E=expenditures, F496=late IE, ...) |
transaction_ |
string | yes | Filer-assigned transaction ID |
entity_ |
string | yes | Entity code (IND=individual, COM=committee, OTH=other, PTY=party, SCC=small contributor committee). Always NULL on ca_independent_expenditures — S496_CD has no ENTITY_CD column in the source. |
contributor_ |
string | yes | Contributor last/entity name |
contributor_ |
string | yes | Contributor first name |
contributor_ |
string | yes | Contributor name title |
contributor_ |
string | yes | Contributor name suffix |
contributor_ |
string | yes | Contributor address city |
contributor_ |
string | yes | Contributor address state |
contributor_ |
string | yes | Contributor address ZIP |
contributor_ |
string | yes | Contributor employer |
contributor_ |
string | yes | Contributor occupation |
contributor_ |
string | yes | Self-employed indicator |
transaction_ |
string | yes | Transaction type code |
receipt_ |
date | yes | Date the contribution was received |
date_ |
date | yes | Period-covered end date (for periodic/in-kind items) |
amount |
double | yes | Contribution amount |
cumulative_ |
double | yes | Cumulative year-to-date amount from this contributor |
cumulative_ |
double | yes | Cumulative other-period amount |
contribution_ |
string | yes | Free-text description (e.g. in-kind contribution detail) |
committee_ |
string | yes | Cal-Access filer ID of the receiving committee (join to ca_filers.filer_id) |
treasurer_ |
string | yes | Committee treasurer last name |
treasurer_ |
string | yes | Committee treasurer first name |
treasurer_ |
string | yes | Committee treasurer name title |
treasurer_ |
string | yes | Committee treasurer name suffix |
treasurer_ |
string | yes | Treasurer address city |
treasurer_ |
string | yes | Treasurer address state |
treasurer_ |
string | yes | Treasurer address ZIP |
intermediary_ |
string | yes | Intermediary/conduit last name (Form 401/460 Schedule I) |
intermediary_ |
string | yes | Intermediary first name |
intermediary_ |
string | yes | Intermediary name title |
intermediary_ |
string | yes | Intermediary name suffix |
intermediary_ |
string | yes | Intermediary address city |
intermediary_ |
string | yes | Intermediary address state |
intermediary_ |
string | yes | Intermediary address ZIP |
intermediary_ |
string | yes | Intermediary employer |
intermediary_ |
string | yes | Intermediary occupation |
intermediary_ |
string | yes | Intermediary self-employed indicator |
candidate_ |
string | yes | Candidate last name (denormalized race context for this item) |
candidate_ |
string | yes | Candidate first name |
candidate_ |
string | yes | Candidate name title |
candidate_ |
string | yes | Candidate name suffix |
office_ |
string | yes | Office sought code (e.g. ASM=Assembly, SEN=Senate, GOV=Governor) |
office_ |
string | yes | Office sought description (e.g. STATE ASSEMBLY, STATE SENATE) |
jurisdiction_ |
string | yes | Jurisdiction code (ST=statewide, ASM/SEN district, local) |
jurisdiction_ |
string | yes | Jurisdiction description |
district_ |
string | yes | Legislative district number (for Assembly/Senate races) |
office_ |
string | yes | Office sought/held indicator |
ballot_ |
string | yes | Ballot measure name (for ballot-measure committees) |
ballot_ |
string | yes | Ballot measure number |
ballot_ |
string | yes | Ballot measure jurisdiction |
support_ |
string | yes | Support/oppose indicator (S=support, O=oppose) for candidate/measure items |
memo_ |
string | yes | Memo code (item is informational, not counted in totals) |
memo_ |
string | yes | Memo reference number (links memo item to parent transaction) |
back_ |
string | yes | Back-reference transaction ID (amendment linkage) |
xref_ |
string | yes | Cross-reference schedule name |
xref_ |
string | yes | Cross-reference match indicator |
interest_ |
double | yes | Loan interest rate (loan-shaped contributions only) |
intermediary_ |
string | yes | Intermediary's own Cal-Access filer ID, when the intermediary is a committee |
ca_expenditures · table¶
Itemized expenditures by California state candidates, parties, and ballot-measure committees (Cal-Access Form 401/460/465 Schedule D/E). One row per expenditure line item; PK is (filing_id, amend_id, line_item, form_type) — Schedule D (subvendor/agent detail, form_type D) files a companion record alongside its Schedule E parent (form_type E) sharing the same filing_id/amend_id/line_item, so form_type is required to disambiguate. Source: Cal-Access full-database export, EXPN_CD.TSV member. Covers 2000-present. A small number of source rows (<0.001%) have a NULL filing_id/amend_id/line_item — a known Cal-Access export data-quality gap, not a transform defect.
| Column | Type | Null | Description |
|---|---|---|---|
filing_ |
long | no | Cal-Access filing ID (PK component; joins across all CA tables) |
amend_ |
integer | no | Amendment sequence (0 = original filing) |
line_ |
integer | no | Line item number within the filing's schedule |
rec_ |
string | yes | Record type — constant per file (RCPT in RCPT_CD, EXPN in EXPN_CD, S496 in S496_CD) |
form_ |
string | yes | Schedule/form code (A=contributions, E=expenditures, F496=late IE, ...) |
transaction_ |
string | yes | Filer-assigned transaction ID |
entity_ |
string | yes | Entity code (IND=individual, COM=committee, OTH=other, PTY=party, SCC=small contributor committee). Always NULL on ca_independent_expenditures — S496_CD has no ENTITY_CD column in the source. |
payee_ |
string | yes | Payee last/entity name |
payee_ |
string | yes | Payee first name |
payee_ |
string | yes | Payee name title |
payee_ |
string | yes | Payee name suffix |
payee_ |
string | yes | Payee address city |
payee_ |
string | yes | Payee address state |
payee_ |
string | yes | Payee address ZIP |
expenditure_ |
date | yes | Expenditure date |
amount |
double | yes | Expenditure amount |
cumulative_ |
double | yes | Cumulative year-to-date amount to this payee |
cumulative_ |
double | yes | Cumulative other-period amount |
check_ |
string | yes | Check number |
expenditure_ |
string | yes | Expenditure category code (e.g. WEB, TRC, POL, CTB, IND) |
expenditure_ |
string | yes | Free-text expenditure description |
agent_ |
string | yes | Agent/intermediary last name making the expenditure on the filer's behalf |
agent_ |
string | yes | Agent first name |
agent_ |
string | yes | Agent name title |
agent_ |
string | yes | Agent name suffix |
committee_ |
string | yes | Cal-Access filer ID of the spending committee (join to ca_filers.filer_id) |
treasurer_ |
string | yes | Committee treasurer last name |
treasurer_ |
string | yes | Committee treasurer first name |
treasurer_ |
string | yes | Committee treasurer name title |
treasurer_ |
string | yes | Committee treasurer name suffix |
treasurer_ |
string | yes | Treasurer address city |
treasurer_ |
string | yes | Treasurer address state |
treasurer_ |
string | yes | Treasurer address ZIP |
candidate_ |
string | yes | Candidate last name (denormalized race context for this item) |
candidate_ |
string | yes | Candidate first name |
candidate_ |
string | yes | Candidate name title |
candidate_ |
string | yes | Candidate name suffix |
office_ |
string | yes | Office sought code (e.g. ASM=Assembly, SEN=Senate, GOV=Governor) |
office_ |
string | yes | Office sought description (e.g. STATE ASSEMBLY, STATE SENATE) |
jurisdiction_ |
string | yes | Jurisdiction code (ST=statewide, ASM/SEN district, local) |
jurisdiction_ |
string | yes | Jurisdiction description |
district_ |
string | yes | Legislative district number (for Assembly/Senate races) |
office_ |
string | yes | Office sought/held indicator |
ballot_ |
string | yes | Ballot measure name (for ballot-measure committees) |
ballot_ |
string | yes | Ballot measure number |
ballot_ |
string | yes | Ballot measure jurisdiction |
support_ |
string | yes | Support/oppose indicator (S=support, O=oppose) for candidate/measure items |
memo_ |
string | yes | Memo code (item is informational, not counted in totals) |
memo_ |
string | yes | Memo reference number (links memo item to parent transaction) |
back_ |
string | yes | Back-reference transaction ID (amendment linkage) |
xref_ |
string | yes | Cross-reference schedule name |
xref_ |
string | yes | Cross-reference match indicator |
general_ |
string | yes | General-purpose-from-election-fund flag |
ca_independent_expenditures · table¶
California Form 496 "24/48-hour" late independent-expenditure reports — the state's closest counterpart to FEC independent_expenditures / the "dark money" IE disclosure this gap was filed for. One row per IE line item; PK is (filing_id, amend_id, line_item). Unlike ca_contributions/ca_expenditures, Form 496 carries no denormalized committee/candidate/race columns in the source file itself (entity_type is always NULL here — S496_CD has no ENTITY_CD column) — resolve the spender/target via the CVR cover page (not yet sourced) or the filing_id. Source: Cal-Access full-database export, S496_CD.TSV member. Covers 2000-present.
| Column | Type | Null | Description |
|---|---|---|---|
filing_ |
long | no | Cal-Access filing ID (PK component; joins across all CA tables) |
amend_ |
integer | no | Amendment sequence (0 = original filing) |
line_ |
integer | no | Line item number within the filing's schedule |
rec_ |
string | yes | Record type — constant per file (RCPT in RCPT_CD, EXPN in EXPN_CD, S496 in S496_CD) |
form_ |
string | yes | Schedule/form code (A=contributions, E=expenditures, F496=late IE, ...) |
transaction_ |
string | yes | Filer-assigned transaction ID |
entity_ |
string | yes | Entity code (IND=individual, COM=committee, OTH=other, PTY=party, SCC=small contributor committee). Always NULL on ca_independent_expenditures — S496_CD has no ENTITY_CD column in the source. |
amount |
double | yes | Independent expenditure amount |
expenditure_ |
date | yes | Independent expenditure date |
expenditure_ |
string | yes | Free-text description (e.g. "mailer") |
memo_ |
string | yes | Memo code (item is informational, not counted in totals) |
memo_ |
string | yes | Memo reference number |
date_ |
date | yes | Period-covered end date |
ca_filers · table¶
California Cal-Access filer registry — every registered filer (candidate, committee, party, ballot-measure committee, lobbyist client, etc.), one row per filer-name/status record. filer_id is the join key to ca_contributions.committee_id and ca_expenditures.committee_id. Source: Cal-Access full-database export, FILERNAME_CD.TSV member. Not a strict 1-row-per-filer table — a filer with a name or status change over time carries multiple rows (xref_filer_id + effective_date vary). A small number of source rows (<0.01%) have a NULL xref_filer_id/filer_id — a known Cal-Access export data-quality gap, not a transform defect.
| Column | Type | Null | Description |
|---|---|---|---|
xref_ |
string | no | Cross-reference filer ID |
filer_ |
string | no | Cal-Access filer ID (join key from ca_contributions/ca_expenditures committee_id) |
filer_ |
string | yes | Filer type (e.g. CLIENT, RECIPIENT, CANDIDATE/OFFICEHOLDER, PARTY) |
status |
string | yes | Filer status (e.g. ACTIVE, INACTIVE, TERMINATED) |
effective_ |
date | yes | Date this name/status record became effective |
name_ |
string | yes | Filer last/entity name |
name_ |
string | yes | Filer first name |
name_ |
string | yes | Filer name title |
name_ |
string | yes | Filer name suffix |
address1 |
string | yes | Address line 1 |
address2 |
string | yes | Address line 2 |
city |
string | yes | City — Cal-Access occasionally concatenates "CITY, ST ZIP" into this field rather than populating state/zip separately (observed live in sampled rows); carried as-is. |
state |
string | yes | State |
zip |
string | yes | ZIP code |
phone |
string | yes | Phone number |
fax |
string | yes | Fax number |
email |
string | yes | Email address |
independent_expenditures_current · view¶
independent_expenditures with amendment supersession resolved. A filer amending a Schedule E filing resubmits the whole filing under a new file_num (amendment_indicator A1/A2/A3, prev_file_num naming the file_num it replaces) rather than correcting it in place, so superseded_by_amendment is true when some other row's prev_file_num names this row's filing_id. Amendments chain (N -> A1 -> A2 -> A3); every link except the last in a chain is marked superseded. amount_implausible is untouched by this view — combine both filters (WHERE superseded_by_amendment IS NOT TRUE AND amount_implausible IS NOT TRUE) before summing or ranking amount. Live-verified 2026: 1,472 of 19,735 rows superseded, removing $107.8M of $1.75B from a raw amount_implausible-filtered SUM.
View — columns are resolved by the query engine at runtime.
active_candidates · view¶
Federal candidates flagged as certified active (candidate_status = 'C') in fec.candidates. Not filtered to a single cycle — rows span every loaded election year, distinguished by the year column. Single-schema view using only fec tables.
View — columns are resolved by the query engine at runtime.
candidate_district_profile · view¶
Enriches FEC candidates with geographic state and congressional district data. House candidates (office=H) are matched to their TIGER district boundary via state_fips + zero-padded district number. Senate/presidential rows get state geography only (no CD match).
View — columns are resolved by the query engine at runtime.