OHLCV Candles
Candlesticks are aggregated continuously from the trade tape — not from a third-party feed — at five timeframes and in two views. Open is snapped to the previous candle’s close for terminal-parity rendering.
Timeframes: 1s · 1m · 5m · 15m · 1h
Full vs. Filtered
Every timeframe is computed twice, from the same trades, with one difference: whether non-organic trades are included.
| View | Includes | Use it for |
|---|---|---|
full | Every trade — including flash swaps, arbitrage legs, wash, and bot activity | Total on-chain activity, volume that matches a block explorer |
filtered | Organic trades only — flash/arb and wash/bot trades removed | The “real” price and volume filtering out bots and MEV |
The filter is applied per trade at ingest (the same organic/non-organic flag carried on Chart Ticks as f). filtered is the right default for charting and price discovery; full is the right default for accounting for all flow on the token.
The candle object
| Field | Type | Description |
|---|---|---|
bucket_start_ms | number | Inclusive bucket start, unix ms |
bucket_end_ms | number | Exclusive bucket end, unix ms |
open | number | Terminal-parity open (= previous candle’s close when available) |
high | number | Bucket high |
low | number | Bucket low |
close | number | Bucket close |
volume_token | number | Token-denominated volume |
volume_base | number | Quote-denominated (SOL/USDC) volume |
volume_usd | number | USD-denominated volume |
buy_volume_token / sell_volume_token | number | Volume split by side, token-denominated |
buy_volume_usd / sell_volume_usd | number | Volume split by side, USD-denominated |
trades | number | Trade count in the bucket |
vwap | number | Volume-weighted average price |
last_trade_ts_ms | number | Time of the last contributing trade |
num_buyers / num_sellers | number | Approximate distinct buyers / sellers (HyperLogLog) |
Field coverage differs slightly by transport: the REST response carries volume_base and per-candle unique num_buyers / num_sellers (HLL), and uses a single bucket timestamp; the stream carries the USD buy/sell split, is_final, and explicit bucket_start_ms / bucket_end_ms.
Terminal-parity: open is set to the previous candle’s close (and high/low widened to include it), so candles join seamlessly with no visual gaps — the same convention trading terminals use. If you need the literal first trade price of a bucket, read it from the first tick in that window.
REST — historical candles
L1 GET /v1/token/{mint}/ohlcv
| Parameter | Type | Default | Description |
|---|---|---|---|
timeframe | string | 1m | 1s · 1m · 5m · 15m · 1h |
view | string | full | full or filtered |
from | integer | — | Range start, unix ms |
to | integer | — | Range end, unix ms |
limit | integer | 500 | Max candles (max 2000) |
curl -H "Authorization: Bearer $API_KEY" \
"https://api.conyr.ai/v1/token/EPjFWd.../ohlcv?timeframe=5m&view=filtered&limit=200"{
"candles": [
{
"bucket": 1709654400000,
"open": 0.00231, "high": 0.00242, "low": 0.00229, "close": 0.00238,
"volume_token": 184203.5, "volume_usd": 4210.88,
"buy_volume": 102400.0, "sell_volume": 81803.5,
"trades": 142, "vwap": 0.00236
}
]
}Stream — live candles
L1 Channel token:{mint}:ohlcv:{view}:{tf}
The in-progress candle updates as trades land; is_final flips to true once the bucket closes. Pick the view and timeframe in the channel name.
// filtered 1-minute candles
ws.send(JSON.stringify({
op: "subscribe",
channels: ["token:EPjFWd...:ohlcv:filtered:1m"],
}));Backfill with the REST endpoint, then subscribe to the matching view + timeframe to keep the latest candle live — see the REST + Streaming Model.