Contents Lesson 16 of 16

7 min read · practitioner

Price and trading data — course checkpoint

You started this course able to request a price. You finish able to say which price it is, when it was true, what has been done to it, and what it leaves out.

Unit 1 — daily bars

/eod/{ticker} returns seven fields: date, open, high, low, close, adjusted_close, volume. The four prices are real trades at four unrecorded moments, not averages.

The central fact of this course: open, high, low and close are raw; adjusted_close carries both splits and dividends. Apple on 28 August 2020 closed at 499.23 raw and, on a pull made 2026-07-28, 121.06 adjusted. Split-only would be 499.23 ÷ 4 = 124.8075 — the one figure here that never moves. The remaining 3.00% gap is dividends: isolate the factor from the first post-split day, 125.1654 ÷ 129.04 = 0.969974, and 124.8075 × 0.969974 = 121.0600, the reported number exactly. Because a new dividend re-applies the factor, adjusted history changes at every ex-date — quarterly for Apple, on the issuer's own schedule elsewhere — which is why every adjusted number in this course is dated and the raw ones are not. volume is adjusted as well, against the intuition that a share count must be sacred: 187,630,000 on 28 August against 225,702,700 on 31 August is a step of 1.20, not the price's 3.87, because both are already in post-split shares. Read raw, the 2013 rows would have Apple trading forty per cent of itself in a session; every pre-split row divides by its cumulative split factor exactly.

period takes d, w, m and aggregates with five different operations — open is first, close is last, high is max, low is min, volume is sum — stamped with the first trading day of the period, which is why a holiday week is labelled Tuesday. Aggregation does not fix units: Apple's August 2020 monthly bar has high 515.14 and low 126.00, straddling the split.

from/to are dates on /eod and UNIX seconds on /intraday and /ticks. filter collapses the whole response to a bare number — 499.23, not an object.

Unit 2 — inside the day

/intraday/{ticker} requires interval, whose enum is 1m, 5m, 15m, 30m, 1h — all five. Timestamps mark the bar's start, datetime is UTC with gmtoffset: 0, and a missing minute means no trades, not missing data: 359 bars in a 361-minute Apple window, both gaps deep in pre-market.

Intervals are not zoom levels. The 13:30 five-minute bar reported volume 2,985,899 against 1,778,212 for the five one-minute bars covering the identical window — different feeds, so never mix them.

Intraday has no adjusted_close. NVIDIA's 7 June 2024 hourly bars still close near 1,208.65 while the daily adjusted_close for that session was 120.6792 on 2026-07-28. The coefficient adjusted_close ÷ close = 0.099827 on that pull is how you reconcile them, per date, recomputed as dividends accrue.

Under the bars, /ticks returns seven parallel arrays — the spec documents an eighth, ex, that never arrives — with from/to in seconds and ts in milliseconds, US equities only. Forty Apple prints spanned 273 milliseconds; the first was 333.39, while the bar's open was 333.505, eight trades later, because tape rules decide which prints are eligible. OHLC is emphatically not first, max, min, last.

Unit 3 — right now, approximately

Delayed means licensed, not slow. In one response, AAPL.US and SPY.US were stamped exactly 900 seconds before EURUSD.FOREX and BTC-USD.CC. On a quote object, close is the last traded price, previousClose is the real close, and change_p is already a percentage — 339.89 − 336.91 = 2.98, and 2.98 ÷ 336.91 = 0.008845, which change_p reports as 0.8845. FX volume of 0 is market structure, not a gap.

Batch with s on /real-time — but the response is an object for one symbol and an array for many. /us-quote-delayed is a different object again: a {meta, data, links} envelope whose data is keyed by symbol, with its own names (lastTradePrice, previousClosePrice, changePercent) and the only bid and ask in the course. Keep batches to roughly fifteen or twenty.

Streaming lives outside the REST spec at wss://ws.eodhistoricaldata.com/ws/{market} and sends prices as strings — five BTC messages in 424 milliseconds for one symbol. A connected but silent socket during an open session is an entitlement result, not a bug.

And before you call anything stale, check /exchange-details: US at 09:30–16:00 local, 13:30–20:00 UTC in summer only, with both 3 and 4 July closed in 2026 and early closes at 13:00 on 27 November and 24 December.

Unit 4 — whole markets at once

/eod is one symbol, many days. /eod-bulk-last-day/{exchange} is one day, many symbols — some fifty thousand US tickers in one call instead of fifty thousand calls — with type switching between three different row schemas. Ask for a past date and you get the instruments trading then, which is why bulk archives are survivorship-free.

.US is four MICs behind one code, while Germany has seven codes for one country. Virtual exchanges (FOREX, CC, GBOND, MONEY, EUFUND) name an asset class rather than a venue — only GBOND, MONEY and EUFUND carry a null MIC, while FOREX reads CDSL and CC reads CRYP — and INDX is absent from /exchanges-list entirely, though it serves some 1,670 index symbols.

Vienna returned 88 active tickers and 50 delisted ones on 2026-07-28, and the two sets are disjoint — delisted=1 replaces rather than includes. The union is the real universe, and the counts drift while that relationship does not. AT0000A21KS2 appears as both active CPI and delisted IIA: one company, two codes, one ISIN.

The three sentences worth keeping

  1. Every price field is raw unless its name says otherwise. One column in one endpoint is adjusted, and it is recomputed behind your back.
  2. A timestamp is a claim you should check, not a decoration. Delay, market hours, daylight saving and entitlement all live in that one field.
  3. The default response is the surviving subset. Today's tickers, the last trading day, the active list — every default hides the part of the record that ended, and each has a parameter that reveals it.

Before you sit it

Each of these is a minute at your desk. Any one that is not names the lesson to reopen first.

Try it now

  1. Rebuild the Apple adjustment from scratch from the six sessions below: derive the dividend factor from the first post-split session, and apply it to the split-adjusted pre-split close. You will not land on 121.06 — you will land on whatever adjusted_close reads today, and the reconstruction will close exactly. Write down both numbers and the date; the gap between them is every dividend since this lesson was written.
Live API response: mda1 apple split week closes
  1. Here is one instrument, Apple, four ways: a daily week, an hour of 5-minute bars, a delayed quote, and a slice of one minute of ticks. Write one sentence per source on what it can answer that the others cannot.
Live API response: mda1 apple suffixed week
Live API response: mda1 apple five minute hour
Live API response: apple delayed quote
Live API response: mda1 apple ticks one minute
  1. Vienna, measured on 28 September 2026: the active and delisted symbol lists together held 140 codes. A bulk snapshot for 28 September 2023, three years earlier, held 84 rows: 80 of their codes were in the active list, 4 in the delisted list, and none in neither. Say what a study of 2023 built from the active list alone would have lost, and what "none in neither" tells you about how complete the union is.

Checkpoint quiz next, then Course 3, which moves from what an instrument's price did to what the company behind it reported. Nothing in this course recommends an instrument, a strategy or an action; it describes how price data is produced, transported and mislabelled, so that whatever you build on it is built on something you can defend.