Daily bars
End-of-day OHLCV bars, one per exchange-local trading date. Raw bars are as traded: prices are never restated for a later split, and share volume is whole shares. A US listing's latest session bar is published within minutes of the close from the consolidated tape and can be revised when the primary end-of-day source delivers the session later that evening or the next day: the bar then takes that source's prices, and keeps the consolidated tape's volume and trade count wherever the two agree on open, high, low and close; a bar that closes at least 90% away from the previous close is held until a split record or the next session confirms it. A listing on the Toronto, TSX Venture, Cboe Canada, London, Euronext Paris and Amsterdam or ASX exchanges has its session's bar published from the exchange's daily file about two hours after the close (asked for again hourly until the file carries the session), and the file is read again at 04:00 UTC the next day. A mutual fund has one bar a day, its net asset value; mutual funds need mutual-funds.read (Commercial and Scale): for other keys a request naming one returns 403 mutual-funds-not-entitled, and whole-market date queries leave them out. Most funds' history starts on 1 January 10 years before the current year; a short list of funds carries its full history. The leading crypto pairs' UTC day is published at about 00:10 UTC the next day from their last quotes of it, and every pair's from the provider's daily file at about 02:00 UTC, read again over the following week as the provider replaces the first bars it posts; a crypto bar's open is the previous day's close. A currency pair's UTC day is published at about 02:00 UTC the next day, Sunday's from the market's open that evening in New York; Saturday has no bar, and the bars carry no volume. History reaches back to 1971 for the majors. An index (the INDEX venue, such as INDEX:GSPC for the S&P 500) has a bar for each trading date of its home market, as its publisher calculates the level, with no volume; its instrument_id is the one /v1/indices gives it. Its bar is published at about 00:30 UTC after its trading date, whatever its market, since the venue's days are UTC days, and the leading indices are quoted during their sessions (/v1/quotes). History reaches back to 1927 for the S&P 500. A US corporate bond (the BOND venue, BOND: and its ISIN, such as BOND:US00037BAF94) has a bar for each US business day it traded, its clean price per 100 of face value, evaluated or last-trade, as open, high, low and close alike, with no volume: a bond that did not trade has no bar that day. A day's bars are published from about 08:00 UTC the next morning and again as the source adds prices during that morning; yields and terms are in /v1/bonds and /v1/bonds/yields. Default order: requested symbol, then date descending (newest first). With date instead of from and to, returns one bar per listing for that exchange-local trading date in symbol order: for every listing in the key's entitled markets (optionally limited by exchanges) when symbols and instrument_ids are omitted, like a daily market summary, or for the requested listings. A listing carries the symbol recorded for it on that date, or where none is recorded yet, the earliest symbol recorded for it (listed in meta.unrecorded_symbols). In a date query, order applies to the symbol, ascending by default, and prices are raw. Select listings with symbols or instrument_ids, not both; order=desc returns each listing's rows newest first (the default) and order=asc oldest first. Requires eod.read and an entitled market. An empty data array is a successful result. When none of the requested symbols resolves, the response is 404 symbol-not-resolved, whatever the size of the list; when at least one does, the others are reported in meta.errors.
/v1/eodThe recommended endpoint for this data. Also available as GET /v1/bars (cross-asset form).
- Required capability
- eod.read
- Data timing
- End of day
- Credits
- 5 credits per symbol; 500 credits without symbols (whole market).
Parameters
limitintegeroptional · query- Maximum records per page, from 1 to 500; default 100.Default:
100 cursorstringoptional · query- Opaque cursor, expires after one hour. Keep all query parameters unchanged. Changes to entitlements can invalidate it.
If-None-Matchstringoptional · header- ETag from a previous response. Authorization is rechecked before returning 304, and a 304 costs no credits.
symbolsstringoptional · query- Comma-separated MIC:TICKER symbols (crypto pairs are CRYPTO:BTC-USD, currency pairs FOREX:EUR-USD, indices INDEX:GSPC, bonds BOND and the ISIN, such as BOND:US00037BAF94) or bare tickers, which resolve to the exchange listing that ticker; neither part is case-sensitive, and two spellings of one listing count as a repeated value. A bare ticker that names no listing as written is also read in the common vendor spellings: with an exchange suffix (RY.TO, SHEL.L, VOD.LSE, BHP.AX), ^GSPC for INDEX:GSPC, and EURUSD=X or EURUSD for FOREX:EUR-USD. At most 100, further limited by the effective plan and key scope. A symbol names the listing recorded under it at symbol_at; at a date before any ticker is recorded for a listing, the earliest ticker recorded for it selects it as well (see symbol_at). Supply symbols or instrument_ids, except with date, where omitting both selects every entitled listing.
instrument_idsstringoptional · query- Comma-separated stable instrument IDs (the instrument_id of each row, and of the research endpoints) instead of symbols; each selects its listing at any date, including history from before its earliest recorded ticker and listings that no longer trade. Rows carry the symbol the listing had at symbol_at, or where it had none then, its symbol at as_of, else the last one it carried by as_of, else its first. At most 100. Cannot be combined with symbols.
symbol_atstringoptional · query- Resolve symbols as they were assigned at the end of this UTC date (YYYY-MM-DD); defaults to as_of. Only listings the security master holds resolve: it was built in September 2026 and records delistings from then on, so most issuers delisted earlier, such as TWTR or SIVB, resolve at no date. With date it defaults to that date when earlier, so listings carry the symbols they traded under that day. A ticker names the listing that carries it at symbol_at, and every row of a from/to range carries that symbol, rows from before the listing took the ticker included: a ticker reused after its earlier holder delisted returns the new holder's older rows, so set symbol_at inside the range to name the listing that traded under the ticker then. Tickers are recorded only where there is evidence for them (for many listings from 2003, though prices start earlier), and none is asserted earlier. As a lookup convenience, a date before a listing's earliest recorded ticker still finds the listing by that ticker when no record contradicts it (no listing is recorded under the ticker by that date, and the listing has no earlier ticker): its rows carry the symbol as a label and meta.unrecorded_symbols lists it. A date before the listing's first row returns 200 with no-data, as a to before it does. A ticker another listing held, or one the listing was renamed from or to, returns 404 naming the date and the listing; instrument_ids select a listing at any date.
as_ofstringoptional · query- Knowledge cutoff as a UTC date (YYYY-MM-DD): the response reflects what was known by the end of that day. Defaults to now; cannot be in the future. A date from before the dataset's knowledge history returns 422 point-in-time-unavailable naming the earliest one, which GET /v1/datasets lists as earliest_as_of.
adjustmentstringoptional · query- raw (default) serves prices and volume as traded. split restates bars before each later split to the current share basis: prices are multiplied by old over new shares, as the exact fraction, and rounded half up to 6 decimal places, and volume is multiplied by new over old shares and rounded half up to whole shares. total_return also multiplies prices by the dividend factors of later cash dividends, to the same 6 places. Adjusted bars carry adjustment and factor_set_version. Listings whose corporate actions are not collected (crypto and currency pairs, OTC) return 422 adjustment-unsupported for anything but raw, as do indices, whose levels already reflect their members' corporate actions, and bonds. Each mode needs its own validated factor set, else 503 adjustments-unavailable: split never waits on a dividend, while total_return is unavailable for a dividend it cannot value (one detaching on the day of a split, or not below that close) and, for rows before a dividend that just detached, until that close is in.
Default:rawsplittotal_returnraw datestringoptional · query- One exchange-local trading date (YYYY-MM-DD) instead of from and to: returns one bar per listing that traded that day, in symbol order. Without symbols or instrument_ids it covers every listing in the entitled markets. Raw prices only; cannot be combined with from, to or adjustment other than raw.
exchangesstringoptional · query- Comma-separated ISO MIC codes, at most 100, that limit a whole-market date query; requires date without symbols or instrument_ids. Defaults to all entitled exchanges. A malformed or repeated code returns 422 invalid-exchanges, a MIC the API does not serve 404 exchange-not-found, and one outside the key's markets 403 market-not-entitled.
fromstringoptional · query- First exchange-local trading date to include (YYYY-MM-DD).
tostringoptional · query- Last exchange-local trading date to include (YYYY-MM-DD); on or after from, so from equal to to selects one session.
orderstringoptional · query- Direction on date, or on the symbol in a date query, desc (default, newest first) or asc; a date query defaults to asc; ties keep their internal order in the same direction. The cursor is bound to it.
Default:ascdescdesc formatstringoptional · query- Response format. csv returns the data rows with a header row, for spreadsheet functions such as IMPORTDATA; nested fields become dotted columns and lists one JSON array cell, the next page cursor is returned in X-Next-Cursor and meta.errors in X-Meta-Errors. A result without rows is the header row alone, listing the documented fields of a row. Default json, or csv when format is omitted and the Accept header ranks text/csv above JSON; a format the Accept header does not admit returns 406 not-acceptable.
jsoncsv
Response fields
Returns data as an array of records. All example values are illustrative.
datestring- Exchange-local trading date.
security_idstring- Deprecated: the same stable public ID as instrument_id, which replaces it.Being superseded by instrument_id, which carries the same value. Read instrument_id where present; security_id remains for compatibility.
instrument_idstring- Stable public instrument ID, independent of ticker; the instrument_id of the research endpoints.
symbolstring- symbol
exchange_micstring- exchange mic
currency_codestring- currency code
openstring · null- Exact decimal string. Never a JSON floating point number.
highstring · null- Exact decimal string. Never a JSON floating point number.
lowstring · null- Exact decimal string. Never a JSON floating point number.
closestring · null- Exact decimal string. Never a JSON floating point number.
volumestring · null- Shares traded, always a whole number for exchange listings: a source that counts fractional-share executions is rounded half up to whole shares. A US daily bar carries the consolidated tape's volume (every print, fractional shares included) wherever the consolidated-tape source has the session and its open, high, low and close agree with the bar's, and the end-of-day provider's volume otherwise. For crypto pairs (the CRYPTO venue), a daily bar's volume is the value traded in the quote currency, US dollars, not coins; an intraday bar's is the number of coins traded, from the provider's separate intraday aggregation, so intraday volumes neither are dollars nor add up to the daily bar's. Null on any crypto bar whose price moved while the source reported no volume (the volume is unknown, not zero). Always null for currency pairs (the FOREX venue): the over-the-counter market reports no traded amount; for indices (the INDEX venue), whose level is not traded; and for bonds (the BOND venue), whose source reports no traded amount. Exact decimal string.
trade_countinteger · null- Number of trades in the bar; null when no source of the bar counts them, which is not missing data. Only the consolidated-tape source of daily bars counts trades: a daily bar carries its count, with its volume, where that source has the session and its prices agree with the bar's, which is from the 2026-10-02 session on for the US-listed symbols that source covers. Most daily bars before that session, every intraday bar, crypto and currency pairs, indices, mutual funds and OTC listings are null.
adjustmentstring- Present only for adjusted prices.
splittotal_return factor_set_versioninteger- Present only for adjusted prices.
Response metadata
Responses include meta.timezone. Dataset responses include next_cursor; health and exports have their own metadata. Request tracing uses the X-Request-ID header.
When something goes wrong
An empty data: [] is a successful query with no matching records. Invalid symbols, permissions and malformed parameters produce an RFC 9457 problem with an actionable detail.
Plans
Requires eod.read. Access, recency and history depth come from the plan definitions the API enforces.
| Plan | Access | Recency | History |
|---|---|---|---|
| Free | Included | End of day | 5 years |
| Developer | Included | End of day | 5 years |
| Pro | Included | End of day | 15 years |
| Commercial | Included | End of day | Full history |
| Scale | Included | End of day | Full history |
Free requests are limited to AAPL, NVDA, JNJ, PEP, MSFT, SPY, QQQ.
History is how far back a plan may request. How far records actually go for a symbol is history_from in dataset coverage. Nothing is real-time. Compare plans