/pre/bronze/calendar Upcoming earnings, with the features as they stand today
https://api.earningspy.ai/v1/pre/bronze/calendar The pre-earnings snapshot for every company with a report coming up: what the fundamentals, valuation, risk and event-window metrics looked like before the market found out. Refreshed weekly, and each row is frozen at capture. We do not go back and rewrite history, which is what makes it safe to backtest.
Ordered by earnings date, then ticker.
Included in the calendar feature set: identity (TICKER, COMPANY,
SECTOR, EARNINGS_DATE, DAYS_LEFT), timing flags (IS_BMO, IS_AMC),
valuation (MARKET_CAP, P/E, FWD_P/E), surprise history (EPS_SURPRISE,
REVENUE_SURPRISE), risk (SHARPE_ANNZD, FHS_GARCH_ANNZD_VOL) and the event
score (EVENT_SCORE, EVENT_SCORE_QUINT).
On the values. EPS here is the consensus going into the report, not a
result: this is the pre-earnings snapshot, so it carries the expectation.
Parameters
| Name | In | Description | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
view | query | A named view: the fields to return, their order, any row filter and the sort, all decided server-side. Prefer this over See the views reference (#views) for the available views and their columns. | ||||||||||||||||
period | query | A named window over
In Q1 the biquarter window crosses a year boundary - in March it runs 1 Oct of the prior year to 31 Mar. Default | ||||||||||||||||
sort | query | Direction of the Ascending is the default because these are upcoming events - soonest
first is the calendar reading. Use Default | ||||||||||||||||
limit | query | Rows per page. Default | ||||||||||||||||
cursor | query | Opaque pagination token from a previous response’s next_cursor. Treat
as opaque - the encoding is not part of the contract. A malformed cursor
returns 400. |
Example responses
First page of a week
{
"data": [
{
"TICKER": "ACME",
"COMPANY": "Acme Financial Corp.",
"SECTOR": "Financial",
"EARNINGS_DATE": "2026-07-14T00:00:00",
"DAYS_LEFT": 3,
"IS_BMO": 1,
"MARKET_CAP": 895300000000,
"P/E": 14.2,
"FWD_P/E": 13.1,
"EPS": 5.8,
"EPS_SURPRISE": 0.041,
"SHARPE_ANNZD": 0.94,
"FHS_GARCH_ANNZD_VOL": 0.213,
"VAR_H": -0.024,
"C_VAR": -0.036,
"EVENT_SCORE": 0.61,
"EVENT_SCORE_QUINT": 4,
"PRICE_AS_OF": "2026-07-11T12:00:00+00:00"
}
],
"next_cursor": "eyJkIjoiMjAyNi0wNy0xNFQwMDowMDowMCIsInQiOiJBQ01FIn0",
"count": 1,
"price_as_of": "2026-07-11T12:00:00+00:00",
"layers_included": [
"bronze"
],
"window": {
"start": "2026-04-01",
"end": "2026-09-30",
"period": "biquarter"
},
"sort": "asc"
} Final page - next_cursor is null
{
"data": [],
"next_cursor": null,
"count": 0,
"price_as_of": null,
"layers_included": [
"bronze"
],
"window": {
"start": "2026-04-01",
"end": "2026-09-30",
"period": "biquarter"
},
"sort": "asc"
} Status codes
-
200A page of earnings events -
400A parameter was rejected: an unknown column infields, a malformed cursor, an out-of-rangelimit, or an impossible date. -
401No credential presented, or the key is unknown. -
403The key is revoked or expired, or its tier does not include the layer being requested. -
429The key’s usage-plan throttle or monthly quota was exceeded. Back off and retry; quotas reset monthly. -
500Unexpected server error. Details are logged, never returned.