Bulk downloads

Download a whole dataset as CSV files instead of paging through the API. ROIC rebuilds the files once a day and serves them from bulk.roic.ai through short-lived signed links. Three datasets are available: fundamentals, earnings-call transcripts, and daily stock prices.

Signed download URLs are valid for one hour after URL generation. Start each file download within this window. If a URL expires, request a new one.

Choose a dataset

Each file holds one slice of one dataset. The table shows the full inventory on September 8, 2026.

DatasetOne file holdsFilesCompressedUncompressed
FundamentalsOne fiscal year of annual, quarterly, or TTM data140, 1978 to 202713.0 GB34.0 GB
Earnings callsOne fiscal quarter of full transcripts90, 2004 to 20273.5 GB11.1 GB
Stock pricesOne calendar month of daily OHLCV prices for all tickers777, 1962 to 20264.6 GB16.3 GB

All files together: 1,007 files, 21.1 GB compressed, 61.4 GB uncompressed. Each dataset page lists the columns and sample rows, and has a file browser with the current size and a download button for every file.

Every file has the same shape:

PropertyValue
File typeCSV with a header row, UTF-8, RFC 4180 quoting
Compressiongzip (.csv.gz), about 2.6 to 3.6 times smaller than the CSV
File nameroic-<dataset>-<year>-<period>.csv.gz
SymbolsExchange-qualified, for example NASDAQ:AAPL or XETR:VOW
Empty cellsThe value was not reported. An empty cell is not zero.
RebuildOnce a day. Data can be up to 24 hours behind the live API.

How the routes work

Each dataset has one route. It returns every available file with its size, its SHA-256 digest, and a signed download url. Two optional query parameters, year and period, filter the list down to one year or one file.

MethodPathResult
GET/v3.0.0/fundamental/bulkFundamentals files
GET/v3.0.0/earnings-calls/bulkEarnings-call files
GET/v3.0.0/stock-prices/bulkStock-price files

The fundamentals route is singular (/fundamental/bulk), like the other fundamental routes. The dataset field in the response stays plural (fundamentals). Do not build the route from the dataset field.

The route returns JSON. It does not redirect and it does not send the file. Every url in the response works for one hour, until expires_at. A download that is in progress when the link expires is not cut off. The file host only accepts signed links: a file address without a valid verify token is blocked.

Download a file

Complete these steps for each file that you need.

1

List the available files

Call the route for the dataset without parameters. Read the year, period, size, and sha256 of each file. The list holds every file, newest year first.

2

Request a fresh link for one file

Call the same route with year and period from the list. The response holds one file. Read its url and expires_at.

3

Download the file

Send a plain GET request to the url before expires_at. Do not send your API key to this URL. The link is already signed.

4

Verify the digest

Calculate the SHA-256 digest of the downloaded .csv.gz file. Make sure that it is equal to the sha256 field. Verify before you decompress.

5

Decompress and read

Decompress the file with gzip. Read the CSV with a real CSV parser, because transcripts contain line breaks and quotes.

To download from the browser instead, open a dataset page and use the download button in its file browser. The browser download requires a Professional or Enterprise account.

Detect updates

File paths never change. A rebuilt file replaces the previous one at the same address, so you cannot tell versions apart by name or URL.

To find changed files, call the route and compare sha256 with the digest of your last download. Files with the same digest are unchanged, so you can skip them. Historical files usually keep the same digest. Current-year files change every day.

Plan access

Bulk downloads require a Professional or Enterprise plan. A request from another plan returns 402 Payment Required with the error code bulk_download_restricted. See handle API responses for the error envelope.

Next steps

Pick a dataset page, then follow the download procedure above.