client.market_data reads and streams public spot OHLCV data. No authentication is required.
There is no client.candles alias; use market_data.
The service calls this value interval in convenience methods and timeframe in GetCandlesOpts; they represent the same candle duration. Supported aliases are 1s, 1m, 5m, 15m, 30m, 1h, 4h, 12h, 1d, 1w, and 1mo. Forms such as min1 and MIN_1 are also accepted.
GetCandlesOpts.include_reference requests composite reference candles. Their OHLC uses reference_price_scale; primary OHLC uses the fixed price scale 9.
OHLCV fields are decimal strings. Candle times are epoch seconds (ts_sec).
Row results are ordered newest-first. When requested, the open/incomplete candle is prepended
at index 0; never use .last() as the latest candle. Reverse or sort row results by ts_sec before feeding them to chronological indicators. The columns API is oldest-first.
Methods
get_candles: Fetch candles (symbol,interval,limit).get_candles_with: Full options (GetCandlesOpts).get_candles_columns: Columnar wire form decoded to rows.get_current_candle: Latest candle asOption<Candle>(Nonewhen no rows exist).subscribe_candles: Stream live row candles (recv_result()).
Get candles
use polyester::models::GetCandlesOpts;
let result = client
.market_data
.get_candles("BTC-USDT", "1h", Some(200))
.await?;
if let Some(latest) = result.candles.first() {
println!("{} {} {}", latest.ts_sec, latest.close, latest.volume);
}
let mut chronological = result.candles.clone();
chronological.reverse();
// Feed chronological (oldest-first) to rolling indicators.
let ranged = client
.market_data
.get_candles_with(GetCandlesOpts {
symbol: Some("BTC-USDT".into()),
timeframe: "1h".into(),
limit: Some(200),
include_incomplete: false,
..Default::default()
})
.await?;Get candle columns
Same GetCandlesOpts; columnar response decoded into CandlesResult rows.
The SDK verifies that every OHLCV column has exactly one value per timestamp and returns Error::Transport if the response is misaligned.
Get current candle
let candle: Option<_> = client.market_data.get_current_candle("BTC-USDT", "1m").await?;Subscribe candles
Requires hydrated catalogs so symbol resolves to an id.
client.wait_for_catalogs().await?;
let mut sub = client.market_data.subscribe_candles("BTC-USDT", "1m").await?;
while let Some(candle) = sub.recv_result().await? {
println!("{} {} {}", candle.ts_sec, candle.timeframe, candle.close);
break;
}Candle does not expose an is_closed field. Treat streamed candles as updates for their ts_sec and timeframe bucket; a later update for the same bucket supersedes the earlier value.