The real-time WebSocket feed has had its biggest update since launch. Here is what is new, all of it live today:

  • European equities — roughly 9,400 symbols across 18 markets, trades and quotes from Cboe Europe on two new endpoints, with quotes consolidated across the BXE, CXE and DXE books
  • One-minute bars — OHLCV bars built for you, for both US and European equities, so you no longer have to aggregate the tick stream yourself
  • Trading status and halts — the venue’s own status for an individual instrument, on its own stream
  • REST backfill — a single request that returns the recent closed minute bars for a symbol, to fill the gap after a dropped connection
  • Documented data provenance — exactly which venue each feed comes from, and what that does and does not include. On the US side that is about 12,700 symbols in a normal session

If you already stream real-time data from us, nothing you have built changes. The connection flow, the subscribe message and the payload shapes are the same — there are simply more markets to subscribe to. The rest of this post covers each item, and closes with three details that save a support ticket.

European equities, straight from Cboe Europe

Two new endpoints carry European trades and quotes:

wss://ws.eodhistoricaldata.com/ws/eu?api_token=YOUR_API_KEY
wss://ws.eodhistoricaldata.com/ws/eu-quote?api_token=YOUR_API_KEY

They use exactly the same message schemas as the US streams. Only the symbol format differs: European instruments use the TICKER.EXCHANGE form you already use elsewhere in the API, so SHEL.LSE, SAP.XETRA and ASML.AS all work as written.

Coverage spans 18 European markets and, measured on a normal trading session, about 9,400 symbols — London, XETRA, the Euronext venues, the Nordic exchanges, Madrid, Milan, Vienna, Warsaw and more. Symbols that do not trade on a given day simply do not appear in that day’s stream, so the count over a longer window is slightly higher.

One detail is worth calling out, because it is a genuine difference from the US side. European quotes are a consolidated best bid and offer across the Cboe Europe books — BXE, CXE and DXE. The best price wins, and where two books show the same price their sizes are added, so the size you see is the depth available at that price across the venues we carry. The US quote stream is a single-venue top of book, which brings us to the next point.

What the US feed is, precisely

We would rather you learn this from us than from a reconciliation report. US trades and quotes come from Cboe EDGX, one of Cboe’s four US equity exchanges. That means:

  • Trades are executions that occurred on EDGX. This is not a consolidated SIP tape, so it does not include executions from other exchanges, or off-exchange and FINRA TRF prints.
  • Quotes are the EDGX top of book with sizes — not a national best bid and offer aggregated across venues.
  • Because there is no off-exchange activity in a single lit venue, the dark-pool flag is always false, and the trade-conditions array is always empty: the exchange top-of-book source does not carry per-trade sale conditions.

On a normal session the US stream carries about 12,700 symbols. None of the above makes the feed less useful — it makes it exchange-grade and predictable. But if you are comparing our prints against a consolidated tape, this is the reason the two will not match tick for tick.

Minute bars, without building them yourself

Aggregating a tick stream into one-minute bars is the first thing almost everyone writes after connecting, and the easiest place to get subtly wrong. Two new streams do it for you:

wss://ws.eodhistoricaldata.com/ws/us-candles?api_token=YOUR_API_KEY
wss://ws.eodhistoricaldata.com/ws/eu-candles?api_token=YOUR_API_KEY
{
"s": "AAPL",             // ticker
"i": "1m",               // bar interval
"t": 1787671260000,      // bar OPEN time, epoch ms UTC
"o": 309.25,             // open
"h": 309.26,             // high
"l": 309.19,             // low
"c": 309.19,             // close
"v": 1101                // volume in shares within the bar
}

Two things to know before you wire this up. The field c is the close price here, whereas on the trade streams c is the conditions array — same letter, different meaning. And the current bar is re-sent every time it changes, so the same timestamp will arrive repeatedly with a growing volume until the minute rolls over. Treat the newest message for a given timestamp as authoritative rather than adding them together.

Trading status and halts

A separate pair of streams reports the venue’s own status for an individual instrument, which is different from the market status field carried inside each trade. That field tells you which session the market is in; this stream tells you what is happening to one symbol.

wss://ws.eodhistoricaldata.com/ws/us-status?api_token=YOUR_API_KEY
wss://ws.eodhistoricaldata.com/ws/eu-status?api_token=YOUR_API_KEY

While an instrument is trading normally you will see the status T. Other codes are issued by the venue when an instrument is halted, paused or in an auction — so treat anything other than T as a signal to stop relying on the last price until it returns.

GET WP PLUGIN

Filling the gap after a reconnect

Sockets drop. When yours does, you no longer have to wait for the streams to rebuild before your charts are whole again:

GET https://ws.eodhistoricaldata.com/history?market=us&symbol=AAPL&api_token=YOUR_API_KEY

It returns the recent closed one-minute bars for a single symbol, oldest first, in the same shape as the minute-bar stream. The market parameter takes us or eu, and the symbol takes the same form you would subscribe with.

Note that only minutes in which the symbol actually traded produce a bar, so for a less active name the result is sparse rather than one bar per consecutive minute. An unknown market or symbol returns an empty array rather than an error, as do forex and crypto, which keep no bars.

Three things that save a support ticket

Error frames come in two shapes. An authentication failure uses the key status, and it arrives over the socket after a successful handshake — so the connection opening is not proof that your token was accepted. Every other frame uses status_code. If you write one parser keyed on status_code, an auth denial will reach your data callback looking like a tick.

Unrecognised symbols are ignored silently. There is no error for a symbol that is unknown or in the wrong format for the market — it simply never streams. If one symbol arrives and others stay quiet, check the format of the quiet ones first: US tickers are plain, European tickers carry the exchange suffix.

European dual-class tickers answer under their canonical name. Names like ERIC-B.ST work as written, and the un-hyphenated form is accepted too — but every message reports the canonical hyphenated ticker in the symbol field, whichever spelling you subscribed with. Key your state on what arrives, not on the string you sent.

You may also hold up to 64 concurrent connections per API token, shared across every market, which is plenty for a socket per stream and a comfortable margin for reconnects.

Availability

Real-time data is included in the paid EOD+Intraday and ALL-IN-ONE plans, and streaming does not consume your REST API call allowance. The full reference — every endpoint, all message schemas, the error table and the symbol formats — lives in the real-time WebSocket documentation.