vike

Wallet TWAP orders

The status changes of one wallet's Hyperliquid TWAP orders, newest first: when each started, how it ended and how much had executed.

GET https://data.vike.io/v1/hyperliquid/wallets/{address}/twaps

The status changes of one wallet's Hyperliquid TWAP orders. A TWAP is one order the venue works off in slices over duration_minutes; this route has one row each time that order changes state, not one row per slice. Newest first by default. The row fields, the statuses and the window rules are the same as on /twaps, which reads every wallet.

cURL
# a wallet's newest TWAP status changes
curl -s "https://data.vike.io/v1/hyperliquid/wallets/0x8ec5db10577f7171a6cb405b49722ded5eaf38da/twaps?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/wallets/0x8ec5db10577f7171a6cb405b49722ded5eaf38da/twaps?limit=3&cursor=$NEXT" \
  -H "X-API-KEY: $VIKE_API_KEY"

# only the TWAPs of one market that ran to the end
curl -s "https://data.vike.io/v1/hyperliquid/wallets/0x8ec5db10577f7171a6cb405b49722ded5eaf38da/twaps?symbol=WLD&status=finished&limit=100" \
  -H "X-API-KEY: $VIKE_API_KEY"

# placements the venue rejected for this wallet (left out unless asked for)
curl -s "https://data.vike.io/v1/hyperliquid/wallets/0x8ec5db10577f7171a6cb405b49722ded5eaf38da/twaps?status=error&limit=100" \
  -H "X-API-KEY: $VIKE_API_KEY"

# a pinned window, oldest first
curl -s "https://data.vike.io/v1/hyperliquid/wallets/0x8ec5db10577f7171a6cb405b49722ded5eaf38da/twaps?start=2026-10-27T00:00:00Z&end=2026-10-28T00:00:00Z&order=asc&limit=500" \
  -H "X-API-KEY: $VIKE_API_KEY"
addresspathrequired
The wallet
twap_idqueryoptional
One TWAP id: every status line of that TWAP
symbolqueryoptional
HL ticker, e.g. BTC or xyz:AAPL
statusqueryoptional
One of activated, waitingForTrigger, finished, terminated, stopped, error. Default: every status except error, a rejected placement rather than an order; status=error shows those rows
startqueryoptional
ISO-8601 UTC. Default: no lower bound
endqueryoptional
ISO-8601 UTC. Default: now. The window has no 31-day cap
orderqueryoptional
asc | desc. Default desc, newest first. order=asc returns the oldest events first and is the mode for following a feed: pass each nextCursor back verbatim. It orders by key, so a row the writer inserts late with an older key is not seen by a poller already past it: re-read a small overlap. An asc page with rows always carries a cursor; an empty one returns the cursor you sent, or on a first call null (the wallet already pins the place). So stop on an empty page, not on a null cursor. A desc page that comes back short carries no cursor. Anything else is a 400
limitqueryoptional
Default 100, max 5000
cursorqueryoptional
nextCursor from the previous page, verbatim. It pins the call that returned it: the feed, order, every filter and the start and end you sent. Changing or dropping any of them, start included, is a 400. It is also valid on /twaps?wallet= with the same parameters
Example response
{
  "wallet": "0x8ec5db10577f7171a6cb405b49722ded5eaf38da",
  "items": [
    {
      "ts": "2026-10-27T12:13:04.041252+00:00",
      "twap_id": 2420636,
      "wallet": "0x8ec5db10577f7171a6cb405b49722ded5eaf38da",
      "symbol": "WLD",
      "side": "sell",
      "status": "finished",
      "size": 514400.0,
      "executed_size": 514400.0,
      "executed_notional_usd": 221262.627392,
      "duration_minutes": 12,
      "reduce_only": true,
      "randomize": true,
      "placed_at": "2026-10-27T12:01:02.491000+00:00",
      "trigger_px": null,
      "trigger_above": null,
      "stop_px": null,
      "error": null
    },
    {
      "ts": "2026-10-27T12:01:02.491653+00:00",
      "twap_id": 2420636,
      "wallet": "0x8ec5db10577f7171a6cb405b49722ded5eaf38da",
      "symbol": "WLD",
      "side": "sell",
      "status": "activated",
      "size": 514400.0,
      "executed_size": 0.0,
      "executed_notional_usd": 0.0,
      "duration_minutes": 12,
      "reduce_only": true,
      "randomize": true,
      "placed_at": "2026-10-27T12:01:02.491000+00:00",
      "trigger_px": null,
      "trigger_above": null,
      "stop_px": null,
      "error": null
    },
    {
      "ts": "2026-10-27T11:52:20.860601+00:00",
      "twap_id": 2420568,
      "wallet": "0x8ec5db10577f7171a6cb405b49722ded5eaf38da",
      "symbol": "WLD",
      "side": "buy",
      "status": "terminated",
      "size": 1000000.0,
      "executed_size": 514400.0,
      "executed_notional_usd": 222721.867641,
      "duration_minutes": 12,
      "reduce_only": false,
      "randomize": true,
      "placed_at": "2026-10-27T11:46:16.888000+00:00",
      "trigger_px": null,
      "trigger_above": null,
      "stop_px": null,
      "error": null
    }
  ],
  "nextCursor": "<opaque cursor>"
}

