AArtery
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.

Note

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

MethodPathCachePurpose
GET/v1/markets/hyperliquid/coins60sList every active coin in the HL perp universe.
GET/v1/markets/hyperliquid/coins/{coin}5sMark, oracle, funding, OI snapshot for one coin.
GET/v1/markets/hyperliquid/coins/{coin}/orderbook2sL2 orderbook depth (top-N bids/asks).
GET/v1/markets/hyperliquid/coins/{coin}/trades5sMost recent taker fills.
GET/v1/markets/hyperliquid/coins/{coin}/candles30sOHLC candles, flexible windowing.
GET/v1/markets/hyperliquid/dailyDaily 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
}
  • funding is 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
}
ParameterTypeDefaultNotes
depthint20Clamped 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.
  • txHash is the HL chain transaction hash (32 hex bytes).
  • limit clamped 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:

sourceMeaning
hl_nodeLive-aggregated from our HL node's hl_fills stream — matches HL official o/c/h/l/v/n exactly.
binanceBackfilled from Binance Futures USDⓈ-M klines (price tracks HL within bps; volume/n reflect Binance flow, not HL).
official_apiLegacy on-miss fetch from api.hyperliquid.xyz for windows older than our hl_fills retention.
nullAdapter 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

ParameterTypeDefaultNotes
intervalenum1hOne of 1m, 5m, 15m, 1h, 4h, 1d.
limitint100Clamped to [1, 5000]. Mirrors HL official's per-call response cap — 1h × 90d (2160 buckets) and 1d × 5y (1825 buckets) both fit.
start_timestring | msderivedUnix-ms or ISO-8601. Inclusive lower bound. Accepts up to ~90 days back.
end_timestring | msderivedUnix-ms or ISO-8601. Exclusive upper bound.

Windowing strategies

Four shapes, picked automatically from which bounds you set:

Caller sendsServer behavior
neither boundMost recent limit candles (most common).
both boundsEvery bucket in [start_time, end_time), capped at limit newest.
start_time onlyFrom that timestamp forward, capped at limit.
end_time onlyEnding at that timestamp, the most recent limit candles that close before it.
  • start_time and end_time accept either Unix milliseconds (1715766000000) or any ISO-8601 timestamp (2026-05-19T00:00:00Z).
  • start_time >= end_time400 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

ParamRequiredDescription
dateyesUTC day, YYYYMMDD or YYYY-MM-DD. Invalid calendar dates → 400.
marketnoFilter 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"
    }
  ]
}
  • symbol is the perp coin (BTC), the namespaced builder-dex contract (xyz:NVDA — same id HL uses in fills/positions), or the spot pair (HYPE-USDC).
  • volume is base-asset volume; amount is quote turnover (USD).
  • marketCap is set for spot only (circulating supply × price); null for perp.
  • source tells you how the bar was built — the two market types use different sources because HL serves no candles for most spot markets:
sourceMarketsHowHistory
candle_agg_5mperp (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_samplespothourly markPx sampling for OHLC; amount/volume = exact day-boundary dayNtlVlm/dayBaseVlm; marketCap from supply⚠️ forward-only — starts at deploy, no history
Note

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:

HTTPerror.codeWhen
400validation_failedBad interval, malformed start_time/end_time, start >= end, etc.
404unknown_coincoin not present in HL's active meta.
401unauthenticatedMissing / invalid Authorization.
403insufficient_scopeKey lacks read.
429quota_exceededOver the markets.read SKU quota.
502upstream_unavailableHL Info endpoint 5xx'd or timed out.

Caching

EndpointTTLWhy
coins60sUniverse changes only when HL lists/delists.
coin5sHot dashboard read; HL pushes mark/funding every few seconds.
orderbook2sTight enough for top-of-book quoting, loose enough to absorb hot polling.
trades5sTape moves but not by the millisecond — a 5s cache is barely visible to users.
candles30sThe 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.

Edit this page on GitHubLast updated
Hyperliquid Markets · Artery API Docs