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

PropertyValue
Base URLhttps://api.unusualwhales.com
AuthAuthorization: Bearer <token> header
Response envelope{ "data": [ ... ] }
Status codes200, 422, 500
Rate limitsNot specified

2. Endpoint matrix

#PathPurpose
1GET /api/congress/recent-tradesAll-Congress trade feed, time-windowed
2GET /api/congress/congress-traderSame shape, but supports filtering by name (one politician)
3GET /api/congress/late-reportsTrades filed late (past the STOCK Act window)
4GET /api/congress/politiciansPolitician 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:

FieldTypeDescription
politician_idUUIDUnique politician
namestringStandardized politician name
reporterstringName as filed
member_typestring"house" or "senate"
tickerstringStock symbol
txn_typestring"Buy" or "Sell"
amountsstringDollar range (e.g. "$15,001 - $50,000")
transaction_datedateTrade execution date
filed_at_datedateFiling submission date
is_activeboolActive status
issuerstringAccount type / issuer descriptor
notesstringFree-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:

ParamTypeRequiredDefaultNotes
limitintno100Min 1, max 200
datedatenolast trading dateMarket date filter
tickerstringno-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

  • page filters.

Query parameters:

ParamTypeRequiredDefaultNotes
limitintno100Min 1, max 200
datedatenolast trading date
tickerstringno-
namestringno-Politician full name, no digits
date_fromdateno-Range start (paired with date)
pageintno-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:

ParamTypeRequiredDefaultNotes
limitintno100Min 1, max 200
datedatenolast trading date
tickerstringno-

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:

ParamTypeRequiredDefaultNotes
last_traded_within_monthsintno-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 ticker filter. 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:

  • UWCongressActor polls /api/congress/recent-trades daily, de-dupes by (politician_id, ticker, transaction_date, txn_type).
  • Publishes UWCongressTrade custom data to the bus.
  • A long-horizon Strategy aggregates over rolling windows.

10. Known gaps

  • amounts is a range string ("$15,001 - $50,000"), not a clean numeric. Build a parser.
  • politicians endpoint 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_trades
  • https://api.unusualwhales.com/docs/operations/PublicApi.CongressController.congress_trader
  • https://api.unusualwhales.com/docs/operations/PublicApi.CongressController.congress_late_reports
  • https://api.unusualwhales.com/docs/operations/PublicApi.CongressController.congress_politicians

uw-api-gex-greeks uw-api-alerts uw-api-companies uw-api-commodities