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.
| Dataset | One file holds | Files | Compressed | Uncompressed |
|---|---|---|---|---|
| Fundamentals | One fiscal year of annual, quarterly, or TTM data | 140, 1978 to 2027 | 13.0 GB | 34.0 GB |
| Earnings calls | One fiscal quarter of full transcripts | 90, 2004 to 2027 | 3.5 GB | 11.1 GB |
| Stock prices | One calendar month of daily OHLCV prices for all tickers | 777, 1962 to 2026 | 4.6 GB | 16.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:
| Property | Value |
|---|---|
| File type | CSV with a header row, UTF-8, RFC 4180 quoting |
| Compression | gzip (.csv.gz), about 2.6 to 3.6 times smaller than the CSV |
| File name | roic-<dataset>-<year>-<period>.csv.gz |
| Symbols | Exchange-qualified, for example NASDAQ:AAPL or XETR:VOW |
| Empty cells | The value was not reported. An empty cell is not zero. |
| Rebuild | Once 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.
| Method | Path | Result |
|---|---|---|
| GET | /v3.0.0/fundamental/bulk | Fundamentals files |
| GET | /v3.0.0/earnings-calls/bulk | Earnings-call files |
| GET | /v3.0.0/stock-prices/bulk | Stock-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.
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.
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.
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.
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.
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.