Economic Calendar Scraper - Actual, Forecast & Previous
Pricing
from $7.30 / 1,000 event returneds
Economic Calendar Scraper - Actual, Forecast & Previous
Economic calendar events from TradingView for any date range since 2013: actual, forecast and previous values, the surprise versus forecast, importance, country and currency, in UTC and your time zone. Monitoring mode returns an event only when its actual is released or its forecast changes.
Pricing
from $7.30 / 1,000 event returneds
Rating
0.0
(0)
Developer
NeverEmpty
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Get the economic calendar as data: every scheduled release (Non Farm Payrolls, CPI, Fed interest rate decisions, GDP, PMIs, central bank meetings and about 150 countries' statistics) with its actual, forecast and previous values, the surprise versus the forecast, importance, country, currency and release time in UTC and in your own time zone. Any date range from 2013 on, filtered by country, currency, importance and event name.
Monitoring mode turns it into a release alert: run it on a schedule and it returns an event only when its actual figure is released or its forecast changes, with the earlier values.
No login, no API key, no browser.
Where the data comes from
The events come from the public economic calendar on tradingview.com, read through the unofficial endpoint (economic-calendar.tradingview.com/events) that TradingView's own calendar page uses. It is not an official API and TradingView can change or stop it without notice; if that happens the run returns free rows that say what TradingView answered instead of guessing. The robots.txt of that host allows /events. The actual, forecast and previous values are TradingView's, passed through unchanged. This is data, not investment advice.
What you can do with it
- Pull this week's high-importance events for the US, euro area, UK and Japan into a spreadsheet or a trading bot.
- Build a history of release surprises (actual minus forecast) for NFP, CPI or any indicator since 2013, to study how markets reacted.
- Get a row within minutes of a release: schedule monitoring mode every few minutes around the release time.
- Avoid trading through high-importance events: pull tomorrow's events in your local time zone.
Quick start
This week's high and medium importance events for the G4, in New York time
{"dateRange": "this_week","countries": ["US", "EU", "GB", "JP"],"importance": ["high", "medium"],"timezone": "America/New_York"}
Every US payrolls and inflation release of 2025, with the surprise
{"startDate": "2025-01-01","endDate": "2025-12-31","countries": ["US"],"keywords": ["Non Farm Payrolls", "Inflation Rate"]}
Release alert: return US high-importance events only when the actual comes out (schedule it every 5 minutes)
{"dateRange": "today","countries": ["US"],"importance": ["high"],"monitoringMode": true}
Input
| Field | What it does |
|---|---|
dateRange | today, tomorrow, yesterday, next_7_days (default), last_7_days, this_week, next_week, last_week, this_month, next_month, last_month. Days are counted in timezone; weeks run Monday to Sunday. Ignored when startDate is given. |
startDate | YYYY-MM-DD. Replaces dateRange. Any day from 2013-01-01 on; an earlier start is moved to 2013-01-01 and a free row says so. |
endDate | YYYY-MM-DD, included. Leave empty for a single day. Needs startDate. |
timezone | IANA time zone name (default UTC), for example America/New_York, Europe/London, Asia/Tokyo. It decides where each day starts and ends, and fills localDateTime. |
countries | Two-letter codes as TradingView uses them: US, GB, JP, CN, DE, CA, AU and so on. EU is the euro area as a whole and WW is worldwide releases; UK is read as GB, lower case is accepted. Empty = all countries. |
currencies | Keep only events in these currencies, for example USD, EUR, JPY. EUR matches the euro area and every euro country. Empty = all. |
importance | Any of high, medium, low, as TradingView rates events. Empty = all three. |
keywords | Keep only events whose title or indicator contains one of these words, ignoring case (Inflation Rate YoY also matches Core Inflation Rate YoY). Empty = all. |
actualFilter | any (default), with-actual (the figure is out) or without-actual (no figure yet; this includes speeches and holidays, which never get one). |
includeDescription | Adds TradingView's explanation of the indicator in description. Default off. |
maxResults | With monitoring off, the most charged rows one run returns (default 1,000, up to 100,000). Oldest dates come first; a free row says from which date events were not returned. It does not limit monitoring mode. |
monitoringMode | Return an event only when its actual or forecast changed since the row last returned for it. See below. |
resetMonitoringState | Forget the remembered values for this set of filters, so that this run returns every matching event once again as a first check. Turn it off again afterwards. |
useProxy | Default on. Requests go directly first; only if TradingView refuses (HTTP 403, 429 or 503) is the request retried through an Apify proxy. |
Output
One row per event, status: "ok":
{"source": "tradingview-economic-calendar","status": "ok","eventId": "396731","title": "Non Farm Payrolls","indicator": "Non Farm Payrolls","country": "US","countryName": "United States","currency": "USD","importance": "high","importanceCode": 1,"dateTimeUtc": "2026-09-04T12:30:00.000Z","dateUtc": "2026-09-04","timeUtc": "12:30","localDateTime": "2026-09-04T08:30:00-04:00","localDate": "2026-09-04","localTime": "08:30","timezone": "America/New_York","period": "Aug","referenceDate": "2026-08-31T00:00:00Z","actual": 162,"forecast": 56,"previous": 21,"unit": null,"scale": "K","actualRaw": 162000,"forecastRaw": 56000,"previousRaw": 21000,"hasActual": true,"surprise": 106,"surprisePercent": 189.29,"surpriseDirection": "above-forecast","category": "lbr","ticker": "ECONOMICS:USNFP","sourceName": "Bureau of Labour Statistics","sourceUrl": "http://www.bls.gov/","description": null,"requestedRange": "2026-09-01 to 2026-09-16 (America/New_York)","scrapedAt": "2026-09-17T00:30:00.000Z","change": null,"changes": [],"isFirstCheck": null,"previousCheckedAt": null,"previousActual": null,"previousForecast": null}
What the columns mean:
titleis the event as TradingView names it (for exampleNon Farm Payrolls,Fed Interest Rate Decision);indicatoris the indicator it belongs to (Interest Ratefor the decision, the minutes and the press conference).eventIdis TradingView's id for the event; it stays the same when the figure comes out, so you can join runs on it.dateTimeUtc,dateUtc,timeUtcare the scheduled release time in UTC;localDateTime,localDate,localTimeare the same moment intimezone. TradingView gives some events a time of 00:00 UTC that is not a real release time: in the measured week (all countries, 2026-09-01 to 2026-09-08), 18 of 555 events were at 00:00 UTC and 15 of those were holidays.actual,forecast,previousare the values as TradingView displays them, inscale(Kthousand,Mmillion,Bbillion,Ttrillion) andunit(such as%or a currency sign) when TradingView gives one.actualRaw,forecastRaw,previousRaware the same values with the scale applied (NFP162with scaleKis162000). A value TradingView does not have isnull, never 0; the forecast was present for only 164 of the 555 events in the measured week. There is no separate "revised previous" column because TradingView does not provide one.periodis the period the figure is about as TradingView writes it (Aug,Q2,Sep/01), andreferenceDatethe end of that period (empty for holidays and speeches).hasActualis true when the actual figure is out.surpriseisactualminusforecastin the displayed scale, rounded to the decimals of the two values;surprisePercentis that difference as a percentage of the forecast's size (nullwhen the forecast is 0);surpriseDirectionisabove-forecast,below-forecastorin-line. All three arenullunless both values exist. Whether "above" is good or bad depends on the indicator (a higher unemployment rate is not good news), so the direction is not labelled as positive or negative.importanceishigh,mediumorlow(TradingView'simportanceCode1, 0, -1).categoryis TradingView's own category code (for examplelbr,prce,gdp,mny), passed through untranslated.tickeris TradingView's symbol for the indicator when it has one;sourceNameandsourceUrlare the agency that publishes the figure.descriptionis filled only withincludeDescription.requestedRangesays which days were asked for and in which time zone.countryis TradingView's two-letter code andcountryNameits English name (Euro AreaforEU,WorldforWW);currencyis the currency TradingView assigns to the event (EURfor the euro area and every euro country).sourceandscrapedAtsay where and when the row was read.- Monitoring columns:
change,changes,isFirstCheck,previousCheckedAt,previousActual,previousForecast(see below; empty with monitoring off).
Monitoring mode
Turn on monitoringMode and run the Actor on a schedule. The Actor remembers the actual and forecast of every event it returns and, on later runs, returns an event only when:
"actual-released": the actual figure was not there before and is there now;"actual-changed": the actual figure is different from the one returned before (a correction, or TradingView removed it);"forecast-changed": the forecast appeared, changed or disappeared.
The first run returns every matching event once as "first-check", to set the baseline. changes lists every change (an event can have both actual-released and forecast-changed), change is the first of them, and previousActual, previousForecast and previousCheckedAt are the values in the row returned before. A run where nothing changed returns one free no-change row. Changes in the previous value or in the release time do not trigger a row.
Before relying on these values for monitoring, the Actor was checked for values that change between reads: an 895-event range read four times over about half a minute on 2026-09-17 gave the same events and the same values every time (0 differences).
Values are remembered per set of filters (countries, currencies, importance, keywords, actual filter), so schedules with different filters do not hide events from each other; two schedules with the same filters and different date ranges share what is remembered. Monitoring needs at least one of countries, currencies, keywords or importance. Do not run the same filters in two schedules that can run at the same time: Apify's key-value store has no atomic update, so a record written by one run can be overwritten by the other, and an event can then come back once more. If Apify restarts a run (for example when it moves the run to another server), the events of the date window that was being read can be checked, and charged as checks, a second time; rows already returned are not returned or charged again.
Free rows that explain
Rows with any other status are not charged and carry a note:
| status | when |
|---|---|
no-events | TradingView answered normally and has no events for the range and countries. |
no-matching-events | TradingView returned events, but none matched the currencies, importance, keywords or actual filter. |
country-without-events | A country code you gave has no events in the range (for a code TradingView did not use between September 2025 and October 2026, the note says so). |
range-note | The start was moved to 2013-01-01, or the range reaches more than five weeks ahead, where TradingView may not list events yet. |
blocked | TradingView refused (HTTP 403, 429 or 503) after retries; the note says which dates are missing. |
unreadable | TradingView's answer could not be read after retries; the note says which dates are missing. |
refused | TradingView rejected the request with HTTP 400; nothing more was asked. |
unreadable-events | TradingView returned events whose id, time or country could not be read; the note gives the count. They are not returned or charged. |
incomplete | More than 2,000 events share a single moment, so some of them may be missing. |
no-change | Monitoring mode: nothing changed since the last rows. |
not-checked | maxResults was reached; the note says from which date events were not returned. |
budget-reached | The run's maximum total charge has no room for another row (or, in monitoring mode, another check with a change row); the note says from which date events were not read. |
invalid-input | The input could not be used; the note says which field and why. |
How it reads the calendar
TradingView returns at most 2,000 events per request, silently (asking for one year of US events on 2026-09-17 returned 2,000 events ending on 2026-03-04). The Actor therefore reads 7-day windows for all countries (the busiest 7 days of all countries between 2025-09-01 and 2026-10-25 had 694 events) and 28-day windows when you name countries, and when a window still hits 2,000 events it continues from the time of the last event it received, removing duplicates by eventId. The calendar starts in January 2013 and, on 2026-09-17, listed United States events up to 2026-10-21, so it covers roughly five weeks ahead. TradingView used 156 country codes between September 2025 and October 2026.
Pricing
Pay per event:
- $10.00 per 1,000 event rows, charged only for rows with
status: "ok". Rows that explain a missing result are free. - Monitoring mode only: $0.30 per 1,000 event checks, charged for every matching event that is checked, including on the first run and whether or not it changed, plus the row price for the rows returned. Example: 30 events checked every hour is 21,600 checks a month, which is $6.48.
A run never charges more than its maximum total charge: with monitoring off it stops before a row that would not fit, and in monitoring mode it checks only as many events as can be paid for together with a change row.
FAQ
Which time zone are the times in? dateTimeUtc is always UTC. localDateTime is in the timezone you choose, with its UTC offset, including daylight saving time.
Why is actual empty for an event in the past? Speeches, meetings and holidays never get a figure. For releases, TradingView may fill it a little after the release time; monitoring mode returns the event when it appears.
Why is forecast empty? TradingView does not have a forecast for every event. The Actor never fills a missing value with 0.
Can I get years of history? Yes, any range from 2013 on in one run. One year of all countries is about 26,000 events (30,119 events were listed between 2025-09-01 and 2026-10-25, 420 days), so raise maxResults or filter by country.
Is this the ForexFactory or Investing.com calendar? No. It is TradingView's calendar. Its event names, importance ratings and forecasts can differ from other calendars.