Congress Trades
Stock and asset trades disclosed by members of Congress and their households under the STOCK Act, parsed from House and Senate periodic transaction reports.
congress_trades — the dataset name to pass to the Obscura API.
What one row means
One reported line-item transaction (one traded asset) within a single Periodic Transaction Report (PTR) filed by a member of Congress or their staff under the STOCK Act. A PTR lists every asset transaction a filer (or spouse/dependent) made in a covered period; each asset line becomes one row. Sourced today from the Senate eFD electronic PTR HTML tables (chamber is hardcoded "Senate"; House PDF filings are not yet scraped).
One row per (ptr_id, row_num).
Point-in-time availability
Every Obscura dataset carries available_date: the calendar day the publisher made the row
available, day-of, with no session rounding. It is the one column a backtest filters on, and it means the
same thing on every dataset in the catalog.
For congress_trades: published: available_date = filing_date, the STOCK Act public-disclosure date (the day the PTR is posted on efdsearch.senate.gov).
Refresh cadence
Obscura refreshes congress_trades daily — the most frequent scheduled job that re-collects or re-exports it. This is Obscura's own pipeline cadence, not the upstream publisher's release schedule; when a row became public is recorded per row in available_date.
Schema — 18 columns
The full public column list for congress_trades, with the meaning of every field. The same
schema is served unauthenticated at https://api.obscura.trade/v1/catalog/congress_trades.
| Column | Type | Description |
|---|---|---|
| ptr_id | text · not null | Senate eFD PTR report UUID, from the /search/view/ptr/{uuid}/ link; the join key back to the filing. |
| row_num | integer · not null | The '#' line-item ordinal within the filing's transaction table. |
| chamber | text · not null | Legislative chamber of the filer — currently always "Senate". |
| filer_name | text | Full name of the filing member of Congress or covered staffer. |
| filer_role | text | Parenthetical filer role parsed from the eFD filer label (`data[i][2]`, e.g. "Peters, Gary (Senator)" → "Senator"): Senator / Candidate / Former Senator / covered staffer. The only signal distinguishing filer type, since `chamber` is hardcoded "Senate" and `filer_name` is rebuilt from name columns. |
| filing_date | date | Date the PTR was posted on efdsearch.senate.gov — the STOCK Act public-disclosure filing date. |
| filed_time | timestamp with time zone | Exact filing timestamp parsed from the PTR header ("Filed MM/DD/YYYY @ H:MM PM", US-Eastern wall clock, stored without tz shift): the intraday moment the disclosure became public, an event_time-grade refinement of the day-granular `filing_date`. |
| transaction_date | date | The trade's execution date as disclosed on the PTR (rehomed from the old, misused available_date). A period/event date, NOT when it became public. |
| available_date | date | PUBLIC-availability date = filing_date (STOCK Act disclosure). DB-generated, read-only; the point-in-time column to filter/join on — NEVER the trade's execution date. |
| owner | text | Household owner of the asset: Self / Spouse / Joint / Dependent Child. |
| ticker | text | Exchange ticker of the traded security; NULL when the asset has none. |
| asset_name | text | Free-text description of the traded asset as the filer wrote it. |
| asset_type | text | Asset class disclosed on the PTR (ST = stock, Municipal Security, options, etc.). |
| transaction_type | text | Purchase / Sale (full or partial) / Exchange. |
| amount_range | text | Raw disclosed dollar bucket exactly as printed, e.g. "$1,001 - $15,000". |
| amount_min | bigint | Lower bound of amount_range in USD. |
| amount_max | bigint | Upper bound of amount_range in USD; NULL for "Over $X" / "At least $X" buckets. |
| comment | text | Optional free-text filer annotation from the PTR's final column. |
Access congress_trades
Two delivery paths, one identifier. Both require an Obscura account and an active subscription; the catalog entry and the schema above are public.
import obscura
client = obscura.Client("obs_live_…")
df = client.query(
dataset="congress_trades",
symbols=["NVDA", "AAPL"],
start="2024-01-01",
)
Create a free account Browse all 95 datasets
Frequently asked questions
What is in the congress_trades dataset?
Stock and asset trades disclosed by members of Congress and their households under the STOCK Act, parsed from House and Senate periodic transaction reports. One reported line-item transaction (one traded asset) within a single Periodic Transaction Report (PTR) filed by a member of Congress or their staff under the STOCK Act. A PTR lists every asset transaction a filer (or spouse/dependent) made in a covered period; each asset line becomes one row. Sourced today from the Senate eFD electronic PTR HTML tables (chamber is hardcoded "Senate"; House PDF filings are not yet scraped).
How do I avoid look-ahead bias with congress_trades?
Filter on congress_trades.available_date, the day the publisher made the row public. For this dataset that date is derived as follows — published: available_date = filing_date, the STOCK Act public-disclosure date (the day the PTR is posted on efdsearch.senate.gov). A query of the form WHERE available_date <= '<as-of date>' never sees a row before it existed.
In what formats can I get congress_trades?
As a Parquet bulk export (POST https://api.obscura.trade/v1/download) or as JSON from the typed query API (POST https://api.obscura.trade/v1/query), both with dataset="congress_trades". The column schema is public at https://api.obscura.trade/v1/catalog/congress_trades.
Can I filter congress_trades by company or symbol?
Yes. congress_trades carries ticker, the column the API's symbols filter resolves against.
How often is congress_trades updated?
Obscura refreshes congress_trades on a daily schedule — that is the most frequent scheduled job that re-collects or re-exports the table. It is Obscura's own pipeline cadence, not the upstream publisher's release schedule; when the publisher makes a row available is described by the availability rule above, and is recorded per row in available_date.