Economic Calendar API
The FCS economic calendar API turns the global schedule of macroeconomic releases into JSON your code can read. Each row describes one release, such as a CPI print, a payrolls report or a central bank rate decision, with its UTC time, country, currency, impact grade and the actual, forecast and previous figures. A single endpoint answers three questions: what is due next, what came out today, and how an indicator has moved over the years.
Economic Calendar API at a Glance
| Endpoint | https://api-v4.fcsapi.com/forex/economy_cal, GET or POST |
| Content | Inflation, labour, GDP, PMI, trade, housing and consumer data, rate decisions, central bank speeches, bond auctions and public holidays |
| Reach | About 150 countries and 120 currencies, archive from 2018 (coverage) |
| Freshness | Checked for new figures every 5 minutes |
| Clock | UTC for every timestamp |
| Filters | Currency or pair, country, event code, impact grade, time window |
| Access | Corporate plan and above, billed by the number of events returned (credits) |
Who Uses an Economic Calendar API
Algorithmic traders wire it into MT4 and MT5 robots that stand aside during high-impact news. Product teams put a forex economic calendar into apps, broker portals and websites, analysts line up years of releases with price data for backtests, and bot builders announce upcoming events in chat groups. When you need quotes next to the news, combine it with the Forex API.
Quick Start: Pull Your First Economic Events
Three steps from zero to a live economic news feed: get a key, open one link, read the JSON. A browser is enough to try it, and the same link works from a terminal, a Python script or an MT5 robot.
API_KEY.forex/economy_cal is the endpoint, access_key is your key, importance=2 keeps the market movers, and from / to set the window in UTC.{
"status": true,
"response": [
{
"title": "Core PCE Price Index MoM",
"country": "US",
"importance": "2",
"date": "2026-10-29 12:30:00",
"actual": "0.3",
"forecast": "0.3",
"previous": "0.3"
}
]
}importance 2 means high impact, date is UTC, and actual stays empty until the figure is published.The public key API_KEY is for testing: at most 5 events per call, taken from the end of your window, each cut to its first 15 fields (so date, category, reference_date and source_url are left out) and tagged with a note. The reply still shows status true and code 200, but its msg reads "LIMITED RESPONSE IN DEMO API". One IP address may send 10 demo calls per 60 minutes; the next one is refused with code 213. Never ship the demo key in a live product.
More Links to Click
USBCOI plus one date returns exactly one event, shown in the panel on the right.Words You Will See
| Word | Meaning here |
|---|---|
| UTC | The world reference clock. Every time in a reply, and every from and to you send, uses it. Riyadh is UTC+3, London in winter is UTC+0. |
| JSON | The plain-text layout of the reply. Each block in curly braces is one event. |
| Credit | What a call spends from your plan. One credit pays for up to 50 events. |
| Event code | A short name for one indicator, for example USNFP for US payrolls. |
| Importance | The expected market effect: 0 low, 1 medium, 2 high. |
Economic Calendar API Parameters
Eight fields shape a request. Put them in the query string of a GET call, or send them as form data or a JSON body with POST. Only access_key is mandatory, and a field that takes several values expects commas between them.
| Parameter | Type | Description |
|---|---|---|
| access_key*required | string | Your private FCS key, the only mandatory field |
It is shown in your dashboard once the account is active. Calls that come from a server IP saved in your dashboard profile are accepted without it; a call with neither gets code 101. | ||
| symboloptional | string | Currencies or forex pairs, separated by commas |
Example: symbol=GBPUSD,AUDNZD. How pairs, prefixes and metals are read: news by currency, pair or country. | ||
| countryoptional | string | Two-letter ISO country codes, separated by commas |
Example: country=CA,AU,NZ. Which field wins when symbol is present too: currency or country. | ||
| eventoptional | string | Event codes; switches the call to release history |
Example: event=USNFP,CNIRYY. Code list: event codes. Default window and matching rules: history by event. | ||
| fromoptional | string | Start of the time window, read as UTC |
Example: from=2026-09-01. Formats and the start used when it is missing: dates and windows. | ||
| tooptional | string | Where the window closes, also in UTC |
Example: to=1789702200 (unix seconds). It takes the same formats as from. | ||
| importanceoptional | string | Impact grade 0, 1 or 2, or a list such as 1,2 |
Example: importance=2. What the grades mean and how common each one is: importance levels. | ||
| outputoptional | string | Reply encoding, json when not set |
jsonp wraps the reply in apijsoncallback(...); the function name is fixed and a callback field is ignored. serialize returns a PHP serialize() string, array returns PHP print_r() text meant for debugging, and object is JSON in which response is a map keyed "0", "1" and so on instead of a list. Any other value, such as csv, falls back to json. Every format is sent with the content type application/json. JSONP puts your key in a page address, so use it only with a key you accept exposing. | ||
Economic Calendar API Endpoint and JSON Response
Call forex/economy_cal with GET or POST. The answer is an economic calendar in JSON: response holds one object per event, ordered from the earliest release to the latest, and info echoes the effective time window and the credits charged. The request fields are described in the parameter table.
response; worked examples are under pricing and credits.Calendar Endpoint Requests
Response Format
Response Fields
id- Row identifier (string)event- Event code such asECONOMICS:USIRYY; send it back ineventto get earlier releasestitle- Release name, e.g. Inflation Rate YoYindicator- Indicator family the release belongs to, e.g. Inflation Ratecomment- Background text on what the number measures, often several sentences longcountry- ISO code of the economy,EUfor the euro areacurrency- Currency most exposed to the releaseimportance- Impact grade"0","1"or"2"(low, medium, high)period- Period the reading covers, e.g.Sep; blank for meetingsactual- Published reading;""before the release and for events that never carry a numberforecast- Forecast published ahead of the release;""if there is noneprevious- Reading of the prior periodsource- Institution that publishes the figurescale- Multiplier such asK(thousands), otherwise""unit- Unit sign such as%, otherwise""date- Scheduled release time in UTC,YYYY-MM-DD HH:MM:SScategory- Topic code such asprce, listed in the category table;""if nonereference_date- Day the reading refers to,YYYY-MM-DD: the month end for monthly data and the meeting day for decisionssource_url- Web address of the publisher;""if none
Mini Sample Response
{
"id": "399075",
"event": "ECONOMICS:USIRYY",
"title": "Inflation Rate YoY",
"indicator": "Inflation Rate",
"comment": "In the United States, unadjusted Consumer Price Index for All Urban Consumers is based on the prices of a market basket of ...",
"country": "US",
"currency": "USD",
"importance": "2",
"period": "Sep",
"actual": "3.7",
"forecast": "3.6",
"previous": "3.4",
"source": "Bureau of Labour Statistics",
"scale": "",
"unit": "%",
"date": "2026-10-14 12:30:00",
"category": "prce",
"reference_date": "2026-09-30",
"source_url": "http://www.bls.gov/"
}- All 19 values arrive as strings, numbers included, so convert
actual,forecastandpreviousbefore comparing them. - A missing value is an empty string and never
null. - Read a number together with
scaleandunit: the CPI row above means 3.7%, and a reading with scaleKis counted in thousands. periodnever holds a year. It is a month name, a quarter, a weekly date or empty, andreference_dategives the full day.- An empty
actualon a past event means no figure was published; it is not zero. Speeches, minutes and press conferences never get one. - A new
actualreplaces the old one when the publisher revises a figure, and no revision history is kept. Store your own snapshots when you need the first print. - A
datethat ends in 00:00:00 marks an all-day item such as a public holiday, so show it as "All day" instead of converting the time. Holiday rows carry a numericeventcode, andidis the only value that is unique per row. inforepeats the effectivefromandto, the requested codes oneventcalls (other calls listsupport_paramsinstead), the server time andcredit_count. It may also carry adebugobject with timing figures; that object is not part of the contract, so ignore it.
Upcoming and Historical Economic Events by Date
The fields from and to set the time window, and every value you send is read as UTC. Leave both out and you get the current UTC day, 00:00:00 to 23:59:00, while a date-only to reaches 23:59:59. A window that lies ahead lists scheduled releases whose actual is still empty; a window in the past reads the archive described under coverage.
Date and Time Formats
| Format | Example | Interpreted as |
|---|---|---|
| Date | 2026-09-18 | Midnight when used in from; in to the whole day up to 23:59:59 |
| Date and time | 2026-09-18 02:30 | That minute; an added :SS part is accepted but rounded down to the minute |
| Unix seconds | 1789700400 | 2026-09-18 03:00:00 UTC |
Sending only to keeps the default start, so a to one week ahead lists everything from the beginning of today until then. Text that is not a date is refused with code 112, quoted under errors and fixes.
Converting to Local Time
The API never changes the zone, so convert in your own code. A date that ends in 00:00:00 is an all-day item and should stay a plain date. In JavaScript add a Z before parsing, otherwise the browser reads the text as local time:
const when = new Date(e.date.replace(" ", "T") + "Z");In Python attach UTC first, then convert to the zone you need:
from datetime import datetime, timezone
from zoneinfo import ZoneInfo
utc = datetime.strptime(e["date"], "%Y-%m-%d %H:%M:%S").replace(tzinfo=timezone.utc)
print(utc.astimezone(ZoneInfo("Asia/Riyadh")))Date Window Examples
from here, so the window opens at the start of today.Forex News by Currency, Pair or Country
symbol follows currencies and country follows economies. Used as a forex news API inside a trading tool, symbol takes the chart name as it is: a six-letter pair is cut into its two currencies, and news for either side comes back.
How symbol Values Are Read
| Value sent | Currencies matched |
|---|---|
symbol=CHF | CHF |
symbol=USD,JPY,CAD | USD, JPY, CAD |
EURUSD, EUR/USD, FX:EURUSD | EUR and USD, after the prefix and slash are removed |
XAUUSD | XAU and USD, so a gold chart receives the US calendar |
GBPJPY,AUDCAD | GBP, JPY, AUD, CAD |
COPPER | Left whole, because a split happens only when both halves are currency codes; nothing matches, so the reply is code 112 |
Currency or Country?
The difference matters for the euro. symbol=EUR collects every euro-area release, from the EU aggregate to Germany, France, Italy, Spain and the other members, whereas country=DE returns German releases only. If a request contains both fields, country is applied and symbol is ignored.
Currency and Country Filters
symbol=XAUUSD,EUR,CNY or country=US,CN,EU.High-Impact News and Importance Levels
Every event carries a grade for its usual market effect: 0 low, 1 medium, 2 high. Send one grade or a comma list such as importance=1,2. Values outside 0 to 2 are dropped, and when nothing valid is left the call returns all grades. In a URL write the list with commas; a bracketed list such as [1,2] is not understood and also returns all grades.
Share of Each Grade
| Grade | Share of events | Typical releases |
|---|---|---|
2 high | 3%, about 14 per week and over 30 in the busiest central-bank weeks | Inflation Rate YoY (CPI), Non Farm Payrolls, Unemployment Rate, ISM Manufacturing and Services PMI, Retail Sales MoM, JOLTs Job Openings, GDP, central bank rate decisions |
1 medium | 16% | Initial Jobless Claims, EIA Crude Oil Stocks Change, S&P Global flash PMIs, speeches by ECB Lagarde, BoE Bailey and Fed members, Industrial Production MoM, Consumer Confidence in most economies |
0 low | 81% | 3-month and 6-month bill auctions, final PMI readings, Current Account, PPI YoY of smaller economies, public holidays |
The shares come from the eight-week sample measured for the coverage tables.
Grades Are Set per Country
Identical titles can carry different grades. Inflation Rate YoY is a 2 for the United States and the United Kingdom, yet a 0 for many small economies, so filter on importance instead of matching titles.
Importance Filter Examples
Event Codes for NFP, CPI and Rate Decisions
An event code identifies one indicator of one economy, for example ECONOMICS:USNFP for US payrolls. The table lists high-impact codes we have checked for eight major economies, written without the ECONOMICS: prefix. Codes for anything else can be copied from the event field of any calendar row.
Verified High-Impact Codes
| Economy | Code and release |
|---|---|
| United States | USNFP Non Farm PayrollsUSUR Unemployment RateUSIRYY Inflation Rate YoYUSCIR Core Inflation Rate YoYUSIRMM Inflation Rate MoMUSPPIMM PPI MoMUSCPCEPIMM Core PCE Price Index MoMUSINTR Fed Interest Rate DecisionUSGDPQQ GDP Growth Rate QoQUSRSMM Retail Sales MoMUSBCOI ISM Manufacturing PMIUSNMPMI ISM Services PMIUSJO JOLTs Job OpeningsUSCCI Michigan Consumer SentimentUSDGO Durable Goods Orders MoMUSHST Housing StartsUSBP Building PermitsUSEHS Existing Home SalesUSPI Personal Income MoMUSPSP Personal Spending MoM |
| Euro Area | EUINTR ECB Interest Rate DecisionEUDIR Deposit Facility RateEUIRYY Inflation Rate YoY Flash |
| Germany | DEBCOI Ifo Business ClimateDEESI ZEW Economic Sentiment IndexDEIRYY Inflation Rate YoY PrelDECCI GfK Consumer ConfidenceDEBOT Balance of Trade |
| United Kingdom | GBINTR BoE Interest Rate DecisionGBIRYY Inflation Rate YoYGBUR Unemployment RateGBMGDPMM GDP MoMGBRSMM Retail Sales MoM |
| Japan | JPINTR BoJ Interest Rate DecisionJPIRYY Inflation Rate YoYJPBCOI Tankan Large Manufacturers IndexJPBOT Balance of TradeJPCCI Consumer Confidence |
| Canada | CAINTR BoC Interest Rate DecisionCAIRYY Inflation Rate YoYCAUR Unemployment RateCABCOI Ivey PMI s.a |
| Australia | AUINTR RBA Interest Rate DecisionAUGDPQQ GDP Growth Rate QoQAUBCOI NAB Business ConfidenceAUBOT Balance of Trade |
| China | CNIRYY Inflation Rate YoYCNGDPYY GDP Growth Rate YoYCNBCOI NBS Manufacturing PMICNRSYY Retail Sales YoYCNIPYY Industrial Production YoYCNBOT Balance of Trade |
One Code, a Family of Events
Rate-decision codes also gather the events around a meeting. ECONOMICS:USINTR brings the Fed Interest Rate Decision together with the Fed press conference, FOMC minutes, FOMC economic projections and speeches by Fed officials. ECONOMICS:GBINTR adds MPC votes, MPC minutes and BoE speeches to the BoE decision, ECONOMICS:EUINTR adds the ECB press conference and Lagarde speeches, and ECONOMICS:AUINTR includes the RBA meeting minutes. When only the decision matters, keep the rows whose title ends in "Interest Rate Decision". Adding importance=2 shrinks the family too: for USINTR over 13 months it cuts about 400 rows (9 credits) to 38 (1 credit), namely the nine decisions with their press conferences and minutes, the projections and a few chair speeches. USNFP also holds the annual payroll revision, so keep the rows titled "Non Farm Payrolls" for the monthly prints.
Event Code Requests
Historical Economic Calendar Data for One Event
With event in the request, the endpoint returns the release history of the listed codes instead of a daily schedule. symbol and country are ignored in this mode, and the default window changes: without dates it runs from the first day of the month six months back to the last day of the current month, which often includes the next scheduled release.
Writing Codes in a Request
- Prefix optional.
event=USNFPandevent=ECONOMICS:USNFPreturn the same series: older rows were stored with the short code, and the API looks for both forms. - Not case-sensitive.
usnfpworks too, and spaces next to the commas of a list are ignored. - Numeric codes. Holidays and some speeches have no official code, so their
eventvalue is a number; send that number like any other code. - Long ranges. Add
fromandtoto reach further back; a longer window returns more rows and costs more, as the credit table shows.
Release History Requests
from given, the window still closes at the end of the current month.Category, Reference Date and Source URL of Each Event
Every event ends with three descriptive fields after date: category, reference_date and source_url. They are part of every reply and need no request field. The 16 values before them keep their names, order and meaning. A value that is not known comes back as an empty string. The three fields are defined in the field reference.
Category Codes and Their Share
| Code | Topic | Share |
|---|---|---|
prce | Prices and inflation | 21% |
mny | Money and central banks | 12% |
bsnss | Business | 12% |
gov | Government | 11% |
trd | Trade | 9% |
cnsm | Consumer | 7% |
bnd | Bonds | 6% |
lbr | Labour | 5% |
hse | Housing | 5% |
gdp | GDP | 4% |
enrg | Energy | 3% |
mrkt | Markets | 1% |
"" | No category given | 5% |
Percentages refer to the same eight weeks of data as the importance shares. For the ECB decision in the right panel, the three values are:
"category": "mny",
"reference_date": "2026-09-10",
"source_url": "https://www.ecb.europa.eu"Requests Returning the Descriptive Fields
Countries Covered and Calendar Data Volume
The calendar spans about 150 countries and roughly 120 currencies, and its archive starts in 2018. New figures are picked up every 5 minutes, so an actual value normally appears within about 5 minutes of publication. The numbers below were measured over eight weeks, 1 September to 26 October 2026, and show how much data a request can return.
Typical Data Volume
| Measure | Value |
|---|---|
| Events per week, all countries | about 400 to 500 |
| Events on an average weekday | about 97 |
| Busiest single day | 252 events |
| Past events that carry an actual value | about 84% |
Speeches, public holidays, minutes and press conferences never receive an actual value. Auction rows do: their result is published in actual like any other figure.
Busiest Country Calendars
| Economy | Code | Events in 8 weeks | High impact |
|---|---|---|---|
| United States | US | 619 | 41 |
| Euro area | EU | 185 | 7 |
| United Kingdom | GB | 181 | 13 |
| Japan | JP | 158 | 8 |
| Germany | DE | 115 | 10 |
| South Africa | ZA | 108 | 0 |
| Canada | CA | 107 | 7 |
| France | FR | 97 | 1 |
| Australia | AU | 95 | 9 |
| Sweden | SE | 81 | 0 |
| New Zealand | NZ | 71 | 0 |
| Brazil | BR | 68 | 0 |
| Italy | IT | 67 | 2 |
| China | CN | 65 | 16 |
| India | IN | 65 | 0 |
Gulf Calendars
The six Gulf economies SA, AE, KW, QA, BH and OM have thin calendars: together they listed 24 events in the five weeks from 29 October 2026, and 23 of them were grade 0. A call with importance=2 for them therefore returns code 112, so request them with country=SA,AE,KW,QA,BH,OM and no importance filter. Text is English only, every time is UTC (Riyadh is UTC+3 all year), and the API has no language or time zone field: names such as lang or timezone are ignored without an error.
Event count and market weight are different things: China published fewer events than Sweden in this period, yet the second-highest number of high-impact releases.
MT4 / MT5 News Filter for Expert Advisors
The MQL5 code below stops an Expert Advisor from opening trades while high-impact news for its chart pair is near. A timer asks the economic calendar API every 5 minutes for grade-2 events between 15 minutes ago and 30 minutes ahead; while any are found, OnTick skips the entry logic. It is useful when the rules of an account, for example a prop-firm challenge, forbid trading around news.
input string InpApiKey = "API_KEY"; // your own Corporate+ key; the demo key allows 10 calls an hour
input string InpCurrencies = ""; // e.g. "USD" for GOLD, US30 or BTCUSD; empty = first 6 letters of the chart symbol
input int InpMinsBefore = 30; // pause this many minutes before high-impact news
input int InpMinsAfter = 15; // and this many minutes after it (45 or more around FOMC, ECB and BoE decisions)
bool newsBlock = false;
// true when a high-impact event for this chart's pair is inside the window
bool HighImpactNewsNow()
{
long now = (long)TimeGMT();
string pair = (InpCurrencies != "") ? InpCurrencies : StringSubstr(_Symbol, 0, 6); // "EURUSD.m" -> "EURUSD"
string url = "https://api-v4.fcsapi.com/forex/economy_cal?symbol=" + pair
+ "&importance=2"
+ "&from=" + IntegerToString(now - InpMinsAfter * 60)
+ "&to=" + IntegerToString(now + InpMinsBefore * 60)
+ "&access_key=" + InpApiKey;
char data[], result[];
string resHeaders;
int code = WebRequest("GET", url, "", 5000, data, result, resHeaders);
if(code == -1)
{
// URL not allowed in the terminal, no internet or a timeout: stay safe and block
Print("WebRequest error ", GetLastError(), " - allow https://api-v4.fcsapi.com/ under Tools > Options > Expert Advisors");
return true;
}
string body = CharArrayToString(result, 0, WHOLE_ARRAY, CP_UTF8);
// HTTP 200 + status true = at least one event (the demo key's reply is pretty-printed, so both spellings are checked)
if(code == 200 && (StringFind(body, "\"status\":true") >= 0 || StringFind(body, "\"status\": true") >= 0))
return true;
// no event in the window = code 112 (0 credits)
if(StringFind(body, "\"code\":112") >= 0)
return false;
// any other reply (bad key, plan, credits) is logged and blocks new entries to stay safe
Print("News API error: ", body);
return true;
}
int OnInit()
{
EventSetTimer(300); // data refreshes every 5 minutes
newsBlock = HighImpactNewsNow();
return(INIT_SUCCEEDED);
}
void OnTimer() { newsBlock = HighImpactNewsNow(); }
void OnDeinit(const int reason) { EventKillTimer(); }
void OnTick()
{
if(newsBlock) return; // no new entries around high-impact news
// ... your entry logic ...
}- Allow the API host in MetaTrader: Tools → Options → Expert Advisors → "Allow WebRequest for listed URL", then add
https://api-v4.fcsapi.com. Until you do,WebRequest()returns -1. - The window is built from
TimeGMT()as unix seconds, so the time zone of the broker server has no effect on it. - Adjust
InpMinsBeforeandInpMinsAfterto the news rule of your account. - A quiet window is answered with code 112, which is not charged, so most timer checks are free.
- Any other answer, such as a wrong key or a plan without calendar access, and a failed
WebRequest()are printed in the Experts log and treated as news, so no new trade opens until a later check succeeds. - The filter reads the symbol of the chart as two currency codes. Names that are not a pair, such as GOLD or US30, return code 112, which the filter takes for "no news"; type the currencies into
InpCurrenciesfor metals, indices and crypto. - The Fed press conference starts 30 minutes after the decision, so set
InpMinsAfterto at least 45 on FOMC, ECB and BoE days. - Every check that finds news costs 1 credit, so a 5-minute timer can spend up to 9 credits around one event on each chart. To cut that to one call per hour, fetch the day's grade-2 events once, keep their times and compare them with
TimeGMT()inOnTick; skip rows whoseeventis a number, because those are holidays and elections. - The Strategy Tester never executes
WebRequest(); run the filter on a demo or live chart. - MQL4 has
WebRequest()as well, so the same request and logic carry over to an MT4 EA.
Economic Calendar API Examples in Python, JavaScript and PHP
Each snippet requests the high-impact EURUSD news of the current day and prints the UTC time, currency, title, actual and forecast of every row. Run them on a server or from a script where the key stays hidden; a key placed in browser JavaScript or an app bundle can be read by anyone.
import requests
params = {
"symbol": "EURUSD",
"importance": "2",
"access_key": "API_KEY",
}
data = requests.get("https://api-v4.fcsapi.com/forex/economy_cal",
params=params, timeout=10).json()
if data["status"]:
for e in data["response"]:
print(e["date"], "UTC", e["currency"], e["title"],
"actual:", e["actual"] or "-", "forecast:", e["forecast"] or "-")
else:
print(data["msg"])Projects Built on an Economic Events API
Most projects reuse one of a handful of request patterns. Find yours in the table.
| Project | Request pattern |
|---|---|
| EA news filter | Chart pair in symbol, importance=2 and a short unix window, checked on a timer. Full code: the MT4 / MT5 guide. |
| Telegram or Discord alerts | One morning call for the grade-2 events of the day, then another shortly after each release time to post actual against forecast. |
| Calendar widget on a website | Your server fetches the day once per refresh cycle and serves its cached copy, so visitor traffic never reaches the API. Replies carry Cache-Control: no-store and the API accepts requests from any origin, so a call from browser JavaScript works but shows your key to every visitor. |
| Backtests and research | Long histories per code with event, from and to, joined to price candles by UTC time. See event history. |
| Trading journal | The releases within an hour of each trade, to explain unusual fills and slippage. |
| AI market briefings | A week of high-impact rows handed to a language model that writes the preview. |
| Mobile app | The currencies each user follows in symbol, with a push message before grade-2 events. |
Economic Calendar API Pricing and Credits
Calendar access starts with the Corporate plan and is included in every higher plan; keys on smaller plans receive code 105. The charge for a call depends only on the number of events it returns and is reported in info.credit_count. A call that fails or finds nothing is free.
Credits by Reply Size
| Events in the reply | Credits |
|---|---|
| 0 (error or empty) | 0 |
| 1 to 50 | 1 |
| 51 to 100 | 2 |
| 101 to 150 | 3 |
| More than 150 | events divided by 50, rounded up |
There is no row limit and no paging: one call returns every matching event, and no limit, offset or page field exists.
What Real Requests Cost
| Request | Events returned | Credits |
|---|---|---|
| All countries, one average weekday | about 97 | 2 |
| All countries, the busiest day of the sample | 252 | 6 |
| All countries, one full week | about 400 to 500 | 8 to 10 |
| All countries, two weeks | about 900 | 18 |
One week with importance=2 | about 14 | 1 |
| News filter check with nothing due | 0 | 0 |
- Leave out grade 0 with
importance=1,2; that removes about four rows in five. - List only the currencies you trade in
symbolrather than pulling the whole world. - Keep one cached copy per refresh cycle on your server; polling faster than every 5 minutes returns the same rows. If one cached refresh costs 3 credits, refreshing every 5 minutes uses 864 credits a day and refreshing hourly 72, however many visitors your site has.
- Give robots short windows, such as the next 30 to 60 minutes, so most of their checks come back empty and cost nothing.
- Plan prices and monthly allowances are on the pricing page.
Calendar Request Errors and Fixes
A failed call answers with "status": false, a numeric code and a msg. Check status before reading response. Only code 112 sets HTTP status 400; every other error arrives as HTTP 200 with status false, so branch on the body and not on the HTTP status. A 112 message that starts with "No data" means nothing matched, which also happens when from is later than to or the country is unknown; one that starts with "Invalid" points at a field you must rewrite. Messages are quoted as the API sends them; for 211 and 213 only the opening words are shown.
| Code / HTTP | Message | Fix |
|---|---|---|
101HTTP 200 | You have not supplied a valid API Access Key. | Also the answer to a call with no access_key or an empty one. Copy the key again from the dashboard and look for stray spaces or a cut-off value. |
102HTTP 200 | Your account is not active, Please check your email to activate it. | Click the activation link in the sign-up email. |
104HTTP 200 | Sorry, access_key parameter missing. Or add your IP in your dashboard->profile | A plain call without a key gets 101, so 104 is rare. If you see it, add access_key or save the IP of your server in the dashboard profile. |
105HTTP 200 | Sorry, You are not allow to access this API endpoint. Please upgrade your plan | The plan is below Corporate; upgrade to unlock the calendar. |
112HTTP 400 | No data or an invalid value has been specified. Data not found. | Nothing matched, so widen the window or check codes, countries and currencies. For a news filter it simply means no news. Do not retry the same request. |
112HTTP 400 | Invalid 'from' date. Use YYYY-MM-DD, 'YYYY-MM-DD HH:MM' or unix time. | Rewrite the named field (from or to) in one of the listed formats. |
211HTTP 200 | Starts with "Your monthly API request limit exceed" and ends with your limit and its reset date | Retrying does not help until the reset date; wait for it or move to a larger plan. |
213HTTP 200 | Starts with "Rate limit exceeded." | Too many calls in a short period, for example more than 10 demo-key calls an hour from one IP. Wait a minute and retry, slow down, or switch to your own key. |
Economic Calendar API FAQ
What is an economic calendar API?
A web service that delivers the dates, times and results of scheduled economic releases as structured data. Software reads it directly instead of scraping a calendar web page.
Is there a free economic calendar API?
You can try this one at no cost with the demo key API_KEY, which gives a small trimmed sample and allows 10 calls an hour from one IP. Complete data needs the Corporate plan or a higher plan.
How often is the economic calendar updated?
Every 5 minutes. A freshly published figure is usually visible in the actual field about 5 minutes after its release time.
Which time zone does the economic calendar API use?
UTC, both for the times in each reply and for the from and to values you send. Conversion to local time is left to your application.
How far back does the historical economic calendar data go?
The stored history begins in 2018. Request any period since then by setting from and to.
Can I use the economic calendar API in MT4 or MT5?
Yes. An Expert Advisor can call it through WebRequest(), and passing the chart pair as symbol returns the news for both of its currencies.
Which economic events move the forex market the most?
Central bank rate decisions, CPI inflation, Non Farm Payrolls, unemployment and GDP releases of the major economies usually cause the largest moves. The API marks them with importance 2.
Can I get the economic calendar as CSV?
Not directly, because the endpoint answers in JSON, JSONP, serialized PHP, array or object form. Writing the JSON rows to a CSV file takes only a few lines in most languages.
How many credits does an economic calendar request cost?
One credit covers up to 50 returned events, so 51 to 100 events cost two, and failed or empty calls cost nothing. A whole week of high-impact news fits into a single credit.
Does the API include forecasts for upcoming events?
Yes, where a forecast exists it is present before the release, next to the previous reading. The actual field stays empty until the figure is out.
Does the economic calendar API support other languages or time zones?
No. Text is English only and every time is UTC. Names such as lang or timezone are ignored without an error, so convert the times in your own code; the Date Range section shows how for Python and JavaScript.
Can I show the economic calendar on my own website?
Fetch it on your server with your key, cache the reply for the refresh cycle and serve the cached copy to your visitors. A call from browser JavaScript works because the API accepts any origin, but it shows your key to everyone. How the data may be displayed is set by the terms of service.
Economic Calendar Data Disclaimer
Release times are set by the publishing institutions and can change, sometimes at short notice, and published figures are often revised later. Treat the calendar as information rather than trading advice: FCS API accepts no liability for losses from decisions based on it, and use of the data is governed by our terms of service.
