GET /exchange/markets to discover every market and to learn the fields you pass to every asset-scoped endpoint.
Market identity
Each row in/exchange/markets is uniquely identified by the triple (exchange, baseSymbol, quoteSymbol). That’s the canonical key — use it to pin a market client-side, persist a “last selected” choice, or re-resolve a saved selection against a fresh catalog.
Each row also carries a unifiedSymbol — the cross-exchange grouping key. It is the alias key (alias:aapl) when the instrument trades under different symbols on different venues, and the plain baseSymbol otherwise. Group by it to line one instrument up across venues; see Aliases.
The id field is a passthrough of the venue’s native market id (symbol on Aster, Binance, and Bybit such as BTCUSDT, underscore-separated symbol on MEXC such as BTC_USDT, encoded asset index on Hyperliquid, market number on Lighter and Robinhood, BASE-QUOTE string on Extended such as BTC-USD, BASE-QUOTE.P string on Ondo such as BTC-USD.P). It is unique per exchange but not a VOOI-owned stable identifier — venue ids can shift when exchanges rename or reindex contracts. Prefer the triple above for persistence.
The asset query parameter
These endpoints take an asset string that must resolve to exactly one market on the given exchange:
GET /exchange/quotesGET /exchange/market-settingsGET /exchange/estimate-slippageGET /exchange/updates-orderbook
The alias form (
alias:…) is resolved only by GET /exchange/quotes (and as the funding-strategy grouping key). For /exchange/market-settings, /exchange/estimate-slippage, and /exchange/updates-orderbook, pass a resolved venue symbol — the base-symbol or full-pair form.Pass
baseSymbol + quoteSymbol whenever you already have them from /exchange/markets. It never errors and it survives the ambiguity case below. This is what the VOOI Ultra client does.Ambiguity
(exchange, baseSymbol) alone is not guaranteed unique — an exchange may list the same base against multiple quote currencies. On Aster today, BTC, ETH, and SOL each trade against both USDT and USD1, so passing the bare base on that venue returns:
Aliases
Some instruments trade under different symbols on different venues — gold isXAUUSDT on Aster, XAU on Lighter and Extended, and xyz:GOLD on Hyperliquid. The alias form (alias:gold) lets a client refer to the same conceptual market with one string across venues. The namespace covers commodities, US and Asian equities, ETFs and index products, FX, and pre-IPO names, and it moves as venues list new contracts.
You don’t need to track the mapping yourself: read unifiedSymbol off each /exchange/markets row. It is the alias key when the instrument is aliased and the plain baseSymbol otherwise, so grouping rows by unifiedSymbol lines one instrument up across every venue that lists it. unifiedSymbol is also the grouping key on GET /funding-strategies and the arbitrage scanner.
An alias can resolve to more than one market on the same exchange when a venue lists the same instrument on multiple DEXes — for example alias:eur matches both xyz:EUR and mkts:EUR on Hyperliquid. GET /exchange/quotes then returns one entry per matching market, not one per exchange.
Aliases are an input convenience for the asset parameter; /exchange/markets rows always expose the venue-native baseSymbol next to unifiedSymbol.
Asset categories
Every market row carries acategory naming the asset class of the underlying:
The category belongs to the underlying rather than the venue, so every market sharing a
unifiedSymbol reports the same one.
GET /exchange/markets/categories returns the categories at least one open market currently belongs to, sorted alphabetically. A category is absent when nothing open carries it, so the list is safe to render directly as a filter’s option set.
Quote currencies today
- Lighter and Robinhood quote every perpetual in USDC.
- Hyperliquid quotes most perpetuals in USDC, including the HIP-3 DEXes it currently surfaces (
xyz:andmkts:). Individual HIP-3 DEXes can pick their own quote currency — always readquoteSymbolfrom the row. See Hyperliquid HIP-3 DEXes below. - Aster quotes most markets in USDT; some top pairs are also listed against USD1, Aster’s own stablecoin. It does not use USDC.
- Binance quotes most markets in USDT, with some pairs against USDC or USD1.
- Extended quotes every perpetual in USD (
quoteSymbolisUSD). - Bybit lists perpetuals against both USDT and USDC.
- MEXC quotes every perpetual in USDT.
- Ondo quotes every perpetual in USD; balances, fees, and funding settle in USDC.
quoteSymbol from the /exchange/markets row and concatenate — don’t hard-code the stablecoin.
Hyperliquid HIP-3 DEXes
Hyperliquid hosts independent perpetual DEXes under HIP-3 alongside its default USDC perp DEX. They list non-crypto perpetuals — equities, commodities, FX, stablecoin pairs — and each DEX picks its own quote currency. VOOI surfaces every HIP-3 market underexchange=hyperliquid, prefixing baseSymbol with the DEX slug:
Filter for them with
exchanges=hyperliquid like any other Hyperliquid market. Read quoteSymbol from the row when you need the venue-side quote — it lines up with the token field on the matching /exchange/accounts row, so funds you hold in a given DEX collateralize positions on that DEX.
Some Hyperliquid markets — most HIP-3 markets in particular — only support isolated margin. They appear in /exchange/markets like any other row, but POST /exchange/margin-mode rejects an attempt to switch them to cross. Read the current mode from GET /exchange/market-settings before opening a position there.
Open interest and 24h change
Two unified fields are easy to mis-read because their conventions differ across venues — VOOI normalizes them so a single client formula works everywhere:openInterest— USD notional, one-sided. Multiply by 2 if you want the two-sided total that some venues publish natively.price24hPercent— signed percent over the last 24 hours (e.g.-2.27means down 2.27%, not-0.0227).
price, volume24h, and fundingRate follow the conventions you’d expect — quote-currency price, 24h quote-volume, decimal funding rate. fundingRate is normalized to an hourly rate on every venue; fundingInterval reports how many hours apart the venue actually settles funding (1 on Hyperliquid, 8 on MEXC by default, and so on), and nextFundingTime is the next settlement.
maxLeverage is the market’s ceiling. It’s typed as a number, so don’t assume it’s an integer.
Trading schedule
Each/exchange/markets row carries a schedule object describing when the market accepts orders:
session is either "24x7" for a round-the-clock market, or a TradingView range of the form "HHMM-HHMM:DAYS" — open and close times followed by day codes where 1 is Sunday through 7 is Saturday. For example "0930-1600:23456" is 09:30–16:00 on Monday through Friday.
Crypto and perpetual venues report "24x7". Today, only Extended emits a real weekday session — a full-day weekday window ("0000-0000:23456", expressed in Etc/UTC) for its _24_5 symbols. Interpret schedule against the current time — applying corrections and sessionHolidays — to know whether a market is currently tradable; orders sent outside a venue’s session are rejected by that venue.
The
open boolean reflects whether the venue currently lists the market as tradable (delisting, reduce-only, or inactive, depending on the exchange), not session hours. Don’t use open to infer whether a market is closed for the session — read schedule for that.Exchange-specific metadata (data)
Each /exchange/markets row carries a data field with venue-shaped extras the unified shape doesn’t cover. Fields are optional and structured differently per exchange — read what you need by exchange:
The shape is typed as
unknown in the API reference because it’s exchange-dependent. Treat anything not listed above as opaque; it may appear, change, or be removed without affecting the unified fields on the same row.
Persisting “last selected market”
Store(exchange, baseSymbol, quoteSymbol) from the selected row. On the next session, re-fetch /exchange/markets and look the row up by equality on those three fields. If the row is gone — venues list and delist contracts — fall back to a default. Do not persist id.
Funding-strategy endpoints
GET /funding-strategies/spread-chart charts the spread between two legs; GET /funding-strategies/funding-rate-history returns one market’s hourly history. The asset parameters on both accept the same forms as asset above — when the market came from /exchange/markets, pass baseSymbol + quoteSymbol.
The spread-chart reference example shows
longAsset: "BTCUSDT" and shortAsset: "BTC" to illustrate that both the full-pair and bare-base forms are accepted. BTCUSDT is a real Aster contract. The bare "BTC" form works against Hyperliquid or Lighter (single USDC match) but is ambiguous on Aster today — if the other leg is Aster, pass the full pair.Next steps
Quotes and slippage
Price a trade on a specific market
Real-time updates
Subscribe to the order-book stream for a market