Skip to main content
hyperliquid.perp_market_details is the market dimension for the Hyperliquid perp dataset, covering first-party markets (coin unprefixed, e.g. BTC) and HIP-3 builder-deployed markets (coin = dex:SYMBOL, e.g. xyz:TSLA). Grain: one row per (perp_dex, coin), current state. coin is the join key used by every market-grained table in the dataset (perp_accounts_daily is per trader and carries none).

Table schema

A live view, current state only

The table is a VIEW over the deduped registry snapshots, so a newly listed market appears with no build and no refresh anywhere in the dataset — on the next registry write covering its dex, measured at a median of 32 minutes after the on-chain registration and 18.2 hours worst case. Counts are therefore as-of, not stable: 498 markets at 2026-08-21, 232 first-party and 266 HIP-3 across 10 builder dexes, of which 320 are neither delisted nor flagged halted. Hyperliquid spot and HIP-4 outcome markets are out of scope. There is no valid_from / valid_to: this is not an SCD. The upstream registry only has change history from 2026-06-29, and intervals would break the one-row-per-market contract that every join here assumes.

Joins from fact tables drop nothing

Delisted markets stay tombstoned in the registry rather than disappearing, so every coin that has traded since the 2025-07-27 fills floor has a row here — verified 2026-08-14 by unbounded all-history anti-join over all 408 coins that had traded by then. An inner join from a fact table is therefore safe. The reverse is not a market list: registered-but-never-traded markets are here too, 81 of the 498 rows at 2026-08-21.

max_leverage is not always the cap that applies

margin_table_id 1-50 is the implicit single-tier ladder where the id is the leverage value; there margin_tiers is synthesised from max_leverage and the two agree. Ids 51+ are deployer-defined and the only genuinely tiered markets — 36 at 2026-08-21, all first-party. On those, max_leverage is a top-tier cap that a large enough position does not get, and the applicable cap is the last tier whose lowerBound the notional clears.
Where a trader never set leverage, Hyperliquid’s account default is least(20, max_leverage).

Classification is here and nowhere else

market_category, asset_class, asset_type, underlying_ticker and description are LEFT JOINed from hyperliquid.perp_market_metadata and stored on no fact table, so a reclassification rebuilds only that ~500-row table. asset_class takes credit, fixed_income, cash_equivalent, equities, multi_asset, commodities, real_estate, fx or other — the vocabulary the tokenized-RWA models use. It is null on every crypto market and on the compute markets, where no value in that vocabulary applies. asset_type names the exposure rather than a wrapper: a single-name perp is equities_synthetic whether the name is listed or pre-IPO, an index perp is equities_index, and a perp on an ETF is equities_exchange_traded_funds because there the reference genuinely is a fund.
perp_trades holds both legs of every match, hence the is_taker filter; hyperliquid.perp_market_metrics_daily is already taker-side if you only need the volume. The IS NULL arm matters: market_category’s not_null test runs at warning severity so a newly listed market keeps reporting while it is unclassified, and a bare <> 'crypto' would silently drop it.