Get started
End-of-day prices

Historical stock prices,
one daily bar per session.

GET /v1/eod returns end-of-day open, high, low, close and volume for stocks and ETFs listed in the U.S. and, on Pro and above, in Canada, the UK, France, the Netherlands and Australia, one bar per exchange trading date. Prices come back raw by default, or back-adjusted for splits and dividends when you ask.

Raw or adjusted

Choose raw, split or total_return per request. Adjusted rows name the factor set they were built from.

Decades of history

Apple's daily bars start on 1980-12-12 and SPY's on 1993-01-29 (coverage endpoint, checked October 3, 2026). Your plan sets how far back you can query.

The whole market for one date

Drop the symbols and pass date to get every listing that traded that session in one paginated call.

Point in time

as_of replays what was known on a past day, and instrument_ids reach listings that changed ticker or stopped trading.

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.

FieldMeaning
dateExchange-local trading date (YYYY-MM-DD)
symbol, exchange_micExchange-qualified ticker such as XNAS:AAPL, and the ISO market code
instrument_idStable ID that survives ticker changes; use it as your primary key
open, high, low, closeSession prices in currency_code
volumeShares traded in the session, always a whole number
trade_countNumber of trades, from the 2026-10-02 session on; null on earlier bars, which no source counted trades for
adjustment, factor_set_versionPresent 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.

From the plan definitions in [pricing](/pricing).
PlanSymbolsDaily history you can query
FreeAAPL, NVDA, JNJ, PEP, MSFT, SPY, QQQ5 years
DeveloperAll U.S. stocks and ETFs5 years
ProAll U.S. stocks and ETFs, plus Canada, UK, France, Netherlands and Australia15 years
Commercial and ScaleEverything in Pro, plus mutual fundsFull 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.

Every NYSE and Nasdaq bar for one sessioncURL
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_return bars 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

RequestcURL
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"
Response · Illustrative sampleJSON
{
  "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

Questions, answered.

Is there a free historical stock price API?

Yes. The Free plan returns daily bars for AAPL, NVDA, JNJ, PEP, MSFT, SPY and QQQ with 5 years of history and 12,500 credits a day, for personal use, with no card. Developer ($49/month) opens every U.S. stock and ETF at the same depth, and Pro ($149/month) adds Canada, the UK, France, the Netherlands and Australia. See pricing.

How far back does the historical data go?

It depends on the listing and your plan. Apple's daily bars start on 1980-12-12 in our data. Free and Developer can query 5 years back, Pro 15 years, and Commercial and Scale the full history. The coverage endpoint reports history_from for any symbol.

Are the prices adjusted for splits and dividends?

Only if you ask. Prices are raw by default; add adjustment=split for split-adjusted bars or adjustment=total_return for split- and dividend-adjusted bars.

Can I download the whole U.S. market's history?

Yes. A date query returns every listing for one session for 500 credits. Pro and above also get nightly flat files, and Commercial and Scale add bulk exports, which suit full-history loads better than paging through the API.

Does the data include delisted stocks?

Listings that stopped trading keep their history. Select them with instrument_ids, or resolve the old ticker with symbol_at set to a date when it was still assigned.

A little JSON.
A lot of possibility.

Explore the API