Reading the lifecycle. The rows of one twap_id are that TWAP's story: it starts (activated, and waitingForTrigger when it has a trigger price) and ends with one closing row. The closing row's executed_size and executed_notional_usd are the total, and a terminated row can carry less than size: that TWAP was ended part-way. executed_notional_usd / executed_size is the average execution price.

Choose the window. With a wallet there is no default window and no 31-day cap: the call starts at the wallet's newest row and pages back through all history, which starts on 2026-04-05 and holds every status line since then (about 1.4 million rows across all wallets on 2026-10-27, with all six statuses). trigger_px, trigger_above and stop_px did not exist before August 2026: on every older row they are null, whether or not the TWAP had a trigger or a stop. start and end (ISO 8601, UTC) narrow it. limit takes 1 to 5000 and defaults to 100; a value above 5000 is a 422. A call costs 1 credit (Rate limits). A spot TWAP carries the raw spot index (@182) as symbol, and the symbol filter takes the same index; a token name such as HYPE selects the perp of that name.

Page and follow. Newest first is the default, and nextCursor is null once a page holds fewer rows than limit. With order=asc the feed runs oldest first, which is how to follow it: keep the last nextCursor and send it back with the same filters. In this mode nextCursor is never null once you hold a cursor, so stop a walk at the first empty page, not at a null; an empty page returns the cursor you sent, so a poller keeps its place, and an empty first page returns null: poll again with the same parameters. A poller that moves forward by cursor never sees a row added late with an older key, nor one that lands in the same microsecond as its cursor row but sorts before it: if you must not miss one, re-read a small overlap with start and drop what you already hold, by ts, twap_id and status. Following a feed has the rules.

A TWAP line is a status change, not a fill

A row says a TWAP changed state, and its amounts are running totals. There is no row for each slice, so a TWAP in progress shows only its activated row until it ends. The slices are ordinary fills of the wallet; they carry no TWAP id in this API, so they cannot be listed per TWAP.

Rejected placements are hidden by default

Without status, rows with status=error are left out: a wallet that retries an order its margin cannot cover can produce thousands of them in a day, and none is a TWAP that ran. Pass status=error to read them; any other status returns only that status.

Example response
{  "wallet": "0x8ec5db10577f7171a6cb405b49722ded5eaf38da",  "items": [    {      "ts": "2026-10-27T12:13:04.041252+00:00",      "twap_id": 2420636,      "wallet": "0x8ec5db10577f7171a6cb405b49722ded5eaf38da",      "symbol": "WLD",      "side": "sell",      "status": "finished",      "size": 514400.0,      "executed_size": 514400.0,      "executed_notional_usd": 221262.627392,      "duration_minutes": 12,      "reduce_only": true,      "randomize": true,      "placed_at": "2026-10-27T12:01:02.491000+00:00",      "trigger_px": null,      "trigger_above": null,      "stop_px": null,      "error": null    },    {      "ts": "2026-10-27T12:01:02.491653+00:00",      "twap_id": 2420636,      "wallet": "0x8ec5db10577f7171a6cb405b49722ded5eaf38da",      "symbol": "WLD",      "side": "sell",      "status": "activated",      "size": 514400.0,      "executed_size": 0.0,      "executed_notional_usd": 0.0,      "duration_minutes": 12,      "reduce_only": true,      "randomize": true,      "placed_at": "2026-10-27T12:01:02.491000+00:00",      "trigger_px": null,      "trigger_above": null,      "stop_px": null,      "error": null    },    {      "ts": "2026-10-27T11:52:20.860601+00:00",      "twap_id": 2420568,      "wallet": "0x8ec5db10577f7171a6cb405b49722ded5eaf38da",      "symbol": "WLD",      "side": "buy",      "status": "terminated",      "size": 1000000.0,      "executed_size": 514400.0,      "executed_notional_usd": 222721.867641,      "duration_minutes": 12,      "reduce_only": false,      "randomize": true,      "placed_at": "2026-10-27T11:46:16.888000+00:00",      "trigger_px": null,      "trigger_above": null,      "stop_px": null,      "error": null    }  ],  "nextCursor": "<opaque cursor>"}