Every stock trade a member of Congress makes is public record under the STOCK Act, filed as a Periodic Transaction Report on the House financial disclosure portal or its Senate counterpart. Public does not mean usable: the filings are documents, split across two portals, and a fair number are scanned images. I wanted this data as rows, not PDFs. The Congress Financial Disclosures and Stock Trades API on Apify turns the whole record into a queryable dataset: search by member, ticker, or date range, get JSON back.
Disclosure: the Apify links in this post are affiliate links. If you run the Actor, I may earn a referral commission at no extra cost to you.
Is there an official API for congress stock trades?
No. The House and Senate each run their own disclosure portal, both built for looking up documents one at a time, and neither offers a developer API. The underlying filings are per-member PDFs, some typed, some scanned. So congress stock trading data as an API means a scraper-backed dataset you query like an API: filters in, one clean row per transaction out.
What the congress stock trading data API returns
The API returns one row per disclosed transaction as structured JSON: who traded, what, which direction, the filed amount bracket, and the dates and filing IDs to verify it.
| Field | Example | Notes |
|---|---|---|
First_Name, Last_Name, House
|
"Nancy", "Pelosi", "House"
|
Plus State_District
|
Ticker, Asset
|
"NVDA", "NVIDIA Corporation"
|
Ticker blank for unlisted assets |
Transaction_Type |
P |
P purchase, S sale, S (partial), E exchange |
Amount_Range |
"$1,001 - $15,000" |
The bracket exactly as filed |
Date, Notification_Date
|
2024-06-14, 2024-07-10
|
Trade date and report date |
Filing_ID, PDF_Quality
|
20024561, "text"
|
Trace any row to its source filing |
Each result set carries a search_metadata object with total_results_found and the query echoed back, so exports are self-documenting.
Who this is for
Journalists doing accountability reporting, compliance and ESG teams screening for exposure or conflicts, quants testing whether disclosed trades carry signal, and transparency advocates who want the record in a spreadsheet.
The manual way, and where it breaks
Doing this by hand means working two separate portals with different search forms, opening filings one at a time, and transcribing tables from PDFs. The scanned filings are the killer: a meaningful share of reports are images, so you are running OCR and fixing its mistakes. Member names vary across filings, tickers hide inside asset descriptions, and by the time you have one member's year assembled, the next reporting cycle has landed. I tried the manual route for exactly one afternoon.
The faster way: run the congress trades scraper
Apify Console
- Open the Congress Financial Disclosures API and click Try for free.
- Filter by
Last_Name,Stock_Symbol, or aStart_DateandEnd_Daterange. - Run it and download the dataset as JSON, CSV, or Excel.
REST
curl -X POST "https://api.apify.com/v2/acts/johnvc~us-congress-financial-disclosures-and-stock-trading-data/runs?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "Last_Name": "Pelosi", "Start_Date": "2024-01-01", "End_Date": "2024-12-31", "Max_Results": 100 }'
Run endpoint reference: the Apify API docs.
Query congress trades in Python
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("johnvc/us-congress-financial-disclosures-and-stock-trading-data").call(
run_input={"Stock_Symbol": "NVDA", "Max_Results": 200}
)
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
print(row["Date"], row["Last_Name"], row["Transaction_Type"], row["Ticker"], row["Amount_Range"])
Name and ticker filters are case-insensitive partial matches, which forgives the inconsistencies in the underlying filings.
Track a single member's trades
Track Nancy Pelosi stock trades is the member-watch recipe: one last name, a date range, every disclosed transaction with brackets and filing IDs.
Watch one ticker across all of Congress
The ticker series flips the question to "who is trading this stock": Nvidia, Tesla, and Apple are ready to run, and the same pattern exists for Amazon, AMD, Google, Meta, Microsoft, Palantir, and TSMC.
Pull a year of disclosures in one run
Get congress stock disclosures last year uses only the date range, which produces the base dataset for any analysis that starts with "across all members".
Monitor new filings daily
Track US congress stock trades daily pairs the Actor with an Apify Schedule so new disclosures land in your dataset the day they are filed, which is how newsroom tip sheets get built.
Use it from Claude and other MCP clients
Connect the Apify MCP server (https://mcp.apify.com/?tools=actors,docs,johnvc/us-congress-financial-disclosures-and-stock-trading-data) and Claude, Claude Code, or Cursor can answer "which members traded semiconductor stocks this quarter" with rows instead of recollection. If you have not used Claude with tools, start at claude.ai.
FAQ about scraping congress stock trades
How much does the congress trades scraper cost?
Billing is per transaction returned plus a small per-run start fee. A 100-row member query runs about $0.19 on the free tier and a full 1,000-row pull about $1.91, with volume tiers lowering the per-row price. Max_Results caps any run, and new Apify accounts include free platform credit.
Where does the scraper's data come from?
From the public record: Periodic Transaction Reports filed under the STOCK Act on the House and Senate disclosure portals. Every row carries a Filing_ID and DocID, so any number can be traced back to the source filing.
Can compliance and ESG teams use this scraper?
Yes, that is a core use. Screen a watchlist of tickers or members on a schedule, and route hits into your case system. The bracket amounts and notification dates are exactly what a conflicts or ESG review needs to document.
Can Claude query the scraper through MCP?
Yes. Over the Apify MCP server the Actor becomes a callable tool, so an agent can filter by member, ticker, or date range mid-conversation and cite the filing IDs it found.
Can I schedule the scraper to catch new disclosures?
Yes. Save a task with your filters, attach a daily schedule, and diff new id values against your store. Start from the Congress Financial Disclosures API.
Why does the scraper show amount ranges instead of exact values?
Because exact values do not exist anywhere in the source: members file brackets like "$1,001 - $15,000", and that is what you get. Two more honest limits: filings trail trades by 30 to 45 days under the reporting deadline, so this is research data rather than a live feed, and rows with PDF_Quality of "image" came through OCR, so spot-check those against the source PDF when a number matters.
More from Truffle Pig Data
The long-form walkthrough lives on Medium: How to track congress stock trades with the Financial Disclosures API. Related Actors on the finance shelf: the SEC Investment Advisor Contacts API and the Google Finance API.
Wrapping up
The record is public; now it is also queryable. Point the Congress Financial Disclosures and Stock Trades API at a member, a ticker, or a year and see what the filings say.
Top comments (0)