Methodology
Where the data comes from, how each figure is computed, and how to quote it without saying more than the filings do. The same rules are published for language models in llms-full.txt and repeated in every API response.
Rules for quoting
- 1
Congressional amounts are ranges
The STOCK Act requires members to disclose only an amount bracket such as "$1,001 – $15,000". Every congressional trade and every congressional total on this site is therefore a range. Quote the range (
amount.disclosed, ormin_usdtomax_usd). Never state that a member traded a single dollar amount unlessamount.exact_usdis set. - 2
Midpoints are estimates
Where the site shows one number for congressional volume (the API's
midpoint_estimate_usd, the dashboard's "est." figures, rankings by volume) it is the sum of bracket midpoints: an estimate this site computes, not a disclosed amount. If you use it, call it an estimate based on bracket midpoints and give the disclosed range next to it. - 3
The top bracket has no ceiling
The highest brackets ("Over $50,000,000", and "Over $1,000,000" for a spouse or dependent) have no upper bound, so
max_usdis null and the range is written "≥ $X". A total that includes such a row is reported as at least its floor, never with an invented upper bound. In a midpoint estimate an open-ended row contributes its floor; on a single trade it has no midpoint at all. - 4
Exact figures only when filed
A handful of filers write a precise amount ("$2,722.50") instead of ticking a bracket. Only then is
exact_usdset, and only then may the trade be quoted as one figure. - 5
Scanned paper filings stay out of totals
Some House members file on paper; the Clerk publishes a scan. Those scans are transcribed: a model reads the handwriting (names, dates, assets) and a separate grid reader decides which amount and type box is ticked. Transcribed rows are shown and labelled, and they count toward trade counts and member/ticker lists, but they are excluded from every dollar total, ranking by volume and alert. In the API they carry
transcribed: trueandcounted_in_totals: false; do not add their amounts into any total. Senate paper filings are not read at all. - 6
Disclosure delay is trade date to filing date
Delay is measured from the trade date to the date the report reached the House Clerk or Senate eFD. It is not the form's "Notification Date": someone trading their own account is notified the same day, so that column reads 0 however long the filing took. The STOCK Act allows 45 days; a trade disclosed later is late. Late filing is a reporting fact, not an allegation of wrongdoing. Where the filing's own dates contradict each other the delay is null rather than negative.
- 7
Dates are reproduced as filed
A few filings carry mistyped dates, such as a trade date in the future or after the filing date. The data stays faithful to the filing; such rows are flagged (
dates_inconsistent) rather than corrected. - 8
Insider values are shares × reported price
Form 4 filers report shares and a price, so an insider value is exact arithmetic but computed: shares × the reported price. Filers may report a weighted-average price over several executions; the real price range is then only in the footnotes. A row with no price has a value of null (unknown, not zero), and a row whose as-filed value is implausible is shown but excluded from totals. Say "shares × reported price", never "disclosed range".
- 9
Congressional and insider data are never combined
The two datasets measure different things (brackets versus computed values, a 45-day versus a two-business-day deadline). They are shown side by side but never summed, ranked or averaged together. "Distinct insiders" counts primary reporting owners: a joint filing is one decision.
- 10
Recent weeks are incomplete
Because members have up to 45 days to disclose, and some file later still, the most recent six weeks of trade dates are always incomplete. Compare periods by filing date, or leave a margin.
- 11
The track record is a stock's move, not a profit
The track record (
/politicians?view=track,/api/v1/track-record) measures, for each decision (one member, ticker, direction and filing), the stock's close-to-close move over 30, 90 or 180 trading days minus SPY's over the same days, read the way the trade pointed (a sale followed by a fall is positive). It starts from the first close on or after the trade date (after_trade) and from the first close after the filing date (after_disclosure, what a member of the public could have copied). It is not what the member earned: the exit, the position size and dividends are unknown, and no dollar amount enters it (brackets are not amounts, so every decision counts once). Member scores are shrunk toward zero by n / (n + k) and come with a 90% bootstrap interval; an interval that crosses zero cannot tell the record from no edge. Options, non-equity assets, exchanges, transcribed rows, rows with contradictory dates and tickers without a price series are excluded and counted. Say "the stocks X traded beat the S&P 500 by N points on average over 90 trading days after the trade", never "X earned", "X's returns", "alpha" or "the best trader". It is not evidence of wrongdoing. - 12
Not investment advice
This site reproduces public disclosures for information. It is not investment advice, and a disclosed trade is not evidence of wrongdoing. Cite the filing (
source_url) and the date of the data (meta.data_as_of) when you quote it.
Sources
- US House Clerk
Periodic Transaction Reports (PTRs) filed under the STOCK Act by members of the House. Electronic PDFs are parsed from their text layer by word position. Scanned paper PDFs are transcribed (see the transcription rule) and their rows never enter a dollar total.
- US Senate eFD
Periodic Transaction Reports filed under the STOCK Act by senators. Electronic reports are read from the transactions table of each eFD page and mapped onto the House vocabulary. Paper Senate filings are scanned images: they are listed as unread and never transcribed.
- SEC EDGAR
Form 4 filings by corporate insiders (officers, directors, 10% owners). Only open-market purchases (code P) and sales (code S) are kept, and only from filings whose P or S rows reach $50,000 in one direction. Amendments (4/A), Forms 3 and 5 and the derivative table are not ingested.
Coverage, live
- Data as of
- 2026-10-23T17:16:03Z
- Congressional filings read
- 525 (House 429, Senate 96), filed 2026-01-01 to 2026-10-22
- Congressional trades
- 6,215 by 136 members across 1,199 tickers
- Trade dates, as filed
- 2016-01-02 to 2026-12-26
- Transcribed from scans (in no total)
- 1,190
- Filings that could not be read
- 15
- SEC Form 4
- 9,503 open-market trades, 3,315 filings, 2,167 insiders at 1,154 issuers
Update cadence
- A scheduled GitHub Actions job polls the House Clerk, Senate eFD and SEC EDGAR, asking for a run every 90 minutes; GitHub delivers scheduled runs late and unevenly, typically every few hours.
- Each run commits the updated SQLite database; the dashboard and API re-read it within about two minutes.
meta.data_as_ofin every API response is the time of the last pipeline write.
Known gaps
- Congressional coverage is filings filed in 2026. Trade dates can be older, because some members file late catch-up reports.
- Filings the pipeline could not read are not in the data; they are listed on the Pipeline page.
- Senate paper filings are not transcribed. House scans are transcribed but kept out of every total.
- Only open-market Form 4 purchases and sales from filings reaching $50,000 in one direction are kept; amendments (4/A), Forms 3 and 5 and derivative transactions are not ingested yet.
- Option contracts (call/put, strike, expiry) are read only where the filing's text names them; a strike is never guessed.
- Industry groups come from the issuer's SEC SIC code; ETFs, funds and unlisted assets have none and stay unclassified.
- Members are grouped by their name on the official roster; a filing the roster could not match keeps the name printed on it.
- The track record covers stocks and ETFs with a ticker and a price series from an unofficial source (Yahoo Finance's chart endpoint); delisted, renamed or acquired tickers drop out, and a decision counts only once its horizon has passed on both clocks, so recent months are missing. Corporate insiders have no track record yet.
For developers and AI agents
A read-only JSON API (no key, CORS open) with the rules above in every response's meta.caveats. Amounts come as min_usd / max_usd with the disclosed text, and any midpoint is named an estimate. Described by OpenAPI 3.1; summarised for language models in llms.txt.
- /api/v1API index: endpoints, coverage and caveats.
- /api/v1/tradesCongressional trades, newest first, with whole-match totals. Filters: member_id, member, ticker, action, chamber, party, type, owner, from, to, scans; limit (≤500), offset.
- /api/v1/membersMembers who have traded, with totals. sort, dir, days, limit (≤500).
- /api/v1/members/{bioguide_id}One member: whole-record totals, top tickers and recent trades. Append .md for Markdown.
- /api/v1/tickersTickers members traded, with totals. sort, dir, days, limit (≤500).
- /api/v1/tickers/{symbol}One ticker: totals, the members behind them and recent trades. Append .md for Markdown.
- /api/v1/insiders/{symbol}SEC Form 4 insider activity for one issuer (separate from congressional data).
- /api/v1/track-recordMembers ranked by how the stocks they traded moved afterwards against SPY (a stock's move, not a profit), from the trade and from the disclosure, with intervals, hit rates and a luck check. horizon = 30, 90 (default) or 180 trading days.
- /api/v1/feed.mdThe latest congressional trades and coverage as Markdown.
Public disclosures, shown for information — not investment advice, and a disclosed trade is not evidence of wrongdoing.