cTrader APIMarket data
For AI agents: this page is also available as Markdown at /docs/ctrader/market-data.md. The index of every docs page is /docs/llms.txt.
cTrader Market Data API
Pull cTrader market data over REST: the broker's symbol list, latest quotes, full contract specifications with commission and trading sessions, and OHLC price history for any of the nine timeframes. For a continuous price feed, use the WebSocket prices stream instead of polling.
How market data works on cTrader
- No Market Watch. Every symbol is available at once; /SymbolSelect only checks names and prices, so code written for MetaTrader still works.
- Bid bars, tick volume. Bars are built from bid prices with tickVolume as the volume; spread and realVolume are 0.
- The forming bar included. /PriceHistory ends with the bar still forming, like MetaTrader's history, so the second-to-last bar is the last closed one.
- Same nine timeframes. M1, M5, M15, M30, H1, H4, D1, W1 and MN1, as on MT4 and MT5.
- Commission and sessions. /SymbolInfo includes the symbol's commission rule and its trading sessions in UTC, as MT5 reports them.
/ctrader/{account_id}/symbolsNames of every symbol the account can trade, exactly as the broker names them in cTrader. Use the returned names verbatim with /getQuote, /SymbolInfo, /PriceHistory, and /OrderSend. cTrader has no Market Watch: every symbol is available at once, and a first quote for one arrives within moments of asking.
curl -H "X-API-Key: fxs_live_..." \
https://api.fxsocket.com/ctrader/{account_id}/symbols["EURUSD", "GBPUSD", "USDJPY", "XAUUSD", "US 500", "..."]
/ctrader/{account_id}/getQuoteLatest bid and ask for a symbol and when they changed. The first call for a symbol subscribes the bridge to it, which can take a moment; after that the price is the live one. last and volume are 0. For continuous prices use the WebSocket prices topic instead.
symbol(required): Symbol name as listed by /symbols (e.g. EURUSD, XAUUSD).
curl -H "X-API-Key: fxs_live_..." \
"https://api.fxsocket.com/ctrader/{account_id}/getQuote?symbol=EURUSD"{
"symbol": "EURUSD",
"bid": 1.11659,
"ask": 1.11662,
"time": "2026-11-10T23:01:03.242Z",
"last": 0.0,
"volume": 0
}/ctrader/{account_id}/PriceHistoryOHLC bars for a symbol and timeframe, the one still forming included. Bars are built from cTrader's bid prices, so spread and realVolume are 0, and tickVolume counts the ticks in the bar. The bridge keeps closed bars, so asking for the same history again comes back fast; the first request for a wide range on a small timeframe can take several seconds. An empty response is normal for a window before the broker's history or one when the market was closed.
symbol(required): Symbol name as listed by /symbols.timeframe(required): M1, M5, M15, M30, H1, H4, D1, W1, MN1, or human forms (5min, 1h, 1d).from: Inclusive lower bound (UTC). ISO-8601 or YYYY-MM-DD. Absent → epoch.to: Inclusive upper bound, same formats. Absent → now.
curl -H "X-API-Key: fxs_live_..." \
"https://api.fxsocket.com/ctrader/{account_id}/PriceHistory?symbol=EURUSD&timeframe=H1&from=2026-01-01&to=2026-12-31"[{
"time": "2026-11-10T19:00:00.000Z",
"open": 1.11631,
"high": 1.11673,
"low": 1.11626,
"close": 1.11655,
"tickVolume": 2588,
"realVolume": 0,
"spread": 0
}]/ctrader/{account_id}/SymbolInfoContract specification for a symbol: digits, point, spread, contract size, tick size and value (tickValue is in the account currency), volume min/max/step, trade mode, swap rates, base, quote and margin currencies, what the broker accepts for it (orderModes: market, limit, stop, sl, tp; expirationModes: gtc, specified; fillingModes is empty), the commission rule, and the trading sessions in UTC. Call this before /OrderSend to validate volumes and round prices to the right precision. Pass symbols instead of symbol to look up to 100 at once: the reply is then {"symbols": [...], "errors": [...]}, and a symbol that fails lands in errors with its own symbol, error code and message instead of failing the whole request.
symbol: Symbol name as listed by /symbols. Required unless symbols is given.symbols: Comma-separated list of up to 100 symbols, instead of symbol.
curl -H "X-API-Key: fxs_live_..." \
"https://api.fxsocket.com/ctrader/{account_id}/SymbolInfo?symbol=EURUSD"{
"symbol": "EURUSD",
"description": "Euro vs US Dollar",
"digits": 5,
"point": 0.00001,
"tickSize": 0.00001,
"tickValue": 0.89556783,
"contractSize": 100000.0,
"volumeMin": 0.01,
"volumeMax": 100.0,
"volumeStep": 0.01,
"stopsLevel": 0,
"freezeLevel": 0,
"spread": 3,
"tradeMode": "Full",
"swapLong": -2.445,
"swapShort": -0.105,
"bid": 1.11659,
"ask": 1.11662,
"currencyBase": "EUR",
"currencyProfit": "USD",
"currencyMargin": "EUR",
"orderModes": ["market", "limit", "stop", "sl", "tp"],
"expirationModes": ["gtc", "specified"],
"fillingModes": [],
"commissions": [{ "currency": "USD", "entryMode": "SYMBOL_COMMISSION_ENTRY_INOUT", "tiers": [{ "volumeType": "SYMBOL_COMMISSION_VOLUME_TYPE_TURNOVER", "value": 45.0, ... }], ... }],
"sessions": [{ "day": "SUNDAY", "from": "22:00", "to": "24:00" }, { "day": "MONDAY", "from": "00:00", "to": "21:29" }, ...]
}/ctrader/{account_id}/SymbolSelectCheck up to 100 symbols before trading them. MetaTrader needs this to add symbols to Market Watch; cTrader has none, so nothing is added, but the reply is the same: selected false means the broker has no symbol by that name, quoting false that it had no price within a second. Copiers can send the same call to every platform. A read-only key gets a 403 here.
symbols(required): Array of up to 100 symbol names as listed by /symbols.
{
"symbols": ["EURUSD", "GBPUSD", "XAUUSD"]
}curl -X POST https://api.fxsocket.com/ctrader/{account_id}/SymbolSelect \
-H "X-API-Key: fxs_live_..." \
-H "Content-Type: application/json" \
-d '{"symbols":["EURUSD","GBPUSD","XAUUSD"]}'[
{ "symbol": "EURUSD", "selected": true, "quoting": true },
{ "symbol": "GBPUSD", "selected": true, "quoting": true },
{ "symbol": "XAUUSD", "selected": true, "quoting": true }
]/ctrader/{account_id}/ServerTimezoneServer time and its offset from UTC. On cTrader every time in the API is real UTC, so utcOffsetSeconds is always 0 and the Utc twins of time fields carry the same value. The route exists so code written for MetaTrader, whose brokers mostly run on UTC+2 or UTC+3, works unchanged.
curl -H "X-API-Key: fxs_live_..." \
https://api.fxsocket.com/ctrader/{account_id}/ServerTimezone{
"serverTime": "2026-11-10T23:01:07.244Z",
"utcOffsetSeconds": 0
}