Streaming by API
| API | Transport | Max streams or subscriptions | Heartbeat | Source | Checked |
|---|---|---|---|---|---|
| OANDA | HTTP streaming: one long lived HTTP connection to the stream host (stream-fxtrade or stream-fxpractice), sending newline delimited JSON price and heartbeat lines. | 20 active streams per IP address; no more than 2 new connections a second; at most 4 prices a second per instrument | Every 5 seconds on pricing and transaction streams | developer.oanda.com Transport and heartbeat: developer.oanda.com | 18 Sep 2026 |
| IG | Streaming connections | 40 concurrent streaming subscriptions per streaming connection. IG warns that opening extra connections to get past that risks having your API permissions revoked | Not stated on the IG streaming guide or the Labs FAQ we opened | labs.ig.com | 19 Sep 2026 |
| Capital.com | WebSocket (wss://api-streaming-capital.backend-capital.com/connect) | Maximum of 40 instruments | Ping at least every 10 minutes | open-api.capital.com | 18 Sep 2026 |
| Saxo OpenAPI | WebSocket, separate SIM and live hosts | Withdrawn on 20 Sep 2026. Saxo used to publish 4 streaming connections per user and a 200 instrument cap on price subscriptions. The streaming pages opened that day say only that the number of WebSocket connections depends on the throttling profile assigned to the application, so both figures are unverified | Control messages carry the reference id _heartbeat for keepalive. The interval in seconds is not stated on the streaming pages we opened. | openapi.help.saxo Heartbeat: developer.saxo | 19 Sep 2026 |
| Interactive Brokers | Web API: WebSocket. TWS API: event driven socket | Web API: capped by the account's market data lines, 100 per user by default, and 5 concurrent historical requests; top of book updates every 500ms and an smd stream ends after 15 minutes unless re-requested. TWS API: up to 32 simultaneous connections, each with its own client id | Websocket: an ech+hb echo heartbeat, which IBKR recommends every 10 seconds. REST session: POST /tickle about every 60 seconds | interactivebrokers.com Heartbeat and tickle: interactivebrokers.com | 18 Sep 2026 |
| eToro | WebSocket topics such as instrument:<id> and candle:<id>; authenticate for private updates | None published. The WebSocket overview page states no connection or subscription limit; the REST limits beside it are 60 requests a minute for reads and 20 for trading, per user key | None documented. No heartbeat, reconnection or replay behaviour appears on any eToro page we could open, so treat a silent socket as dead and re-snapshot | api-portal.etoro.com Rate limits: api-portal.etoro.com | 19 Sep 2026 |
| cTrader Open API | TCP or WebSocket on ports 5035 (Protobuf) and 5036 (JSON); spots and depth subscriptions | 50 requests a second per connection; 5 a second for historical data | A ProtoHeartbeatEvent (payloadType 51) at least every 10 seconds; drop it and the server drops the connection | help.ctrader.com Limits: help.ctrader.com | 18 Sep 2026 |
| TradeLocker API | Socket.IO Streams API for account, position and order updates | Not published | Not stated on the Streams API page we opened | api-dev.tradelocker.com | 18 Sep 2026 |
| Match-Trader Platform API | WebSocket with STOMP | Not published | Not stated on the platform API page we opened | match-trader.com | 18 Sep 2026 |
| DXtrade APIs | Push API over WebSockets | Not published | Not stated on the page we opened | devexperts.com | 18 Sep 2026 |
| FOREX.com / StoneX Trading (City Index) | Streaming host push.cityindex.com (vendor unconfirmed) | Not published | Not stated on the page we opened | docs.labs.gaincapital.com | 18 Sep 2026 |
| FXCM | ForexConnect price streams; legacy REST over a socket.io connection | Not published | Not stated on the page we opened | fxcm-rest.readthedocs.io | 18 Sep 2026 |
| MetaTrader 5 (Python package and MQL5) | No push API in Python: poll ticks and bars | Not stated | Not applicable | mql5.com | 18 Sep 2026 |
| MetaTrader 4 (MQL4) | In-terminal events only; no external streaming API | Not applicable | Not applicable | docs.mql4.com | 18 Sep 2026 |
Each row comes from the linked page, opened on the date shown. Not published means we found no figure on the pages we opened. Full comparison table.
Deeper references: Streaming limits for every API in the compare table, IBKR Web API websocket topics, cTrader Open API subscribe messages and payloadType numbers
What to do with these numbers
- Treat a missing heartbeat as a dead connection and reconnect, rather than waiting for data that will not arrive.
- Stay under the subscription cap: IG and Capital.com both stop at 40, Saxo's old 200 instruments across 4 connections, withdrawn on 20 Sep 2026 and now unverified, and IBKR at the account's market data lines, 100 by default.
- OANDA counts streams per IP address, so several bots on one server share the 20.
- Three heartbeats, three intervals: cTrader every 10 seconds, IBKR every 10 seconds on the socket and 60 on the REST session, Capital.com every 10 minutes. A cell that says not stated means we found no figure on the page we opened, not that there is none.