Get started

How to Find Crypto Holdings in Congressional Disclosures

Digital assets hide in congressional filings under a dozen inconsistent names. Here is how to find them, normalize the mess, and build a watchlist worth monitoring.

The first time I went looking for a member of Congress holding bitcoin, I searched the disclosure database for "bitcoin" and got almost nothing back. Which felt wrong, because I knew the exposure was in there. The problem was never that the holdings did not exist. The problem is that nobody who files these forms describes a crypto position the same way twice, and the search tools take the text literally. So you type one word and miss half the field.

These filings are worth reading because digital asset legislation moves through committees full of people who may or may not own the thing they are voting on, and the disclosures are the only public record of that. But you have to actually be able to find the positions first, and that is harder than it sounds for reasons that have nothing to do with anyone hiding anything.

Why the search never returns what you expect

Two kinds of documents matter here. The periodic transaction reports, usually called PTRs, are filed within roughly 45 days of a trade and list individual buys and sells. The annual financial disclosures give you a snapshot of everything held, but in wide value ranges rather than exact amounts. If you only read one, read the annual, because a PTR shows you a moment and the annual shows you the whole position at year end.

The reason a plain search fails is that the asset description on these forms is free text typed by a staffer, not a ticker pulled from a clean menu. So the same underlying exposure shows up as "Bitcoin", "BTC", "Bitcoin (BTC)", "Grayscale Bitcoin Trust", "GBTC", or the full legal name of whatever spot ETF wrapper they bought. Ether has the same problem, plus people spell it "Ethereum" and "Etherium" and "ETH" and sometimes just write the fund name and leave the underlying asset out entirely. If you search one string, you find one slice.

The fix is boring and it works. Search each filing type separately, and run a list of terms instead of a single word. My starting list looks roughly like this.

  • The plain coin names and tickers: bitcoin, BTC, ethereum, ether, ETH, and the handful of large-cap alts that actually appear.
  • The trust and ETF wrappers by name and ticker: Grayscale, GBTC, iShares Bitcoin, and the other spot funds. This is where most of the exposure actually lives now.
  • The exchange and platform names: Coinbase, and the mining and infrastructure stocks that people treat as a crypto proxy.
  • Generic catch terms like "digital asset", "crypto", and "blockchain" that sometimes appear in a fund description when nothing else does.

Run all of it, keep everything that hits, and expect a pile of duplicates and false positives you will clean up in the next step.

Normalizing the mess into something you can compare

Once you have your raw hits, you have a spreadsheet where the same senator's bitcoin exposure appears three different ways and one of them is actually a mining stock that got swept up by the word "blockchain". You need to collapse this into a clean picture, and the key move is separating direct exposure from wrapped exposure, because they behave differently and they mean different things.

Direct holdings are the coin itself, or something so close to it that the distinction does not matter. Wrapped exposure is a spot ETF, a trust, or a fund that holds crypto on the member's behalf. Both count as exposure, but a spot ETF position is a much easier, more institutional way to hold, and it tends to show up in the accounts of people who would never touch a self-custody wallet. Tagging each row as direct or wrapped is the single most useful thing you can do, because a watchlist that mixes them tells you less than one that keeps them apart.

Here is the workflow I settled on after cleaning these up too many times by hand.

  1. Dedupe by member and by underlying asset, not by the text string. Three rows describing GBTC for the same person on the same annual filing are one position.
  2. Map every text description to a normalized underlying: bitcoin, ether, a specific alt, or "basket" for a fund that holds several.
  3. Tag direct versus wrapped. When you cannot tell from the text, default to wrapped, because most of what looks ambiguous turns out to be a fund.
  4. Drop the pure proxies unless you specifically want them. A miner or an exchange stock is a bet on the industry, not a holding of the asset, and lumping them in will overstate your list.
  5. Keep the reported value range and the filing date next to each position, because a range of "1,001 to 15,000" and a range in the hundreds of thousands are not the same signal even if both say bitcoin.

The reason to be strict about the proxy step is that it is the most common way these lists get inflated. Somebody counts every member who owns an exchange stock as "crypto exposed" and the number balloons into something that sounds dramatic and means very little.

Building a watchlist that actually tells you something

Once the data is clean, the watchlist almost builds itself, but the useful version is not just a roster of everyone with a position. What you want is exposure crossed with relevance. A member who holds a small bitcoin ETF slice and sits on a committee that never touches financial regulation is trivia. A member with meaningful direct exposure who sits on a committee that marks up digital asset bills is the row you actually watch.

So I keep two columns beside each name. One is the exposure profile, direct or wrapped and roughly how large relative to their overall reported assets. The other is committee relevance, which you pull from public committee rosters, focused on the banking, financial services, and agriculture committees, since agriculture matters more for crypto than people expect because of how commodity oversight is split. Sort by both and the list that matters rises to the top on its own.

A couple of failure modes to plan around. The filings lag, so a position you see was true as of the filing date and may be gone, which is why the annual snapshot plus recent PTRs together beat either one alone. Ranges are wide on purpose, so treat every value as an order of magnitude, not a number. And spouse and dependent holdings appear on the same forms, which is genuinely useful signal but should be labeled as such rather than folded silently into the member's own line.

The payoff for all this cleaning is that when a digital asset bill starts moving, you are not scrambling to figure out who has skin in it. You already have the normalized list, you already know who holds the coin directly versus through a fund, and you already know which of them sit where the bill has to pass. Re-run your term search against each new filing period, fold the fresh hits into the same normalized structure, and the watchlist stays current with maybe an hour of work a quarter. The first pass is the slow one. Everything after that is maintenance.

WRITTEN BY
Blockcircle Team

Financial market intelligence covering crypto, stocks, commodities, precious metals, and prediction markets.