> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dune.com/llms.txt
> Use this file to discover all available pages before exploring further.

# hyperliquid.perp_market_metrics_daily

> Daily per-market OHLCV, volume, fees, liquidations, open interest and funding for every Hyperliquid perpetual market, first-party and HIP-3.

export const PremiumDatasetAccessCard = ({href = "https://dune.com/enterprise#contact-form", note = null}) => <Card title="Gated dataset" icon="lock" href={href}>
    Querying this dataset requires an entitlement on your workspace. See <a href="/data-catalog/overview#access-tiers-public-vs-gated-datasets">access tiers</a>, or contact the Dune team to enable access.
    {note && <><br /><br />{note}</>}
  </Card>;

`hyperliquid.perp_market_metrics_daily` is the reporting grain for Hyperliquid perpetual markets: one row per `(coin, block_date)`, venue-wide across first-party markets (`coin` = `BTC`) and HIP-3 builder-deployed markets (`coin` = `dex:SYMBOL`, e.g. `xyz:TSLA`). Same column list as [`perp_market_metrics_hourly`](/data-catalog/curated/perpetuals/hyperliquid/perp-market-metrics-hourly), with `block_hour` replaced by `block_date`. Partitioned by `block_month`.

<PremiumDatasetAccessCard />

A row exists for a market-day if the market traded or held an open position. On a day it held positions without trading, the flow columns are zero-filled and the candle columns are null.

## Table schema

| Column                    | Type                          | Description                                                                                                                                                               |
| ------------------------- | ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `block_month`             | `DATE`                        | Month of `block_date`. Partition key                                                                                                                                      |
| `block_date`              | `DATE`                        | UTC calendar day. The grain, with `coin`                                                                                                                                  |
| `perp_dex`                | `VARCHAR`                     | `hyperliquid` for first-party markets, otherwise the builder DEX code (`xyz`, `flx`, `para`, ...)                                                                         |
| `coin`                    | `VARCHAR`                     | Venue-native market id. The grain, with `block_date`, and the join key to `perp_market_details`                                                                           |
| `market_symbol`           | `VARCHAR`                     | `coin` with the `dex:` prefix stripped. Not unique across dexes, so never join on it                                                                                      |
| `asset_id`                | `BIGINT`                      | Numeric asset id used by the action tables. Null for a market that traded before the registry recorded it                                                                 |
| `open_price`              | `DOUBLE`                      | First taker-leg trade price of the day. Null on a day with no trades                                                                                                      |
| `high_price`              | `DOUBLE`                      | Highest taker-leg trade price of the day                                                                                                                                  |
| `low_price`               | `DOUBLE`                      | Lowest taker-leg trade price of the day                                                                                                                                   |
| `close_price`             | `DOUBLE`                      | Last taker-leg trade price of the day. Not the price `open_interest_usd` is struck at                                                                                     |
| `vwap`                    | `DOUBLE`                      | Volume-weighted average taker price over the day: `volume_usd / volume_units`                                                                                             |
| `volume_usd`              | `DOUBLE`                      | Taker-leg notional, so each match is counted once. Includes administrative fills                                                                                          |
| `volume_units`            | `DOUBLE`                      | Taker-leg volume in base units                                                                                                                                            |
| `buy_volume_usd`          | `DOUBLE`                      | Taker-side buy notional. Aggressor flow, not a directional net: on a liquidation or ADL the taker leg is the account being closed out, not a voluntary aggressor          |
| `sell_volume_usd`         | `DOUBLE`                      | Taker-side sell notional. Same forced-flow caveat                                                                                                                         |
| `trades_count`            | `BIGINT`                      | Matches in the day                                                                                                                                                        |
| `unique_traders`          | `BIGINT`                      | Distinct accounts on either leg over the day                                                                                                                              |
| `unique_takers`           | `BIGINT`                      | Distinct aggressors over the day                                                                                                                                          |
| `unique_makers`           | `BIGINT`                      | Distinct passive accounts over the day                                                                                                                                    |
| `fee_usd`                 | `DOUBLE`                      | Protocol fee revenue for the market-day, both legs netted                                                                                                                 |
| `taker_fee_usd`           | `DOUBLE`                      | Taker-leg fees                                                                                                                                                            |
| `maker_fee_usd`           | `DOUBLE`                      | Maker-leg fees, negative where rebated                                                                                                                                    |
| `builder_fee_usd`         | `DOUBLE`                      | Front-end / builder-code fee share. A component of `fee_usd`, not an addend                                                                                               |
| `deployer_fee_usd`        | `DOUBLE`                      | HIP-3 deployer fee share. A component of `fee_usd`, not an addend                                                                                                         |
| `forced_count`            | `BIGINT`                      | Matches the engine forced — liquidations and ADL, counted on the taker leg and not split into the two                                                                     |
| `forced_volume_usd`       | `DOUBLE`                      | Notional of those matches, one per match, so directly comparable to `volume_usd`                                                                                          |
| `open_interest_units`     | `DOUBLE`                      | Open interest at the day's last global funding round, base units, longs plus shorts. `0` when the market held nothing at that round; null on a day with no round anywhere |
| `open_interest_usd`       | `DOUBLE`                      | That same snapshot, priced at the market's last trade at or before the round rather than at `close_price`                                                                 |
| `open_positions`          | `BIGINT`                      | Distinct accounts holding a position at that round                                                                                                                        |
| `funding_rate`            | `DOUBLE`                      | The day's total funding rate, the sum of its hourly rates. Null when the market had no funding round that day                                                             |
| `funding_rate_annualized` | `DOUBLE`                      | `funding_rate * 365` — the hourly table annualizes `* 24 * 365`                                                                                                           |
| `funding_paid_usd`        | `DOUBLE`                      | Funding that changed hands over the day, as a positive magnitude, taken from the paying side. Direction is in `funding_rate`                                              |
| `_updated_at`             | `TIMESTAMP(3) WITH TIME ZONE` | Build timestamp                                                                                                                                                           |

