# Earnings Calendar: EPS Estimates, Actuals & Surprise (`mrdoe/earnings-calendar-tracker`) Actor

Earnings dates with before/after-market timing, consensus EPS estimate, actual EPS, surprise % and reported revenue for any tickers or the whole market. Chain-ready ticker + date key.

- **URL**: https://apify.com/mrdoe/earnings-calendar-tracker.md
- **Developed by:** [MrDoe](https://apify.com/mrdoe) (community)
- **Categories:** Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 upcoming earnings returneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

![Earnings Calendar: EPS Estimates, Actuals & Surprise - Earnings calendar with EPS estimate, actual EPS, surprise percent and report timing](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/earnings-calendar-tracker--hero.png)

### What does Earnings Calendar: EPS Estimates, Actuals & Surprise do?

Earnings Calendar Tracker returns one row per company earnings report: the ticker, the report date, whether it reports before or after the market, the consensus EPS estimate, the actual EPS once reported, the surprise percentage, the number of estimates and the reported revenue. Give it a list of tickers or leave the list empty for every company reporting in a date range of up to 186 days. Every row has a clean ticker and report_date key, so it joins directly with options flow, insider trading and other datasets.

### Why use Earnings Calendar: EPS Estimates, Actuals & Surprise?

- Estimate, actual and surprise in one row, so a single run covers the calendar and the results.
- A stable ticker plus report_date key that other datasets can join on.
- Reported revenue is added from SEC filings, an official source, for reported quarters.
- Bulk watchlists or the whole market for any date window; delta mode returns only new results.
- No account or API key.

### What makes this different

Free calendars show dates only and paid data feeds charge per seat. This Actor returns the calendar, estimate, actual and surprise together, adds SEC-reported revenue, and is built to be chained: the ticker and report date are clean join keys.

### Who can use the Earnings Calendar Tracker and how?

- **Earnings traders:** see who reports before and after the bell and how the last quarter surprised.
- **Options traders:** build a pre-earnings volatility screen from report dates.
- **Quant teams:** join estimates, actuals and surprise to price and flow data.
- **Retail investors:** track your watchlist's report dates and results.
- **Newsletter writers:** publish a weekly earnings preview and results recap.
- **Fintech developers:** power an earnings calendar view or alert through the API.
- **Analysts:** compare estimates and revenue across sectors.
- **Alert builders:** notify when a watched company reports with delta mode.

### How it works

![Earnings Calendar: EPS Estimates, Actuals & Surprise workflow: your input, collection, output](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/earnings-calendar-tracker--how-it-works.png)

1. **Your input** — enter tickers (or none for all companies) and a date range.
2. **The Actor collects it** — the Actor reads each business day's earnings calendar and, for reported quarters, looks up revenue in SEC filings.
3. **Your output** — you get one row per report with timing, estimate, actual and surprise.

### What data can you extract?

The dataset has 19 fields per row:

| Field                   | Type   | Description                                             |
| ----------------------- | ------ | ------------------------------------------------------- |
| `ticker`                | string | Stock ticker.                                           |
| `company_name`          | string | Company name.                                           |
| `report_date`           | string | Report date (YYYY-MM-DD).                               |
| `report_time`           | string | before_market or after_market, null when not announced. |
| `fiscal_quarter_end`    | string | Fiscal quarter the report covers, for example Sep/2026. |
| `eps_estimate`          | number | Consensus EPS estimate.                                 |
| `eps_actual`            | number | Actual EPS, null before the report.                     |
| `surprise_pct`          | number | Actual versus estimate in percent.                      |
| `number_of_estimates`   | number | Number of analyst estimates behind the consensus.       |
| `revenue_estimate`      | number | Always null: no free revenue consensus exists.          |
| `revenue_actual`        | number | Reported quarterly revenue in USD from SEC filings.     |
| `last_year_eps`         | number | EPS of the same quarter last year.                      |
| `last_year_report_date` | string | Report date of the same quarter last year.              |
| `market_cap_usd`        | number | Market capitalization in USD.                           |
| `status`                | string | scheduled or reported.                                  |
| `fetch_path`            | string | nasdaq_calendar or nasdaq_calendar_and_sec_filing.      |
| `source`                | string | Data source.                                            |
| `scraped_at`            | string | Collection time (ISO 8601).                             |
| `actor_version`         | string | Output schema version.                                  |

### How to use Earnings Calendar: EPS Estimates, Actuals & Surprise

![Earnings Calendar: EPS Estimates, Actuals & Surprise input form](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/earnings-calendar-tracker--input.png)

1. Open the Actor and go to the **Input** tab.
2. Enter **Tickers** (or leave empty), set a **Date range** and **Max events**, and run.
3. Optionally set filters and a **Max results** limit.
4. Click **Start**. A default run finishes in under a minute.
5. Open the **Output** tab, then download the dataset or connect it to your tools.

### Input Parameters

| Parameter            | Type    | Required | Default                   | Description                                                                                                            |
| -------------------- | ------- | -------- | ------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
| `tickers`            | array   | No       | `[]`                      | Only return these tickers, one per line. Leave empty for every company reporting in the date range.                    |
| `dateRange`          | object  | No       | `{}`                      | From and to dates (YYYY-MM-DD), at most 186 days. Default is 21 days back and 70 days ahead.                           |
| `minMarketCapUsd`    | number  | No       | `0`                       | Skip companies below this market cap. Useful for whole-market calendars.                                               |
| `includeRevenue`     | boolean | No       | `true`                    | Look up the reported quarterly revenue in SEC filings for reported events (up to 60 per run).                          |
| `maxItems`           | integer | No       | `100`                     | Maximum number of events returned. Default is 100; set 0 for no limit.                                                 |
| `deltaMode`          | boolean | No       | `false`                   | Return and bill only events not delivered before, or whose status or actual EPS changed (an event that just reported). |
| `deltaStateKey`      | string  | No       | `"default"`               | Name of the tracked stream. Use a different key per watchlist.                                                         |
| `proxyConfiguration` | object  | No       | `{"useApifyProxy":false}` | Optional proxy. The public calendar works without one from most networks.                                              |

### Output Data

![Earnings Calendar: EPS Estimates, Actuals & Surprise dataset table](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/earnings-calendar-tracker--output.png)

`report_time` is `before_market` or `after_market`, and null when the company has not announced a time. `eps_estimate` is the consensus before the report; `eps_actual` and `surprise_pct` are filled once reported. `revenue_actual` is the quarterly revenue in US dollars from the company's SEC filing; `revenue_estimate` is null because no free source publishes revenue consensus. `status` is `scheduled` or `reported`.

![Earnings Calendar: EPS Estimates, Actuals & Surprise field map of one record](https://api.apify.com/v2/key-value-stores/kE36venAoVchGsE6b/records/earnings-calendar-tracker--fields.png)

A real dataset item:

```json
{
    "ticker": "CASY",
    "company_name": "Caseys General Stores, Inc.",
    "report_date": "2026-09-08",
    "report_time": null,
    "fiscal_quarter_end": "Jul/2026",
    "eps_estimate": 6.6,
    "eps_actual": 7.37,
    "surprise_pct": 11.67,
    "number_of_estimates": 7,
    "revenue_estimate": null,
    "revenue_actual": 5678336000,
    "last_year_eps": null,
    "last_year_report_date": null,
    "market_cap_usd": 22133596200,
    "status": "reported",
    "fetch_path": "nasdaq_calendar_and_sec_filing",
    "source": "nasdaq_earnings_calendar",
    "scraped_at": "2026-09-26T02:39:15.698Z",
    "actor_version": "1.0.0"
}
```

### How to read and use the results

1. **Filter status = scheduled** for what is coming and sort by report_date.
2. **Check report_time** to know if it lands before or after the market.
3. **Read surprise_pct** on reported rows: positive means a beat.
4. **Compare with last_year_eps** for growth.
5. **Join on ticker and report_date** with your other datasets.
6. **Automate** with delta mode and a daily schedule.

### Usage Examples

#### Earnings for a watchlist

```json
{
    "tickers": ["AAPL", "MSFT", "NVDA", "TSLA"],
    "dateRange": {
        "from": "2026-10-01",
        "to": "2026-11-15"
    }
}
```

#### Big companies reporting this week

```json
{
    "dateRange": {
        "from": "2026-10-12",
        "to": "2026-10-16"
    },
    "minMarketCapUsd": 50000000000,
    "maxItems": 0
}
```

#### Only newly reported results

```json
{
    "tickers": ["AAPL", "MSFT", "NVDA"],
    "deltaMode": true,
    "deltaStateKey": "earnings-watch"
}
```

### Tips for Best Results

- Use the default window for a rolling view: three weeks of recent results and ten weeks of upcoming dates.
- Filter by minimum market cap to keep whole-market calendars readable.
- Schedule daily with delta mode to receive each result once.
- Join on ticker plus report_date with your options or insider data.
- Default is 5 results for a fast test. Set the max to 0 to return everything available.

### Reliability by mode

| Mode                                             | Status | Needs login or key? | Notes                                        |
| ------------------------------------------------ | ------ | ------------------- | -------------------------------------------- |
| Report dates and timing                          | ✅     | No                  | Nasdaq public calendar.                      |
| EPS estimate, actual, surprise                   | ✅     | No                  | Same source.                                 |
| Reported revenue                                 | 🟡     | No                  | SEC filings; first 60 reported rows per run. |
| Revenue estimate                                 | ❌     | -                   | Not published for free.                      |
| Quarters whose revenue is reported only annually | 🟡     | No                  | Fourth quarter revenue can be null.          |
| Source stability                                 | 🟡     | No                  | Unofficial web service; can change.          |

✅ works as described, 🟡 works with caveats, ❌ not supported.

### Only new records (delta mode)

Turn on **Only new or updated events (delta mode)** and set a **Delta key**. A scheduled run returns, and bills, only events not delivered before or events that changed from scheduled to reported.

### Known Limitations

- The calendar and estimates come from Nasdaq's public earnings calendar, which is not a documented API and can change without notice.
- Revenue estimate is not available (null); reported revenue comes from SEC filings and is looked up for up to 60 rows per run.
- Report time is null when the company has not published it.
- Estimates are consensus numbers from the calendar provider at the time of collection.
- Dates can move; run again for the latest schedule.
- For personal research use: Nasdaq's site terms restrict automated collection, so keep volumes low.

### Integrations

Run it from the Apify API, on a schedule, or from a webhook. Send results straight to Google Sheets, Make, Zapier, Slack or your own database with Apify's built-in integrations.

### Export Formats

Download the dataset as JSON, CSV, Excel, XML, HTML table or RSS from the **Output** tab or the API.

### Frequently Asked Questions

#### Where does the data come from?

Dates, timing, estimates and actual EPS come from Nasdaq's public earnings calendar (a public web service, not an official documented API). Reported revenue comes from SEC EDGAR company filings, an official source.

#### Does it need an API key?

No.

#### What is surprise_pct?

Actual EPS compared with the consensus estimate, in percent, as reported by the calendar.

#### How do I get the next earnings date for a stock?

Enter the ticker and a date range covering the next three months; the row with status scheduled is the next report.

#### Can I chain it with other Actors?

Yes. Join on ticker and report_date.

#### Am I charged for failed results?

No. You are only charged for events written to the dataset.

#### Do I need an account or login?

No. The Actor reads public web services and needs no account or API key.

#### Am I charged for failed runs or empty results?

You are only charged for results that are actually written to the dataset.

#### Can I run it on a schedule?

Yes. Create a Task with your input and add a schedule in Apify Console. With monitor mode on, each scheduled run returns only what changed since the previous one.

### Changelog

- **2026-09-26:** First release: earnings calendar with estimate, actual, surprise, SEC reported revenue and delta mode.

### Enterprise and custom work

Need higher volumes, a custom output schema, dedicated scheduling or a no-breaking-changes commitment for a production pipeline? Open an issue on the Actor page and describe your use case. Bulk terms and custom builds are available.

### Support

Questions or a missing field? Open an issue from the **Issues** tab on this Actor's page and it will be looked at.

### Legal / Responsible Use

For personal research use. Nasdaq's website terms restrict automated collection; you are responsible for complying with them and applicable law. SEC data is public. This is not investment advice and the Actor is not affiliated with Nasdaq or the SEC.

# Actor input Schema

## `tickers` (type: `array`):

Only return these tickers, one per line. Leave empty for every company reporting in the date range.

## `dateRange` (type: `object`):

From and to dates (YYYY-MM-DD), at most 186 days. Default is 21 days back and 70 days ahead.

## `minMarketCapUsd` (type: `number`):

Skip companies below this market cap. Useful for whole-market calendars.

## `includeRevenue` (type: `boolean`):

Look up the reported quarterly revenue in SEC filings for reported events (up to 60 per run).

## `maxItems` (type: `integer`):

Maximum number of events returned. Default is 100; set 0 for no limit.

## `deltaMode` (type: `boolean`):

Return and bill only events not delivered before, or whose status or actual EPS changed (an event that just reported).

## `deltaStateKey` (type: `string`):

Name of the tracked stream. Use a different key per watchlist.

## `proxyConfiguration` (type: `object`):

Optional proxy. The public calendar works without one from most networks.

## Actor input object example

```json
{
  "tickers": [
    "AAPL",
    "MSFT",
    "NVDA",
    "TSLA",
    "GOOGL",
    "AMZN",
    "META",
    "JPM"
  ],
  "dateRange": {},
  "minMarketCapUsd": 0,
  "includeRevenue": true,
  "maxItems": 25,
  "deltaMode": false,
  "deltaStateKey": "default",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "tickers": [
        "AAPL",
        "MSFT",
        "NVDA",
        "TSLA",
        "GOOGL",
        "AMZN",
        "META",
        "JPM"
    ],
    "dateRange": {},
    "maxItems": 25,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("mrdoe/earnings-calendar-tracker").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "tickers": [
        "AAPL",
        "MSFT",
        "NVDA",
        "TSLA",
        "GOOGL",
        "AMZN",
        "META",
        "JPM",
    ],
    "dateRange": {},
    "maxItems": 25,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("mrdoe/earnings-calendar-tracker").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "tickers": [
    "AAPL",
    "MSFT",
    "NVDA",
    "TSLA",
    "GOOGL",
    "AMZN",
    "META",
    "JPM"
  ],
  "dateRange": {},
  "maxItems": 25,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call mrdoe/earnings-calendar-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mrdoe/earnings-calendar-tracker"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/hetIiKPmqg4at2OeE/builds/0gBXLzCnSoiMcCbzr/openapi.json
