The moment a member of Congress files a stock disclosure, we pick it up. Query by ticker or politician. Get webhook alerts within hours of filing. Free to start — no credit card, no waitlist.
Other services lock congressional trading data behind expensive subscriptions, slow daily refreshes, and UI-only access. Here's the breakdown.
| Feature | CongressInvests | QuiverQuant | Unusual Whales | Finnhub |
|---|---|---|---|---|
| Free tier | ✓ 100 req/day | ✗ Paid only | ✗ Paid only | ~ Very limited |
| Pro price | $29 / mo | $25–75 / mo | $40–60 / mo | $50+ / mo |
| Data freshness | ✓ Every 6 hours | ~ Daily | ~ Daily | ~ Daily |
| Webhook alerts | ✓ By ticker or politician | ✗ | ✗ | ✗ |
| Senate + House | ✓ Both chambers | ✓ | ✓ | ~ Partial |
| REST API access | ✓ Free & Pro | ✓ Paid plans | ✗ UI-first | ✓ Paid plans |
| AI trend analysis | ✓ Pro — cached 24h/ticker | ✗ | ✗ | ✗ |
| Open source SDK | ✓ Python + Node.js | ✗ | ✗ | ✗ |
| Data source | Official Senate EFD + House Clerk | Official gov sources | Official gov sources | Third-party aggregator |
Competitor details are approximate — verify current pricing on their respective sites. Questions? Contact us.
On startup, a background thread fetches Periodic Transaction Reports (PTRs) going back 365 days from two sources: efdsearch.senate.gov (HTML pages, CSRF-authenticated) and disclosures-clerk.house.gov (bulk XML index + per-PTR PDFs).
Senate PTRs are parsed as HTML tables. House PTRs are downloaded as PDFs and parsed with pdfplumber. From each filing the member name, transaction date, ticker, asset name, trade type (buy/sell), and disclosed dollar range are extracted. Only stocks and stock options are indexed.
Trades from both chambers are merged into a single in-memory dictionary keyed by ticker
symbol — O(1) per-ticker lookups, no database required. Each trade record carries a
chamber field so you can tell Senate from House. Cache auto-refreshes
every 24 hours.
A FastAPI app exposes the data over a simple REST API with CORS enabled for all origins. Deployed on Railway with zero-config auto-scaling.
/health
Liveness check. Returns status: "ok" plus cache readiness, ticker count,
and data age in seconds. Good for uptime monitoring.
/trades/{ticker}
All trades for a specific stock ticker, sorted newest-first. Case-insensitive —
nvda and NVDA both work. Filter by ?chamber=Senate or
?chamber=House.
/trades/{ticker}/summary
AI
Pro
Full trade list for the ticker plus an AI-generated
trend analysis — sentiment (bullish/bearish/mixed), a 2–3 sentence narrative, and notable
member patterns. Cached for 24 hours per ticker,
so all Pro subscribers get instant results after the first call of the day.
Requires a valid X-Api-Key header. Grounded strictly in the disclosed filing data.
/trades?limit=N
All cached trades across every ticker, newest-first. Default limit is 200; pass
?limit=500 to get more. Useful for a global feed or bulk analysis.
/cache/status
Returns cache metadata: whether data is ready, whether a reload is in progress, total ticker count, and when the cache was last loaded.
/cache/refresh
Force a full cache reload. Requires the X-Api-Key header. Useful after the
Senate publishes a batch of new PTRs and you don't want to wait for the 24-hour cycle.
curl https://congressinfor-production.up.railway.app/trades/NVDA
GET /trades/NVDA{
"ticker": "NVDA",
"total": 15,
"offset": 0,
"limit": 50,
"has_more": false,
"data_current": true,
"cache_loading": false,
"last_updated": "2026-05-31T10:04:17Z", // UTC timestamp of last scrape
"data_lag_minutes": 14, // minutes since last refresh
"next_refresh_in_minutes": 346, // minutes until next incremental refresh
"trades": [
{
"member": "John Boozman",
"chamber": "Senate",
"ticker": "NVDA",
"trade_type": "buy",
"amount": "$1,001 - $15,000",
"tx_date": "2026-03-19",
"disclosed": "2026-04-14",
"asset": "NVIDIA Corporation - Common Stock",
"link": "https://efdsearch.senate.gov/search/view/ptr/..."
}
]
}
100 requests/day free — no account or API key required. Upgrade to Pro for webhooks and higher limits.
curl https://congressinfor-production.up.railway.app/trades/NVDA
curl -H "X-Api-Key: YOUR_PRO_KEY" \
https://congressinfor-production.up.railway.app/trades/NVDA/summary
Response includes the full trade list plus an ai_analysis object:
{
"ai_analysis": {
"sentiment": "bullish",
"summary": "Congressional trading in NVDA is skewed toward buying, with 31 buys (62%) vs 19 sells (38%)...",
"notable_patterns": "Cleo Fields is responsible for 27% of all trades, with a concentrated buying campaign...",
"cached": true, // false on the first call of the day; true after that
"stats": {
"total_trades": 50,
"buys": 31,
"sells": 19,
"unique_members": 16,
"date_range": {
"earliest": "2025-06-24",
"latest": "2026-04-24"
}
}
}
}
curl "https://congressinfor-production.up.railway.app/trades/recent?limit=25&days=30"
curl -H "X-Api-Key: YOUR_KEY" \
"https://congressinfor-production.up.railway.app/trades/recent?limit=500"
Get notified within hours of a new filing — no polling required.
1. Subscribe to a ticker or politician
curl -X POST https://congressinfor-production.up.railway.app/webhooks/subscribe \
-H "X-Api-Key: YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"webhook_url": "https://your-server.com/hook", "ticker": "NVDA", "events": ["any"]}'
2. Handle the payload on your server
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route("/hook", methods=["POST"])
def hook():
trade = request.get_json()
print(f"🔔 {trade['politician']} {trade['trade_type']} {trade['ticker']} — {trade['amount']}")
return jsonify({"ok": True})
Payload delivered to your URL
{
"event": "new_trade",
"ticker": "NVDA",
"politician": "Nancy Pelosi",
"trade_type": "Purchase",
"amount": "$1,000,001 - $5,000,000",
"filing_date": "2026-05-30",
"transaction_date": "2026-05-15",
"source": "House",
"api_url": "https://congressinfor-production.up.railway.app/trades/NVDA"
}More examples in the congressinvests-api SDK repo ↗ · Full webhook API docs ↗
Live data pulled from the production API. No key required for the free tier.
Start for free. Upgrade as your usage grows. No credit card required to get started.
Everything you need to explore congressional trading data.
/trades/{ticker}/tradesFor developers and researchers who need reliable, high-volume access.
/trades/{ticker}/summaryFor newsrooms, fintechs, and teams that need guaranteed uptime and custom data.
All plans subject to House Clerk and Senate EFD fair-use terms. Prices in USD. Cancel any time.
Already a Pro subscriber? Manage or cancel your subscription.
Get notified the moment a new disclosure hits — before most people even know it exists.
Watch NVDA, AAPL, or any symbol. Get a webhook the instant a member files a trade on it.
Follow specific members of Congress across every ticker they trade — Senate or House.
Our incremental refresh runs every 6 hours. Webhooks fire the moment new PTRs are detected.
Automatic retries with exponential back-off. Every delivery attempt is logged.
Webhook payload delivered to your URL on every new trade:
{
"event": "new_trade",
"ticker": "NVDA",
"politician": "Nancy Pelosi",
"trade_type": "Purchase",
"amount": "$1,000,001 - $5,000,000",
"filing_date": "2026-05-30",
"transaction_date": "2026-05-15",
"source": "House",
"api_url": "https://congressinfor-production.up.railway.app/trades/NVDA"
}Webhook alerts are a Pro tier feature. View API docs ↗
Interested in Pro or Enterprise access, have a question, or want to report an issue? Send a message and we'll get back to you.