# ForexFactory Calendar Scraper (`axiomworks/economic-calendar-scraper`) Actor

Scrape scheduled economic releases from Trading Economics, Nasdaq and ForexFactory. Results include event dates and times in UTC, country or currency, importance, and available release values. The ForexFactory weekly feed can also add impact ratings to matching Trading Economics and Nasdaq events.

- **URL**: https://apify.com/axiomworks/economic-calendar-scraper.md
- **Developed by:** [Axiom Works](https://apify.com/axiomworks) (community)
- **Categories:** Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.95 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

**Returns:** one row per economic event with `datetimeUtc`, `country`, `currency`, `event`, `importance`, `actual`, `consensus` and `forecast`.
**Input:** `{"dateRange": "thisWeek", "countries": ["United States"], "minImportance": "medium", "maxItems": 100}`
**Best for:** macro trading dashboards, news and alert bots that react to data releases, and research datasets of historical releases.

```json
{
    "id": "te-399075",
    "datetimeUtc": "2026-10-14T12:30:00Z",
    "country": "United States",
    "currency": "USD",
    "event": "Inflation Rate YoY",
    "importance": "high",
    "actual": "3.7%",
    "forecast": "3.6%"
}
```

### What does Economic Calendar Scraper do?

Economic Calendar Scraper is an economic calendar API for data releases and central bank events. Give it a date range, optionally a list of countries and a minimum importance, and it returns one structured row for every scheduled release: the time in UTC, the country and currency, the event name, and the actual, previous, consensus and forecast values as the source displays them. You can use it as a Trading Economics scraper, a Nasdaq economic events scraper, or a ForexFactory calendar scraper, or combine the three in one run.

The default source is the public Trading Economics calendar. It covers more than 250 countries and has an importance rating (low, medium, high), a category, a reference period such as `SEP` or `Q3`, a ticker and a link to the indicator page. The Nasdaq source adds one request per day, works for any past or future date, and includes a plain-language description when the source supplies one. The ForexFactory source is the public weekly feed with impact ratings for the current week; it is also used to add a `forexFactoryImpact` value to Trading Economics and Nasdaq rows that fall in the same week and match on currency, time and title.

All times are converted to UTC so you can sort and join rows across sources. Values are kept as strings exactly as shown (`-39.3K`, `3.3%`, `3.99M`), so units are never lost. No login is needed and no cookies or accounts are required from you.

Use the records for trading dashboards, release alerts and historical comparisons.

### What data can you get from Trading Economics, Nasdaq and ForexFactory?

Every row has the same fields. Fields a source does not provide are `null`, for example `description` is only filled for Nasdaq rows and `ticker` only for Trading Economics rows.

| Field | Description | Example |
|---|---|---|
| `id` | Stable ID with a source prefix (`te-`, `nq-`, `ff-`), unique within a run | `te-399064` |
| `source` | `tradingeconomics`, `nasdaq` or `forexfactory` | `tradingeconomics` |
| `date` | Event date in UTC, `YYYY-MM-DD` | `2026-10-13` |
| `time` | Event time in UTC, `HH:MM`, null when the source gives no time | `14:00` |
| `datetimeUtc` | ISO 8601 timestamp in UTC | `2026-10-13T14:00:00Z` |
| `country` | Country name (null on ForexFactory rows, which only give a currency) | `United States` |
| `countryCode` | Trading Economics country code | `US` |
| `currency` | ISO 4217 currency of the country, or the feed currency on ForexFactory rows | `USD` |
| `event` | Name of the release or event | `Existing Home Sales` |
| `reference` | Period the release refers to | `SEP` |
| `category` | Indicator category in lowercase | `existing home sales` |
| `importance` | `low`, `medium`, `high` or `holiday` (null for Nasdaq rows) | `high` |
| `actual` | Released value as displayed, null before the release | `3.99M` |
| `previous` | Previous value as displayed | `3.93M` |
| `revised` | Revised previous value, when the source revised it | `3.98M` |
| `consensus` | Market consensus as displayed | `3.95M` |
| `forecast` | Forecast as displayed | `3.97M` |
| `forexFactoryImpact` | ForexFactory impact rating (Low, Medium, High, Holiday) for events in the current week | `High` |
| `ticker` | Trading Economics indicator symbol | `UNITEDSTAEXIHOMSAL` |
| `eventUrl` | Trading Economics indicator page | `https://tradingeconomics.com/united-states/existing-home-sales` |
| `description` | Explanation of the indicator (Nasdaq rows) | `German Retail Sales measures the change in...` |
| `scrapedAt` | Timestamp of the run | `2026-10-15T19:14:27.693Z` |
| `sourceUrl` | Page or API endpoint the row came from | `https://tradingeconomics.com/united-states/existing-home-sales` |

Rows from different sources are not merged. If you select Trading Economics and Nasdaq, the same release can appear twice, once per source, and the `source` field tells them apart. Filter on `source` if you want a single feed.

### How to use Economic Calendar Scraper

1. Open the Actor on Apify and go to the Input tab.
2. Choose a `dateRange`, for example `thisWeek`, or pick `custom` and enter `startDate` and `endDate`.
3. Add countries as names (`United States`, `Euro Area`, `Germany`) or as Trading Economics ISO3 codes (`usa`, `emu`, `gbr`, `jpn`). Leave the list empty to get every country.
4. Set `minImportance` to `medium` or `high` to drop minor releases, and choose the sources you want.
5. Set `maxItems`, press Start, and export the dataset as JSON, CSV, Excel, XML or RSS when the run finishes.

A few tips. Weeks run from Monday to Sunday and all times are UTC. Rows are sorted by time and country, so `maxItems` keeps the earliest events in the range. A custom range can span at most 31 days. For Trading Economics, the custom range must fall inside one of its guest windows (roughly the last 30 days up to the end of next month); for any other dates, add `nasdaq` to `sources`, which accepts any date. If a custom range does not fit a Trading Economics window, the Actor falls back to Nasdaq for those days and logs a warning.

### Input

| Field | Type | Required | Description |
|---|---|---|---|
| `dateRange` | string | No | `today`, `tomorrow`, `yesterday`, `thisWeek` (default), `nextWeek`, `lastWeek`, `thisMonth`, `nextMonth`, `last30Days` or `custom` |
| `startDate` | string | With `custom` | First day, `YYYY-MM-DD` |
| `endDate` | string | No | Last day, `YYYY-MM-DD`, at most 31 days after `startDate` |
| `countries` | array of strings | No | Country names or ISO3 codes. Empty means all countries. Unknown values are skipped with a warning |
| `minImportance` | string | No | `low` (default), `medium` or `high`. Nasdaq rows have no rating and are left out unless this is `low` |
| `sources` | array of strings | No | Any of `tradingeconomics` (default), `nasdaq`, `forexfactory` |
| `addForexFactoryImpact` | boolean | No | Add `forexFactoryImpact` to rows in the current week. Default true |
| `currencies` | array of strings | No | Currency codes such as USD or EUR, case-insensitive. Empty (default) keeps all |
| `eventKeywords` | array of strings | No | Literal phrases matched against event titles, case-insensitive. Any phrase may match; empty keeps all |
| `categories` | array of strings | No | Exact Trading Economics category values, case-insensitive. Empty keeps all; other sources have no category |
| `maxItems` | integer | No | Maximum rows across all sources, 1-10000, default 100 |
| `proxyConfiguration` | object | No | Proxy settings. Default: no proxy. Enable Apify Proxy if the sites block your runs |

```json
{
    "dateRange": "thisWeek",
    "countries": ["United States", "Euro Area"],
    "minImportance": "medium",
    "sources": ["tradingeconomics"],
    "addForexFactoryImpact": true,
    "maxItems": 100,
    "proxyConfiguration": { "useApifyProxy": false }
}
```

To monitor inflation without collecting unrelated releases, add `"eventKeywords": ["inflation"]`. To follow a currency across several countries, use `"currencies": ["EUR"]` and leave `countries` empty. To select an exact Trading Economics indicator category, use `"categories": ["inflation rate"]`; this excludes Nasdaq and ForexFactory rows because their category is null. Category values are the source's labels, such as `inflation rate mom`, rather than broad themes inferred from titles.

These three filters are optional and default to empty lists. Multiple values within one filter are alternatives; different filters apply together with countries, date range and importance. For example, a USD currency filter combined with Germany will normally return no rows. Keywords are literal substrings, not regular expressions or translations. A non-English phrase only matches if that text occurs in the source's event title. An unknown currency, category or unmatched keyword returns a successful empty dataset with a message suggesting fewer filters. Filters apply before saving and charging: `maxItems` is the shared maximum of matching records, so skipped rows consume no results. They do not reduce upstream requests because source pages are collected before filtering and chronological sorting.

For a fixed historical window from Nasdaq only:

```json
{
    "dateRange": "custom",
    "startDate": "2026-09-01",
    "endDate": "2026-09-03",
    "countries": ["Germany"],
    "sources": ["nasdaq"],
    "maxItems": 50
}
```

The Nasdaq source labels its time column as GMT, but the values are US Eastern time. The Actor converts them from America/New_York to UTC, including daylight saving changes, so `time` and `datetimeUtc` are comparable across sources.

When a ForexFactory currency filter is needed, countries are mapped to their currency, so selecting Germany for the ForexFactory source returns EUR rows. ForexFactory rows have no country name, only the currency.

### Output

Each run writes one dataset item per event. Two real rows from Trading Economics and one from Nasdaq:

```json
[
    {
        "id": "te-399064",
        "source": "tradingeconomics",
        "date": "2026-10-13",
        "time": "14:00",
        "datetimeUtc": "2026-10-13T14:00:00Z",
        "country": "United States",
        "countryCode": "US",
        "currency": "USD",
        "event": "Existing Home Sales",
        "reference": "SEP",
        "category": "existing home sales",
        "importance": "high",
        "actual": "3.99M",
        "previous": "3.93M",
        "revised": "3.98M",
        "consensus": "3.95M",
        "forecast": "3.97M",
        "forexFactoryImpact": null,
        "ticker": "UNITEDSTAEXIHOMSAL",
        "eventUrl": "https://tradingeconomics.com/united-states/existing-home-sales",
        "description": null,
        "scrapedAt": "2026-10-15T19:14:27.693Z",
        "sourceUrl": "https://tradingeconomics.com/united-states/existing-home-sales"
    },
    {
        "id": "te-398650",
        "source": "tradingeconomics",
        "date": "2026-10-14",
        "time": "12:30",
        "datetimeUtc": "2026-10-14T12:30:00Z",
        "country": "United States",
        "countryCode": "US",
        "currency": "USD",
        "event": "Core Inflation Rate MoM",
        "reference": "SEP",
        "category": "core inflation rate mom",
        "importance": "high",
        "actual": "0.3%",
        "previous": "0.3%",
        "revised": null,
        "consensus": "0.2%",
        "forecast": "0.2%",
        "forexFactoryImpact": null,
        "ticker": "USACIRM",
        "eventUrl": "https://tradingeconomics.com/united-states/core-inflation-rate-mom",
        "description": null,
        "scrapedAt": "2026-10-15T19:14:27.693Z",
        "sourceUrl": "https://tradingeconomics.com/united-states/core-inflation-rate-mom"
    },
    {
        "id": "nq-2026-09-02-germany-german-retail-sales-02-00-0",
        "source": "nasdaq",
        "date": "2026-09-02",
        "time": "06:00",
        "datetimeUtc": "2026-09-02T06:00:00Z",
        "country": "Germany",
        "countryCode": null,
        "currency": "EUR",
        "event": "German Retail Sales",
        "actual": "-3.4%",
        "previous": "0.0%",
        "consensus": "0.4%",
        "description": "German Retail Sales measures the change in the total value of inflation-adjusted...",
        "sourceUrl": "https://api.nasdaq.com/api/calendar/economicevents?date=2026-09-02"
    }
]
```

The third record is shortened here for readability; real rows always contain every field, with `null` where a source has no value. Results can be exported as JSON, CSV, Excel, XML or RSS from the dataset page, or read through the API.

### How much does it cost to scrape the economic calendar?

Economic Calendar Scraper is charged per result. You pay only for the rows returned, and `maxItems` caps how many that can be. See the Pricing tab for the current price. A typical week for one or two countries is a few dozen rows; an all-country run over a week is larger, so set `maxItems` if you only need the first entries.

### Use with AI agents (MCP)

Connect Economic Calendar Scraper to Claude, Cursor or any MCP client through the Apify MCP server:

```json
{
    "mcpServers": {
        "apify": {
            "url": "https://mcp.apify.com/?tools=axiomworks/economic-calendar-scraper"
        }
    }
}
```

Example prompts:

1. "List the high-importance US economic releases this week with their consensus and actual values."
2. "What euro area data releases are scheduled tomorrow, in UTC?"
3. "Get the German events from the Nasdaq calendar between 2026-09-01 and 2026-09-03."

The input fields are described for agents: `dateRange` has a closed list of values, `countries` takes names or ISO3 codes, and a request that matches nothing returns zero rows with a status message instead of an error.

### Integrations and API

Run Economic Calendar Scraper from your own code with the Apify API. Set `APIFY_TOKEN` to your Apify API token (send it in the `Authorization` header, never in the URL).

**Python**

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("axiomworks/economic-calendar-scraper").call(
    run_input={"dateRange": "thisWeek", "countries": ["United States"], "minImportance": "medium", "maxItems": 100}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["datetimeUtc"], item["country"], item["event"], item["actual"], item["consensus"])
```

**JavaScript**

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

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });
const run = await client.actor('axiomworks/economic-calendar-scraper').call({
    dateRange: 'thisWeek',
    countries: ['United States'],
    minImportance: 'medium',
    maxItems: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

**cURL**

```bash
curl -X POST "https://api.apify.com/v2/acts/axiomworks~economic-calendar-scraper/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"dateRange": "thisWeek", "countries": ["United States"], "minImportance": "medium", "maxItems": 100}'
```

Use the Integrations tab to send results to Make, Zapier, n8n, Google Sheets or a webhook, or schedule the Actor to run every morning before the market opens.

### FAQ

**How fresh is the data?**
Trading Economics and Nasdaq are fetched live. The ForexFactory feed may be reused for up to 15 minutes to avoid rate limits. Released values depend on source updates.

**Why did my run return 0 rows?**
The status message says why. The usual causes are a country name the Actor does not recognise (use a name like `Euro Area` or an ISO3 code like `emu`), a `minImportance` that is too high for a small country, or choosing only the Nasdaq source together with `medium` or `high`, because Nasdaq rows are not rated.

**Why are some `forexFactoryImpact` values empty?**
The ForexFactory feed covers the current week only and has no entry for every release. A Trading Economics or Nasdaq row gets a value only when a ForexFactory row has the same currency and UTC time and shares a word with the event title. If the feed is rate limited, the run continues without it.

**Are the values numbers?**
No, they are strings as displayed, with units such as `K`, `M`, `B` and `%`, so nothing is lost in conversion. Parse them in your own pipeline if you need numbers.

**Can I get every country at once?**
Yes, leave `countries` empty. Trading Economics shows guests at most 1000 rows per request, so the Actor splits the country list into several requests when needed and removes duplicates.

**What time zone are the times in?**
UTC for all sources. Trading Economics times are requested in UTC, ForexFactory times are converted from their offset, and Nasdaq times are converted from US Eastern.

**Do I need a proxy?**
Usually not. If requests are blocked, enable Apify Proxy in the `proxyConfiguration` input; blocked or rate-limited requests are retried on a new session.

**Can I get dates far in the past?**
Use the Nasdaq source with a `custom` range of up to 31 days; it accepts any past or future date. Trading Economics only serves a rolling guest window.

### Is it legal to scrape economic calendar data?

Economic Calendar Scraper collects publicly visible calendar data that loads without logging in. It does not bypass logins or CAPTCHAs. You are responsible for how you use the data, including any terms of the source sites and local laws. This is not legal advice.

Economic Calendar Scraper is an independent tool. It is not affiliated with, endorsed by or sponsored by Trading Economics, Nasdaq or ForexFactory.

### Feedback

Found a bug or need a field that isn't here? Open an issue on the Issues tab and we'll look at it.

# Actor input Schema

## `dateRange` (type: `string`):

Period to return: today, tomorrow, yesterday, thisWeek (default), nextWeek, lastWeek, thisMonth, nextMonth, last30Days or custom. With custom, set startDate and endDate. Weeks run Monday to Sunday, times are UTC.

## `startDate` (type: `string`):

First day, YYYY-MM-DD, e.g. '2026-09-01'. Used only when dateRange is custom. Invalid dates fail the run.

## `endDate` (type: `string`):

Last day, YYYY-MM-DD, at most 31 days after startDate. Used only when dateRange is custom; defaults to startDate.

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

Countries to include, as names ('United States', 'Euro Area', 'Germany') or Trading Economics ISO3 codes ('usa', 'emu', 'gbr', 'jpn'). Empty means all countries. Unknown entries are skipped with a warning; if none is valid the run ends with 0 items and a message.

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

Lowest importance to return: low (default, everything), medium or high. Nasdaq rows have no rating and are left out unless this is low.

## `sources` (type: `array`):

Sources to combine: tradingeconomics (default), nasdaq, forexfactory (current week only). Rows from different sources are not merged; each row's 'source' field says where it came from. Any of the three can be listed.

## `addForexFactoryImpact` (type: `boolean`):

When true (default), rows in the current week get a forexFactoryImpact value matched by currency, time and title. Needs one extra request; if ForexFactory is unavailable the run continues without it.

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

Keep currencies such as USD, EUR or JPY, case-insensitive. Default \[] keeps all. Applies together with countries; codes with no matching events return 0 items. maxItems counts matching results across all sources.

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

Keep event titles containing any of these literal phrases, case-insensitive, e.g. inflation or interest rate. Default \[] keeps all titles. Combined with other filters; unmatched or blocked targets return 0 items with a status message.

## `categories` (type: `array`):

Keep exact category values from Trading Economics, case-insensitive, e.g. inflation rate. Default \[] keeps all. Nasdaq and ForexFactory have no category and are excluded when this filter is set. Combined with other filters.

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

Maximum events to return across all sources, 1-10000, default 100. The run stops once this many are saved, and you are charged only for results returned.

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

Proxy for requests. Default: no proxy. Enable Apify Proxy if the sites rate-limit or block your runs.

## Actor input object example

```json
{
  "dateRange": "thisWeek",
  "countries": [
    "United States"
  ],
  "minImportance": "medium",
  "sources": [
    "tradingeconomics"
  ],
  "addForexFactoryImpact": true,
  "currencies": [],
  "eventKeywords": [],
  "categories": [],
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Dataset with one item per result, in the order found.

# 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 = {
    "dateRange": "thisWeek",
    "countries": [
        "United States"
    ],
    "minImportance": "medium",
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("axiomworks/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 = {
    "dateRange": "thisWeek",
    "countries": ["United States"],
    "minImportance": "medium",
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("axiomworks/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 '{
  "dateRange": "thisWeek",
  "countries": [
    "United States"
  ],
  "minImportance": "medium",
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call axiomworks/economic-calendar-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,axiomworks/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/RIMpbqc6jyVZNJxVB/builds/c5jVlk1IemwepTUkM/openapi.json
