Economic calendar in Google Sheets with IMPORTDATA

You can put a live economic calendar in Google Sheets with one formula and no script: =IMPORTDATA("https://www.financecalendar.com/wp-json/fc/v1/calendar?format=csv"). The Finance Calendar API returns CSV for any filtered query, Sheets refreshes it about once an hour, and no key is needed.

Google Sheets’ IMPORTDATA function fetches a CSV from a URL and spreads it into cells. The Finance Calendar API adds format=csv to its /calendar and /week endpoints for exactly this. Everything below works in a blank sheet; the only thing to add is a visible link to financecalendar.com somewhere on the sheet, which is the API’s one condition.

1. The next 14 days

Click cell A1 and type:

=IMPORTDATA("https://www.financecalendar.com/wp-json/fc/v1/calendar?format=csv")

Sheets fills 20 columns: date, time_utc, time_et, all_day, name, title, impact, category, consensus, prior, actual, url, country, exchange, id, series_code, status, period, unit, source_url. The first 2 rows today are Canada CPI on 19 October 2026 at 08:30 ET and the PBoC loan prime rate (filed under 19 October, released at 01:00 UTC on 20 October). The last row is a comment beginning # that credits the source; leave it or hide it.

2. Filter by impact, country and series

Every /calendar parameter works in the URL. High-impact only:

=IMPORTDATA("https://www.financecalendar.com/wp-json/fc/v1/calendar?impact=high&format=csv")

US and UK, high impact, with a London-time column added at the end:

=IMPORTDATA("https://www.financecalendar.com/wp-json/fc/v1/calendar?country=US,GB&impact=high&tz=Europe/London&format=csv")

Only the Fed, ECB, Bank of England and Bank of Japan:

=IMPORTDATA("https://www.financecalendar.com/wp-json/fc/v1/calendar?series=fomc,ecb,boe,boj&to=2027-01-19&format=csv")

Exchange holidays worldwide for a quarter:

=IMPORTDATA("https://www.financecalendar.com/wp-json/fc/v1/calendar?category=market-holidays&from=2026-10-01&to=2026-12-31&format=csv")

Parameters: from and to (YYYY-MM-DD, at most 92 days apart, default today to today + 14), country (US, GB, EU, DE, JP, CA, AU, CN, CH, NZ, NO, SE, IN, HK), impact (high, medium, low), category, series (codes from /series), status, include=holidays, tz, limit (1 to 500, default 100) and offset. Add limit=500 to a busy 92-day window so nothing is cut off.

3. A rolling window with TODAY()

Build the URL from today’s date so the sheet always shows the next 30 days:

=IMPORTDATA("https://www.financecalendar.com/wp-json/fc/v1/calendar?impact=high&to=" & TEXT(TODAY()+30, "yyyy-mm-dd") & "&tz=Europe/London&limit=500&format=csv")

from defaults to today in New York, so you only need to set to. Keep the window at 92 days or less or the API returns an error instead of data.

4. This week, every Monday

=IMPORTDATA("https://www.financecalendar.com/wp-json/fc/v1/week?format=csv")

/week runs Monday to Sunday and rolls over by itself. Add which=next for the coming week, and impact= or country= to narrow it.

5. Readable dates and times

time_utc arrives as text like 2026-10-21T06:00:00+00:00. To turn it into a Sheets datetime in column B of a helper tab, with the import in a tab called raw:

=ARRAYFORMULA(IF(raw!B2:B="", "", DATEVALUE(LEFT(raw!B2:B, 10)) + TIMEVALUE(MID(raw!B2:B, 12, 8))))

Format the column as date-time and you get a sortable UTC timestamp. For local time, either add tz= to the URL and use the time_local column, or add your offset in hours divided by 24. Rows with all_day true (exchange holidays) have an empty time_utc, which the IF above leaves blank.

6. Conditional formatting by impact

Select the data range, open Format, Conditional formatting, choose “Custom formula is”, and enter =$G2="high" with a red fill (column G is impact). Repeat with "medium" for orange. The actual column (K) fills in within the hour of each release, so a rule like =$K2<>"" can mark released rows grey.

7. Look up one date with a formula

For a dashboard cell that shows the next Fed decision, import the single-series CSV and read the first data row:

