vike

Recipe 6 of 33

Do whales rotate between BTC, ETH and HYPE? (cross-asset cohort drift)

Pull the same 30 days of hourly size-cohort positioning for each coin, sum the whale rows per hour, and compare their long notional and bias across the three coins.

GET /v1/hl-cohorts/symbols/{symbol}/cohort-metrics with axis=size&hours=720 answers it, one call per coin: 30 days of hourly positioning split by account-size cohort. Sum the four whale rows (4x whale to whale, accounts of $1m and up) for each hour, then compare the coins hour by hour; rotation shows as whale long notional falling on one coin while it rises on another. The full parameter list is on Coin cohort metrics.

Quick answer

The same call three times, once per coin.

cURL
# 30 days of hourly BTC positioning by account-size cohort
curl -H "X-API-Key: $VIKE_API_KEY" \
  "https://data.vike.io/v1/hl-cohorts/symbols/BTC/cohort-metrics?axis=size&hours=720"

# the same 30 days for ETH
curl -H "X-API-Key: $VIKE_API_KEY" \
  "https://data.vike.io/v1/hl-cohorts/symbols/ETH/cohort-metrics?axis=size&hours=720"

# the same 30 days for HYPE
curl -H "X-API-Key: $VIKE_API_KEY" \
  "https://data.vike.io/v1/hl-cohorts/symbols/HYPE/cohort-metrics?axis=size&hours=720"

Example response

Captured from the live API on 2026-10-24 at 17:12 UTC from the HYPE call with hours=1, trimmed to the 4 whale rows of 12. Summed over the four rows, HYPE whales held $868M at 16:00 UTC, 48% of it long (bias -0.04). The same hour from the other two calls: BTC whales $2.15B, 40% long (bias -0.19); ETH whales $2.04B, 48% long (bias -0.04). Compare long notional in USD across coins; total_position_size is in each coin's own units and does not add up across them.

Example response
{
  "axis": "size",
  "label_basis": "point_in_time",
  "metrics": [
    {
      "ts": "2026-10-24T16:00:00+00:00",
      "cohort": "4x whale",
      "position_count": 18,
      "position_count_long": 7,
      "total_position_value": 356317805.7,
      "total_position_value_long": 140063060.9,
      "total_unrealized_pnl": 45633942.06,
      "total_position_size": 4723382.5,
      "total_position_size_long": 1856689.17,
      "bias": -0.2138306944,
      "label_basis": "point_in_time",
      "grading": null
    },
    {
      "ts": "2026-10-24T16:00:00+00:00",
      "cohort": "3x whale",
      "position_count": 22,
      "position_count_long": 11,
      "total_position_value": 58049237.7,
      "total_position_value_long": 18263739.76,
      "total_unrealized_pnl": -5305953.539,
      "total_position_size": 769506.18,
      "total_position_size_long": 242105.86,
      "bias": -0.3707500569,
      "label_basis": "point_in_time",
      "grading": null
    },
    {
      "ts": "2026-10-24T16:00:00+00:00",
      "cohort": "2x whale",
      "position_count": 38,
      "position_count_long": 20,
      "total_position_value": 162442260.2,
      "total_position_value_long": 107902594.6,
      "total_unrealized_pnl": -3590918.866,
      "total_position_size": 2153349.95,
      "total_position_size_long": 1430366.99,
      "bias": 0.3285039805,
      "label_basis": "point_in_time",
      "grading": null
    },
    {
      "ts": "2026-10-24T16:00:00+00:00",
      "cohort": "whale",
      "position_count": 93,
      "position_count_long": 49,
      "total_position_value": 291119638.1,
      "total_position_value_long": 150632573.7,
      "total_unrealized_pnl": -4087107.336,
      "total_position_size": 3859109.43,
      "total_position_size_long": 1996799.63,
      "bias": 0.03484996537,
      "label_basis": "point_in_time",
      "grading": null
    }
  ],
  "hours": 1,
  "nextCursor": "eyJtIjoiY29ob3J0X21ldHJpY3MiLCJ0IjoiMjAyNi0xMC0yNCAxNjowMDowMCJ9",
  "grading": null,
  "freshness": {
    "newest_ts": "2026-10-24T16:00:00+00:00",
    "behind_hours": 1,
    "settled_lag_ceiling_hours": 3,
    "stale": false
  }
}

