---
title: "Get Hyperliquid TWAP order events by wallet"
method: GET
path: "/v1/hyperliquid/twap/user/{user}"
tags: ["Hyperliquid - Orders"]
---

# Get Hyperliquid TWAP order events by wallet

`GET /v1/hyperliquid/twap/user/{user}`

## Request

- Base URL: `https://api.0xarchive.io`
- URL: `https://api.0xarchive.io/v1/hyperliquid/twap/user/{user}`
- Auth: API key in header `X-API-Key`

TWAP order status events: `activated`, `waitingForTrigger`, `finished`, `terminated`, `stopped`, and `error`. Each event carries the TWAP size, executed size and notional, duration, and trigger settings. This route returns the events of one wallet on Hyperliquid perpetuals. History starts June 17, 2026 18:00 UTC. Events are ordered oldest first. Page with `meta.next_cursor` until `meta.has_more` is false. A page never ends partway through a millisecond, so it can hold fewer events than `limit`.

## Path parameters

- `user` string, required

## Query parameters

- `start` union: An instant: Unix milliseconds, or an RFC 3339 string such as `2026-01-01T00:00:00Z` (encode a `+` offset as `%2B`). An unparsable value answers 400 `invalid_time_range`.
  - integer: Unix milliseconds.
  - string, date-time: RFC 3339 instant.
- `end` union: An instant: Unix milliseconds, or an RFC 3339 string such as `2026-01-01T00:00:00Z` (encode a `+` offset as `%2B`). An unparsable value answers 400 `invalid_time_range`.
  - integer: Unix milliseconds.
  - string, date-time: RFC 3339 instant.
- `cursor` string
- `limit` integer

## Response `200`

TWAP order status events for the wallet

- ApiResponseTwapArray
  - `success` boolean
  - `data` TwapRecord[]
    - `timestamp` string, date-time, required: When the status event happened (RFC 3339, UTC).
    - `block_time` string, date-time, required: Time of the block that carried the event (RFC 3339, UTC).
    - `block_number` integer, required: Hyperliquid block number.
    - `twap_id` integer, required: TWAP order ID. Every event of one TWAP carries the same ID.
    - `status` string, required: `activated`, `waitingForTrigger`, `finished`, `terminated`, `stopped`, or `error`.
    - `coin` string, required: Market symbol.
    - `user_address` string, required: Wallet that placed the TWAP, lowercase.
    - `side` 'B' | 'A', required: `B` (buy) or `A` (sell).
    - `size` number, required: Total TWAP size, in base units.
    - `executed_size` number, required: Size filled so far, in base units.
    - `executed_notional` number, required: Notional filled so far, in quote units.
    - `minutes` integer, required: TWAP duration in minutes.
    - `reduce_only` boolean, required: True for a reduce-only TWAP.
    - `randomize` boolean, required: True when slice timing is randomized.
    - `started_at` string, date-time, required: When the TWAP started (RFC 3339, UTC).
    - `trigger_px` number: Activation trigger price. Omitted for a TWAP without a trigger.
    - `trigger_above` boolean: True when the TWAP activates at or above `trigger_px`. Omitted for a TWAP without a trigger.
    - `stop_px` number: Price bound that ends the TWAP: the highest price for a buy, the lowest for a sell. Omitted when not set.
  - `meta` ApiMeta: Response metadata. Every 2xx JSON response carries `meta.request_id`; list payloads add `count`; cursor-paged routes add `has_more` and, when another page follows, `next_cursor`; per-symbol routes add `symbol` and `venue`. Fields that do not apply to a route are omitted.
    - `count` integer: Number of records returned
    - `has_more` boolean: Cursor-paged routes: whether another page follows. `next_cursor` is present exactly when this is `true`. A final page can be empty when the previous page was exactly full; `has_more` is `false` on it.
    - `next_cursor` string: Opaque cursor for the next page, present exactly when `has_more` is `true`. Pass it back unchanged as `cursor` with the same filters. Do not parse or construct it.
    - `request_id` string, uuid, required: Unique request ID for support
    - `symbol` string: Per-symbol routes: the canonical public symbol the response describes (for example `BTC`, `xyz:TSLA`, `HYPE-USDC`, `#0`).
    - `venue` 'hyperliquid' | 'hip3' | 'hip4' | 'spot' | 'lighter' | 'rh-lighter': Per-symbol routes: the venue the response describes.
    - `coverage_from` string, date-time: Earliest coverage for the requested symbol and data type. Present only when the requested window ends before coverage begins.
    - `notice` string: Human-readable advisory about the response. Used when the requested window ends before coverage begins for the symbol, and on CVD responses that are one page of several; may carry other advisories in future.
    - `finalized_through` string, date-time: Two-tier datasets (Lighter trades): data at or before this instant is final; later data is preliminary.
    - `requested_end` string, date-time, nullable: The `end` the request asked for, echoed when it was clamped to `finalized_through`.
    - `clamped_to` string, date-time, nullable: The boundary the request's `end` was clamped to, when clamping occurred.
    - `preliminary_row_count` integer, nullable: Number of preliminary rows in this response, on routes that intentionally serve preliminary data (Lighter `/recent`).

## Other responses

- `400`: Invalid request: a parameter, symbol, interval, cursor or time range failed validation. See `error_code`.
- `401`: Authentication required: the API key is missing or invalid.
- `403`: The request is outside the plan's history window or per-request span, or the key is not allowed to make it.
- `429`: Rate limit, concurrency limit or monthly credits exceeded. See `error_code`.
- `default`: Any other error. The body is an `ErrorResponse`; branch on `error_code`. A 503 (`upstream_unavailable`) carries `Retry-After`.

---

[API](https://skmtc.dev/0xarchive/apis/0xarchive-api-2.md) · [All operations](https://skmtc.dev/0xarchive/apis/0xarchive-api-2/llms.txt) · [OpenAPI document](https://skmtc.dev/0xarchive/apis/0xarchive-api-2/revisions/27076f55595f?raw)
