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. |
All five 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
}
]
}Query parameters
| Parameter | Type | Default | Notes |
|---|---|---|---|
interval | enum | 1h | One of 1m, 5m, 15m, 1h, 4h, 1d. |
limit | int | 100 | Clamped to [1, 500]. Always caps the response, even when an explicit time range would return more. |
start_time | string | ms | derived | Unix-ms or ISO-8601. Inclusive lower bound. |
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 cap exists to keep responses bounded — a
1minterval over a 30-day range would request 43,200 buckets; the cap truncates to the newest 500. Paginate via shrinking time windows when you need older data. - Candles are returned oldest-first within the response.
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 | rate_limited | 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.