Massive's forex and metals history is not one continuous record, and the documented start date is the earliest pair's, not every pair's. USD/JPY and gold begin two days after it, silver almost four years later, and between 12 July 2010 and 12 July 2013 gold has data only on 27 September 2010 and from 30 June to 30 August 2011. Gold and silver also have a second kind of gap that a check for missing days will not find: for more than four and a half years the minute bars keep coming, but each one is built from two to four quotes.
Applies to
- Plans: Currencies Basic reaches 2 years of forex bars and no quotes; Currencies Starter and Business reach all history, per the Plan History tables for forex bars and forex quotes.
- Endpoints: /v2/aggs/ticker/{forexTicker}/range/... for bars, /v3/quotes/{fxTicker} for quotes, and the forex flat files.
- Asset classes: forex, including gold (C:XAUUSD) and silver (C:XAGUSD).
When each pair's history starts
The forex documentation says records date back to 25 September 2009. That is the earliest pair's first day; each pair below starts on its own first day, all times UTC:
| Pair | First daily bar | First minute bar |
|---|---|---|
| C:EURUSD | 2009-09-25 | 2009-09-25 04:00 |
| C:GBPUSD | 2009-09-25 | 2009-09-25 04:00 |
| C:USDCHF | 2009-09-25 | 2009-09-25 04:00 |
| C:AUDUSD | 2009-09-25 | 2009-09-25 04:00 |
| C:USDCAD | 2009-09-25 | 2009-09-25 04:00 |
| C:NZDUSD | 2009-09-25 | 2009-09-25 04:00 |
| C:USDJPY | 2009-09-27 | 2009-09-27 21:00 |
| C:XAUUSD | 2009-09-27 | 2009-09-27 21:45 |
| C:XAGUSD | 2013-07-14 | 2013-07-14 22:00 |
A forex daily bar covers one UTC calendar day, so the Sunday dates are the evening the trading week opens.
Which days are missing
A missing day here is a weekday, by UTC date, with no daily bar. Inside those days there are no minute bars and no quotes either, so the gap is in the underlying quotes rather than in the bars built from them. Weekends are not gaps: forex closes from Friday evening to Sunday evening, as What are the forex market hours? explains. These are the runs of three or more missing weekdays, generated from each pair's complete daily history on the aggregates endpoint:
| Pair | Missing weekdays, UTC |
|---|---|
| C:EURUSD | 2020-10-26 to 2020-11-13 |
| C:GBPUSD | 2020-10-26 to 2020-11-13 |
| C:USDJPY | 2019-09-16 to 2019-10-04; 2020-10-13 to 2020-11-13 |
| C:USDCHF | 2019-09-25 to 2019-10-04; 2020-10-13 to 2020-11-13; 2021-04-29 to 2021-06-08 |
| C:AUDUSD | No run of three or more |
| C:USDCAD | 2019-09-25 to 2019-10-04; 2020-10-13 to 2020-11-13 |
| C:NZDUSD | 2019-09-25 to 2019-10-04; 2020-10-26 to 2021-01-01 |
| C:XAUUSD | 2010-07-12 to 2010-09-24; 2010-09-28 to 2011-06-29; 2011-08-31 to 2013-07-12; 2019-09-03 to 2019-10-04; 2020-10-13 to 2020-11-13 |
| C:XAGUSD | 2019-09-03 to 2019-10-04; 2020-10-13 to 2021-01-01 |
The single missing weekdays in the same nine pairs are these:
- 25 December and 1 January: no pair has data on either day up to 1 January 2021, apart from 1 January 2018. From 25 December 2023 onward those days have data.
- 2015-11-02: C:USDJPY and C:USDCHF.
- 2023-06-21: C:XAGUSD.
- 2023-08-21: C:XAUUSD and C:XAGUSD.
- 2025-04-18: all nine pairs. 2025-04-21: C:XAUUSD and C:XAGUSD.
- Good Friday for gold and silver: 2014-04-18, 2015-04-03, 2016-03-25, 2017-04-14, 2018-03-30, 2019-04-19, 2020-04-10 and 2024-03-29, plus 2021-04-02 for silver only.
Gaps of a few hours inside a day
Gaps of a few hours inside a weekday that otherwise has data are not in the tables above, and all nine pairs have some. In the seven US dollar majors, more of them start at 00:00 UTC, the beginning of the UTC day, than at any other hour. Hourly bars show these gaps, as the section on checking a pair below describes.
Gold and silver quotes are sparse from 2021 to 2025
Gold and silver quotes are sparse from 8 January 2021 through 15 August 2025. In that period each metal has fewer than 5,000 quotes on almost every weekday, two to four a minute, and a weekday still has as many minute bars as one before or after the period. From 2018 to 2020, gold had more than 100,000 quotes on almost every weekday and silver more than 10,000. Quotes are dense again from the session that opens on Sunday 17 August 2025, and from September 2025 both metals have more than 100,000 on almost every weekday.
The n field on a forex bar is the number of quotes the bar was built from, so daily bars show the change directly. This request spans the end of the sparse period:
curl -X GET "https://api.massive.com/v2/aggs/ticker/C:XAUUSD/range/1/day/2025-08-14/2025-08-19?apiKey=YOUR_API_KEY"
Response
{
"ticker": "C:XAUUSD",
"results": [
{ "t": 1755129600000, "n": 3584 },
{ "t": 1755216000000, "n": 3307 },
{ "t": 1755388800000, "n": 5292 },
{ "t": 1755475200000, "n": 99553 },
{ "t": 1755561600000, "n": 98537 }
],
"status": "OK"
}
The timestamps are milliseconds at 00:00 UTC on 14, 15, 17, 18 and 19 August 2025. Thursday and Friday carry fewer than 3,600 quotes each, Sunday's short session opens the week, and Monday jumps to nearly 100,000. A minute bar from the sparse period is therefore a price from a few quotes, not a full minute of trading, which matters for anything that uses the bar's high, low or volume.
What tick-level forex history looks like
Forex tick history is quotes only, because foreign exchange has no consolidated trade tape. Each quote's participant_timestamp is in nanoseconds but recorded to the whole second, so its last nine digits are zero and several quotes can share one timestamp.
How to check a pair that is not listed here
The quickest check for any other pair is its whole daily history, which comes back in one request. Ask for the oldest bar first, shown here for gold:
curl -X GET "https://api.massive.com/v2/aggs/ticker/C:XAUUSD/range/1/day/2009-01-01/2009-12-31?sort=asc&limit=1&apiKey=YOUR_API_KEY"
Response
{
"ticker": "C:XAUUSD",
"results": [
{ "t": 1254009600000, "c": 994.25, "n": 1636 }
],
"status": "OK"
}
That timestamp is 27 September 2009, 00:00 UTC, gold's first daily bar. Then request the pair from its first day to today with limit=50000 and list the weekdays with no bar. Hourly bars over a shorter range show gaps of a few hours inside a day, which daily bars cannot.
Why a gap shows up as missing bars
A gap shows up as missing bars rather than flat ones because forex aggregates are built from quotes. The aggregates documentation says that when no new quotes arrive in a window, no bar is produced for it, so a period with no quotes leaves no bars at all, at every resolution.
If you see an error
An empty results array for a date in the tables above is the gap, not a problem with your request.
{"status":"NOT_AUTHORIZED"} on /v3/quotes with a Currencies Basic plan means the plan does not include forex quotes. On the aggregates endpoint for a date more than two years back, the message Your plan doesn't include this data timeframe means the date is older than the Basic plan's history window.

