If you schedule a job around Massive's flat files, check for the file rather than the clock. The 11:00 AM ET time in the flat-file documentation is approximate, a file can be downloaded the moment it appears in the bucket listing, and a file that is already published can be replaced later, so the copy you downloaded is not always the latest one.
Applies to
- Plans: paid plans that include flat files, such as Stocks Starter and above. Stocks Basic does not include them. The splits and dividends endpoints are on every Stocks plan, Basic included.
- Endpoints or feeds: the flat files at https://files.massive.com, bucket flatfiles, and the /stocks/v1/splits and /stocks/v1/dividends endpoints.
- Asset classes: flat files for stocks, options, indices, forex, crypto and futures; splits and dividends for stocks.
When each day's flat files are published
Massive's flat-file documentation gives the same time for every asset class: the finalized files for a trading day are available for download by approximately 11:00 AM ET the following day. The flat files quickstart says so, as do the overview pages for stocks, options, indices, forex, crypto and futures. Each dataset page, such as stock minute aggregates, lists its recency as "Updated at 11a ET to include the previous day".
The 11:00 AM ET time is when a day's flat files are documented to be complete, not when the first file is written. Stock and options flat files are generated after the full session closes, which for stocks is when after-hours trading ends at 8:00 PM ET, and each file can be downloaded as soon as it is in the bucket. Stock files are often there hours before 11:00 AM ET, and quote files tend to be written after the aggregate files for the same day. A busy trading day makes bigger files, and bigger files take longer: stock quote files for the busiest days land later than for quiet ones, and options quote files, the largest of all, sometimes land after 11:00 AM ET. The earlier time is not documented and varies from day to day, so do not build a schedule on it: check that the file is there, as shown below, or sync on a schedule as described further down.
If you need a day's stock bars sooner than its flat file, the REST custom bars endpoint serves them on your plan's recency instead: 15-minute delayed on Stocks Starter and Developer, real-time on Stocks Advanced and Business.
How to check that a day's flat file is ready
- List the date's prefix in the bucket. A file that has not been published yet is absent from the listing.
- Read LastModified on the object. It is the time, in UTC, that the copy in the bucket was written.
- Download the file. If you keep copies, list the prefix again later and compare LastModified or ETag with the values you downloaded; a change means the file has been replaced.
The listing below uses curl's built-in S3 signing with the S3 Access Key and Secret Key from your dashboard, which are not your API key. Any S3 client lists the same fields, and How do I get started with Flat Files and S3 on Massive? sets one up.
curl -X GET --aws-sigv4 "aws:amz:us-east-1:s3" --user "YOUR-ACCESS-KEY:YOUR-SECRET-KEY" "https://files.massive.com/flatfiles?list-type=2&prefix=us_stocks_sip/minute_aggs_v1/2026/10/2026-10-09"
Response, trimmed:
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Prefix>us_stocks_sip/minute_aggs_v1/2026/10/2026-10-09</Prefix>
<Contents>
<Key>us_stocks_sip/minute_aggs_v1/2026/10/2026-10-09.csv.gz</Key>
<LastModified>2026-10-10T04:32:52.156Z</LastModified>
<ETag>"2e27419c5fbca6495118d39f2b18549c"</ETag>
<Size>26083580</Size>
</Contents>
<KeyCount>1</KeyCount>
</ListBucketResult>
The LastModified value is UTC: 04:32 UTC on 10 October 2026 is 12:32 AM ET, so the stock minute aggregates for Friday 9 October 2026 were in the bucket about ten and a half hours before the documented 11:00 AM ET. For a date whose file is not there yet, the same listing returns <KeyCount>0</KeyCount> and no <Contents>.
How to download new and updated flat files automatically
A scheduled sync keeps a local copy of a Massive flat-file dataset current without checking the bucket by hand. A sync downloads the files that are new in the bucket and the files whose copy in the bucket has changed, so it also picks up a file Massive has replaced. With the AWS CLI, using the same endpoint as the commands in How do I get started with Flat Files and S3 on Massive?:
aws s3 sync s3://flatfiles/us_stocks_sip/day_aggs_v1/2026/ ./day_aggs_v1/2026/ --endpoint-url https://files.massive.com
The AWS CLI downloads a file when it is missing locally, when its size differs, or when the copy in the bucket is newer than the local file, as the aws s3 sync reference describes. With rclone, rclone copy compares size and modification time the same way and never deletes a local file, which rclone sync would do for a file that is not in the bucket:
rclone copy s3massive:flatfiles/us_stocks_sip/day_aggs_v1/2026/ ./day_aggs_v1/2026/
Run the sync after 11:00 AM ET on weekdays, for example from cron, and run it again later in the day if you rely on files that can land late, such as options quotes.
Why a flat file you already downloaded can change
A Massive flat file that is already published can be replaced by a new copy under the same name, and the new copy has a new LastModified time and ETag. The stock minute aggregates file for 2 January 2026, for example, was rewritten on 30 March 2026:
curl -X GET --aws-sigv4 "aws:amz:us-east-1:s3" --user "YOUR-ACCESS-KEY:YOUR-SECRET-KEY" "https://files.massive.com/flatfiles?list-type=2&prefix=us_stocks_sip/minute_aggs_v1/2026/01/2026-01-02"
Response, trimmed:
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Prefix>us_stocks_sip/minute_aggs_v1/2026/01/2026-01-02</Prefix>
<Contents>
<Key>us_stocks_sip/minute_aggs_v1/2026/01/2026-01-02.csv.gz</Key>
<LastModified>2026-03-30T18:29:38.174Z</LastModified>
<ETag>"201c9c7ab18c8144d76e65db1cfec3c8"</ETag>
<Size>22848818</Size>
</Contents>
<KeyCount>1</KeyCount>
</ListBucketResult>
18:29 UTC on 30 March 2026 is 2:29 PM ET, almost three months after the session in the file. To know whether a flat file you hold is still current, keep the ETag or LastModified you downloaded and compare it with a fresh listing.
When are splits and dividends updated?
Massive's splits and dividends endpoints, /stocks/v1/splits and /stocks/v1/dividends, are documented as updated daily on every Stocks plan, and the splits and dividends documentation gives no time of day. Neither record carries a timestamp, so a response cannot tell you when a split or dividend was added.
Splits and dividends do not have to be in place before the stock flat files are. The stocks flat files overview says every stock flat file is unadjusted for splits, dividends and other corporate actions, so a file is the same whether or not a split has been recorded. If you adjust flat-file prices yourself, the splits endpoint includes splits whose execution date has not arrived yet, so query forward from the current date to see the ones coming up:
curl -X GET "https://api.massive.com/stocks/v1/splits?execution_date.gte=2026-10-14&execution_date.lte=2026-10-15&sort=execution_date.asc&apiKey=YOUR_API_KEY"
Response, trimmed:
{
"status": "OK",
"results": [
{
"execution_date": "2026-10-14",
"split_from": 1.0,
"split_to": 2.0,
"ticker": "SKYD",
"adjustment_type": "forward_split"
},
{
"execution_date": "2026-10-14",
"split_from": 20.0,
"split_to": 1.0,
"ticker": "SKIN",
"adjustment_type": "reverse_split"
},
{
"execution_date": "2026-10-15",
"split_from": 16.0,
"split_to": 1.0,
"ticker": "BTOC",
"adjustment_type": "reverse_split"
}
]
}
The splits response lists a 2-for-1 split for SKYD and a 1-for-20 reverse split for SKIN taking effect on 14 October 2026, and a 1-for-16 reverse split for BTOC on 15 October 2026. Put today's date in execution_date.gte to see the splits coming up when you read this. The dividends endpoint likewise lists dividends whose ex-dividend date has not arrived yet, and a dividend's declaration_date, where the record has one, shows when the company announced it.
If you see an error
HTTP 404 with the error code NoSuchKey on a flat-file download for a date with no session, such as a Saturday, means there is no file for that date. For a trading day whose flat file you expect, list the date's prefix rather than reading the download error: <KeyCount>0</KeyCount> means the file is not there yet, and a listed file shows when it was written.

