Public Filing System · Congressional Disclosure Data

18 build phases · public domain data only

The trading disclosures your representatives filed. Un-paywalled.

Quantgress scrapes congressional stock trades and 17 adjacent datasets: lobbying, insider trades, 13F holdings, short volume, patents, campaign donations, straight from SEC, Senate, House, and FEC source systems into one self-hosted database. No subscription between you and the filing.

Why it exists

Every dataset here is public U.S. government or public-domain disclosure data.

The problem

The data is public. The access isn't.

Products like Quiver Quantitative and CapitolTrades package congressional trading disclosures into a paid API. Every underlying filing is already public record.

The approach

Own scrapers, one local database.

Quantgress is the build-it-yourself version: scrapers against primary sources, one DuckDB file, a thin read-only API over it. Auditable end to end.

The guarantee

Guesses stay reversible.

Any value inferred rather than scraped (a ticker recovered from free text, for example) goes into a separate *_guess column. The original filing value is never overwritten.

The dataset index

18 phases, each independently runnable and resumable. Check marks indicate phases verified against live data.

01Senate stock trades (PTRs)efdsearch.senate.govDaily
02House stock trades (PTRs)disclosures-clerk.house.govDaily
06Corporate lobbyingLDA.govAs needed
07Government contractsUSAspending v2Rolling 7-day
09Insider trades (Form 4)SEC EDGAR bulk + daily indexDaily
1013F institutional holdingsSEC Form 13F data setsQuarterly
11Off-exchange short volumeFINRA daily filesDaily
12PatentsUSPTO Open Data PortalAs needed
13Corporate / PAC donationsOpenFECAs needed
16Executive compensationSEC XBRL Frames APIAs needed
17Donald Trump 278-T tradesProPublica DocumentCloud mirrorManual
18Senate Annual Financial Disclosureefdsearch.senate.govAnnual

Full 18-phase table, including entity resolution and derived net-worth phases, in the docs.

Query it directly

One unified trades view across both chambers. Arbitrary SQL from the command line.

py q.py "SELECT tkr, count(*) AS n, sum(amount_low) AS min_dollars
         FROM trades WHERE tkr IS NOT NULL
         GROUP BY tkr ORDER BY n DESC LIMIT 5"