Price history
Daily and intraday bars of every family share one shape. For indicators computed from the bars, see technicals.
A stock's daily bars for the last year:
curl "https://api.tauric.ai/v1/securities/AAPL/history?period=1y" \
-H "Authorization: Bearer $TAURIC_API_KEY"
For the year before, send coverage.continue_end as end with the same period, until continue_end is null.
Stocks and ETFs covers the stock routes.
Routes
| bars of | route | period | interval |
|---|---|---|---|
| a stock or ETF | GET /v1/securities/{symbol}/history | 1d 5d 1mo 3mo 6mo ytd 1y | 1d, 15m, 60m (with days) |
| a continuous future | GET /v1/futures/{root}/continuous/history | 1d 5d 1mo 3mo 6mo ytd 1y | 1d |
| an FX pair | GET /v1/fx/{pair}/history | 1d 5d 1mo 3mo 6mo | 1d |
| a crypto pair | GET /v1/crypto/pairs/{pair}/history | 1d 5d 1mo 3mo 6mo | UTC days |
| an index, yield, or volatility series | GET /v1/series/{key}/history | 1d 5d 1mo 3mo 6mo | 1d |
Every route takes end to page back (history paging); none takes start.
{"instrument": {"key": "future:XCME:ES/continuous", "name": "E-mini S&P 500", "currency": "USD",
"price_scale": null, "price_precision": null, "venue": "XCME",
"field_states": {"price_scale": {"state": "unavailable", "reason": "quoted_in_points", "retry": "never"}},
"...": "..."},
"interval": "1d", "price_basis": "unadjusted",
"coverage": {"requested": {"period": "5d", "days": null, "end": null}, "from": "2026-09-21",
"through": "2026-09-25",
"complete": true, "complete_reason": null, "window_bound": null,
"available_from": "2021-09-27", "continue_end": "2026-09-18",
"skipped_sessions": [], "pending_session": null, "revision_window": {"...": "..."}},
"freshness": {"refreshed_at": "2026-09-26T13:00:00.000000Z", "stale": false,
"session_calendar": {"id": "cme.equity_index"}, "field_states": null},
"bars": [{"date": "2026-09-24", "start": null, "open": 7741.25, "high": 7768.5, "low": 7730.0, "close": 7752.75,
"volume": 812344, "status": "unsettled", "session_complete": true, "field_states": {}},
{"date": "2026-09-25", "start": null, "open": 7759.0, "high": 7814.75, "low": 7748.5, "close": 7803.75,
"volume": null, "status": "unsettled", "session_complete": true,
"field_states": {"volume": {"state": "withheld", "reason": "unreliable", "retry": "never"}}}]}
Two of the window's five bars are shown; both are unsettled (settlement).
Response fields
Every field is described in the API reference. To use them:
price_basis:split_dividend_adjustedfor a security (splits and cash dividends applied back, so a past close is below the price that traded; volume is split-adjusted only), orunadjusted. Before a listing's first recorded distribution, its bars are adjusted for splits only.day_boundary(crypto pairs only):utc_midnight. A bar is the UTC day, not a session close.- A bar's null value says why in the bar's
field_states.
Coverage
completesays whether every session of the window is served as a bar or named inskipped_sessions. It says nothing about values: each bar'sfield_statesdoes.falsecomes withcomplete_reason; null means not assessed.continue_endis theendto send, with the sameperiodordays, for the next older window; null when no older session is held.skipped_sessionsnames each unserved session with its reason. An intraday session that cannot be put on the served adjustment basis is skipped (not_held), never served unadjusted.pending_sessionis a completed session whose bar is not available yet.revision_window.revisablesays which recent bars may still change; a correction to an older bar is not shown.
A window is plainly complete only when complete is true and no bar carries a field_states entry.
Incomplete windows
complete_reason | complete | meaning |
|---|---|---|
insufficient_history | false | the window reaches before the history held; it is served from its first held session |
temporarily_unavailable | false | a completed session has no bar yet (pending_session), or earlier intraday sessions may still be filled |
possibly_incomplete | false | crypto days: a day inside the window is missing or still pending; never read it as a day without trades |
not_assessed | null | the expected sessions are not assessed (some FX, futures, and index windows; intraday bars) |
An end before any held history is refused 404 insufficient_history
(history paging).
Incomplete intraday sessions
coverage.incomplete_sessions lists intraday sessions holding fewer bars than their trading hours imply, each
{date, bars, bars_expected, reason}: temporarily_unavailable (may still be filled) or not_held (will not be).
Session calendars
freshness.session_calendar.id (FX, futures, and index bars) names the calendar the window's sessions are dated on.
A trading day ends:
| used for | the day ends |
|---|---|
| a continuous future | at the family's close, Chicago time: 16:00 for equity index, interest rate, energy, metals, and dairy; 13:20 for the grains; 13:05 for livestock |
| an index or yield series | 16:15 New York (the US Dollar Index 17:00) |
| an FX pair | 23:59 London, every weekday |
| the softs (coffee, sugar, cocoa) | weekdays less the NYSE closures |
A market holiday inside a window has no bar, and the response does not name it.
Bars
Completed sessions only
A history serves completed sessions only; a session in progress is the quote's. For FX, futures, index, and yield
bars, the newest session is named in pending_session until its final bar is available (on a Monday afternoon a
futures history ends on Friday's bar).
Withheld bars
An FX, futures, or index bar can be served with every value null and unreliable; the technicals skip it.
Close-only series
A close-only series (the MOVE, one level a day) serves each bar's close only. Its open, high, and low are null
with unreliable, as are its quote's day range and the range indicators (technicals).
Settlement
status | meaning |
|---|---|
settled | final: the bar does not change |
unsettled | not final: it may still change, or its close is missing. A futures or index bar inside revision_window, a session with no bar, a series bar with no close, and every FX bar (its close is withheld) stay unsettled |
settled is not an exchange settlement price: a futures bar's close is the daily close. A bar can be
session_complete: true and unsettled. A departed listing's unsettled bars stay so
(listing lifecycle).
History windows
1d and 5d are the newest 1 and 5 served sessions. A calendar period counts back from the newest served session:
1mo over bars through Friday 2026-09-25 is 2026-08-26 to 2026-09-25. ytd starts on 1 January of that session's
year.
| data | depth | one response | further |
|---|---|---|---|
| security daily bars | the listing's history, from coverage.available_from | a period up to 1y | end = coverage.continue_end |
| security intraday bars | 15m and 60m over a recent window that varies by listing and interval (coverage.available_from) | days sessions (at most 7 at 15m, 28 at 60m) | end |
| FX, futures, and index bars | up to 5 years | up to 6mo (1y for a continuous future) | end |
| crypto daily bars | from 2024-07-01, or from the pair's first traded day if later (coverage.available_from) | up to 6mo | end |
A security's intraday bars are available after the session ends. Its intraday volumes do not sum to the daily bar's volume: use the daily bar for a day's volume.
When the data is behind
freshness.stale is defined on freshness. For the bars:
| window | when the served data is behind |
|---|---|
| a security's daily window, any period | refused 503 temporarily_unavailable, so a served window has stale false (null for a delisted or departed listing) |
| a security's intraday window | stale is null with not_assessed |
period=1d or 5d of an FX, futures, index, or crypto window | refused 503 temporarily_unavailable when the newest bar is too old to stand for the latest sessions |
| a longer period of an FX, futures, or index window | refused 503 temporarily_unavailable when the window holds no recent bar; otherwise served, with stale true once a session's bar is overdue |
| a longer period of a crypto window | served, with stale true once a day's bar is overdue |
For FX, futures, index, and crypto bars, a window anchored on a past end is not refused as stale.