GET /2/market/ohlcv-history and GET /2/token/ohlcv-history, so a single client can render both spot and perp charts. Market identifier is dex + market (perp has no pool address). Market mappings are cached server-side for 5 minutes.
Query Parameters
Upstream DEX to query. One of
gains, lighter.Human-readable pair in
BASE/QUOTE format (e.g., BTC/USD, ETH/USD, USD/JPY). Case-insensitive — internally uppercased.- Lighter: only USD-quoted perps (e.g.,
BTC/USD,SOL/USD,HYPE/USD). - Gains: crypto, forex, stocks, and commodities. Quote can be non-USD (e.g.,
USD/JPY,EUR/CHF).
Candle width. One of
1m, 5m, 15m, 30m, 1h, 4h, 1d, 1w.Range start (inclusive). UNIX seconds, UNIX milliseconds, or ISO date string.
Range end (inclusive). Same unit handling as
from. Must be greater than from.Max number of candles to return (capped at 2000). When the range yields more candles than
amount, only the most recent amount are returned.Response
OHLC candles sorted ascending by
t. Duplicate timestamps and rows with h < l or non-finite values are dropped.Examples
LighterBTC/USD, 1-minute candles for the last hour:
USD/JPY, 5-minute candles, last 200 candles only:
Errors
| Status | When | message |
|---|---|---|
| 400 | Zod validation failed (invalid dex, malformed market) | zod validation failed |
| 400 | from >= to | from must be < to |
| 400 | period not in supported set | unsupported period "<period>" |
| 404 | Market not found for the selected DEX (errors[0] lists example pairs) | unknown market "<market>" for dex "<dex>" |
| 502 | Upstream DEX returned an error (timeout, non-200, or code !== 200 for Lighter) | upstream <dex> error |
| 500 | Unexpected internal error | internal server error |
Notes
- Candle shape matches spot OHLCV endpoints (
{t, o, h, l, c}). Perp has novfield — volume is not reported by the upstream DEXes. - Empty result sets are not errors —
data: []with HTTP 200 is returned when the upstream has no data for the range. - Market mappings (Gains pairs, Lighter
orderBookDetails) are fetched lazily on first request per process and cached for 5 minutes. - Upstream requests have a 10s timeout.
- Each request is traced server-side with a short
traceIdincluded in every log line for that request.