# FatCat Watch — full context for language models > US congressional (STOCK Act) and corporate-insider (SEC Form 4) stock trades, reproduced as filed. Congressional amounts are disclosed brackets, never exact figures; insider values are shares × the reported price. Generated 2026-10-26T14:10:15.801Z from the live database. Canonical copy: https://www.fatcatwatch.com/llms-full.txt ## Rules for quoting (read first) These rules are not style preferences. Breaking the first three produces false statements, e.g. "Representative X traded $62.5M" when the filings only disclose brackets whose midpoints sum to an estimate. 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`, or `min_usd` to `max_usd`). Never state that a member traded a single dollar amount unless `amount.exact_usd` is 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_usd` is 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_usd` set, 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: true` and `counted_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. ### Quoting examples - Right: "Rep. X disclosed a purchase of NVDA worth $1,001–$15,000 (STOCK Act bracket), traded 2026-03-02 and filed 2026-04-10." - Right: "Senator Y's 2026 disclosures total $1.2M–$3.4M; the midpoint estimate is about $2.3M." - Right: "The total is at least $50,000,000 (one trade is in the open-ended top bracket)." - Wrong: "Rep. X bought $8,000 of NVDA." (a bracket midpoint stated as a fact) - Wrong: "Senator Y traded $2.3M." (an estimate without its label or range) - Wrong: adding an insider's Form 4 value to a member's congressional total. ## What this is FatCat Watch collects public stock-trade disclosures from three official sources, parses them, and reproduces them as filed. Disagreements inside a filing are flagged, not corrected. ## Sources - **US House Clerk** (https://disclosures-clerk.house.gov/FinancialDisclosure): 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** (https://efdsearch.senate.gov/): 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** (https://www.sec.gov/edgar/search/): 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 and freshness (live) - Data as of (last pipeline write): 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: 2016-01-02 to 2026-12-26 (as filed; late catch-up reports reach back years, and a few mistyped dates lie in the future) - Rows transcribed from scanned filings (counted as trades, excluded from every total): 1,190 - Filings that could not be read (not in the data): 15 - SEC Form 4: 9,503 open-market trades in 3,315 filings by 2,167 insiders at 1,154 issuers, trade dates 2023-04-03 to 2026-10-23 ### 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_of` in 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. ## Data dictionary ### Amount One congressional trade's disclosed amount. | Field | Type | Meaning | | --- | --- | --- | | `kind` | string | `range` (a bracket), `open_ended` (top bracket, no ceiling), `exact` (the filing printed a figure) or `unknown` (no amount filed). | | `min_usd` | number|null | Bracket floor in US dollars. | | `max_usd` | number|null | Bracket ceiling in US dollars; null for the open-ended top bracket (no upper bound). | | `exact_usd` | number|null | Set only when the filing itself states a precise figure; otherwise null. | | `disclosed` | string|null | The amount as disclosed, ready to quote: "$1,001–$15,000", "≥$50,000,000" or an exact figure. | | `midpoint_estimate_usd` | number|null | Bracket midpoint: an ESTIMATE computed by this site, not a disclosed figure. Null for an open-ended bracket. Label it as an estimate if used. | ### Volume A sum of congressional amounts (a member's, a ticker's, a filtered set's). | Field | Type | Meaning | | --- | --- | --- | | `min_usd` | number | Sum of the disclosed floors of every counted row. | | `max_usd` | number|null | Sum of the disclosed ceilings; null once any counted row is in the open-ended top bracket. | | `open_ended` | boolean | True when the total has no upper bound (quote it as ≥ min_usd). | | `disclosed` | string | The range, ready to quote: "$X–$Y", or "≥$X" when open-ended. | | `midpoint_estimate_usd` | number | Sum of bracket midpoints (an open-ended row counts at its floor): an ESTIMATE, not a disclosed figure. The dashboard's "est." volume. | | `transcribed_rows_excluded` | integer | Rows transcribed from scanned filings that are in the trade count but excluded from this total. | ### Trade One congressional transaction as filed. | Field | Type | Meaning | | --- | --- | --- | | `id` | integer | Row id in this database; stable between runs but not an official identifier. | | `trade_date` | string|null | Transaction date as filed (YYYY-MM-DD). | | `filing_date` | string|null | Date the report was filed with the House Clerk or Senate eFD. | | `notification_date` | string|null | The form's Notification Date (House only): when the member learned of the trade. | | `disclosure_delay_days` | integer|null | Days from trade_date to filing_date; null when the filed dates contradict. Over 45 is late under the STOCK Act. | | `late` | boolean|null | disclosure_delay_days > 45; null when the delay is unknown. | | `dates_inconsistent` | boolean | The filing's own dates contradict each other; shown as filed, not corrected. | | `action` | string | `purchase`, `sale`, `sale_partial` or `exchange`. | | `ticker` | string|null | Ticker as filed (or read from the asset name); null for assets without one. | | `asset_name` | string | Asset description as filed. | | `asset_type` | string|null | House asset-type code (ST stock, OP option, EF ETF, GS government debt …); null when the Senate label has no equivalent. | | `owner` | string | `self`, `spouse`, `joint` or `dependent_child`. | | `amount` | Amount | The disclosed amount (see Amount). | | `transcribed` | boolean | True when the row was transcribed from a scanned paper filing. Such rows never enter a dollar total. | | `counted_in_totals` | boolean | Whether this row's amount enters dollar totals (false for transcribed rows). | | `member` | object | Who filed: name, bioguide_id (null if the roster did not match), party, state, district, chamber, url, api_url. | | `option` | object|null | The option contract when the filing's text names one: kind (call/put), strike_usd, expiry. Never guessed. | | `industry_group` | string|null | The issuer's industry group from its SEC SIC code; null when unclassified. | | `source_url` | string | The original filing: a House Clerk PDF or a Senate eFD page. | | `url` | string | This trade's member page on the dashboard. | | `ticker_url` | string|null | The ticker's page on the dashboard. | ### InsiderTrade One SEC Form 4 open-market transaction. | Field | Type | Meaning | | --- | --- | --- | | `trade_date` | string|null | Transaction date as filed. | | `filing_date` | string | Date the Form 4 was filed with the SEC. | | `action` | string | `purchase` (code P) or `sale` (code S). | | `shares` | number|null | Shares as filed. | | `price_per_share_usd` | number|null | Price as filed; may be a weighted average over several executions. | | `value_usd` | number|null | shares × reported price. Null when the row has no price or its as-filed value is implausible: unknown, never 0. | | `value_basis` | string | Always "shares × reported price": computed, not a disclosed range. | | `late` | boolean|null | Filed after the two-business-day Form 4 deadline (federal holidays excluded). | | `insider` | object | The primary reporting owner: name, CIK, roles. | | `footnotes` | string|null | The filing's footnotes; a weighted-average price range is stated here. | | `source_url` | string | The filing index on SEC EDGAR. | ### TrackRecordEntry One member's track record at one horizon: how the stocks they traded moved afterwards against SPY. A stock's move, never a profit. | Field | Type | Meaning | | --- | --- | --- | | `rank` | integer|null | Rank by `after_trade.shrunk_excess_move_pts` among members with enough measured decisions; null when not ranked. | | `horizon_trading_days` | integer | 30, 90 or 180 trading days after each clock's start. | | `decisions_measured` | integer | Decisions (member, ticker, direction, filing) measured on both clocks at this horizon. Each counts once: no dollar amount weights it. | | `filings` | integer | Filings those decisions come from. | | `after_trade` | object | From the first close on or after the trade date: `shrunk_excess_move_pts` (the mean signed move vs SPY in percentage points, × n/(n+k)), `unshrunk_mean_excess_move_pts`, `interval_90_pts` (bootstrap over filings; null if not ranked), `hit_rate`, `share_of_same_date_random_portfolios_beaten` (null without a comparable universe). | | `after_disclosure` | object | The same, from the first close strictly after the filing date: what a member of the public could have copied. | | `timing_lost_to_disclosure_delay_pts` | number | after_trade minus after_disclosure (shrunk scores, same decisions). | ## JSON API Read-only, no key, CORS-enabled, GET only. Base: https://www.fatcatwatch.com/api/v1. Described in https://www.fatcatwatch.com/openapi.json (OpenAPI 3.1). Every response is `{ data, meta }`; `meta` carries `generated_at`, `data_as_of`, `caveats` (the rules above, one line each) and `docs`. Unknown parameters and malformed values are rejected with HTTP 400 rather than ignored; `limit` above the maximum is clamped and the clamp is reported in `meta.notices`. - `GET /api/v1`: API index: endpoints, coverage and caveats. Example: https://www.fatcatwatch.com/api/v1 - `GET /api/v1/trades`: Congressional trades, newest first, with whole-match totals. Filters: member_id, member, ticker, action, chamber, party, type, owner, from, to, scans; limit (≤500), offset. Example: https://www.fatcatwatch.com/api/v1/trades?ticker=NVDA&action=buy&limit=20 - `GET /api/v1/members`: Members who have traded, with totals. sort, dir, days, limit (≤500). Example: https://www.fatcatwatch.com/api/v1/members?sort=trades&limit=20 - `GET /api/v1/members/{bioguide_id}`: One member: whole-record totals, top tickers and recent trades. Append .md for Markdown. Example: https://www.fatcatwatch.com/api/v1/members/P000197 - `GET /api/v1/tickers`: Tickers members traded, with totals. sort, dir, days, limit (≤500). Example: https://www.fatcatwatch.com/api/v1/tickers?days=90&limit=20 - `GET /api/v1/tickers/{symbol}`: One ticker: totals, the members behind them and recent trades. Append .md for Markdown. Example: https://www.fatcatwatch.com/api/v1/tickers/NVDA - `GET /api/v1/insiders/{symbol}`: SEC Form 4 insider activity for one issuer (separate from congressional data). Example: https://www.fatcatwatch.com/api/v1/insiders/LEN - `GET /api/v1/track-record`: Members 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. Example: https://www.fatcatwatch.com/api/v1/track-record?horizon=90 - `GET /api/v1/feed.md`: The latest congressional trades and coverage as Markdown. Example: https://www.fatcatwatch.com/api/v1/feed.md Members are keyed by their Bioguide ID (e.g. P000197), the identifier Congress itself uses; `GET /api/v1/members` lists them. Dashboard pages are linked from each object's `url` field; link to those rather than constructing page URLs. ## Disclaimer Public disclosures, shown for information. Not investment advice. A disclosed trade is not evidence of wrongdoing.