Unusual Whales API - Congress endpoints
Four endpoints that surface U.S. Congressional stock trade disclosures: recent trades, by-politician trades, late-filed reports, and the politician roster. Filing cadence is irregular (STOCK Act allows up to 45 days), so these are slow signals at best - useful for longer-horizon strategies, not 0DTE.
Filed for completeness and future strategy work.
1. Base contract
| Property | Value |
|---|---|
| Base URL | https://api.unusualwhales.com |
| Auth | Authorization: Bearer <token> header |
| Response envelope | { "data": [ ... ] } |
| Status codes | 200, 422, 500 |
| Rate limits | Not specified |
2. Endpoint matrix
| # | Path | Purpose |
|---|---|---|
| 1 | GET /api/congress/recent-trades | All-Congress trade feed, time-windowed |
| 2 | GET /api/congress/congress-trader | Same shape, but supports filtering by name (one politician) |
| 3 | GET /api/congress/late-reports | Trades filed late (past the STOCK Act window) |
| 4 | GET /api/congress/politicians | Politician roster + activity recency filter |
The first three return the same trade-record schema; endpoint 4 returns the same shape too, just indexed by politician.
3. Common trade-record schema (endpoints 1-4)
Every Congress trade row has:
| Field | Type | Description |
|---|---|---|
politician_id | UUID | Unique politician |
name | string | Standardized politician name |
reporter | string | Name as filed |
member_type | string | "house" or "senate" |
ticker | string | Stock symbol |
txn_type | string | "Buy" or "Sell" |
amounts | string | Dollar range (e.g. "$15,001 - $50,000") |
transaction_date | date | Trade execution date |
filed_at_date | date | Filing submission date |
is_active | bool | Active status |
issuer | string | Account type / issuer descriptor |
notes | string | Free-form filing notes |
The amounts field is a range string, not a number. Parse to
(min, max) tuples for any aggregation work.
The STOCK Act gap = filed_at_date - transaction_date. Anything > 45
days is technically a late report. Endpoint #3 is pre-filtered to
those.
4. GET /api/congress/recent-trades
Most recently filed trades across all members.
Query parameters:
| Param | Type | Required | Default | Notes |
|---|---|---|---|---|
limit | int | no | 100 | Min 1, max 200 |
date | date | no | last trading date | Market date filter |
ticker | string | no | - | Filter by symbol |
Use: the primary feed. Poll daily, write to a local table, query for “any congress trade in SPY/QQQ in last 30 days?“
5. GET /api/congress/congress-trader
Filtered feed. Same schema as #4 but supports name and date_from
pagefilters.
Query parameters:
| Param | Type | Required | Default | Notes |
|---|---|---|---|---|
limit | int | no | 100 | Min 1, max 200 |
date | date | no | last trading date | |
ticker | string | no | - | |
name | string | no | - | Politician full name, no digits |
date_from | date | no | - | Range start (paired with date) |
page | int | no | - | Pagination (starts at 0) |
Use: drill into one politician’s history. Useful when a specific member is flagged (e.g. an unusual high-conviction position).
6. GET /api/congress/late-reports
Trades filed late (>45 days from transaction date).
Query parameters:
| Param | Type | Required | Default | Notes |
|---|---|---|---|---|
limit | int | no | 100 | Min 1, max 200 |
date | date | no | last trading date | |
ticker | string | no | - |
Response schema identical to #4.
Use: outlier detection. Late filings are correlated with politically sensitive trades. Worth monitoring but very low-frequency signal.
7. GET /api/congress/politicians
Roster of politicians with optional recency filter.
Query parameters:
| Param | Type | Required | Default | Notes |
|---|---|---|---|---|
last_traded_within_months | int | no | - | Range 1 to 240 (1 to 20 years) |
Response schema same as the trade rows (returns the latest trade per politician matching the filter), not a clean roster shape - so the endpoint is really “most-recent-trade-per-politician” rather than “static politician list.”
Use: identify active traders. Combine with #2 to drill in.
8. MK3 use
Not in the 0DTE SPY hunter hot path. Plausible plays:
- Long-horizon signal: weighted “smart politician” basket (subset with documented above-market returns). Polling weekly is enough.
- Anti-signal: pre-event positioning. If multiple members start buying a sector ahead of a known legislative event, take note.
- Postmortem context: when a ticker rips on no obvious news,
query #4 with that
tickerfilter. Sometimes Congress was early.
Time scale: weekly-to-monthly. Wrong tool for intraday.
9. Nautilus integration shape
For the SPY hunter, not needed. If/when a longer-horizon strategy wants it:
UWCongressActorpolls/api/congress/recent-tradesdaily, de-dupes by(politician_id, ticker, transaction_date, txn_type).- Publishes
UWCongressTradecustom data to the bus. - A long-horizon Strategy aggregates over rolling windows.
10. Known gaps
amountsis a range string ("$15,001 - $50,000"), not a clean numeric. Build a parser.politiciansendpoint conflates “roster” with “most-recent-trade”- the docs description and the actual response shape mismatch.
- No realtime / push - poll only.
- No party affiliation field in the documented schema.
11. Source URLs
https://api.unusualwhales.com/docs/operations/PublicApi.CongressController.congress_recent_tradeshttps://api.unusualwhales.com/docs/operations/PublicApi.CongressController.congress_traderhttps://api.unusualwhales.com/docs/operations/PublicApi.CongressController.congress_late_reportshttps://api.unusualwhales.com/docs/operations/PublicApi.CongressController.congress_politicians
uw-api-gex-greeks uw-api-alerts uw-api-companies uw-api-commodities