=INDEX(IMPORTDATA("https://www.financecalendar.com/wp-json/fc/v1/calendar?series=fomc&to=2027-01-19&format=csv"), 2, 1)

This returns 2026-10-28, the next FOMC decision date, because rows are sorted soonest first and row 1 is the header. Column 3 gives 14:00 (Eastern), column 9 the consensus once it is published. The same pattern works for us-cpi, us-nfp, boe or any code on the economic calendar API page.

8. How often it refreshes, and the limits

Google refreshes IMPORTDATA results roughly every hour; you cannot force it faster, and that suits the data, which the API updates within the hour of a release and caches for 5 minutes. Each refresh is one API request from Google’s servers. The keyless limit is 2,000 requests a day per IP address; because Google fetches on your behalf, a sheet with 10 import formulas refreshing hourly uses about 240 requests a day. If you hit “Could not fetch URL”, wait for the next refresh; if you see it often, reduce the number of import formulas or combine them into one wider query and use FILTER inside the sheet.

IMPORTDATA cannot send headers, so you cannot attach a free API key to it. That is fine: the keyless limit is per IP address on Google’s side and is rarely reached by one sheet.

9. A tidy dashboard tab

Keep the raw import on its own tab and build the view you want with QUERY. With the 14-day import in raw!A:T, this shows only high-impact rows as date, time, name, country, consensus and prior, sorted by time:

=QUERY(raw!A:T, "select A, C, E, M, I, J where G = 'high' order by B", 1)

Letters map to columns: A date, B time_utc, C time_et, E name, G impact, I consensus, J prior, K actual, M country, P series_code, Q status. To count releases per country for the window, =QUERY(raw!A:T, "select M, count(E) where E is not null group by M", 1). Because the raw tab refreshes by itself, the dashboard does too, and nobody has to touch the sheet.

For a status column that reads “released” once the figure is out, use =IF(raw!K2<>"", "released", raw!Q2); actual (K) is filled within the hour of the print and status (Q) switches to released with it.

10. Apps Script, if you need JSON

IMPORTDATA only reads CSV. The /next, /series, /market-status and /holidays endpoints return JSON, so for those use a short Apps Script function and call it from a cell:

function FC_NEXT(series) {
  var r = UrlFetchApp.fetch("https://www.financecalendar.com/wp-json/fc/v1/next?series=" + encodeURIComponent(series));
  var e = JSON.parse(r.getContentText()).next;
  return [[e.date, e.time_et, e.consensus, e.prior, e.actual]];
}

Then =FC_NEXT("fomc") fills 5 cells with the next Fed decision’s date, Eastern time, consensus, prior and actual, and =FC_NEXT("uk-cpi") does the same for UK CPI. Custom functions recalculate when their arguments change or on a time-driven trigger you set in Apps Script; Google caches them, so pass a cell containing TODAY() as a dummy second argument if you want a daily refresh. Apps Script can also send headers, so a free key can be attached there if a shared sheet is busy.

11. Excel

In Excel for Microsoft 365, use Data, From Web with the same CSV URL, or Power Query’s Csv.Document(Web.Contents("...")). Excel lets you set the refresh interval in the query properties. The URLs and columns are identical.

Frequently asked questions

Why does the sheet show #N/A or “Could not fetch URL”?

Usually a URL problem. Check that the date window is 92 days or less, that country codes are from the list above, and that the URL ends with format=csv. The API returns HTTP 400 with a message for bad parameters, which Sheets shows as an error rather than displaying the message; paste the URL into a browser to read it.

Can I show times in my own timezone?

Yes. Add tz=Europe/London (or any IANA zone) to the URL and a time_local column is appended to the CSV.

Can I get more than 92 days in one sheet?

Use 2 or more IMPORTDATA formulas with consecutive windows, or import the full dataset with a short Apps Script, which covers 12 months back to 400 days ahead.

Do I have to credit the source?

Yes. Put a visible link to financecalendar.com on the sheet, for example in a header cell. The CSV’s last line carries the same credit.

Does this work in Google Sheets on mobile?

Yes. The formula is evaluated by Google’s servers, so the imported data shows anywhere the sheet opens.

Attribution

Data from this API is free for any use, commercial included, on one condition: a visible link to https://www.financecalendar.com near where the data appears, or on your credits page. Earnings dates are not included.

Similar Posts