API ReferenceOHLCV Candles
Live

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.

ViewIncludesUse it for
fullEvery trade — including flash swaps, arbitrage legs, wash, and bot activityTotal on-chain activity, volume that matches a block explorer
filteredOrganic trades only — flash/arb and wash/bot trades removedThe “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

FieldTypeDescription
bucket_start_msnumberInclusive bucket start, unix ms
bucket_end_msnumberExclusive bucket end, unix ms
opennumberTerminal-parity open (= previous candle’s close when available)
highnumberBucket high
lownumberBucket low
closenumberBucket close
volume_tokennumberToken-denominated volume
volume_basenumberQuote-denominated (SOL/USDC) volume
volume_usdnumberUSD-denominated volume
buy_volume_token / sell_volume_tokennumberVolume split by side, token-denominated
buy_volume_usd / sell_volume_usdnumberVolume split by side, USD-denominated
tradesnumberTrade count in the bucket
vwapnumberVolume-weighted average price
last_trade_ts_msnumberTime of the last contributing trade
num_buyers / num_sellersnumberApproximate 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

ParameterTypeDefaultDescription
timeframestring1m1s · 1m · 5m · 15m · 1h
viewstringfullfull or filtered
fromintegerRange start, unix ms
tointegerRange end, unix ms
limitinteger500Max 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.