On this page
Hyperliquid Markets
The /v1/markets/hyperliquid/* namespace covers customer-facing,
normalized market data over the Hyperliquid perpetual universe. Each
endpoint maps onto an HL Info call but reshapes the response into the
Artery wire format — typed columns, consistent error envelope, server-side
caching.
If you need the raw HL payload verbatim (e.g. for a strategy that's
hard-coded against HL fields), use the /v1/hyperliquid/info/* passthrough
family instead — same auth, no schema translation.
HL perpetuals are all USD-quoted — each coin (BTC, ETH, SOL, …) is
one perpetual contract. There's no BTC/ETH pair on HL perp. The coin
identifier therefore plays the role of a symbol on cex platforms.
Endpoint summary
| Method | Path | Cache | Purpose |
|---|---|---|---|
| GET | /v1/markets/hyperliquid/coins | 60s | List every active coin in the HL perp universe. |
| GET | /v1/markets/hyperliquid/coins/{coin} | 5s | Mark, oracle, funding, OI snapshot for one coin. |
| GET | /v1/markets/hyperliquid/coins/{coin}/orderbook | 2s | L2 orderbook depth (top-N bids/asks). |
| GET | /v1/markets/hyperliquid/coins/{coin}/trades | 5s | Most recent taker fills. |
| GET | /v1/markets/hyperliquid/coins/{coin}/candles | 30s | OHLC candles, flexible windowing. |
| GET | /v1/markets/hyperliquid/daily | — | Daily market cross-section: all perp + spot markets for one date. |
All require the read scope and meter under the markets.read SKU.
List coins
bashcurl -H "Authorization: Bearer art_live_<your-key>" \
"https://api.artery.questflow.ai/v1/markets/hyperliquid/coins"jsonc{
"coins": [
{ "name": "BTC", "sizeDecimals": 5, "maxLeverage": 50 },
{ "name": "ETH", "sizeDecimals": 4, "maxLeverage": 50 },
{ "name": "SOL", "sizeDecimals": 2, "maxLeverage": 20 }
]
}Delisted coins are filtered out. For the raw universe (including delisted
entries plus the assetCtxs margin/funding overlay) use
GET /v1/hyperliquid/info/meta from the passthrough family.
Coin snapshot
bashcurl -H "Authorization: Bearer art_live_<your-key>" \
"https://api.artery.questflow.ai/v1/markets/hyperliquid/coins/BTC"jsonc{
"coin": "BTC",
"markPx": 76905.0,
"oraclePx": 76900.5,
"midPx": 76904.2,
"funding": 0.00001,
"openInterest": 12345.67,
"dayNtlVlm": 98765432.1,
"dayBaseVlm": 1284.91
}fundingis the per-hour funding rate as a decimal (0.00001 = 0.001%/hr). Multiply by 8760 for annualized; by 24 × 365 for a more conventional APR representation. This matches HL's own convention.- Unknown coin →
404 unknown_coin. - Sandbox-aware: when called with a sandbox API key, returns a frozen
mock and stamps
X-Artery-Sandbox: true.
Orderbook
bashcurl -H "Authorization: Bearer art_live_<your-key>" \
"https://api.artery.questflow.ai/v1/markets/hyperliquid/coins/BTC/orderbook?depth=20"jsonc{
"coin": "BTC",
"bids": [
{ "price": 76903.5, "size": 0.42 },
{ "price": 76902.8, "size": 1.10 }
],
"asks": [
{ "price": 76905.0, "size": 0.85 },
{ "price": 76906.1, "size": 0.27 }
],
"ts": 1779163200000
}| Parameter | Type | Default | Notes |
|---|---|---|---|
depth | int | 20 | Clamped to [1, 100]. |
Recent trades
bashcurl -H "Authorization: Bearer art_live_<your-key>" \
"https://api.artery.questflow.ai/v1/markets/hyperliquid/coins/BTC/trades?limit=50"jsonc{
"trades": [
{
"coin": "BTC",
"price": 76904.2,
"size": 0.05,
"side": "buy",
"ts": 1779163198120,
"txHash": "0x..."
}
]
}side: "buy"= an aggressor lifted the ask;"sell"= one hit the bid.txHashis the HL chain transaction hash (32 hex bytes).limitclamped to [1, 200]; default 50.
OHLC candles
bash# Last 100 1h candles (default window)
curl -H "Authorization: Bearer art_live_<your-key>" \
"https://api.artery.questflow.ai/v1/markets/hyperliquid/coins/BTC/candles?interval=1h&limit=100"
# Explicit time range — May 18 (UTC), 1h granularity, cap at 30 rows
curl -H "Authorization: Bearer art_live_<your-key>" \
"https://api.artery.questflow.ai/v1/markets/hyperliquid/coins/BTC/candles?interval=1h&start_time=2026-05-18T00:00:00Z&end_time=2026-05-19T00:00:00Z&limit=30"jsonc{
"candles": [
{
"ts": 1779163200000,
"open": 76757.0,
"high": 76927.0,
"low": 76676.0,
"close": 76905.0,
"volume": 658.65,
"source": "hl_node" // "hl_node" | "binance" | "official_api"
}
]
}Each candle carries a source tag so backtesters can audit per-bar provenance:
source | Meaning |
|---|---|
hl_node | Live-aggregated from our HL node's hl_fills stream — matches HL official o/c/h/l/v/n exactly. |
binance | Backfilled from Binance Futures USDⓈ-M klines (price tracks HL within bps; volume/n reflect Binance flow, not HL). |
official_api | Legacy on-miss fetch from api.hyperliquid.xyz for windows older than our hl_fills retention. |
null | Adapter build predates source-tagging — treat as unknown. |
A single response may mix sources at the join seam (e.g. recent rows
hl_node, older ones binance).
Query parameters
| Parameter | Type | Default | Notes |
|---|---|---|---|
interval | enum | 1h | One of 1m, 5m, 15m, 1h, 4h, 1d. |
limit | int | 100 | Clamped to [1, 5000]. Mirrors HL official's per-call response cap — 1h × 90d (2160 buckets) and 1d × 5y (1825 buckets) both fit. |
start_time | string | ms | derived | Unix-ms or ISO-8601. Inclusive lower bound. Accepts up to ~90 days back. |
end_time | string | ms | derived | Unix-ms or ISO-8601. Exclusive upper bound. |
Windowing strategies
Four shapes, picked automatically from which bounds you set:
| Caller sends | Server behavior |
|---|---|
| neither bound | Most recent limit candles (most common). |
| both bounds | Every bucket in [start_time, end_time), capped at limit newest. |
start_time only | From that timestamp forward, capped at limit. |
end_time only | Ending at that timestamp, the most recent limit candles that close before it. |
start_timeandend_timeaccept either Unix milliseconds (1715766000000) or any ISO-8601 timestamp (2026-05-19T00:00:00Z).start_time >= end_time→400 validation_failed.- The 5000-bucket cap mirrors HL official's per-call response limit — sized so
the common large queries land in one round-trip:
1h × 90d→ 2160 buckets,1d × 5y→ 1825 buckets.1m × 90d(≈130k buckets) still needs pagination — shrink the window and call iteratively. - Candles are returned oldest-first within the response.
Historical reach + caching
Artery runs its own Hyperliquid node. Recent candles (since the
node's earliest indexed fill) are computed live from the raw fill
stream — they match HL official o/c/h/l/v/n exactly. Older buckets
come from a write-through cache that's hydrated lazily on the first
miss for a (coin, interval, window) tuple.
HL official's hard limit is 5000 bars per response, no matter how wide the window (so for 5m that's ~17 days; for 1m, ~3.5 days). To make longer windows usable for backtesting, Artery pre-populates the cache with a 2-year Binance Futures USDⓈ-M backfill for the top HL crypto majors that exist on both venues. Coverage today:
BTC, ETH, SOL, NEAR, TON, WLD, XRP, SUI, ZEC, TAO, DOGE, ADA, AVAX, BNB
× 1m / 5m / 15m / 1h × 2 years back.
For these symbols, an old-window request that would have returned
[] from HL alone is served from the Binance backfill instead.
Prices match HL within a few basis points for these names; volume
totals differ (different LP venue) and trade counts reflect Binance
flow, not HL. HL-native names (HYPE, xyz:* HIP-3 perps, @N
spot deploys) have no Binance counterpart and remain capped at HL's
5000-bar window until our own fill index ages out far enough to
serve them locally.
For uncovered (coin, interval, window) combinations beyond what
either HL or the backfill provides, the response is [] for the
uncovered range — never an error.
Daily market cross-section
GET /v1/markets/hyperliquid/daily returns the day's OHLCV plus quote
turnover for every HL market — the main-dex perp universe, every
HIP-3 / builder-dex contract (xyz:NVDA, flx:OIL, …), and spot pairs —
in a single response. It's the cross-section counterpart to the per-coin
candles endpoint: pick a date, get the whole market.
bashcurl -H "Authorization: Bearer art_live_<your-key>" \
"https://api.artery.questflow.ai/v1/markets/hyperliquid/daily?date=20260605"Query parameters
| Param | Required | Description |
|---|---|---|
date | yes | UTC day, YYYYMMDD or YYYY-MM-DD. Invalid calendar dates → 400. |
market | no | Filter to perp or spot. Omitted → both. |
Response
json{
"date": "2026-06-05",
"market": null,
"count": 532,
"snapshots": [
{
"tradeDate": "2026-06-05",
"marketType": "perp",
"symbol": "BTC",
"open": 66732, "high": 67479, "low": 64061, "close": 64118,
"volume": 75735.7,
"amount": 4900000000,
"marketCap": null,
"source": "candle_agg_5m"
}
]
}symbolis the perp coin (BTC), the namespaced builder-dex contract (xyz:NVDA— same id HL uses in fills/positions), or the spot pair (HYPE-USDC).volumeis base-asset volume;amountis quote turnover (USD).marketCapis set for spot only (circulating supply × price);nullfor perp.sourcetells you how the bar was built — the two market types use different sources because HL serves no candles for most spot markets:
source | Markets | How | History |
|---|---|---|---|
candle_agg_5m | perp (main dex + HIP-3) | 5m candle aggregation; amount = Σ(5m close × volume), ~0.15% median error vs HL's rolling notional | ✅ backfilled (trailing ~20 days) |
ctx_sample | spot | hourly markPx sampling for OHLC; amount/volume = exact day-boundary dayNtlVlm/dayBaseVlm; marketCap from supply | ⚠️ forward-only — starts at deploy, no history |
Spot has no history. HL exposes no historical candles or turnover for
its spot markets, so the spot series begins empty when the feature deploys and
fills one day forward at a time. Perp is unaffected (it backfills ~20 days).
Only complete UTC days are returned — the in-progress day is excluded so a
bar never mutates intraday; an unknown / in-progress date returns an empty
snapshots array (not an error).
Error responses
Common to every endpoint in this family:
| HTTP | error.code | When |
|---|---|---|
| 400 | validation_failed | Bad interval, malformed start_time/end_time, start >= end, etc. |
| 404 | unknown_coin | coin not present in HL's active meta. |
| 401 | unauthenticated | Missing / invalid Authorization. |
| 403 | insufficient_scope | Key lacks read. |
| 429 | quota_exceeded | Over the markets.read SKU quota. |
| 502 | upstream_unavailable | HL Info endpoint 5xx'd or timed out. |
Caching
| Endpoint | TTL | Why |
|---|---|---|
coins | 60s | Universe changes only when HL lists/delists. |
coin | 5s | Hot dashboard read; HL pushes mark/funding every few seconds. |
orderbook | 2s | Tight enough for top-of-book quoting, loose enough to absorb hot polling. |
trades | 5s | Tape moves but not by the millisecond — a 5s cache is barely visible to users. |
candles | 30s | The newest bucket is still forming — repeated polls within 30s see the same in-flight value. |
Cache hits are completely transparent; there's no header to opt out. If you
need fresher data than the TTL allows, drop down to the
/v1/hyperliquid/info/* passthrough family — those forward upstream
without caching.