vike

Vault leaderboard

Every Hyperliquid vault, one row per vault family: current TVL, APR and the window's PnL, return, net flow, volume and fills.

GET https://data.vike.io/v1/hyperliquid/vaults

Every Hyperliquid vault, one row per vault family: current TVL, APR and the window's PnL, return, net flow, volume and fills. HLP and its sub-vaults are one row (child_vaults lists them), so every dollar is counted once.

cURL
# the largest open vaults by current TVL
curl -s "https://data.vike.io/v1/hyperliquid/vaults?limit=3" \
  -H "X-API-KEY: $VIKE_API_KEY"

# next page of the call just above: NEXT is its nextCursor, passed back verbatim
curl -s "https://data.vike.io/v1/hyperliquid/vaults?limit=3&cursor=$NEXT" \
  -H "X-API-KEY: $VIKE_API_KEY"

# best share-price return over 30 days among vaults holding at least $100k that still take deposits
curl -s "https://data.vike.io/v1/hyperliquid/vaults?sort=return&deposits=open&min_tvl=100000&limit=20" \
  -H "X-API-KEY: $VIKE_API_KEY"

# where money went this week: vaults ranked by net deposits over 7 days
curl -s "https://data.vike.io/v1/hyperliquid/vaults?window=7d&sort=net_flow&limit=20" \
  -H "X-API-KEY: $VIKE_API_KEY"

# the newest vaults first, open or closed: sort=age with order=desc is the oldest first
curl -s "https://data.vike.io/v1/hyperliquid/vaults?sort=age&order=asc&status=all&limit=20" \
  -H "X-API-KEY: $VIKE_API_KEY"

# check how much of a window is really covered before comparing returns
curl -s "https://data.vike.io/v1/hyperliquid/vaults?window=90d&limit=50" \
  -H "X-API-KEY: $VIKE_API_KEY" \
  | jq '{window, vaults: [.vaults[] | {vault, start, partial, coverage, return_pct}]}'
windowqueryoptional
7d | 30d | 90d | 365d | all. Default 30d
sortqueryoptional
tvl | apr | pnl | return | net_flow | volume | age. Default tvl
orderqueryoptional
asc | desc. Default desc
statusqueryoptional
open | closed | all. Default open
depositsqueryoptional
any | open | closed: whether the vault accepts deposits. Default any
min_tvlqueryoptional
Minimum current TVL in USD. Default 0
limitqueryoptional
Default 50, max 500
cursorqueryoptional
Keyset cursor

No response has been captured for this route yet. The card shows the fields the code returns, with placeholders in place of values.

Response shape
{
  "window": {
    "window": "30d",
    "start": "<YYYY-MM-DD>",
    "end": "<YYYY-MM-DD, the newest recorded day>",
    "partial": "<true when the history is shorter than the window>"
  },
  "sort": "tvl",
  "order": "desc",
  "vaults": [
    {
      "vault": "<address>",
      "name": "<vault name>",
      "leader": "<address>",
      "created_at": "<ISO-8601 UTC>",
      "is_closed": "<boolean>",
      "allow_deposits": "<boolean>",
      "leader_commission": "<fraction, 0.1 is 10%>",
      "lockup_seconds": "<integer>",
      "start": "<YYYY-MM-DD, this vault's own start, or null>",
      "partial": "<boolean>",
      "tvl_usd": "<USD>",
      "apr_pct": "<percentage points, or null>",
      "pnl_usd": "<USD>",
      "return_pct": "<percentage points, or null>",
      "net_flow_usd": "<USD>",
      "volume_usd": "<USD>",
      "fills": "<integer>",
      "coverage": "<fraction from 0 to 1>",
      "child_vaults": ["<address>"]
    }
  ],
  "nextCursor": "<string, or null on the last page>"
}

History starts on 2026-10-27: windows are partial and returns are null until it fills

A window ends on the newest recorded day and reaches back 7, 30, 90 or 365 days. Vault history is recorded from 2026-10-27, so a window longer than the history starts on the first recorded day and comes back with partial: true; all means all recorded history, so it is never marked partial but is just as short. On a partial window the PnL, return and flows cover only the recorded days. pnl_usd and return_pct stay null until a day has been recorded after the window's first day, and apr_pct is null for a vault recorded for less than 30 days. Read partial before comparing two vaults or two windows.

A row's start can be later than the window's

The top-level window states the resolved bounds; each row carries its own start and partial, because a vault younger than the window starts later. Its PnL and return cover only its own days.

  • pnl_usd is the equity change minus net deposits, so money flowing in or out does not count as profit.
  • return_pct is the chained share-price return, in percentage points. It is null when a daily step is missing or when fewer than 95% of the window's days are recorded for that vault (coverage, a fraction); it is never filled with zero.
  • apr_pct annualises the vault's own 30-day return, whatever window you ask for.
  • net_flow_usd counts withdrawals and distributions as outflow.
  • A null sort value sorts last. Until 30 days are recorded, sort=apr cannot order anything, and neither can sort=return while return_pct is null.
  • sort=age with the default order=desc lists the oldest vaults first.

Each vault's own page is /vaults/{vault}; its fills, trades and positions are served by the wallet routes with the vault's address.