I keep a bookmarks folder with exactly two links in it, the House Clerk's financial disclosure search and the Senate's eFD portal. Every congressional trade you have ever seen quoted on social media traces back to one of those two databases, usually third or fourth hand, and by the time it reaches you the fields that actually matter have been stripped out. Reading the raw filing yourself takes a few minutes once you know the layout, and after that you never have to take anyone's screenshot on faith.
Some background if this is new to you. The STOCK Act, passed in 2012, requires members of Congress and senior staff to disclose securities transactions over $1,000. The disclosure document is the Periodic Transaction Report, PTR for short. A filer has 30 days from being notified of a trade to report it, and never more than 45 days from the trade date itself. House members file with the Clerk of the House and those filings live on the Clerk's public disclosure site. Senators file through the Senate's electronic financial disclosure system, eFD, which makes you tick an agreement box before every search session. Both databases are free, public, and searchable without an account.
The fields, one at a time
Open any PTR and you get a table where each row is a single transaction. Six fields do nearly all the work.
Owner. A small code telling you whose account traded. SP is spouse, DC is dependent child, JT is a joint account, and a blank or self entry means the member personally. This matters more than people expect, because a lot of the most watched filings are technically spouse trades. For signal purposes I treat the household as one unit, since the disclosure obligation exists precisely because the member is presumed to share information across the household, but you should still record which code you saw. Patterns sometimes differ between a member's own account and a spouse's managed one.
Transaction type. House filings use P for purchase, S for sale, S (partial) for a partial sale, and E for exchange. Senate filings spell the same categories out. Partial sales are worth flagging, since the filer still holds the rest of the position, and a string of partials over several reports shows you how they scale out. Exchanges are usually noise, shares swapped in a merger or one fund converted into another. The trap here is options. A row marked P can be a bearish position if the thing purchased was a put, so the type column alone never gives you direction. You need the asset description for that.
Asset description. The security's full name, usually with a ticker in parentheses. Electronically filed House reports also append a bracketed code for the instrument, [ST] for common stock and [OP] for options being the two you will see most often, with a handful of others covering funds and bonds. For options, the description or an attached comment typically carries the strike, the expiration, and whether they are calls or puts. Read every word of it, because purchased calls and purchased puts look identical in the type column and are opposite bets. Also remember these descriptions are typed by humans. Tickers are occasionally wrong or missing entirely, and private assets have no ticker at all.
Amount. You never get an exact dollar figure, only a bracket. The smallest is $1,001 to $15,000, the next is $15,001 to $50,000, and the brackets keep widening from there, up through $1,000,001 to $5,000,000 and beyond for the largest trades. This is the field people most consistently misuse. A trade reported in the lowest bracket could be $1,100, and datasets that quietly convert brackets into midpoints inflate everything. My rule is to record the full bracket, and when a single number is unavoidable, use the low end and label it as such.
The three dates. There is a transaction date, when the trade executed. There is a notification date, when the filer says they learned about it, which mostly matters for managed accounts where an advisor trades without asking first. And there is the filing date, when the report actually hit the system. The gap between transaction date and filing date is the staleness of everything you are reading, anywhere from a couple of days to the full 45, and sometimes longer, since the standard penalty for a late filing has historically been a token fee. Whatever conclusion you draw from a PTR has to survive that lag.
House forms also include a checkbox asking whether a sale produced more than $200 in capital gains. It is occasionally useful to know a sale was profitable. Most of the time you can ignore it.
Amendments, where naive readers get burned
A filer can amend a PTR at any time, to fix a ticker, correct a bracket, add trades that were missed, or strike rows that were reported in error. The amendment arrives as a brand new filing with its own filing date. House reports carry a filing status field that says whether the document is new or an amendment, and Senate eFD puts the word amendment in the report title. Two specific failure modes come out of this.
The first is double counting. A scraper that ingests the original and the amendment as independent reports counts every restated trade twice. Deduplicate on filer, transaction date, asset, type, and bracket, and keep only the latest version of any given report.
The second is phantom freshness. An amendment filed months after the original looks like new activity if you sort by filing date, when the underlying trades might be very old. Sort and evaluate by transaction date, always, and treat the filing date as a fact about disclosure speed rather than a sign of fresh activity.
One more House-specific wrinkle. Some members still file on paper, and those reports show up as scanned PDFs, sometimes handwritten, which automated parsing mangles badly. If a dataset shows a suspicious gap for one particular member, go pull the raw filings, because there is a decent chance they exist as scans nobody bothered to read by eye.
A five minute extraction workflow
- Pull the filing. For the House, search the Clerk's financial disclosure site by last name and filing year, then filter to PTRs. For the Senate, open eFD, accept the agreement prompt, and search by name with the report type set to periodic transactions.
- Check the filing status before anything else. If it is an amendment, find the original it modifies and read the two side by side.
- For each row, extract six things: owner code, asset name and ticker, instrument, transaction type, transaction date, and amount bracket.
- Compute the lag from transaction date to filing date. Under a week is fast. Past the 45 day limit is late, which is worth recording as a fact about the filer.
- Sanity check the ticker against the asset name, since these are hand-typed and wrong often enough to matter.
- Store the bracket, never a point estimate.
Do that and you have a usable trade record: who in the household traded, what instrument, which direction once you have actually read the description, when it happened, roughly how big it was, and how long the filer sat on the disclosure. That last measure is my favorite even though it is not printed anywhere on the form, because a filer who discloses in three days and a filer who discloses in three months are telling you different things about how much they want to be watched.
None of this is difficult, it is just tedious in a way that filters out almost everyone, and plenty of the congressional trading data floating around was built by someone who skipped at least one of the steps above. Read a handful of raw filings yourself before you trust anyone's cleaned copy, including mine.