Products
Congressional Trades
Access US Congress & Senate trading disclosures and corporate PAC donations linked to public company leadership.
What's inside
FIRM's Congressional Trades product combines these datasets:
- Congressional trading disclosures: trades that House and Senate members report under the STOCK Act in periodic transaction reports (PTRs), filterable by ticker. Two coverage sources: a realtime cross-ticker feed (
provider=options_flow, the default) and a bulk alternative-data feed (provider=alternative_).data - US Congress roster: Live member list with trade counts per politician.
- Corporate PAC donations: Campaign contributions from a company's corporate PAC to politicians, linked by ticker.
Real-world use: monitor what members of Congress trade in names you follow, line trades up against committee assignments and votes, and see where a company's PAC money goes.
Access
2 credits/call. Available in Starter and up.
Endpoints
| Method | Path | MCP tool | Description |
|---|---|---|---|
| GET | /api/v3/intel/congress | intel_congress | Recent congressional trades, cross-ticker or for one ?ticker=. ?provider= picks the coverage source (options_flow, the default realtime feed, or alternative_data; with alternative_data, a ticker switches from the live cross-ticker feed to that ticker's history); ?limit= (1–500, default 50; the default options_flow feed returns at most 200 trades per call whatever limit asks for, while alternative_data returns up to 500). Each trade carries ticker, politician, party, chamber, transaction_type, amount (the disclosed range), transaction_date and reported_date. Returns {provider, ticker, items, count}. |
| GET | /api/v3/intel/politicians | intel_politicians | US Congress roster (House and Senate) with disclosed trade counts: bioguide_id, name, party, chamber, state, trade_count. Use it to resolve a name to a BioGuide ID before pulling trades. ?limit= (1–1000, default 100). Returns {items, count}. |
| GET | /api/ | intel_corporate_donors | Corporate-PAC donations linked to the ticker's parent company: candidate_name, bioguide_id, company_committee, committee, amount, transaction_date, cycle. ?limit= (1–500, default 50). Returns {ticker, items, count}. When the source answers and holds no records for the company, items is empty and a note says so: many companies have no corporate PAC. |
Disclosures are filed after the trade, so reported_date is later than transaction_date, and amount is the value range the member reported, not an exact figure. party is null when it is not known.
With provider=alternative_ and a ticker, trades come from a warehouse copy of the feed first (source: "warehouse:congressional-trades-archive"), and from the live feed only for a ticker the copy does not hold. The copy holds trades from 2025-05-20 onward, plus earlier history for some tickers from a one-time load. data_from (the oldest trade held for the ticker), history_floor, data_through, as_of and coverage_note say where it begins; older trades may exist at the source and are not included, so do not describe the answer as a member's complete history.
When the feed cannot be read, intel/congress, intel/politicians and intel/corporate_donors answer 503 with error: "upstream_ instead of an empty list, not billed, with an error_code such as upstream_, archive_read_timeout or archive_read_failed and a Retry-After header. A 503 means the data could not be retrieved, not that nobody traded; see Alt-Data for the codes.
Examples
Bash: Recent congressional trades (all members)
curl -H "Authorization: Bearer $WEALTHNOW_API_KEY" \ "https://firm.wealthnow.io/api/v3/intel/congress?limit=25"Response:
{ "ok": true, "timestamp": "2026-09-24T14:32:18.123456+00:00", "provider": "options_flow", "ticker": null, "items": [ { "ticker": "NVDA", "politician": "...", "party": "...", "chamber": "House", "transaction_type": "Buy", "amount": "$15,001 - $50,000", "transaction_date": "2026-09-02", "reported_date": "2026-09-19", "issuer": "...", "notes": "" } ], "count": 1}Python: Congressional trades + politicians roster
import os, requests KEY = os.environ["WEALTHNOW_API_KEY"]headers = {"Authorization": f"Bearer {KEY}"} # Get recent congressional tradestrades = requests.get( "https://firm.wealthnow.io/api/v3/intel/congress", headers=headers, timeout=30,).json()print(f"Latest trades: {trades['count']} items")print(trades["items"][:2]) # Get Congress roster with trade countscongress = requests.get( "https://firm.wealthnow.io/api/v3/intel/politicians?limit=50", headers=headers, timeout=30,).json()print(f"Congress members: {congress['count']}")for member in congress["items"][:3]: print(f" {member['name']} ({member['chamber']}): {member.get('trade_count', 0)} trades") # Get corporate donations for a tickerdonors = requests.get( "https://firm.wealthnow.io/api/v3/intel/corporate_donors/NVDA", headers=headers, timeout=30,).json()print(f"NVDA PAC donations: {donors['count']} recipients")print(donors["items"][:2])