Variations

Page further back. end without start returns the hours newest buckets at or before it, so the previous 30 days is the same call with end set just before the oldest hour you already have.

cURL — previous 30 days
# the 720 hours before the first call: END is its oldest ts minus 1 second
curl -H "X-API-Key: $VIKE_API_KEY" \
  "https://data.vike.io/v1/hl-cohorts/symbols/BTC/cohort-metrics?axis=size&hours=720&end=$END"

The whole board at one instant. /heatmap returns every coin's cohort split at the newest 5-minute snapshot in one call, so a "where are whales now" snapshot needs no loop.

cURL — heatmap
# whale cells for the three coins at the newest snapshot
curl -s -H "X-API-Key: $VIKE_API_KEY" \
  "https://data.vike.io/v1/hl-cohorts/heatmap?axis=size" \
  | jq '[.heatmap[] | select(.symbol == "BTC" or .symbol == "ETH" or .symbol == "HYPE") | {symbol, whales: [.segments[] | select(.cohort | test("whale")) | {cohort, total_long_value, bias}]}]'

Before you rely on it

A cohort is a set of accounts, not the same wallets

A wallet's size cohort is stored with each snapshot from its account value at the time, so a wallet that grows or shrinks moves between rungs; a change in whale notional can be membership, not trading. The whale rows are a few dozen positions per coin, so one account can swing them. Each call returns about hours x 12 rows; join the three on ts.

Ask your agent

Connected to the Vike MCP server (https://vike.io/mcp) in Claude, ChatGPT or Cursor, ask it in plain words. The hl_cohort_metrics tool answers, at 1 credit a call.

Ask your agent
Over the last 30 days, did Hyperliquid whales move long exposure from BTC to ETH or HYPE?
Example response
{  "axis": "size",  "label_basis": "point_in_time",  "metrics": [    {      "ts": "2026-10-24T16:00:00+00:00",      "cohort": "4x whale",      "position_count": 18,      "position_count_long": 7,      "total_position_value": 356317805.7,      "total_position_value_long": 140063060.9,      "total_unrealized_pnl": 45633942.06,      "total_position_size": 4723382.5,      "total_position_size_long": 1856689.17,      "bias": -0.2138306944,      "label_basis": "point_in_time",      "grading": null    },    {      "ts": "2026-10-24T16:00:00+00:00",      "cohort": "3x whale",      "position_count": 22,      "position_count_long": 11,      "total_position_value": 58049237.7,      "total_position_value_long": 18263739.76,      "total_unrealized_pnl": -5305953.539,      "total_position_size": 769506.18,      "total_position_size_long": 242105.86,      "bias": -0.3707500569,      "label_basis": "point_in_time",      "grading": null    },    {      "ts": "2026-10-24T16:00:00+00:00",      "cohort": "2x whale",      "position_count": 38,      "position_count_long": 20,      "total_position_value": 162442260.2,      "total_position_value_long": 107902594.6,      "total_unrealized_pnl": -3590918.866,      "total_position_size": 2153349.95,      "total_position_size_long": 1430366.99,      "bias": 0.3285039805,      "label_basis": "point_in_time",      "grading": null    },    {      "ts": "2026-10-24T16:00:00+00:00",      "cohort": "whale",      "position_count": 93,      "position_count_long": 49,      "total_position_value": 291119638.1,      "total_position_value_long": 150632573.7,      "total_unrealized_pnl": -4087107.336,      "total_position_size": 3859109.43,      "total_position_size_long": 1996799.63,      "bias": 0.03484996537,      "label_basis": "point_in_time",      "grading": null    }  ],  "hours": 1,  "nextCursor": "eyJtIjoiY29ob3J0X21ldHJpY3MiLCJ0IjoiMjAyNi0xMC0yNCAxNjowMDowMCJ9",  "grading": null,  "freshness": {    "newest_ts": "2026-10-24T16:00:00+00:00",    "behind_hours": 1,    "settled_lag_ceiling_hours": 3,    "stale": false  }}