Data API

Your Earnings Whispers data in a spreadsheet, a script, or an AI assistant. One key, three ways to use it.

What you can access

Every endpoint covers your watch list, and that is what a request returns unless you say otherwise. A Trader subscription can also reach the whole universe — every company with analyst coverage, around 4,500 names — by adding scope=universe. It is a choice per request, not a setting: ask for scope=watchlist any time you only want your own stocks.

Subscription Watch list All covered companies Confirmed calendar Last quarter & guidance Five-year history Requests a day
Member Yesup to 10 — Watch list only — — 100
Investor Yesup to 100 — Everyone Yes Watch list 1,000
Trader Yes Yes~4,500 Everyone Yes Any company 5,000

Written previews and earnings history follow the watch-list rule: your own list, or every company with a Trader subscription. The confirmed calendar is wider on purpose — a schedule of who reports when isn’t analysis, so Investors get the whole population too.

Requests return 100 rows unless you ask for more with limit, up to 500 at a time. When meta.has_more is true, raise offset by your limit and ask again; when it’s false, you have everything. The per-company limits above are a ceiling on how much one subscription can pull, not a limit on how many stocks you can follow.

Your keys

A key identifies you and carries your subscription. Anyone holding it can read your data, so treat it like a password — and if one ever gets out, revoke it here.

Quick start

In a browser or with curl

curl -H "X-EW-Key: YOUR_KEY" \
  "https://www.earningswhispers.com/api/v1/earnings?limit=10"

In Excel or Google Sheets

Excel: Data → Get Data → From Web, and paste this URL. It refreshes on whatever schedule you set.

https://www.earningswhispers.com/api/v1/earnings?key=YOUR_KEY

The key parameter exists for tools that can’t send headers. When you can send one, prefer X-EW-Key — a key in a URL ends up in browser history and server logs along the way.

In Python

import requests

r = requests.get(
    "https://www.earningswhispers.com/api/v1/earnings",
    headers={"X-EW-Key": "YOUR_KEY"},
    params={"scope": "universe", "grade_min": 10, "confirmed": True, "limit": 50},
)
for row in r.json()["data"]:
    print(row["ticker"], row["epsDate"], row["whisper"], row["grade"])

Endpoints

Base URL https://www.earningswhispers.com/api/v1. Everything returns JSON. Authenticate with an X-EW-Key header or a key query parameter.

GET /me

What your key can do — tier, scopes, detail levels, how far history reaches (history: any, watchlist or none) — and how many requests you have left today. The first thing to check when something is refused.

GET /earnings

Upcoming earnings, filtered. Narrow it — a date range or a handful of tickers uses one request where an unfiltered pull uses many.

ParameterValuesWhat it does
scopewatchlist, universeYour list, or every company with analyst coverage (Trader)
detailstandard, expandedExpanded adds last quarter’s results and guidance. Standard leaves those fields out entirely
from, toYYYY-MM-DDEarnings date range
tickersNKE,MU,ORCLSpecific companies, up to 200
grade_min, grade_max0–12Earnings Whisper Grade, 0 is F and 12 is A+
confirmedtrueOnly companies that have confirmed their date
sectornumberOne sector
limit, offset1–500Page size (default 100) and where to start

Every list comes back as { "meta": { ... }, "data": [ ... ] }. meta repeats the scope, detail, limit and offset you asked for, with count rows returned and has_more saying whether another page is waiting.

GET /calendar

The confirmed earnings calendar: who reports on which day, the time of day, market cap, and the implied and average moves. Lighter than /earnings, and available across every confirmed date for Investors as well as Traders. Defaults to every confirmed date from today out to 120 days.

ParameterValuesWhat it does
scopeall, watchlistEvery confirmed date (default), or just your own stocks
from, toYYYY-MM-DDDate range. Defaults to today through 120 days, which is also the maximum span
limit, offset1–500Page size and where to start

Returns ticker, company, epsDate, epsTime, period, confirmed, marketCap, url, impliedMove, avgMove and avgVolume. The same data backs the download button on the monthly calendar.

GET /company/{ticker}

One company’s next report. Takes detail.

GET /history/{ticker}

The last 20 reports — about five years — for one company, newest first: how it did against the whisper and consensus, revenue against its estimate, guidance, and how the stock traded around each report. Traders can ask for any company; Investors for companies on their watch list.

FieldWhat it is
date, releaseTimeReport date, and BMO or AMC
tradingDateThe first session that traded on the report: the report day for BMO, the next day for AMC
quarterDateFiscal quarter end
eps, whisper, consEstReported EPS, the Earnings Whisper number, and consensus, all on the option-expense-adjusted basis
revenue, revEstReported revenue and its estimate, in millions
epsOpenOpening price on tradingDate
guidanceDirection of guidance issued with the report
pricesDaily open, high, low, close and volume for every session from 10 before to 10 after the report

Each entry in prices has a day: 0 is tradingDate, -1 the session before it, 1 the session after. Days count trading sessions, not calendar days, so weekends and holidays never leave gaps. A report from the last two weeks has fewer than 10 sessions after it until they trade.

