Unusual Whales API - Earnings endpoints

Layer mapping:

  • /api/earnings/afterhours + /api/earnings/premarket L1 partially (SPY doesn’t report, but mega-caps in SPY do, and their postmarket/premarket prints drive SPY gaps).
  • /api/earnings/{ticker} L2 (per-ticker swing-trade context).

SPY itself never appears in these feeds. What matters for L1 is who in SPY is reporting tonight or tomorrow morning. AAPL after the bell can move SPY 50 bps overnight.

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

#PathPurposeLayer
1GET /api/earnings/afterhoursTickers reporting after the bellL1 (calendar)
2GET /api/earnings/premarketTickers reporting before the openL1 (calendar)
3GET /api/earnings/{ticker}Historical earnings reactions for one tickerL2

3. GET /api/earnings/afterhours

Tickers scheduled to report after market close.

Query parameters:

ParamTypeRequiredDefaultRange
datedatenolast trading date-
limitintno501 to 100
pageintno-starts at 0

Response per record:

FieldTypeDescription
symbolstringTicker
full_namestringLegal company name
report_dateISO dateEarnings report date
report_timestringE.g. "postmarket", "premarket"
ending_fiscal_quarterISO dateQuarter end
street_mean_eststringAnalyst consensus EPS
actual_epsstringReported EPS (post-report only)
pre_earnings_closestringClose before report
pre_earnings_dateISO dateDate of pre_earnings_close
post_earnings_closestringClose after report
post_earnings_dateISO dateDate of post_earnings_close
reactionstringStock reaction (numeric %, as string)
expected_movestringImplied dollar move
expected_move_percstringImplied % move
marketcapstringMarket cap
is_s_p_500boolS&P 500 membership
sectorstringGICS sector
continent, country_code, country_namestringsGeography
has_optionsboolOptions trade for ticker
sourcestringData source attribution

4. GET /api/earnings/premarket

Same schema as #3, filtered to tickers reporting before the open.

Query parameters: identical to #3 (date, limit, page).

5. GET /api/earnings/{ticker}

Historical earnings reactions for one ticker. Different schema - adds straddle returns and pre/post-event move statistics.

Path parameter: ticker (required, e.g. AAPL)

Query parameters: none documented.

Response per record:

FieldDescription
report_date, report_timeWhen the earnings dropped
ending_fiscal_quarterQuarter end
actual_eps, street_mean_estEPS + consensus
expected_move, expected_move_percImplied move at report
pre_earnings_move_1d, _3d, _1w, _2wMoves into earnings
post_earnings_move_1d, _3d, _1w, _2wMoves out of earnings
long_straddle_1d, _1wLong straddle return at exit
short_straddle_1d, _1wShort straddle return at exit
sourceData origin

All numeric values returned as strings.

6. MK3 use

6.1 L1 (SPY hunter)

Pre-session routine, every trading day:

  1. Pull /api/earnings/afterhours for today’s date - list of mega-caps reporting tonight.
  2. Pull /api/earnings/premarket for tomorrow’s date - list of mega-caps reporting before open.
  3. Filter to is_s_p_500: true and top weights (combine with uw-api-etfs/weights for SPY: cross-reference symbols against SPY’s top-25 weight constituents).
  4. Build a gap-risk feature: n_mega_cap_earnings_overnight. Tradeoff: high overnight earnings density = higher overnight gap risk for SPY = bias L1 to either flatten EOD or sit on hands.
  5. Day-of-week awareness: mega-cap earnings cluster (AAPL + AMZN + GOOG on a Thursday, for example). Don’t sleep through it.

6.2 L2 (out of MK3 scope)

/api/earnings/{ticker} is the per-ticker historical reaction. For swing-trade strategy on individual names, it’s the core feed. Not relevant to MK3 right now - filed for future L2 work.

Per cortana-north-star section 6 (scope discipline): the per-ticker historical reaction data is L2 fodder. Don’t wire it into MK3.

7. Nautilus integration shape (L1 only)

  • One-time pull at session start of /afterhours (today) + /premarket (tomorrow).
  • Cache in memory.
  • Publish a UWEarningsCalendar snapshot to the bus once.
  • Strategies subscribe and read at decision time, never poll repeatedly.

No per-record custom data needed - just a daily snapshot type.

8. Known gaps

  • reaction is a string-typed number - parse to float.
  • The straddle returns in /earnings/{ticker} are not labeled with long-vs-short clearly until you look at the full field names. Code defensively.
  • No futures-impact field (e.g. /ES overnight move into earnings).
  • No earnings whisper number; just consensus.

9. Source URLs

  • https://api.unusualwhales.com/docs/operations/PublicApi.EarningsController.afterhours
  • https://api.unusualwhales.com/docs/operations/PublicApi.EarningsController.premarket
  • https://api.unusualwhales.com/docs/operations/PublicApi.EarningsController.ticker

cortana-north-star uw-api-etfs uw-api-economy 2026-05-15-mk3-setup-hunter-architecture