vike

Recipe 19 of 65

Copy-trade watcher: alert when a Hyperliquid wallet opens, adds or closes

Poll /wallets/{address}/fills with start set to the last fill you saw to catch every new fill within seconds, and diff /positions?wallet= between polls to tell an open, an add and a close apart.

GET /v1/hyperliquid/wallets/{address}/fills answers it, polled: there is no push channel. It returns the wallet's fills newest first, each with symbol, side, size, price, order_id, is_maker, crossed and closed_pnl. Ask again with start set to the newest ts you hold and alert on anything new. To label an event as an open, an add or a close, compare the wallet's open positions from GET /v1/hyperliquid/positions with the previous poll. The full parameter lists are on Wallet fills and Positions.

Quick answer

Read the wallet's newest fills.

cURL
# the wallet's newest fills
curl -H "X-API-Key: $VIKE_API_KEY" \
  "https://data.vike.io/v1/hyperliquid/wallets/0xfc667adba8d4837586078f4fdcdc29804337ca06/fills?limit=5"

Example response

Captured from the live API on 2026-10-24 at 17:17 UTC, trimmed to 3 of 5 rows. The legacy asset copy of symbol is left out.

The newest fill was served about 8 seconds after it happened. The two NEAR sells reduce the wallet's NEAR long, so the venue reports a closed_pnl on them; the MU sell carries none. is_maker: true and a negative fee mean resting orders that earned a rebate. fee is in fee_token.

Example response
{
  "wallet": "0xfc667adba8d4837586078f4fdcdc29804337ca06",
  "items": [
    {
      "ts": "2026-10-24T17:16:58.916000+00:00",
      "symbol": "NEAR",
      "side": "sell",
      "direction": "sell",
      "size_token": 37.0,
      "price": 4.426,
      "size_usd": 163.762,
      "fee": -0.001637,
      "fee_token": "USDC",
      "is_maker": true,
      "crossed": false,
      "closed_pnl": -0.97162,
      "order_id": 584771810682,
      "trade_id": 507206740892077,
      "dex_name": "HL"
    },
    {
      "ts": "2026-10-24T17:16:58.916000+00:00",
      "symbol": "NEAR",
      "side": "sell",
      "direction": "sell",
      "size_token": 121.4,
      "price": 4.426,
      "size_usd": 537.3164,
      "fee": -0.005373,
      "fee_token": "USDC",
      "is_maker": true,
      "crossed": false,
      "closed_pnl": -3.187964,
      "order_id": 584771810690,
      "trade_id": 302300364497393,
      "dex_name": "HL"
    },
    {
      "ts": "2026-10-24T17:16:43.979000+00:00",
      "symbol": "xyz:MU",
      "side": "sell",
      "direction": "sell",
      "size_token": 4.442,
      "price": 876.61,
      "size_usd": 3893.90162,
      "fee": -0.003893,
      "fee_token": "USDC",
      "is_maker": true,
      "crossed": false,
      "closed_pnl": 0.0,
      "order_id": 584771610549,
      "trade_id": 435950047636822,
      "dex_name": "XYZ"
    }
  ],
  "nextCursor": "eyJpIjo5NTc4MDQ1ODM3NTMwOTksInQiOiIyMDI2LTEwLTI0IDE3OjE2OjI5Ljc2MiJ9"
}

Variations

Only what is new since the last poll. Pass the newest ts you hold as start.

cURL — since the last fill
# fills at or after the last one already seen
curl -H "X-API-Key: $VIKE_API_KEY" \
  "https://data.vike.io/v1/hyperliquid/wallets/0xfc667adba8d4837586078f4fdcdc29804337ca06/fills?start=2026-10-24T17:16:58.916Z&limit=500"

Open, add or close. Snapshot the wallet's open positions on each poll. A new symbol and direction pair is an open, a larger size_token is an add, a smaller one a partial close, and a pair that disappears is a close.

cURL — open positions
# the wallet's open positions, one row per symbol and side
curl -s -H "X-API-Key: $VIKE_API_KEY" \
  "https://data.vike.io/v1/hyperliquid/positions?wallet=0xfc667adba8d4837586078f4fdcdc29804337ca06&limit=500" \
  | jq '.positions | map({symbol, direction, size_token, entry_price, snapshot_ts})'

One market only. Add symbol.

cURL — BTC fills
# the wallet's newest BTC fills
curl -H "X-API-Key: $VIKE_API_KEY" \
  "https://data.vike.io/v1/hyperliquid/wallets/0xfc667adba8d4837586078f4fdcdc29804337ca06/fills?symbol=BTC&limit=100"

Before you rely on it

Polling, two clocks, and repeats at the boundary

Nothing is pushed: you decide the poll interval and pay for each call. Fills arrive within seconds, but positions come from a snapshot taken about every 5 minutes, so the position diff lags the fills. start is cut to the whole second and is inclusive, so drop fills whose trade_id you already hold. One order can fill in many pieces with one order_id, and direction repeats side (buy or sell); it does not say whether the fill opened or closed a position.

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_wallet_activity tool answers with view: fills, at 1 credit a call.

Ask your agent
What did Hyperliquid wallet 0xfc667adba8d4837586078f4fdcdc29804337ca06 trade in the last 10 minutes?
Example response
{  "wallet": "0xfc667adba8d4837586078f4fdcdc29804337ca06",  "items": [    {      "ts": "2026-10-24T17:16:58.916000+00:00",      "symbol": "NEAR",      "side": "sell",      "direction": "sell",      "size_token": 37.0,      "price": 4.426,      "size_usd": 163.762,      "fee": -0.001637,      "fee_token": "USDC",      "is_maker": true,      "crossed": false,      "closed_pnl": -0.97162,      "order_id": 584771810682,      "trade_id": 507206740892077,      "dex_name": "HL"    },    {      "ts": "2026-10-24T17:16:58.916000+00:00",      "symbol": "NEAR",      "side": "sell",      "direction": "sell",      "size_token": 121.4,      "price": 4.426,      "size_usd": 537.3164,      "fee": -0.005373,      "fee_token": "USDC",      "is_maker": true,      "crossed": false,      "closed_pnl": -3.187964,      "order_id": 584771810690,      "trade_id": 302300364497393,      "dex_name": "HL"    },    {      "ts": "2026-10-24T17:16:43.979000+00:00",      "symbol": "xyz:MU",      "side": "sell",      "direction": "sell",      "size_token": 4.442,      "price": 876.61,      "size_usd": 3893.90162,      "fee": -0.003893,      "fee_token": "USDC",      "is_maker": true,      "crossed": false,      "closed_pnl": 0.0,      "order_id": 584771610549,      "trade_id": 435950047636822,      "dex_name": "XYZ"    }  ],  "nextCursor": "eyJpIjo5NTc4MDQ1ODM3NTMwOTksInQiOiIyMDI2LTEwLTI0IDE3OjE2OjI5Ljc2MiJ9"}