{ "date": "2026-08-04", "releaseTime": "AMC", "tradingDate": "2026-08-05",
  "eps": 1.66, "whisper": 1.69, "consEst": 1.62, "guidance": "Positive",
  "prices": [
    { "day": -1, "date": "2026-08-04", "open": 504.00, "close": 518.58, ... },
    { "day":  0, "date": "2026-08-05", "open": 484.49, "close": 482.05, ... },
    ... ] }

GET /previews

The written previews: headline, opening paragraph and a link to the full piece. Takes scope — watchlist by default, or universe for every upcoming preview (Trader) — plus limit and offset.

When something goes wrong

StatusMeans
400Something in the request isn’t valid, such as a ticker that can’t be one
401No key, or the key is wrong or revoked
403Your subscription doesn’t cover what you asked for
404No upcoming earnings, or no history, for that ticker
429Out of requests for today. Retry-After says when it resets

Every error carries a plain-English error.message explaining what happened.

Fields

Every /earnings and /company row carries these:

FieldWhat it is
ticker, company, urlSymbol, name, and investor relations site
epsDate, epsTime, periodWhen it reports. Period is BMO, DMH or AMC
confirmedWhether the company has confirmed the date
whisperThe Earnings Whisper number for the coming quarter
earningsEst, revenueEst, prevRevenueConsensus estimates, and revenue in the same quarter a year earlier
grade, scoreEarnings Whisper Grade (0–12) and Score (−5 to +5)
sentiment−1 most bearish to +1 most bullish
impliedMove, avgMoveOptions-implied and historical average moves
drift, revisionMove since the last report, and estimate revisions
prevClose, dayOpen, high, low, lastTrade, volumeToday’s prices
marketCap, avgVolume, eavwapSize, average volume, anchored VWAP
shortRatio, shortPercentShort interest
callDirection, callMomentumAI call analysis on the last conference call
revenueTrend, marginTrend, demandTrend, guidanceTrend, toneTrendDirection on each axis: Up, Flat or Down
trends, compositeAvgTrend snapshot

With detail=expanded (Investor and Trader)

These appear only on an expanded request. A standard response leaves them out rather than sending them empty.

FieldWhat it is
reportedDate, reportedEPS, consensusEst, reportedWhisperThe last quarter as reported
reportedOptExpThe option-expense adjustment applied to EPS and consensus
reportedRevenue, reportedRevenueEstRevenue against its estimate
lyReportedEPS, lyReportedRevenueSame quarter a year earlier, split-adjusted
epsGrowthYoY, revenueGrowthYoYYear-over-year growth
guidanceDate, guidanceDirection, guidanceKind, guidancePeriod, guidanceRange, guidanceSubjectGuidance issued with that report, or the most recent since. Kind is Q or FY
guidEpsLow, guidEpsMid, guidEpsHigh, guidEpsConsensusGuided EPS against consensus
guidRevLow, guidRevMid, guidRevHigh, guidRevConsensusGuided revenue against consensus
guidancePercHow far the guidance sits from consensus

EPS and consensus are both reported on the option-expense-adjusted basis, so they compare directly. The Whisper is already quoted that way.

Use with AI

The MCP server connects your data to an AI assistant, so you can ask questions instead of writing requests:

What’s reporting on my watch list this week, and which have a grade of A− or better?
How often has AMD beaten the whisper over the last five years, and how did the stock trade the week after?

Works with Claude Desktop, Claude Code, Cursor, VS Code and anything else that supports MCP. You need Node.js 20 or newer, and a key from above — the server won’t start without one.

Claude Desktop

Settings → Developer → Edit Config, then add:

{
  "mcpServers": {
    "earnings-whispers": {
      "command": "npx",
      "args": ["-y", "earningswhispers-mcp"],
      "env": { "EW_API_KEY": "YOUR_KEY" }
    }
  }
}

Claude Code

claude mcp add earnings-whispers \
  --env EW_API_KEY=YOUR_KEY \
  -- npx -y earningswhispers-mcp

Cursor and VS Code

Cursor: add the Claude Desktop block above to ~/.cursor/mcp.json. VS Code: add it to .vscode/mcp.json, with "servers" in place of "mcpServers".

On Windows, if the assistant can’t start npx, use "command": "cmd" and "args": ["/c", "npx", "-y", "earningswhispers-mcp"].

Restart the app afterwards. Six tools appear:

ToolWhat it does
ew_get_my_accessWhat your subscription covers, requests left today
ew_get_upcoming_earningsUpcoming earnings, filtered
ew_get_companyOne company’s next report
ew_get_earnings_historyThe last 20 reports and how the stock traded around each
ew_get_earnings_calendarWho reports on which day, and when
ew_get_earnings_previewsThe written previews

Limits and fair use

  • Requests are counted per key per day and reset at midnight. /me reports what’s left.
  • 100 rows a page by default, up to 500 with limit; use offset for the rest.
  • The data is for your own use. Redistributing it, or republishing it as your own feed, needs a license — get in touch.
  • Keys are yours alone. If you need access for a team, talk to us about an institutional license rather than sharing one.