What a daily bar contains
Each row is one listing on one exchange-local trading date. Prices and volume are exact decimal strings, never floating-point numbers, so a daily close of 338.4 stays 338.4 when you parse it into a decimal type. A missing value is null, not zero.
| Field | Meaning |
|---|---|
date | Exchange-local trading date (YYYY-MM-DD) |
symbol, exchange_mic | Exchange-qualified ticker such as XNAS:AAPL, and the ISO market code |
instrument_id | Stable ID that survives ticker changes; use it as your primary key |
open, high, low, close | Session prices in currency_code |
volume | Shares traded in the session, always a whole number |
trade_count | Number of trades, from the 2026-10-02 session on; null on earlier bars, which no source counted trades for |
adjustment, factor_set_version | Present only on adjusted rows |
Raw, split-adjusted and total-return prices
The adjustment parameter defaults to raw: the prices that actually printed on that date. split back-adjusts earlier bars for the listing's reconciled splits, so a 10-for-1 split no longer looks like a 90% drop. total_return also folds in cash dividends, each valued at the last close that still carried it, which is what you want for return calculations and backtests.
Each mode is built from its own validated factor set. Adjusted prices are rounded to 6 decimal places and adjusted volume to whole shares. If a factor set is not ready, the request returns 503 adjustments-unavailable instead of silently mixing adjusted and unadjusted rows. Whole-market date queries are raw only. The adjusted prices guide walks through the arithmetic, and the stock splits page shows a worked example.
How far back the data goes
History depth is set by your plan. Requests that start earlier than your window return 403 history-not-entitled rather than a silently truncated result.
| Plan | Symbols | Daily history you can query |
|---|---|---|
| Free | AAPL, NVDA, JNJ, PEP, MSFT, SPY, QQQ | 5 years |
| Developer | All U.S. stocks and ETFs | 5 years |
| Pro | All U.S. stocks and ETFs, plus Canada, UK, France, Netherlands and Australia | 15 years |
| Commercial and Scale | Everything in Pro, plus mutual funds | Full history |
Where the underlying data starts varies by listing. Call GET /v1/datasets/eod/coverage?symbols=XNAS:AAPL and read history_from and history_to; coverage rows also list interior gaps, so you can see a missing session before your backtest does.
Every listing for one trading date
Pass date without symbols and the endpoint returns one bar for every listing in your entitled markets that traded that day, in symbol order. Narrow it with exchanges. This costs 500 credits per request instead of 5 credits per symbol, and it is the fastest way to build a daily market table or refresh a local database each evening.
curl 'https://api.ohlc.io/v1/eod?date=2026-10-02&exchanges=XNYS,XNAS&limit=500' \
-H "Authorization: Bearer $OHLC_API_KEY"Results page at up to 500 rows. Copy meta.next_cursor into the next request and keep every other parameter unchanged; a null cursor ends the set. See pagination.
Point in time and ticker changes
as_of sets a knowledge cutoff: the response reflects what was known at the end of that UTC day, including corrections published since. symbol_at resolves a ticker as it was assigned on a past date, which matters when a symbol has been reused. To follow a company across ticker changes, or to read a listing that no longer trades, select it with instrument_ids instead of symbols.
Bulk history: exports and flat files
Pro, Commercial and Scale plans can skip pagination entirely. Nightly flat files hold one gzipped CSV per dataset per U.S. trading date with the same raw values the REST API returns for U.S. listings. Scale adds S3 delivery. See flat files.
Common uses
- Backtesting strategies on
total_returnbars so dividends count toward performance - Charting candlesticks with split-adjusted history that lines up across splits
- Valuing a portfolio at each month-end close
- Loading prices into Excel or Google Sheets with
format=csv(see spreadsheets) - Asking Claude or another MCP client for price history through the MCP server
These are end-of-day values, published after each session closes. For the latest price during the session, use delayed quotes; for bars inside the day, use intraday prices.
Split-adjusted daily bars for Apple
curl 'https://api.ohlc.io/v1/eod?symbols=XNAS:AAPL&from=2026-09-28&to=2026-09-30&adjustment=split' \
-H "Authorization: Bearer $OHLC_API_KEY"{
"data": [
{
"date": "2026-09-28",
"security_id": "01M35H2KE2ZJHXFY5C3E7FPC66",
"instrument_id": "01M35H2KE2ZJHXFY5C3E7FPC66",
"symbol": "XNAS:AAPL",
"exchange_mic": "XNAS",
"currency_code": "USD",
"open": "340.37",
"high": "342.988",
"low": "338.04",
"close": "338.4",
"volume": "32463830",
"trade_count": null,
"adjustment": "split",
"factor_set_version": 1
}
],
"meta": {
"timezone": "UTC",
"as_of": "2026-10-03T15:04:46Z",
"next_cursor": null
}
}Prices delayed 15 minutes · Illustrative sample data