vike
API EndpointsHyperliquid

/ohlcv

Hyperliquid candles, derived from executed fills.

GET https://data.vike.io/v1/hyperliquid/ohlcv

Hyperliquid candles, derived from executed fills.

cURL
# the last three hourly BTC perp candles
curl -s "https://data.vike.io/v1/hyperliquid/ohlcv?symbol=BTC&interval=1h&limit=3" \
  -H "X-API-KEY: $VIKE_API_KEY"

# a day of 15-minute bars: with no start, the window reaches back limit bars from now
curl -s "https://data.vike.io/v1/hyperliquid/ohlcv?symbol=BTC&interval=15m&limit=96" \
  -H "X-API-KEY: $VIKE_API_KEY"

# a pinned month for a backtest: 744 hourly bars (end is exclusive)
curl -s "https://data.vike.io/v1/hyperliquid/ohlcv?symbol=BTC&interval=1h&start=2026-07-01T00:00:00Z&end=2026-08-01T00:00:00Z&limit=744" \
  -H "X-API-KEY: $VIKE_API_KEY"

# a spot token by name
curl -s "https://data.vike.io/v1/hyperliquid/ohlcv?symbol=HYPE&market=spot&interval=1h&limit=168" \
  -H "X-API-KEY: $VIKE_API_KEY"

# a HIP-3 builder-DEX market: the dex-prefixed symbol, and its dex
curl -s "https://data.vike.io/v1/hyperliquid/ohlcv?symbol=xyz:PLATINUM&dex=XYZ&interval=1h&limit=168" \
  -H "X-API-KEY: $VIKE_API_KEY"

# 100-trade bars are built from raw fills. With no start the window is the 24 hours before end and limit
# keeps the OLDEST bars, so name the slice you want: here the last hour of a pinned day
curl -s "https://data.vike.io/v1/hyperliquid/ohlcv?symbol=BTC&interval=100t&start=2026-08-17T23:00:00Z&end=2026-08-18T00:00:00Z&limit=500" \
  -H "X-API-KEY: $VIKE_API_KEY"

# past one page there is no cursor: save the first page, then restart one bar after its last candle
curl -s "https://data.vike.io/v1/hyperliquid/ohlcv?symbol=BTC&interval=1m&start=2026-08-17T00:00:00Z&limit=5000" \
  -H "X-API-KEY: $VIKE_API_KEY" \
  -o page1.json

# page 2 starts one minute after page 1's last candle: start accepts epoch milliseconds
START=$(( $(jq '.candles[-1].ts' page1.json) + 60000 ))
curl -s "https://data.vike.io/v1/hyperliquid/ohlcv?symbol=BTC&interval=1m&start=$START&limit=5000" \
  -H "X-API-KEY: $VIKE_API_KEY" \
  -o page2.json
symbolqueryrequired
Perp ticker (BTC), spot token (HYPE) or raw index (@107)
intervalqueryoptional
1m | 5m | 15m | 30m | 1h | 4h | 1d, or Nt for N-trade bars. Default 1h
marketqueryoptional
perp | spot. Default perp
dexqueryoptional
HL core or a HIP-3 perp DEX, e.g. XYZ. Default HL. Builder DEXs are added over time, so do not hard-code a list
startqueryoptional
ISO-8601 UTC or epoch ms, inclusive
endqueryoptional
ISO-8601 UTC or epoch ms, exclusive
limitqueryoptional
Default 500, clamped to 5000
Example response
{
  "symbol": "BTC",
  "asset": "BTC",
  "market": "perp",
  "dex": "HL",
  "interval": "1h",
  "tz": "UTC",
  "source": "1h fills rollup",
  "candles": [
    {
      "ts": 1788415200000,
      "open": 77800.0,
      "high": 77839.0,
      "low": 77679.0,
      "close": 77822.0,
      "volume": 742.5236199999999,
      "volume_usd": 57737530.938200004,
      "n_trades": 11927
    },
    {
      "ts": 1788418800000,
      "open": 77823.0,
      "high": 78177.0,
      "low": 77569.0,
      "close": 77635.0,
      "volume": 2354.81572,
      "volume_usd": 183533988.69679,
      "n_trades": 23209
    },
    {
      "ts": 1788422400000,
      "open": 77636.0,
      "high": 78019.0,
      "low": 77636.0,
      "close": 77993.0,
      "volume": 398.0436600000001,
      "volume_usd": 31002407.180790003,
      "n_trades": 3884
    }
  ]
}

There is no cursor. The engine returns one page clamped to 5000 bars; page by moving start/end yourself.