## Not a sum of the hourly rows

The two column families are built differently, and neither is an hourly `SUM`:

| Family                                                                | How the daily value is produced                                                                                                                                                            |
| --------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Flows — candles, volume, counts, fees, forced flow                    | Re-aggregated from `perp_trades` over the whole day. Daily distinct account counts have to be exact, and hourly distincts do not sum; the candle needs the day's true first and last trade |
| Stocks — `open_interest_units`, `open_interest_usd`, `open_positions` | An end-of-day snapshot lifted from the hourly row at the day's last global funding round. Not a sum, not a max                                                                             |

Because `volume_usd` is taker-leg only, this is the volume figure to quote. Summing `notional_usd` on `perp_trades` gives roughly twice the traded volume, since that table holds both legs of every match.

<Warning>
  A market that held no open position at the day's last funding round reports `0` for the stocks, not null and not its own stale earlier snapshot. Null there means something different: no funding round happened anywhere on the venue that day, so the state is unknown. Treat `0` and null as distinct in any open-interest series.
</Warning>

The snapshot hour is a venue-wide clock — funding fires once an hour for every open market simultaneously — so every market's stock columns on a given `block_date` are struck at the same round, and summing `open_interest_usd` across markets for one day is coherent.

```sql theme={null}
-- Venue-wide daily volume and end-of-day open interest, split by market category
SELECT
  d.block_date,
  md.market_category,
  SUM(d.volume_usd) AS volume_usd,
  SUM(d.open_interest_usd) AS open_interest_usd_eod,
  SUM(d.forced_volume_usd) AS forced_volume_usd
FROM hyperliquid.perp_market_metrics_daily AS d
LEFT JOIN hyperliquid.perp_market_details AS md
  ON md.coin = d.coin
WHERE d.block_month >= date_trunc('month', current_date - INTERVAL '90' day)
  AND d.block_date >= current_date - INTERVAL '90' day
  AND d.block_date < current_date
GROUP BY 1, 2
ORDER BY 1 DESC, 3 DESC
```

## The newest day is partial

Trades are still accumulating and the day's "last global round" is only the latest round ingested so far. The row is merge-updated in place on each run, so it moves during the day. Filter `block_date < current_date` for complete days.

## History floors

Flows start on 2025-07-27, the floor of the decoded fills source. Open interest and funding start on 2025-09-27. Market-days in between carry flows with null stocks. Both floors are measured 2026-08-21; 417 distinct `coin` values have a row in this table.
