# Economic Calendar Scraper: CPI, NFP, Forex Factory Impact (`steadyscrape/economic-calendar-scraper`) Actor

Economic calendar data (CPI, payrolls, rate decisions, GDP, PMIs) from Trading Economics for 140+ countries: time in UTC, actual, consensus, previous, revisions, forecast, importance, plus Forex Factory's impact this week. Forex and macro releases as JSON, CSV or API. Release-watch mode.

- **URL**: https://apify.com/steadyscrape/economic-calendar-scraper.md
- **Developed by:** [Steady Scrape](https://apify.com/steadyscrape) (community)
- **Categories:** Business, News, Automation
- **Security:** Limited permissions
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.50 / 1,000 calendar releases

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

## Economic Calendar Scraper: CPI, NFP, Rate Decisions, PMIs, with Forex Factory Impact

Get the **economic calendar** as clean data: every scheduled macro release (CPI and inflation, non-farm payrolls and jobless
claims, central bank rate decisions, GDP, PMIs, retail sales, trade balance, bond auctions…) for **140+ countries and areas**,
with its **time in UTC**, **actual**, **consensus**, **previous** (and what it was **revised from**), Trading Economics' own
**forecast** and **importance**. Releases of the current week also carry **Forex Factory's impact** (high / medium / low), the
label forex traders filter on.

Built for trading bots, macro dashboards, newsletters and alerts that run on a schedule. A **release-watch mode** delivers only
the releases whose actual figure came out since your last run, so an hourly schedule pays only for new numbers.

### What it reads

- **Trading Economics' public economic calendar** (tradingeconomics.com/calendar), the way any visitor sees it: the date
  ranges, countries and importance levels its menus offer to everyone, times set to UTC.
- **Forex Factory's own weekly calendar export** (the current week), to add Forex Factory's impact and forecast to the
  releases both calendars list. Releases are paired only when they have the same currency, the same minute and the same
  name (for example Forex Factory's "CPI y/y" and Trading Economics' "Inflation Rate YoY"); a release with no sure match
  keeps the impact empty rather than a wrong one.

No login, no browser, and no proxy to set up.

### Use cases

- **Trading bots and EAs**: pull this week's high-impact releases for USD, EUR, GBP and JPY before the session, and the
  actual versus consensus right after each release.
- **Macro dashboards and spreadsheets**: a weekly or monthly table of releases for the countries you follow, with numbers
  ready to chart (`actualValue`, `consensusValue`, `previousValue`).
- **Alerts and newsletters**: schedule release watch every 15 minutes and send each new CPI, payrolls or rate decision as it
  lands.
- **Research**: the last 30 days of releases with their surprises (actual minus consensus) and revisions.

### Input

| field | what it does |
|---|---|
| `period` | `yesterday`, `today`, `tomorrow`, `recent` (today and the next days), `thisWeek`, `nextWeek`, `previousWeek` (last 7 days), `thisMonth`, `nextMonth`, `previousMonth` (last 30 days) |
| `region` | `major` (G20 and more, the default), `world`, `europe`, `america`, `asia`, `africa`; used when no country or currency is given |
| `countries` | pick countries and areas (euro area, European Union, OPEC…); overrides the region |
| `currencies` | ISO codes such as `USD`, `EUR`, `GBP`, `JPY`; with no countries, reads every economy paying in them |
| `minImportance` | `low` (all), `medium`, `high` |
| `releaseStatus` | `all`, `released` (actual out), `upcoming` (no actual yet) |
| `eventKeywords` | keep releases whose name or category contains any of these words (`inflation`, `pmi`, `interest rate`…) |
| `maxEvents` | stop after this many releases, earliest first; `0` = all |
| `onlyNewReleases` | release watch: only releases whose actual appeared or changed since your last run with the same settings |

Example: this week's high-importance releases in the four major FX currencies.

```json
{
    "period": "thisWeek",
    "currencies": ["USD", "EUR", "GBP", "JPY"],
    "minImportance": "high"
}
```

### Output

One row per release. Example (US Housing Starts, 2026-10-20):

```json
{
    "status": "ok",
    "reason": null,
    "eventId": "399226",
    "date": "2026-10-20",
    "time": "12:30",
    "dateTimeUtc": "2026-10-20T12:30:00.000Z",
    "country": "United States",
    "countryCode": "US",
    "currency": "USD",
    "event": "Housing Starts",
    "referencePeriod": "SEP",
    "category": "housing starts",
    "importance": "high",
    "released": true,
    "actual": "1.221M",
    "actualValue": 1.221,
    "consensus": "1.30M",
    "consensusValue": 1.3,
    "previous": "1.288M",
    "previousValue": 1.288,
    "previousRevisedFrom": "1.275M",
    "teForecast": "1.3M",
    "teForecastValue": 1.3,
    "forexFactoryImpact": "low",
    "forexFactoryTitle": "Housing Starts",
    "forexFactoryForecast": "1.30M",
    "symbol": "UNITEDSTAHOUSTA",
    "url": "https://tradingeconomics.com/united-states/housing-starts",
    "scrapedAt": "2026-10-22T13:30:00.000Z"
}
```

| field | meaning |
|---|---|
| `eventId` | Trading Economics' id of this release |
| `date`, `time`, `dateTimeUtc` | when it is released, in UTC; `time` and `dateTimeUtc` are null for releases listed without a time (elections, some meetings) |
| `country`, `countryCode`, `currency` | the economy (`EA` is the euro area, `EU` the European Union) and its currency (null for the world, OPEC, IMF, G7, G20) |
| `event`, `referencePeriod`, `category` | the release name, the period it covers (`SEP`, `Q3`, `OCT/17`), and the indicator it belongs to |
| `importance` | Trading Economics' importance: `low`, `medium`, `high` (null when the calendar shows none) |
| `released` | whether the actual figure is out |
| `actual`, `consensus`, `previous` | the figures as printed, with their unit (`3.5%`, `$-749.7M`, `194K`) |
| `actualValue`, `consensusValue`, `previousValue`, `teForecastValue` | the same figures as numbers, as printed (scale letter and unit stay in the text field) |
| `previousRevisedFrom` | when the previous figure was revised, the value it had before |
| `teForecast` | **Trading Economics' own forecast** (its analysts' and model's projection), not the market consensus |
| `forexFactoryImpact`, `forexFactoryTitle`, `forexFactoryForecast` | Forex Factory's impact (`high`, `medium`, `low`, `holiday`), its name for the release and its forecast; null outside the current week, for currencies Forex Factory does not cover, or when no sure match exists |
| `symbol`, `url` | Trading Economics' ticker of the indicator, and its page |
| `status`, `reason`, `scrapedAt` | `ok` for a release (its `reason` is null); a free row says `no_results`, `invalid` (a currency no economy pays in) or `blocked` with the reason; when the row was read, in UTC |

A run that finds nothing stores one free row with `status` `no_results` and the reason (for example "of 54 listed, 54 in
another currency"). A summary with releases listed, pages read and releases left out by each filter is in the run's
key-value store as `SUMMARY`.

### Pricing

**US$0.0005 per release delivered** (US$0.50 per 1,000). Releases left out by your filters, releases not new in release-watch
mode, and status rows are free. A week of high-importance releases for the major economies is about 15–30 releases
(about US$0.01); every release of the major economies for a whole month is about 1,300 (US$0.65).

### Release watch on a schedule

Turn on `onlyNewReleases` and schedule the Actor (for example every 15 minutes with `period` `today`). Each run delivers
only the releases whose actual figure appeared or changed since the last run with the same countries, currencies,
importance and keywords; the first run delivers every release already out. Upcoming releases are never delivered in this
mode. The memory lives in a key-value store named `steadyscrape-economic-calendar-state` in your account.

### Limits

- **Only the date ranges Trading Economics offers every visitor**: from the last 30 days to next month. Older history and
  custom date ranges are not offered (Trading Economics keeps them for subscribers).
- Trading Economics shows a visitor at most 1,000 releases at once; larger selections (the world for a month) are read as
  several smaller country selections and merged, which takes a few more seconds.
- The site can occasionally answer a request with a table it rendered for another visitor, so every selection is read
  twice, at least 6 seconds apart, and kept only when both reads agree (a run takes about 10 seconds per selection). If the
  reads keep disagreeing, the run stops with a free `blocked` row instead of delivering doubtful data.
- Forex Factory's export covers the current week only and allows few requests; when it cannot be read, releases are still
  delivered, with the Forex Factory fields empty.

### Legal

This Actor is **unofficial** and is **not affiliated with, endorsed by or connected to Trading Economics or Forex Factory**.
It reads public pages and a public export that anyone can open without an account, at a gentle pace, and does not pass any
login, paywall or challenge. The figures belong to their publishers; check the terms of Trading Economics and Forex Factory
before redistributing them, and use them for your own analysis.

# Actor input Schema

## `period` (type: `string`):

The date range, as Trading Economics' calendar offers it to every visitor. <b>Recent</b> is today and the next days; <b>previous week</b> and <b>previous month</b> are the last 7 and 30 days. Older history and custom dates are not offered.

## `region` (type: `string`):

Which economies to read when <b>Countries</b> and <b>Currencies</b> are empty, as the calendar's own region buttons select them. <b>Major</b> is the G20 economies plus the euro area, the EU, the world, OPEC, the IMF, the G7 and Singapore.

## `countries` (type: `array`):

Read only these countries and areas (the euro area, the European Union, OPEC…). When set, the region is ignored.

## `currencies` (type: `array`):

Keep releases of economies paying in these currencies, as ISO codes: <code>USD</code>, <code>EUR</code>, <code>GBP</code>, <code>JPY</code>, <code>CHF</code>, <code>CAD</code>, <code>AUD</code>, <code>NZD</code>, <code>CNY</code>… With no countries chosen, every economy paying in them is read (<code>EUR</code> reads the euro area, the EU and each euro country).

## `minImportance` (type: `string`):

Trading Economics' own importance of each release: <b>high</b> is what moves markets (CPI, payrolls, rate decisions, GDP, PMIs).

## `releaseStatus` (type: `string`):

<b>Released</b> keeps releases whose actual figure is out; <b>Upcoming</b> keeps those still waiting for it.

## `eventKeywords` (type: `array`):

Keep releases whose name or category contains any of these words, ignoring case, e.g. <code>inflation</code>, <code>non farm payrolls</code>, <code>interest rate</code>, <code>pmi</code>.

## `maxEvents` (type: `integer`):

Stop after this many releases, the earliest first. <code>0</code> delivers every release of the period.

## `onlyNewReleases` (type: `boolean`):

For scheduled runs: deliver (and charge) only releases whose actual figure appeared or changed since your last run with the same countries and filters. The first run delivers every release already out. Upcoming releases are never delivered in this mode.

## Actor input object example

```json
{
  "period": "thisWeek",
  "region": "major",
  "countries": [],
  "currencies": [],
  "minImportance": "high",
  "releaseStatus": "all",
  "eventKeywords": [],
  "maxEvents": 0,
  "onlyNewReleases": false
}
```

# Actor output Schema

## `events` (type: `string`):

No description

## `summary` (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 = {
    "period": "thisWeek",
    "region": "major",
    "minImportance": "high"
};

// Run the Actor and wait for it to finish
const run = await client.actor("steadyscrape/economic-calendar-scraper").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 = {
    "period": "thisWeek",
    "region": "major",
    "minImportance": "high",
}

# Run the Actor and wait for it to finish
run = client.actor("steadyscrape/economic-calendar-scraper").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 '{
  "period": "thisWeek",
  "region": "major",
  "minImportance": "high"
}' |
apify call steadyscrape/economic-calendar-scraper --silent --output-dataset

```

## MCP server setup

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

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/vR79dGXrvBxXXAwkT/builds/tnHhPGXPNNb6nQXlf/openapi.json