Do not hard-code the dex list

The accepted dex set is not fixed. A list such as HL | XYZ | PARA | MKTS | HYNA is a partial one: builder DEXs are deployed permissionlessly, so the accepted set is refreshed from the live deployments (within 10 minutes) rather than fixed. An earlier three-hour sample saw only five of the nine DEXs a static list would have carried — which is exactly how a hard-coded list 400s a venue that is live and trading. An unknown dex returns a 400 naming the known set; ask for one and read the answer.

An unsupported interval is a 400, never a default

A bad interval is refused rather than replaced with a default. Tick bars (Nt, 1 to 100,000 trades) and time bars are not interchangeable downstream: time bars come from the pre-aggregated minute/hour rollups, tick bars have to walk the raw fill history, which is retained 12 months where the rollups are not. The response's source field names which of the two answered, so a series that stopped early is distinguishable from an asset that stopped trading.

This is the API's crypto candle surface — Hyperliquid's own bars, off the fills our node sees. /ohlcv/export streams the same single page as NDJSON.

cURL
# the last three hourly BTC perp candlescurl -s "https://data.vike.io/v1/hyperliquid/ohlcv?symbol=BTC&interval=1h&limit=3" \  -H "X-API-KEY: $VIKE_API_KEY"# a day of 15-minute bars: with no start, the window reaches back limit bars from nowcurl -s "https://data.vike.io/v1/hyperliquid/ohlcv?symbol=BTC&interval=15m&limit=96" \  -H "X-API-KEY: $VIKE_API_KEY"# a pinned month for a backtest: 744 hourly bars (end is exclusive)curl -s "https://data.vike.io/v1/hyperliquid/ohlcv?symbol=BTC&interval=1h&start=2026-07-01T00:00:00Z&end=2026-08-01T00:00:00Z&limit=744" \  -H "X-API-KEY: $VIKE_API_KEY"# a spot token by namecurl -s "https://data.vike.io/v1/hyperliquid/ohlcv?symbol=HYPE&market=spot&interval=1h&limit=168" \  -H "X-API-KEY: $VIKE_API_KEY"# a HIP-3 builder-DEX market: the dex-prefixed symbol, and its dexcurl -s "https://data.vike.io/v1/hyperliquid/ohlcv?symbol=xyz:PLATINUM&dex=XYZ&interval=1h&limit=168" \  -H "X-API-KEY: $VIKE_API_KEY"# 100-trade bars are built from raw fills. With no start the window is the 24 hours before end and limit# keeps the OLDEST bars, so name the slice you want: here the last hour of a pinned daycurl -s "https://data.vike.io/v1/hyperliquid/ohlcv?symbol=BTC&interval=100t&start=2026-08-17T23:00:00Z&end=2026-08-18T00:00:00Z&limit=500" \  -H "X-API-KEY: $VIKE_API_KEY"# past one page there is no cursor: save the first page, then restart one bar after its last candlecurl -s "https://data.vike.io/v1/hyperliquid/ohlcv?symbol=BTC&interval=1m&start=2026-08-17T00:00:00Z&limit=5000" \  -H "X-API-KEY: $VIKE_API_KEY" \  -o page1.json# page 2 starts one minute after page 1's last candle: start accepts epoch millisecondsSTART=$(( $(jq '.candles[-1].ts' page1.json) + 60000 ))curl -s "https://data.vike.io/v1/hyperliquid/ohlcv?symbol=BTC&interval=1m&start=$START&limit=5000" \  -H "X-API-KEY: $VIKE_API_KEY" \  -o page2.json
Example response
{  "symbol": "BTC",  "asset": "BTC",  "market": "perp",  "dex": "HL",  "interval": "1h",  "tz": "UTC",  "source": "1h fills rollup",  "candles": [    {      "ts": 1788415200000,      "open": 77800.0,      "high": 77839.0,      "low": 77679.0,      "close": 77822.0,      "volume": 742.5236199999999,      "volume_usd": 57737530.938200004,      "n_trades": 11927    },    {      "ts": 1788418800000,      "open": 77823.0,      "high": 78177.0,      "low": 77569.0,      "close": 77635.0,      "volume": 2354.81572,      "volume_usd": 183533988.69679,      "n_trades": 23209    },    {      "ts": 1788422400000,      "open": 77636.0,      "high": 78019.0,      "low": 77636.0,      "close": 77993.0,      "volume": 398.0436600000001,      "volume_usd": 31002407.180790003,      "n_trades": 3884    }  ]}