1. Data Sources
CapitolExposed aggregates data from the following official government sources:
| Source | Agency | Data Type | Update Frequency | Coverage |
|---|---|---|---|---|
| House PTR Filings | Clerk of the House | STOCK Act disclosures | Continuous · last ingested 20h ago | 2012 – present |
| Senate EFD Search | Secretary of the Senate | Senate periodic transaction reports | Delayed · latest filing Oct 22, 2026 | 2012 – present |
| FEC Data | Federal Election Commission | Campaign finance & donations | Daily | 1980 – present |
| Senate LDA | Secretary of the Senate | Lobbying disclosure filings | Quarterly | 1999 – present |
| Congress.gov API | Library of Congress | Votes, bills, committee info | Daily | 1789 – present |
| USAspending | Dept. of the Treasury | Federal contract awards and actions | Checked daily | 2008 – present |
| SEC EDGAR | SEC | Form 4 insider trades, company SIC codes | Daily | 1993 – present |
| WA Public Disclosure | WA State PDC | State official financial disclosures | As filed | WA State |
2. What We Publish
CapitolExposed publishes only claims a reader can check directly against a public record: the trades as filed, late disclosures, federal contract leads that pass the checks below, an anomaly feed built on the same facts, and the records section 3 ties to a member by identifier. None of them is an allegation of wrongdoing.
The conflict score was retired on October 3, 2026
Until then the site published a 0–100 “conflict score” for every trade, and alerts built on it, combining committee jurisdiction, timing near votes and hearings, lobbying, donations and trade size. Its inputs could not be verified: company sectors were wrong, committee jurisdictions were mapped by hand, ex-officio seats were stored as ranking-member seats, and committee rosters carry no dates, so a seat held today was applied to trades made years earlier. When the alerts were checked one by one, most did not hold up. The score, its alerts and every ranking built on them were removed from the site, the API, the feeds and the emails.
2.1 Trades
Each trade is shown as the member's periodic transaction report states it: the asset, the type of transaction, the transaction date, the disclosure date, the owner (the member, a spouse, a dependent child, or a joint account) and the dollar range the filer checked. Members report ranges, not amounts, and a spouse's trade appears on the member's report without saying who placed it. Rows read by a parser at a confidence of 0.7 or below are held back until they are checked against the filing.
2.2 Late disclosures
The STOCK Act requires a report no later than 45 days after the transaction. A trade is counted as disclosed late when its disclosure date is more than 45 days after its transaction date. Two kinds of row are left out of every late count: a House line marked “Amended” or “Deleted” that restates or withdraws a transaction an earlier report already disclosed (it carries the amendment's date, not the original one), unless the original report was found and the line dated from it; and rows parsed at a confidence of 0.7 or below. A late disclosure is a fact about two dates. Whether it is a violation is for the House or Senate Ethics Committee to decide.
2.3 Federal contract leads
A contract lead says that three public records line up: a STOCK Act report of a trade in a company, a USAspending contract with that same company whose latest recorded action falls within 90 days of the trade, and the member's seat on a committee that oversees or funds the agency that acted. Before a lead is published, an automated check confirms that:
- every trade it cites exists and matches the record: member, ticker, transaction type, dates and amount range;
- the USAspending recipient, or its parent company, carries the traded company's own name;
- the contract's latest recorded action is within 90 days of the trade;
- the member holds the committee seat on the current roster, and the trade was made on or after January 3, 2025, the first day of the 119th Congress (committee rosters carry no dates, so an earlier trade cannot be tied to today's seat);
- the committee's link to the agency is in a hand-kept map of each agency's authorizing committees and appropriations subcommittees;
- every number in the headline and summary equals the record it comes from.
A lead that fails any check is not published, and a published lead found to fail one is withdrawn; every lead on the site was put through these checks on October 3, 2026. The dollar figure is the contract's total value, not the value of the action, and the contract itself may be years older than the action. The records do not show who placed the trade or that anyone involved knew of the contract: a lead is a starting point for reporting, not a finding.
2.4 Anomaly feed
The anomaly feed lists recently disclosed trades that stand out on two signals, both computed from the filings themselves: a trade much larger than the member's own history (how far its range sits above the member's other trades, on a log scale, with at least five other trades as the baseline), and a disclosure more than 45 days after the trade. Committee-jurisdiction and hearing-timing signals were removed on October 3, 2026, for the reasons above. Unusual is not improper.
3. How Records Are Linked
A record is tied to a member of Congress only through an identifier both records carry: the filer of a disclosure report, a committee roster entry, an FEC committee ID, a bill number, a ticker. Two records that merely share a name are never linked.
3.1 Trades and committee seats
A trade belongs to the member who filed the periodic transaction report that lists it, and each trade carries a link to that report where the source publishes one. Committee seats come from the committee rosters. Rosters carry no dates, so a seat shows where a member sits now, not where they sat when an older trade was made.
3.2 Campaign receipts
Receipts are FEC itemized contributions to the member's own campaign committee, matched by the committee's FEC ID. Transfers from the member's own or joint fundraising committees, party money, self-funding and conduits such as ActBlue and WinRed are left out of donor lists.
3.3 Lobbying on a member's bills
A Senate LDA filing is tied to a member when it lists a bill the member sponsored. LDA filings cite a bill by type and number with no Congress (“hr-1234”), so a filing counts only when its reporting period falls in that bill's Congress; H.R. 1234 of the 118th Congress does not match H.R. 1234 of the 119th, and a fourth-quarter report filed the following January stays with the Congress it reports on. The filing shows that the registrant lobbied on the bill. It does not show contact with the member or the member's office, and the amount on it covers every issue in the filing, not the bill alone.
3.4 SEC Form 4 trades in the same stock
Where a member's trade and a corporate insider's Form 4 trade are in the same ticker within seven days of each other, the two are shown side by side with their dates. The link is the ticker and the dates, nothing else. There is no score, and neither filing says anything about the other.
3.5 Federal contracts
Contract leads tie a trade to a USAspending contract action with the same company, under the checks in section 2.3.
3.6 What is not linked
Until October 3, 2026 the site also matched members' names against the ICIJ Offshore Leaks database, Foreign Agents Registration Act filings, the FinCEN Files and OpenSanctions, listed the lobbying filings whose client name contained a ticker the member traded, and counted donations and trades in the same company. All of it was retired that day. A shared name cannot establish that two records describe the same person, none of those databases carries an identifier that also appears in a member's filings, and the company links behind the donation counts rested on matched organization names and on stored company IDs that had gone out of date. Name matches were withdrawn from every page, the API, the exports and the research tools.
4. PTR PDF Processing
House Periodic Transaction Reports (PTRs) are filed as PDF documents with the Clerk of the House. CapitolExposed processes these filings through the following pipeline:
Download
PTR PDFs are downloaded from the House Clerk's website by automated polling as new filings are listed. Current ingest state: data status.
Text Extraction
PDF text is extracted using PyMuPDF. For scanned documents without embedded text, OCR is applied where possible.
Parsing
Extracted text is parsed to identify member name, transaction type (purchase/sale/exchange), asset description, transaction date, disclosure date, amount range, and owner (self, spouse, dependent, joint).
Ticker Resolution
Asset descriptions are matched to stock tickers using our company database. Ambiguous descriptions (e.g., "ABC Corp" matching multiple companies) are flagged for manual review.
Validation
Parsed data is validated against expected formats and ranges. Trades that fail validation are quarantined and reviewed manually before ingestion.
Error handling for ambiguous data includes: unknown tickers are stored with the raw asset description; dates that cannot be parsed are set to the disclosure date with a flag; amount ranges that don't match standard STOCK Act ranges are preserved as-reported.
5. Data Quality and Limitations
We are transparent about the known limitations and gaps in our data:
5.1 Known Data Gaps
- • Pending OCR trades: Some older House PTR filings are scanned images that resist automated text extraction. These are queued for manual processing.
- • Delisted tickers: Companies that have been delisted, merged, or acquired may not resolve to current market data. Historical trades referencing these companies are preserved but may lack current stock price data.
- • Missing sector classifications: Approximately 38% of tracked companies currently lack sector classification via SEC EDGAR SIC codes. Sector-based analysis is limited for these companies.
- • Reporting delays: Members have 30–45 days to file STOCK Act disclosures after a transaction. The data we present may lag actual trades by weeks.
- • OpenSecrets data: The OpenSecrets (Center for Responsive Politics) API was discontinued in April 2025. Historical data from this source will not be updated.
5.2 Source Data Errors
Errors in source data are handled as follows: when we identify a confirmed error in a government filing (e.g., a typo in a ticker symbol), we annotate the record with both the original filing data and the corrected data. We do not silently modify source data. All corrections are timestamped and attributed.
5.3 What We Cannot Verify
- • Whether a member had material non-public information at the time of a trade
- • The intent or motivation behind any trading decision
- • Whether a trade was executed by the member personally, a financial advisor, or a blind trust manager
- • The accuracy of self-reported filing data submitted by members to the House Clerk or Senate
6. Error Correction
We take data accuracy seriously and provide a clear process for reporting and correcting errors:
6.1 How to Report Errors
- • Email: [email protected] with subject "Data Correction"
- • Contact form: capitolexposed.com/contact
- • Include: the specific URL, the data in question, and the source documentation that demonstrates the error
6.2 Response Timeline
- • Acknowledgment: Within 2 business days
- • Investigation: Within 5 business days
- • Correction (if confirmed): Within 7 business days
6.3 Correction Process
Confirmed errors are corrected in place with an annotation noting the original value, the corrected value, the date of correction, and the source of the correction. Material corrections to investigative content are noted at the top of the relevant article or dossier.
For the standalone public policy, see the corrections policy. For publication standards, see the editorial policy.
7. Open Source
CapitolExposed is partially open source. The following components are publicly available:
- • Frontend application: Next.js application source code, React components, and page layouts
- • Data ingestion scripts: Scripts used to fetch and process government data
- • API route handlers: Public API endpoint implementations
The following are proprietary and not included in the open source release:
- • AI agent prompts and fine-tuning configurations
- • Production database credentials and environment variables
- • Internal moderation and review tools
GitHub Repository