---
title: "Get Hyperliquid cumulative volume delta"
method: GET
path: "/v1/hyperliquid/cvd/{symbol}"
tags: ["Hyperliquid - Convenience"]
---

# Get Hyperliquid cumulative volume delta

`GET /v1/hyperliquid/cvd/{symbol}`

## Request

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

Get cumulative volume delta buckets for a Hyperliquid core symbol: taker buy and sell notional per bucket, their difference, and a running total. Intervals of 1h and longer roll up hourly totals; 1m, 5m, 15m and 30m are summed from taker fills. Live responses currently meter this route at 1 credit per request. Use `start`, `end`, and `interval` to bound the returned window.

**Buckets:** each bucket is labelled by its open time in UTC and is omitted when it holds no trades. 4h, 1d and 1w buckets open on UTC epoch boundaries, so 1w buckets open on Thursdays. Below 1h, a bucket is returned when it opens inside `[start, end]`, and it always covers its full interval. From 1h up, each bucket sums the hours that open inside `[start, end]`, so at 4h, 1d and 1w the first and last buckets of a window can be partial.

**Pagination:** a page holds up to `limit` buckets (default 500, max 10000). While more buckets may follow inside `[start, end]`, `meta.next_cursor` is set: pass it back as `cursor` with `start`, `end` and `interval` unchanged, and stop when it is absent. Below 1h a page can hold fewer than `limit` buckets and still carry a cursor, so stop on the cursor, not on a short page. At the default `limit`, a window of up to 500 buckets is always one page. Without `start` or `cursor`, the response is the newest `limit` buckets of the 24 hours before `end` (or before now, when `end` is later), with no cursor.

**Running total:** `cumulative_delta` is a running total of `delta` from the first bucket of each response, so it restarts on every page. To join pages, rebuild it from `delta`. A response that is one page of several says so in `meta.notice`.

## Path parameters

- `symbol` 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.
- `interval` '1m' | '5m' | '15m' | '30m' | '1h' | '4h' | '1d' | '1w'
- `cursor` string
- `limit` integer

## Response `200`

CVD buckets

- ApiResponseCvdBucketArray: API response containing CVD buckets.
  - `success` boolean
  - `data` CvdBucket[]
    - `timestamp` union, required: Bucket open time (UTC). By default an integer, Unix milliseconds. With `0xArchive-Version: 2026-10-01` an RFC 3339 UTC string with millisecond precision, and the integer moves to `timestamp_ms`.
      - integer: Default: Unix milliseconds.
      - string, date-time: Version 2026-10-01: RFC 3339 UTC.
    - `timestamp_ms` integer: With `0xArchive-Version: 2026-10-01` only: `timestamp` as Unix milliseconds.
    - `buy_volume` number, required: Buy-side volume for the bucket.
    - `sell_volume` number, required: Sell-side volume for the bucket.
    - `delta` number, required: buy_volume minus sell_volume for this bucket.
    - `cumulative_delta` number, required: Running total of `delta` from the first bucket of this response. It restarts on every page, so rebuild it from `delta` when joining pages.
  - `meta` ResponseMeta: 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)
