get_fec_contributions
Returns FEC Schedule A contribution data — money flowing INTO federal committees — in AGGREGATED form. Individual donors are never exposed as searchable per-record rows: the FEC sale-or-use rule (11 CFR 104.15) permits aggregated presentation only, so this tool serves group totals and a bounded ORGANISATION leaderboard (the same posture as Quiver Quantitative's public pages). Source: api.open.fec.gov (official FEC API), queried live per request with a cached-rollup fallback (responses carry source: live | cache). THREE MODES (pick one): 1. Aggregate totals — pass group_by: - group_by='employer' + recipient_committee_id + cycle → total + count per employer for that committee (FEC-computed, all itemized rows). E.g. which employers' workforces fund committee X. - group_by='state' + recipient_committee_id + cycle → geographic fundraising pattern for a committee. ⚠ On employer and state rows, contribution_count is the number of CONTRIBUTIONS, not contributors — the FEC publishes no contributor count for these aggregates. A cell can carry a dozen contributions from ONE person (measured: an employer cell with 14 contributions and a single contributor). Do not read it as a crowd, and do not use it to judge whether a cell describes a population or an individual. - group_by='candidate' + cycle (optionally candidate_id) → per- candidate cycle receipts, itemized-individual share, disbursements, cash on hand. Sorted by receipts DESC — 'who raised the most'. - group_by='committee' + recipient_committee_id (cycle optional) → that committee's cycle totals. Top-committee LISTS come from the rollup cache and may lag a day. - group_by='cycle' + candidate_id or recipient_committee_id → per-cycle rows across cycles (fundraising trajectory). 2. Donor leaderboard — pass leaderboard=true + cycle + EXACTLY ONE scope: recipient_committee_id | candidate_id | contributor_state | contributor_employer. Returns top ORGANISATION donors (PAC / party / committee / company) as name + summed total + contribution count, PLUS the individual side as STATISTICS ONLY: individual_donor_count and individual_total. NO median and NO maximum are served — each is one person's number (a median over an odd count IS one contributor's gift) and re-identifies against the FEC's own site. ⚠ SMALL-CELL FLOOR: when fewer than 5 distinct individuals contributed in the scope, the whole individual block is WITHHELD — count and total both null, suppressed=true, and the envelope carries suppressed_small_cells. Three donors plus a total is three people's gifts nearly reconstructed, and the scope is public. The organisation board is never floored; entities are not natural persons. NO NATURAL PERSON IS NAMED BY THIS TOOL, IN ANY MODE. A paid service ranking named individuals by their contribution history is a prohibited commercial use of contributor lists (11 CFR 104.15; 52 U.S.C. 30111(a)(4)). An empty organisation list means no organisation gave in that scope above the floor — it is never a reason to look for people. No addresses, no city/ZIP, no per-record rows. The response's leaderboard.complete flag is true when every itemized row at or above the fixed $1,000 floor (min_amount is not accepted in this mode) for the scope was aggregated — totals are then exact; otherwise the pull hit its page cap and ranks are amount-weighted approximations. 3. Per-record (NON-INDIVIDUAL only) — pass entity_type (COM, CCM, PAC, PTY, ORG) with optional recipient_committee_id / candidate_id / contributor_state / cycle / amount / date filters, or sub_id for a direct lookup. Individual (IND) rows are never returned per-record; memo subtotals are excluded by default (exclude_memos=false to include). Useful for PAC-to-PAC transfer analysis. There is NO contributor_name search and no individual street/city/ZIP anywhere in this tool's output — by design, permanently. Killer query patterns: - Who raised the most this cycle? group_by='candidate' + cycle=2026. - Who funds Senator X? get_fec_candidate_profile → principal committee → leaderboard=true + recipient_committee_id + cycle. - Which employers' staff fund committee Y? group_by='employer' + recipient_committee_id + cycle. - Where does committee Y's money come from? group_by='state' + recipient_committee_id + cycle. - PAC-to-PAC flows into committee Z? entity_type='PAC' + recipient_committee_id.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| cycle | No | Election cycle year (2-year transaction period, e.g. 2026). Required for leaderboard and group_by='employer'/'state'; defaults to the current cycle for group_by='candidate'. | |
| limit | No | Max rows (aggregate/per-record) or max ORGANISATIONS (leaderboard, default 100). Default 50, max 500. | |
| since | No | Per-record mode: inclusive lower bound on contribution_receipt_date (YYYY-MM-DD). | |
| until | No | Per-record mode: inclusive upper bound on contribution_receipt_date (YYYY-MM-DD). | |
| sub_id | No | Per-record mode: direct doc lookup by FEC sub_id. Returns the row only when it is a non-individual contribution. | |
| sort_by | No | Per-record mode sort key. Default: contribution_receipt_date. | |
| group_by | No | Aggregate mode: group totals by this axis. employer/state require recipient_committee_id + cycle (the FEC computes those per committee). cycle requires candidate_id or recipient_committee_id. | |
| max_amount | No | Per-record mode: inclusive upper bound on amount. | |
| min_amount | No | Leaderboard: itemization floor for aggregated rows (default 1000; 200 = FEC itemization floor). Per-record: inclusive lower bound on amount. | |
| sort_order | No | Per-record mode: default desc. | |
| entity_type | No | Per-record mode selector — NON-INDIVIDUAL types only: COM (committee), CCM (candidate committee), PAC, PTY (party), ORG (organization). IND, UNK and CAN are not accepted: a CAN row is the FEC's code for a CANDIDATE, who is a natural person, so candidate contributions are served aggregated only alongside every other individual. | |
| leaderboard | No | Leaderboard mode: top ORGANISATION donors (PAC / party / committee / company) by name + summed total + count for ONE bounded scope, PLUS the individual side as statistics only (count and total — NO median and NO maximum; each is one person's number and re-identifies against the FEC's own site). Those statistics are WITHHELD ENTIRELY when fewer than 5 distinct individuals contributed in the scope. NO NATURAL PERSON IS NAMED — ranking named individuals by their giving is a prohibited commercial use of contributor lists (11 CFR 104.15). Requires cycle + exactly one of recipient_committee_id | candidate_id | contributor_state | contributor_employer. | |
| candidate_id | No | FEC candidate ID (e.g. 'S8GA00180'). Scope for group_by='candidate'/'cycle', leaderboard scope, or per-record filter. | |
| exclude_memos | No | Per-record mode: when true (DEFAULT) filters out memoed_subtotal rows (FEC duplicates that double-count dollars). Leaderboards always exclude them. | |
| contributor_state | No | 2-letter state code. Leaderboard scope (top donors from a state) or per-record filter (non-individual rows). | |
| contributor_employer | No | Employer name (FEC substring match). LEADERBOARD SCOPE ONLY — top donors reporting this employer. Not available as a per-record filter. | |
| recipient_committee_id | No | FEC committee ID (e.g. 'C00401224'). Scope for group_by='employer'/'state'/'committee'/'cycle', leaderboard scope, or per-record filter. Use get_fec_candidate_profile to find a candidate's principal committee. |