Route Metadata
| Field | Value |
|---|---|
| Method | GET |
| Path | /v1/lighter/liquidations/{symbol} |
| operationId | getLighterLiquidations |
| Tag | Lighter - Liquidations |
| Family | Lighter |
| Deprecated or legacy | no |
Human endpoint reference
OpenGET /v1/lighter/liquidations/{symbol} for authentication, parameters, responses, and examples.
Request Parameters
Path Parameters
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "getLighterLiquidations path parameters",
"type": "object",
"required": [
"symbol"
],
"properties": {
"symbol": {
"description": "Lighter market symbol.",
"type": "string",
"example": "BTC",
"x-parameter-location": "path"
}
}
}
Query Parameters
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "getLighterLiquidations query parameters",
"type": "object",
"properties": {
"start": {
"description": "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`.",
"oneOf": [
{
"description": "Unix milliseconds.",
"type": "integer",
"format": "int64",
"example": 1767225600000
},
{
"description": "RFC 3339 instant.",
"type": "string",
"format": "date-time",
"example": "2026-01-01T00:00:00Z"
}
],
"x-parameter-location": "query"
},
"end": {
"description": "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`.",
"oneOf": [
{
"description": "Unix milliseconds.",
"type": "integer",
"format": "int64",
"example": 1767225600000
},
{
"description": "RFC 3339 instant.",
"type": "string",
"format": "date-time",
"example": "2026-01-01T00:00:00Z"
}
],
"x-parameter-location": "query"
},
"cursor": {
"description": "Opaque pagination cursor: pass `meta.next_cursor` from the previous page unchanged, with the same filters. Omit it for the first page.",
"type": "string",
"x-parameter-location": "query"
},
"limit": {
"description": "Maximum number of results (default: 100, max: 1000)",
"type": "integer",
"default": 100,
"maximum": 1000,
"x-parameter-location": "query"
}
}
}
Header Parameters
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "getLighterLiquidations header parameters",
"type": "object",
"properties": {
"0xArchive-Version": {
"description": "Selects the 2026-10 response contract. Send `2026-10-01`; any dated version on or after it selects the same shapes. Without the header every response keeps its existing shape. With it:\n\n- The data quality routes, `/v1/status/coverage` and `/v1/symbols` answer the standard `{success, data, meta}` envelope.\n- Record times that are integer milliseconds by default become RFC 3339 UTC strings with millisecond precision, and the integer moves to a `*_ms` field: L4 resting-order `timestamp` (`timestamp_ms`), CVD buckets, HIP-3 oracle reads, Lighter and Lighter on Robinhood Chain liquidations and liquidation volume. Levels and trigger-levels `snapshot_ts` become RFC 3339 with `snapshot_ts_ms`.\n- Error bodies carry the contract `error_code` names: `invalid_parameter` instead of `invalid_query_params` and `invalid_path_params`, `historical_depth_exceeded` instead of `history_window_exceeded`, and `historical_range_exceeded` instead of `request_range_exceeded`; a malformed cursor that fails to parse answers 400 `invalid_cursor` instead of `invalid_query_params`. With `0xArchive-Version: 2026-10-01`, malformed cursors on trades, liquidations, L2 and L4 diffs, order history, TP/SL and order-flow routes answer 400 `invalid_cursor`. Without the header, the first six route families treat a malformed cursor as no cursor and return the first page; order flow answers 400 `invalid_query_params`. Malformed trade time inputs answer 400 `invalid_time_range` with the header and 400 `invalid_query_params` without it.\n\nThe response echoes the selected version in its own `0xArchive-Version` header.",
"type": "string",
"enum": [
"2026-10-01"
],
"example": "2026-10-01",
"x-parameter-location": "header"
}
}
}
Response Contracts
Status 200
Lighter liquidation eventsapplication/json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "getLighterLiquidations response 200",
"description": "API response containing an array of native Lighter liquidation events",
"type": "object",
"properties": {
"data": {
"type": "array",
"items": {
"description": "Native Lighter liquidation event. Raw ask/bid account fields are preserved instead of a derived `liquidated_user`: the upstream payload does not reliably flag which side was liquidated, so the liquidated side is derived at read time from position signs. Margin and fee integer fields are raw upstream units.",
"type": "object",
"required": [
"ask_account",
"ask_order_id",
"bid_account",
"bid_order_id",
"block_height",
"is_maker_ask",
"liquidation_type",
"maker_allocated_margin_usdc_after",
"maker_allocated_margin_usdc_before",
"maker_entry_quote_before",
"maker_fee",
"maker_initial_margin_fraction_before",
"maker_position_sign_changed",
"maker_position_size_before",
"price",
"raw_json",
"size",
"source",
"symbol",
"taker_allocated_margin_usdc_after",
"taker_allocated_margin_usdc_before",
"taker_entry_quote_before",
"taker_fee",
"taker_initial_margin_fraction_before",
"taker_position_sign_changed",
"taker_position_size_before",
"timestamp",
"trade_id",
"transaction_time_us",
"tx_hash",
"usd_amount"
],
"properties": {
"ask_account": {
"description": "Lighter account index on the ask side (serialized as a string)",
"type": "string",
"example": "728637"
},
"ask_order_id": {
"description": "Order ID on the ask side",
"type": "integer",
"format": "int64",
"example": 562952982931319
},
"bid_account": {
"description": "Lighter account index on the bid side (serialized as a string)",
"type": "string",
"example": "726722"
},
"bid_order_id": {
"description": "Order ID on the bid side",
"type": "integer",
"format": "int64",
"example": 844421854021817
},
"block_height": {
"description": "Lighter L2 block height containing the liquidation",
"type": "integer",
"format": "int64",
"example": 300340672
},
"is_maker_ask": {
"description": "True if the maker was on the ask side",
"type": "boolean",
"example": false
},
"liquidation_type": {
"description": "Upstream liquidation type",
"type": "string",
"example": "liquidation"
},
"maker_allocated_margin_usdc_after": {
"description": "Maker's isolated-margin USDC allocation after the fill (raw upstream units)",
"type": "integer",
"format": "int64",
"example": 0
},
"maker_allocated_margin_usdc_before": {
"description": "Maker's isolated-margin USDC allocation before the fill (raw upstream units)",
"type": "integer",
"format": "int64",
"example": 0
},
"maker_entry_quote_before": {
"description": "Maker's position entry quote value before the fill",
"type": "number",
"example": 120665.315247
},
"maker_fee": {
"description": "Maker fee (raw upstream units)",
"type": "integer",
"example": 28
},
"maker_initial_margin_fraction_before": {
"description": "Maker's initial margin fraction before the fill (raw upstream units)",
"type": "integer",
"example": 500
},
"maker_position_sign_changed": {
"description": "True if the fill flipped the maker's position between long and short",
"type": "boolean",
"example": false
},
"maker_position_size_before": {
"description": "Maker's signed position size before the fill",
"type": "number",
"example": -1.85452
},
"price": {
"description": "Execution price",
"type": "number",
"example": 64921.9
},
"raw_json": {
"description": "Raw upstream payload as received from Lighter. Empty for rows backfilled from the venue's finalized export (`source: \"bucket\"`, Lighter on Robinhood Chain).",
"type": "string"
},
"size": {
"description": "Liquidated size in base units",
"type": "number",
"example": 0.18476
},
"source": {
"description": "Row provenance: `ws` for live capture; `bucket` for rows backfilled from the venue's finalized export (Lighter on Robinhood Chain), which carry an empty `raw_json`.",
"type": "string",
"example": "ws"
},
"symbol": {
"description": "Trading pair symbol",
"type": "string",
"example": "BTC"
},
"taker_allocated_margin_usdc_after": {
"description": "Taker's isolated-margin USDC allocation after the fill (raw upstream units)",
"type": "integer",
"format": "int64",
"example": 23859483
},
"taker_allocated_margin_usdc_before": {
"description": "Taker's isolated-margin USDC allocation before the fill (raw upstream units)",
"type": "integer",
"format": "int64",
"example": 259232053
},
"taker_entry_quote_before": {
"description": "Taker's position entry quote value before the fill",
"type": "number",
"example": 12945.451185
},
"taker_fee": {
"description": "Taker fee (raw upstream units)",
"type": "integer",
"example": 10000
},
"taker_initial_margin_fraction_before": {
"description": "Taker's initial margin fraction before the fill (raw upstream units)",
"type": "integer",
"example": 200
},
"taker_position_sign_changed": {
"description": "True if the fill flipped the taker's position between long and short",
"type": "boolean",
"example": false
},
"taker_position_size_before": {
"description": "Taker's signed position size before the fill (long positive, short negative)",
"type": "number",
"example": 0.19771
},
"timestamp": {
"description": "Liquidation time. 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`.",
"oneOf": [
{
"description": "Default: Unix milliseconds.",
"type": "integer",
"format": "int64",
"example": 1785116108743
},
{
"description": "Version 2026-10-01: RFC 3339 UTC.",
"type": "string",
"format": "date-time",
"example": "2026-01-01T00:00:00.000Z"
}
]
},
"timestamp_ms": {
"description": "With `0xArchive-Version: 2026-10-01` only: `timestamp` as Unix milliseconds.",
"type": "integer",
"format": "int64",
"example": 1767225600000
},
"trade_id": {
"description": "Unique Lighter trade ID of the liquidation fill",
"type": "integer",
"format": "int64",
"example": 26144238102
},
"transaction_time_us": {
"description": "Intra-block transaction time in microseconds",
"type": "integer",
"format": "int64",
"example": 1785116108751813
},
"tx_hash": {
"description": "Lighter settlement transaction hash (fixed-width hex)",
"type": "string",
"example": "000000198190c10e0000019fa13627c7000000000000000000000000000000000000000000000000"
},
"usd_amount": {
"description": "Notional value of the liquidation in USD",
"type": "number",
"example": 11994.970244
}
}
}
},
"meta": {
"description": "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.",
"type": "object",
"required": [
"request_id"
],
"properties": {
"clamped_to": {
"description": "The boundary the request's `end` was clamped to, when clamping occurred.",
"type": "string",
"format": "date-time",
"nullable": true
},
"count": {
"description": "Number of records returned",
"type": "integer"
},
"coverage_from": {
"description": "Earliest coverage for the requested symbol and data type. Present only when the requested window ends before coverage begins.",
"type": "string",
"format": "date-time"
},
"finalized_through": {
"description": "Two-tier datasets (Lighter trades): data at or before this instant is final; later data is preliminary.",
"type": "string",
"format": "date-time"
},
"has_more": {
"description": "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.",
"type": "boolean"
},
"next_cursor": {
"description": "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.",
"type": "string"
},
"notice": {
"description": "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.",
"type": "string"
},
"preliminary_row_count": {
"description": "Number of preliminary rows in this response, on routes that intentionally serve preliminary data (Lighter `/recent`).",
"type": "integer",
"nullable": true
},
"request_id": {
"description": "Unique request ID for support",
"type": "string",
"format": "uuid"
},
"requested_end": {
"description": "The `end` the request asked for, echoed when it was clamped to `finalized_through`.",
"type": "string",
"format": "date-time",
"nullable": true
},
"symbol": {
"description": "Per-symbol routes: the canonical public symbol the response describes (for example `BTC`, `xyz:TSLA`, `HYPE-USDC`, `#0`).",
"type": "string",
"example": "BTC"
},
"venue": {
"description": "Per-symbol routes: the venue the response describes.",
"type": "string",
"enum": [
"hyperliquid",
"hip3",
"hip4",
"spot",
"lighter",
"rh-lighter"
],
"example": "hyperliquid"
}
}
},
"success": {
"type": "boolean",
"example": true
}
}
}
Status 400
Invalid request: a parameter, symbol, interval, cursor or time range failed validation. Seeerror_code.
application/json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "getLighterLiquidations response 400",
"description": "Body of every non-2xx JSON response. `code` repeats the HTTP status, `error_code` is the stable machine-readable code (see `ErrorCode`), `error` is a human-readable message, and `request_id` identifies the request for support. Validation failures add `param` and, where the accepted set is fixed, `valid_values`. A 404 for a datatype the venue does not offer (`unsupported_for_venue`) adds `venue`, `datatype` and `available_on`; any other unknown path answers 404 `route_not_found`.",
"type": "object",
"required": [
"code",
"error",
"error_code",
"request_id",
"success"
],
"properties": {
"available_on": {
"description": "`unsupported_for_venue` only: the venues and routes that serve the datatype.",
"type": "array",
"items": {
"type": "object",
"required": [
"route",
"venue"
],
"properties": {
"route": {
"type": "string",
"example": "/v1/hyperliquid/orders/{symbol}/flow"
},
"venue": {
"type": "string",
"example": "hyperliquid"
}
}
}
},
"code": {
"description": "HTTP status code.",
"type": "integer",
"example": 400
},
"credits_limit": {
"description": "`insufficient_credits` only: the period's credit allowance.",
"type": "integer",
"format": "int64"
},
"credits_used": {
"description": "`insufficient_credits` only: credits used this period.",
"type": "integer",
"format": "int64"
},
"datatype": {
"description": "`unsupported_for_venue` only: the datatype the request asked for, as `GET /v1/capabilities` names it.",
"type": "string",
"example": "order_flow"
},
"error": {
"description": "Human-readable message. Wording can change; do not parse it.",
"type": "string"
},
"error_code": {
"description": "Stable, machine-readable error code. Branch on this value, not on the `error` text.\n\n**Contract codes**\n\n| Code | HTTP | Meaning |\n|---|---|---|\n| `invalid_parameter` | 400 | A parameter failed to parse or validate. `param` names it and `valid_values` lists accepted values where the set is fixed. |\n| `invalid_symbol` | 400 | The symbol is not listed on this venue. |\n| `invalid_interval` | 400 | The `interval` (bucket width) is not one this route accepts. |\n| `invalid_cursor` | 400 | The `cursor` is malformed, stale, or was issued for other filters. Restart pagination without a cursor. Trades, liquidations, L2 and L4 diffs, order history and TP/SL routes currently return the first page for a malformed cursor instead. |\n| `invalid_time_range` | 400 | `start` is after `end`, or a time value could not be parsed. |\n| `range_before_coverage` | 400 | The whole requested range ends before the first instant this dataset is served from. |\n| `historical_range_exceeded` | 403 | The requested span is longer than the plan allows in one request or replay. |\n| `historical_depth_exceeded` | 403 | The request reaches further back than the plan's history window. |\n| `unsupported_for_venue` | 404 | The venue does not offer this datatype. The message, `datatype` and `available_on` name where it is served. |\n| `route_not_found` | 404 | No route matches the path or method. `GET /v1/capabilities` lists the routes each venue serves. |\n| `not_found` | 404 | The route exists but the requested resource (for example an incident, endpoint or outcome id) does not. |\n| `unauthorized` | 401 | The API key is missing or invalid. |\n| `forbidden` | 403 | The key is valid but not allowed to make this request. |\n| `insufficient_credits` | 429 | The monthly credit allowance is spent (402 on pay-per-request routes). |\n| `rate_limited` | 429 | Too many requests or concurrent queries. Retry after the interval in the rate-limit headers. |\n| `conflict` | 409 | The request conflicts with the current state of the resource. |\n| `upstream_unavailable` | 503 | A dependency is unavailable or saturated. Retry shortly; the response carries `Retry-After`. |\n| `internal_error` | 500 | An unexpected server error. Quote `request_id` when contacting support. |\n\n**WebSocket only** (sent in `{\"type\":\"error\"}` messages, never by REST)\n\n| Code | Where | Meaning |\n|---|---|---|\n| `endpoint_unsupported` | WebSocket | This WebSocket endpoint does not serve the channel or operation. The message names the endpoint that does. |\n| `slow_consumer` | WebSocket | The connection fell behind a stream and messages were dropped. Re-subscribe, or restart the replay, to resynchronise. |\n\n**Route-specific codes**\n\n| Code | HTTP | Meaning |\n|---|---|---|\n| `positions_unavailable` | 503 | Account positions are temporarily unavailable for this venue. |\n| `reconstruction_unavailable` | 503 | The as-of positions state for this instant cannot be reconstructed right now. |\n| `snapshot_advanced` | 409 | A positions market cursor pinned a snapshot that has since been replaced or expired. Restart pagination. |\n| `pagination_unavailable` | 503 | The next positions page cannot be served right now. Retry the same cursor shortly. |\n| `api_key_limit_reached` | 403 | The account already holds the maximum number of API keys for its plan. |\n| `wallet_requires_plan` | 402 | A wallet-authenticated key needs an active plan for this request. |\n| `wallet_account_required` | 403 | Wallet sign-in needs an existing account linked to the wallet. |\n| `wallet_free_signup_retired` | 410 | Free wallet sign-up is no longer offered. |\n| `account_disabled` | 403 | The account is disabled. |\n| `oauth_not_permitted` | 403 | This route is not available to OAuth access tokens. |\n| `insufficient_scope` | 403 | The OAuth access token lacks the scope this route requires. |\n\n**Legacy names.** Requests without `0xArchive-Version: 2026-10-01` keep the four names that predate the contract; with the header they receive the contract names instead.\n\n| Code | HTTP | Meaning |\n|---|---|---|\n| `invalid_query_params` | 400 | Legacy name of `invalid_parameter` (query parameter), or of `invalid_cursor` when the parameter is `cursor`, sent without the version header. |\n| `invalid_path_params` | 400 | Legacy name of `invalid_parameter` (path parameter), sent without the version header. |\n| `history_window_exceeded` | 403 | Legacy name of `historical_depth_exceeded`, sent without the version header. |\n| `request_range_exceeded` | 403 | Legacy name of `historical_range_exceeded`, sent without the version header. |\n\nTreat any value not listed here as a generic error of the HTTP status.",
"type": "string",
"enum": [
"invalid_parameter",
"invalid_symbol",
"invalid_interval",
"invalid_cursor",
"invalid_time_range",
"range_before_coverage",
"historical_range_exceeded",
"historical_depth_exceeded",
"unsupported_for_venue",
"route_not_found",
"not_found",
"unauthorized",
"forbidden",
"insufficient_credits",
"rate_limited",
"conflict",
"upstream_unavailable",
"internal_error",
"endpoint_unsupported",
"slow_consumer",
"positions_unavailable",
"reconstruction_unavailable",
"snapshot_advanced",
"pagination_unavailable",
"api_key_limit_reached",
"wallet_requires_plan",
"wallet_account_required",
"wallet_free_signup_retired",
"account_disabled",
"oauth_not_permitted",
"insufficient_scope",
"invalid_query_params",
"invalid_path_params",
"history_window_exceeded",
"request_range_exceeded"
],
"example": "invalid_parameter"
},
"max_concurrent": {
"description": "`rate_limited` concurrency refusals only: simultaneous queries the plan allows.",
"type": "integer"
},
"param": {
"description": "The parameter that failed validation, when one did.",
"type": "string",
"example": "side"
},
"request_id": {
"description": "Unique request ID for support.",
"type": "string",
"format": "uuid"
},
"success": {
"description": "Always `false` on an error.",
"type": "boolean",
"enum": [
false
]
},
"suggestion": {
"description": "Present when the symbol exists on another venue: where to request it instead.",
"type": "object",
"properties": {
"endpoint": {
"type": "string",
"example": "/v1/hyperliquid/hip3/trades/xyz:TSLA"
},
"symbol": {
"type": "string",
"example": "xyz:TSLA"
},
"venue": {
"type": "string",
"example": "hip3"
}
}
},
"valid_values": {
"description": "Accepted values of `param`, when the set is fixed.",
"type": "array",
"items": {
"type": "string"
},
"example": [
"buy",
"sell"
]
},
"venue": {
"description": "`unsupported_for_venue` only: the venue the request asked.",
"type": "string",
"example": "spot"
}
}
}
OpenAPI example: current_main
{
"code": 400,
"error": "Failed to deserialize query string: limit: invalid digit found in string",
"error_code": "invalid_query_params",
"param": "limit",
"request_id": "3f2a9c71-5b0e-4d68-9a4c-7e1d2b6f8a05",
"success": false
}
OpenAPI example: invalid_parameter
{
"success": false,
"code": 400,
"error_code": "invalid_parameter",
"error": "Invalid side 'up'. Use buy or sell.",
"request_id": "3f2a9c71-5b0e-4d68-9a4c-7e1d2b6f8a05",
"param": "side",
"valid_values": [
"buy",
"sell"
]
}
OpenAPI example: invalid_symbol
{
"success": false,
"code": 400,
"error_code": "invalid_symbol",
"error": "The symbol 'ZZZ' does not exist. Please see /v1/hyperliquid/instruments for available symbols.",
"request_id": "3f2a9c71-5b0e-4d68-9a4c-7e1d2b6f8a05",
"param": "symbol"
}
OpenAPI example: invalid_time_range
{
"success": false,
"code": 400,
"error_code": "invalid_time_range",
"error": "start must be <= end",
"request_id": "3f2a9c71-5b0e-4d68-9a4c-7e1d2b6f8a05"
}
OpenAPI example: legacy_invalid_query_params
{
"success": false,
"code": 400,
"error_code": "invalid_query_params",
"error": "Failed to deserialize query string: limit: invalid digit found in string",
"request_id": "3f2a9c71-5b0e-4d68-9a4c-7e1d2b6f8a05"
}
Status 401
Authentication required: the API key is missing or invalid.application/json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "getLighterLiquidations response 401",
"description": "Body of every non-2xx JSON response. `code` repeats the HTTP status, `error_code` is the stable machine-readable code (see `ErrorCode`), `error` is a human-readable message, and `request_id` identifies the request for support. Validation failures add `param` and, where the accepted set is fixed, `valid_values`. A 404 for a datatype the venue does not offer (`unsupported_for_venue`) adds `venue`, `datatype` and `available_on`; any other unknown path answers 404 `route_not_found`.",
"type": "object",
"required": [
"code",
"error",
"error_code",
"request_id",
"success"
],
"properties": {
"available_on": {
"description": "`unsupported_for_venue` only: the venues and routes that serve the datatype.",
"type": "array",
"items": {
"type": "object",
"required": [
"route",
"venue"
],
"properties": {
"route": {
"type": "string",
"example": "/v1/hyperliquid/orders/{symbol}/flow"
},
"venue": {
"type": "string",
"example": "hyperliquid"
}
}
}
},
"code": {
"description": "HTTP status code.",
"type": "integer",
"example": 400
},
"credits_limit": {
"description": "`insufficient_credits` only: the period's credit allowance.",
"type": "integer",
"format": "int64"
},
"credits_used": {
"description": "`insufficient_credits` only: credits used this period.",
"type": "integer",
"format": "int64"
},
"datatype": {
"description": "`unsupported_for_venue` only: the datatype the request asked for, as `GET /v1/capabilities` names it.",
"type": "string",
"example": "order_flow"
},
"error": {
"description": "Human-readable message. Wording can change; do not parse it.",
"type": "string"
},
"error_code": {
"description": "Stable, machine-readable error code. Branch on this value, not on the `error` text.\n\n**Contract codes**\n\n| Code | HTTP | Meaning |\n|---|---|---|\n| `invalid_parameter` | 400 | A parameter failed to parse or validate. `param` names it and `valid_values` lists accepted values where the set is fixed. |\n| `invalid_symbol` | 400 | The symbol is not listed on this venue. |\n| `invalid_interval` | 400 | The `interval` (bucket width) is not one this route accepts. |\n| `invalid_cursor` | 400 | The `cursor` is malformed, stale, or was issued for other filters. Restart pagination without a cursor. Trades, liquidations, L2 and L4 diffs, order history and TP/SL routes currently return the first page for a malformed cursor instead. |\n| `invalid_time_range` | 400 | `start` is after `end`, or a time value could not be parsed. |\n| `range_before_coverage` | 400 | The whole requested range ends before the first instant this dataset is served from. |\n| `historical_range_exceeded` | 403 | The requested span is longer than the plan allows in one request or replay. |\n| `historical_depth_exceeded` | 403 | The request reaches further back than the plan's history window. |\n| `unsupported_for_venue` | 404 | The venue does not offer this datatype. The message, `datatype` and `available_on` name where it is served. |\n| `route_not_found` | 404 | No route matches the path or method. `GET /v1/capabilities` lists the routes each venue serves. |\n| `not_found` | 404 | The route exists but the requested resource (for example an incident, endpoint or outcome id) does not. |\n| `unauthorized` | 401 | The API key is missing or invalid. |\n| `forbidden` | 403 | The key is valid but not allowed to make this request. |\n| `insufficient_credits` | 429 | The monthly credit allowance is spent (402 on pay-per-request routes). |\n| `rate_limited` | 429 | Too many requests or concurrent queries. Retry after the interval in the rate-limit headers. |\n| `conflict` | 409 | The request conflicts with the current state of the resource. |\n| `upstream_unavailable` | 503 | A dependency is unavailable or saturated. Retry shortly; the response carries `Retry-After`. |\n| `internal_error` | 500 | An unexpected server error. Quote `request_id` when contacting support. |\n\n**WebSocket only** (sent in `{\"type\":\"error\"}` messages, never by REST)\n\n| Code | Where | Meaning |\n|---|---|---|\n| `endpoint_unsupported` | WebSocket | This WebSocket endpoint does not serve the channel or operation. The message names the endpoint that does. |\n| `slow_consumer` | WebSocket | The connection fell behind a stream and messages were dropped. Re-subscribe, or restart the replay, to resynchronise. |\n\n**Route-specific codes**\n\n| Code | HTTP | Meaning |\n|---|---|---|\n| `positions_unavailable` | 503 | Account positions are temporarily unavailable for this venue. |\n| `reconstruction_unavailable` | 503 | The as-of positions state for this instant cannot be reconstructed right now. |\n| `snapshot_advanced` | 409 | A positions market cursor pinned a snapshot that has since been replaced or expired. Restart pagination. |\n| `pagination_unavailable` | 503 | The next positions page cannot be served right now. Retry the same cursor shortly. |\n| `api_key_limit_reached` | 403 | The account already holds the maximum number of API keys for its plan. |\n| `wallet_requires_plan` | 402 | A wallet-authenticated key needs an active plan for this request. |\n| `wallet_account_required` | 403 | Wallet sign-in needs an existing account linked to the wallet. |\n| `wallet_free_signup_retired` | 410 | Free wallet sign-up is no longer offered. |\n| `account_disabled` | 403 | The account is disabled. |\n| `oauth_not_permitted` | 403 | This route is not available to OAuth access tokens. |\n| `insufficient_scope` | 403 | The OAuth access token lacks the scope this route requires. |\n\n**Legacy names.** Requests without `0xArchive-Version: 2026-10-01` keep the four names that predate the contract; with the header they receive the contract names instead.\n\n| Code | HTTP | Meaning |\n|---|---|---|\n| `invalid_query_params` | 400 | Legacy name of `invalid_parameter` (query parameter), or of `invalid_cursor` when the parameter is `cursor`, sent without the version header. |\n| `invalid_path_params` | 400 | Legacy name of `invalid_parameter` (path parameter), sent without the version header. |\n| `history_window_exceeded` | 403 | Legacy name of `historical_depth_exceeded`, sent without the version header. |\n| `request_range_exceeded` | 403 | Legacy name of `historical_range_exceeded`, sent without the version header. |\n\nTreat any value not listed here as a generic error of the HTTP status.",
"type": "string",
"enum": [
"invalid_parameter",
"invalid_symbol",
"invalid_interval",
"invalid_cursor",
"invalid_time_range",
"range_before_coverage",
"historical_range_exceeded",
"historical_depth_exceeded",
"unsupported_for_venue",
"route_not_found",
"not_found",
"unauthorized",
"forbidden",
"insufficient_credits",
"rate_limited",
"conflict",
"upstream_unavailable",
"internal_error",
"endpoint_unsupported",
"slow_consumer",
"positions_unavailable",
"reconstruction_unavailable",
"snapshot_advanced",
"pagination_unavailable",
"api_key_limit_reached",
"wallet_requires_plan",
"wallet_account_required",
"wallet_free_signup_retired",
"account_disabled",
"oauth_not_permitted",
"insufficient_scope",
"invalid_query_params",
"invalid_path_params",
"history_window_exceeded",
"request_range_exceeded"
],
"example": "invalid_parameter"
},
"max_concurrent": {
"description": "`rate_limited` concurrency refusals only: simultaneous queries the plan allows.",
"type": "integer"
},
"param": {
"description": "The parameter that failed validation, when one did.",
"type": "string",
"example": "side"
},
"request_id": {
"description": "Unique request ID for support.",
"type": "string",
"format": "uuid"
},
"success": {
"description": "Always `false` on an error.",
"type": "boolean",
"enum": [
false
]
},
"suggestion": {
"description": "Present when the symbol exists on another venue: where to request it instead.",
"type": "object",
"properties": {
"endpoint": {
"type": "string",
"example": "/v1/hyperliquid/hip3/trades/xyz:TSLA"
},
"symbol": {
"type": "string",
"example": "xyz:TSLA"
},
"venue": {
"type": "string",
"example": "hip3"
}
}
},
"valid_values": {
"description": "Accepted values of `param`, when the set is fixed.",
"type": "array",
"items": {
"type": "string"
},
"example": [
"buy",
"sell"
]
},
"venue": {
"description": "`unsupported_for_venue` only: the venue the request asked.",
"type": "string",
"example": "spot"
}
}
}
OpenAPI example
{
"success": false,
"code": 401,
"error_code": "unauthorized",
"error": "Missing authentication credentials. Provide X-API-Key header or Bearer token.",
"request_id": "3f2a9c71-5b0e-4d68-9a4c-7e1d2b6f8a05"
}
Status 403
The request is outside the plan’s history window or per-request span, or the key is not allowed to make it.application/json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "getLighterLiquidations response 403",
"description": "Body of every non-2xx JSON response. `code` repeats the HTTP status, `error_code` is the stable machine-readable code (see `ErrorCode`), `error` is a human-readable message, and `request_id` identifies the request for support. Validation failures add `param` and, where the accepted set is fixed, `valid_values`. A 404 for a datatype the venue does not offer (`unsupported_for_venue`) adds `venue`, `datatype` and `available_on`; any other unknown path answers 404 `route_not_found`.",
"type": "object",
"required": [
"code",
"error",
"error_code",
"request_id",
"success"
],
"properties": {
"available_on": {
"description": "`unsupported_for_venue` only: the venues and routes that serve the datatype.",
"type": "array",
"items": {
"type": "object",
"required": [
"route",
"venue"
],
"properties": {
"route": {
"type": "string",
"example": "/v1/hyperliquid/orders/{symbol}/flow"
},
"venue": {
"type": "string",
"example": "hyperliquid"
}
}
}
},
"code": {
"description": "HTTP status code.",
"type": "integer",
"example": 400
},
"credits_limit": {
"description": "`insufficient_credits` only: the period's credit allowance.",
"type": "integer",
"format": "int64"
},
"credits_used": {
"description": "`insufficient_credits` only: credits used this period.",
"type": "integer",
"format": "int64"
},
"datatype": {
"description": "`unsupported_for_venue` only: the datatype the request asked for, as `GET /v1/capabilities` names it.",
"type": "string",
"example": "order_flow"
},
"error": {
"description": "Human-readable message. Wording can change; do not parse it.",
"type": "string"
},
"error_code": {
"description": "Stable, machine-readable error code. Branch on this value, not on the `error` text.\n\n**Contract codes**\n\n| Code | HTTP | Meaning |\n|---|---|---|\n| `invalid_parameter` | 400 | A parameter failed to parse or validate. `param` names it and `valid_values` lists accepted values where the set is fixed. |\n| `invalid_symbol` | 400 | The symbol is not listed on this venue. |\n| `invalid_interval` | 400 | The `interval` (bucket width) is not one this route accepts. |\n| `invalid_cursor` | 400 | The `cursor` is malformed, stale, or was issued for other filters. Restart pagination without a cursor. Trades, liquidations, L2 and L4 diffs, order history and TP/SL routes currently return the first page for a malformed cursor instead. |\n| `invalid_time_range` | 400 | `start` is after `end`, or a time value could not be parsed. |\n| `range_before_coverage` | 400 | The whole requested range ends before the first instant this dataset is served from. |\n| `historical_range_exceeded` | 403 | The requested span is longer than the plan allows in one request or replay. |\n| `historical_depth_exceeded` | 403 | The request reaches further back than the plan's history window. |\n| `unsupported_for_venue` | 404 | The venue does not offer this datatype. The message, `datatype` and `available_on` name where it is served. |\n| `route_not_found` | 404 | No route matches the path or method. `GET /v1/capabilities` lists the routes each venue serves. |\n| `not_found` | 404 | The route exists but the requested resource (for example an incident, endpoint or outcome id) does not. |\n| `unauthorized` | 401 | The API key is missing or invalid. |\n| `forbidden` | 403 | The key is valid but not allowed to make this request. |\n| `insufficient_credits` | 429 | The monthly credit allowance is spent (402 on pay-per-request routes). |\n| `rate_limited` | 429 | Too many requests or concurrent queries. Retry after the interval in the rate-limit headers. |\n| `conflict` | 409 | The request conflicts with the current state of the resource. |\n| `upstream_unavailable` | 503 | A dependency is unavailable or saturated. Retry shortly; the response carries `Retry-After`. |\n| `internal_error` | 500 | An unexpected server error. Quote `request_id` when contacting support. |\n\n**WebSocket only** (sent in `{\"type\":\"error\"}` messages, never by REST)\n\n| Code | Where | Meaning |\n|---|---|---|\n| `endpoint_unsupported` | WebSocket | This WebSocket endpoint does not serve the channel or operation. The message names the endpoint that does. |\n| `slow_consumer` | WebSocket | The connection fell behind a stream and messages were dropped. Re-subscribe, or restart the replay, to resynchronise. |\n\n**Route-specific codes**\n\n| Code | HTTP | Meaning |\n|---|---|---|\n| `positions_unavailable` | 503 | Account positions are temporarily unavailable for this venue. |\n| `reconstruction_unavailable` | 503 | The as-of positions state for this instant cannot be reconstructed right now. |\n| `snapshot_advanced` | 409 | A positions market cursor pinned a snapshot that has since been replaced or expired. Restart pagination. |\n| `pagination_unavailable` | 503 | The next positions page cannot be served right now. Retry the same cursor shortly. |\n| `api_key_limit_reached` | 403 | The account already holds the maximum number of API keys for its plan. |\n| `wallet_requires_plan` | 402 | A wallet-authenticated key needs an active plan for this request. |\n| `wallet_account_required` | 403 | Wallet sign-in needs an existing account linked to the wallet. |\n| `wallet_free_signup_retired` | 410 | Free wallet sign-up is no longer offered. |\n| `account_disabled` | 403 | The account is disabled. |\n| `oauth_not_permitted` | 403 | This route is not available to OAuth access tokens. |\n| `insufficient_scope` | 403 | The OAuth access token lacks the scope this route requires. |\n\n**Legacy names.** Requests without `0xArchive-Version: 2026-10-01` keep the four names that predate the contract; with the header they receive the contract names instead.\n\n| Code | HTTP | Meaning |\n|---|---|---|\n| `invalid_query_params` | 400 | Legacy name of `invalid_parameter` (query parameter), or of `invalid_cursor` when the parameter is `cursor`, sent without the version header. |\n| `invalid_path_params` | 400 | Legacy name of `invalid_parameter` (path parameter), sent without the version header. |\n| `history_window_exceeded` | 403 | Legacy name of `historical_depth_exceeded`, sent without the version header. |\n| `request_range_exceeded` | 403 | Legacy name of `historical_range_exceeded`, sent without the version header. |\n\nTreat any value not listed here as a generic error of the HTTP status.",
"type": "string",
"enum": [
"invalid_parameter",
"invalid_symbol",
"invalid_interval",
"invalid_cursor",
"invalid_time_range",
"range_before_coverage",
"historical_range_exceeded",
"historical_depth_exceeded",
"unsupported_for_venue",
"route_not_found",
"not_found",
"unauthorized",
"forbidden",
"insufficient_credits",
"rate_limited",
"conflict",
"upstream_unavailable",
"internal_error",
"endpoint_unsupported",
"slow_consumer",
"positions_unavailable",
"reconstruction_unavailable",
"snapshot_advanced",
"pagination_unavailable",
"api_key_limit_reached",
"wallet_requires_plan",
"wallet_account_required",
"wallet_free_signup_retired",
"account_disabled",
"oauth_not_permitted",
"insufficient_scope",
"invalid_query_params",
"invalid_path_params",
"history_window_exceeded",
"request_range_exceeded"
],
"example": "invalid_parameter"
},
"max_concurrent": {
"description": "`rate_limited` concurrency refusals only: simultaneous queries the plan allows.",
"type": "integer"
},
"param": {
"description": "The parameter that failed validation, when one did.",
"type": "string",
"example": "side"
},
"request_id": {
"description": "Unique request ID for support.",
"type": "string",
"format": "uuid"
},
"success": {
"description": "Always `false` on an error.",
"type": "boolean",
"enum": [
false
]
},
"suggestion": {
"description": "Present when the symbol exists on another venue: where to request it instead.",
"type": "object",
"properties": {
"endpoint": {
"type": "string",
"example": "/v1/hyperliquid/hip3/trades/xyz:TSLA"
},
"symbol": {
"type": "string",
"example": "xyz:TSLA"
},
"venue": {
"type": "string",
"example": "hip3"
}
}
},
"valid_values": {
"description": "Accepted values of `param`, when the set is fixed.",
"type": "array",
"items": {
"type": "string"
},
"example": [
"buy",
"sell"
]
},
"venue": {
"description": "`unsupported_for_venue` only: the venue the request asked.",
"type": "string",
"example": "spot"
}
}
}
OpenAPI example: historical_depth_exceeded
{
"success": false,
"code": 403,
"error_code": "historical_depth_exceeded",
"error": "Your plan includes the most recent 30 days of history: this request starts at 2026-01-01T00:00:00Z, before the earliest allowed timestamp 2026-08-30T00:00:00Z. Requests cannot be chunked across the age boundary.",
"request_id": "3f2a9c71-5b0e-4d68-9a4c-7e1d2b6f8a05"
}
OpenAPI example: historical_range_exceeded
{
"success": false,
"code": 403,
"error_code": "historical_range_exceeded",
"error": "Maximum range is 30 days per request on your plan. Requested range is 45 days.",
"request_id": "3f2a9c71-5b0e-4d68-9a4c-7e1d2b6f8a05"
}
Status 429
Rate limit, concurrency limit or monthly credits exceeded. Seeerror_code.
application/json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "getLighterLiquidations response 429",
"description": "Body of every non-2xx JSON response. `code` repeats the HTTP status, `error_code` is the stable machine-readable code (see `ErrorCode`), `error` is a human-readable message, and `request_id` identifies the request for support. Validation failures add `param` and, where the accepted set is fixed, `valid_values`. A 404 for a datatype the venue does not offer (`unsupported_for_venue`) adds `venue`, `datatype` and `available_on`; any other unknown path answers 404 `route_not_found`.",
"type": "object",
"required": [
"code",
"error",
"error_code",
"request_id",
"success"
],
"properties": {
"available_on": {
"description": "`unsupported_for_venue` only: the venues and routes that serve the datatype.",
"type": "array",
"items": {
"type": "object",
"required": [
"route",
"venue"
],
"properties": {
"route": {
"type": "string",
"example": "/v1/hyperliquid/orders/{symbol}/flow"
},
"venue": {
"type": "string",
"example": "hyperliquid"
}
}
}
},
"code": {
"description": "HTTP status code.",
"type": "integer",
"example": 400
},
"credits_limit": {
"description": "`insufficient_credits` only: the period's credit allowance.",
"type": "integer",
"format": "int64"
},
"credits_used": {
"description": "`insufficient_credits` only: credits used this period.",
"type": "integer",
"format": "int64"
},
"datatype": {
"description": "`unsupported_for_venue` only: the datatype the request asked for, as `GET /v1/capabilities` names it.",
"type": "string",
"example": "order_flow"
},
"error": {
"description": "Human-readable message. Wording can change; do not parse it.",
"type": "string"
},
"error_code": {
"description": "Stable, machine-readable error code. Branch on this value, not on the `error` text.\n\n**Contract codes**\n\n| Code | HTTP | Meaning |\n|---|---|---|\n| `invalid_parameter` | 400 | A parameter failed to parse or validate. `param` names it and `valid_values` lists accepted values where the set is fixed. |\n| `invalid_symbol` | 400 | The symbol is not listed on this venue. |\n| `invalid_interval` | 400 | The `interval` (bucket width) is not one this route accepts. |\n| `invalid_cursor` | 400 | The `cursor` is malformed, stale, or was issued for other filters. Restart pagination without a cursor. Trades, liquidations, L2 and L4 diffs, order history and TP/SL routes currently return the first page for a malformed cursor instead. |\n| `invalid_time_range` | 400 | `start` is after `end`, or a time value could not be parsed. |\n| `range_before_coverage` | 400 | The whole requested range ends before the first instant this dataset is served from. |\n| `historical_range_exceeded` | 403 | The requested span is longer than the plan allows in one request or replay. |\n| `historical_depth_exceeded` | 403 | The request reaches further back than the plan's history window. |\n| `unsupported_for_venue` | 404 | The venue does not offer this datatype. The message, `datatype` and `available_on` name where it is served. |\n| `route_not_found` | 404 | No route matches the path or method. `GET /v1/capabilities` lists the routes each venue serves. |\n| `not_found` | 404 | The route exists but the requested resource (for example an incident, endpoint or outcome id) does not. |\n| `unauthorized` | 401 | The API key is missing or invalid. |\n| `forbidden` | 403 | The key is valid but not allowed to make this request. |\n| `insufficient_credits` | 429 | The monthly credit allowance is spent (402 on pay-per-request routes). |\n| `rate_limited` | 429 | Too many requests or concurrent queries. Retry after the interval in the rate-limit headers. |\n| `conflict` | 409 | The request conflicts with the current state of the resource. |\n| `upstream_unavailable` | 503 | A dependency is unavailable or saturated. Retry shortly; the response carries `Retry-After`. |\n| `internal_error` | 500 | An unexpected server error. Quote `request_id` when contacting support. |\n\n**WebSocket only** (sent in `{\"type\":\"error\"}` messages, never by REST)\n\n| Code | Where | Meaning |\n|---|---|---|\n| `endpoint_unsupported` | WebSocket | This WebSocket endpoint does not serve the channel or operation. The message names the endpoint that does. |\n| `slow_consumer` | WebSocket | The connection fell behind a stream and messages were dropped. Re-subscribe, or restart the replay, to resynchronise. |\n\n**Route-specific codes**\n\n| Code | HTTP | Meaning |\n|---|---|---|\n| `positions_unavailable` | 503 | Account positions are temporarily unavailable for this venue. |\n| `reconstruction_unavailable` | 503 | The as-of positions state for this instant cannot be reconstructed right now. |\n| `snapshot_advanced` | 409 | A positions market cursor pinned a snapshot that has since been replaced or expired. Restart pagination. |\n| `pagination_unavailable` | 503 | The next positions page cannot be served right now. Retry the same cursor shortly. |\n| `api_key_limit_reached` | 403 | The account already holds the maximum number of API keys for its plan. |\n| `wallet_requires_plan` | 402 | A wallet-authenticated key needs an active plan for this request. |\n| `wallet_account_required` | 403 | Wallet sign-in needs an existing account linked to the wallet. |\n| `wallet_free_signup_retired` | 410 | Free wallet sign-up is no longer offered. |\n| `account_disabled` | 403 | The account is disabled. |\n| `oauth_not_permitted` | 403 | This route is not available to OAuth access tokens. |\n| `insufficient_scope` | 403 | The OAuth access token lacks the scope this route requires. |\n\n**Legacy names.** Requests without `0xArchive-Version: 2026-10-01` keep the four names that predate the contract; with the header they receive the contract names instead.\n\n| Code | HTTP | Meaning |\n|---|---|---|\n| `invalid_query_params` | 400 | Legacy name of `invalid_parameter` (query parameter), or of `invalid_cursor` when the parameter is `cursor`, sent without the version header. |\n| `invalid_path_params` | 400 | Legacy name of `invalid_parameter` (path parameter), sent without the version header. |\n| `history_window_exceeded` | 403 | Legacy name of `historical_depth_exceeded`, sent without the version header. |\n| `request_range_exceeded` | 403 | Legacy name of `historical_range_exceeded`, sent without the version header. |\n\nTreat any value not listed here as a generic error of the HTTP status.",
"type": "string",
"enum": [
"invalid_parameter",
"invalid_symbol",
"invalid_interval",
"invalid_cursor",
"invalid_time_range",
"range_before_coverage",
"historical_range_exceeded",
"historical_depth_exceeded",
"unsupported_for_venue",
"route_not_found",
"not_found",
"unauthorized",
"forbidden",
"insufficient_credits",
"rate_limited",
"conflict",
"upstream_unavailable",
"internal_error",
"endpoint_unsupported",
"slow_consumer",
"positions_unavailable",
"reconstruction_unavailable",
"snapshot_advanced",
"pagination_unavailable",
"api_key_limit_reached",
"wallet_requires_plan",
"wallet_account_required",
"wallet_free_signup_retired",
"account_disabled",
"oauth_not_permitted",
"insufficient_scope",
"invalid_query_params",
"invalid_path_params",
"history_window_exceeded",
"request_range_exceeded"
],
"example": "invalid_parameter"
},
"max_concurrent": {
"description": "`rate_limited` concurrency refusals only: simultaneous queries the plan allows.",
"type": "integer"
},
"param": {
"description": "The parameter that failed validation, when one did.",
"type": "string",
"example": "side"
},
"request_id": {
"description": "Unique request ID for support.",
"type": "string",
"format": "uuid"
},
"success": {
"description": "Always `false` on an error.",
"type": "boolean",
"enum": [
false
]
},
"suggestion": {
"description": "Present when the symbol exists on another venue: where to request it instead.",
"type": "object",
"properties": {
"endpoint": {
"type": "string",
"example": "/v1/hyperliquid/hip3/trades/xyz:TSLA"
},
"symbol": {
"type": "string",
"example": "xyz:TSLA"
},
"venue": {
"type": "string",
"example": "hip3"
}
}
},
"valid_values": {
"description": "Accepted values of `param`, when the set is fixed.",
"type": "array",
"items": {
"type": "string"
},
"example": [
"buy",
"sell"
]
},
"venue": {
"description": "`unsupported_for_venue` only: the venue the request asked.",
"type": "string",
"example": "spot"
}
}
}
OpenAPI example: insufficient_credits
{
"success": false,
"code": 429,
"error_code": "insufficient_credits",
"error": "Monthly credit limit exceeded. Please upgrade your plan.",
"request_id": "3f2a9c71-5b0e-4d68-9a4c-7e1d2b6f8a05",
"credits_used": 50000,
"credits_limit": 50000
}
OpenAPI example: rate_limited
{
"success": false,
"code": 429,
"error_code": "rate_limited",
"error": "Rate limit exceeded",
"request_id": "3f2a9c71-5b0e-4d68-9a4c-7e1d2b6f8a05"
}
Status default
Any other error. The body is anErrorResponse; branch on error_code. A 503 (upstream_unavailable) carries Retry-After.
application/json
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "getLighterLiquidations response default",
"description": "Body of every non-2xx JSON response. `code` repeats the HTTP status, `error_code` is the stable machine-readable code (see `ErrorCode`), `error` is a human-readable message, and `request_id` identifies the request for support. Validation failures add `param` and, where the accepted set is fixed, `valid_values`. A 404 for a datatype the venue does not offer (`unsupported_for_venue`) adds `venue`, `datatype` and `available_on`; any other unknown path answers 404 `route_not_found`.",
"type": "object",
"required": [
"code",
"error",
"error_code",
"request_id",
"success"
],
"properties": {
"available_on": {
"description": "`unsupported_for_venue` only: the venues and routes that serve the datatype.",
"type": "array",
"items": {
"type": "object",
"required": [
"route",
"venue"
],
"properties": {
"route": {
"type": "string",
"example": "/v1/hyperliquid/orders/{symbol}/flow"
},
"venue": {
"type": "string",
"example": "hyperliquid"
}
}
}
},
"code": {
"description": "HTTP status code.",
"type": "integer",
"example": 400
},
"credits_limit": {
"description": "`insufficient_credits` only: the period's credit allowance.",
"type": "integer",
"format": "int64"
},
"credits_used": {
"description": "`insufficient_credits` only: credits used this period.",
"type": "integer",
"format": "int64"
},
"datatype": {
"description": "`unsupported_for_venue` only: the datatype the request asked for, as `GET /v1/capabilities` names it.",
"type": "string",
"example": "order_flow"
},
"error": {
"description": "Human-readable message. Wording can change; do not parse it.",
"type": "string"
},
"error_code": {
"description": "Stable, machine-readable error code. Branch on this value, not on the `error` text.\n\n**Contract codes**\n\n| Code | HTTP | Meaning |\n|---|---|---|\n| `invalid_parameter` | 400 | A parameter failed to parse or validate. `param` names it and `valid_values` lists accepted values where the set is fixed. |\n| `invalid_symbol` | 400 | The symbol is not listed on this venue. |\n| `invalid_interval` | 400 | The `interval` (bucket width) is not one this route accepts. |\n| `invalid_cursor` | 400 | The `cursor` is malformed, stale, or was issued for other filters. Restart pagination without a cursor. Trades, liquidations, L2 and L4 diffs, order history and TP/SL routes currently return the first page for a malformed cursor instead. |\n| `invalid_time_range` | 400 | `start` is after `end`, or a time value could not be parsed. |\n| `range_before_coverage` | 400 | The whole requested range ends before the first instant this dataset is served from. |\n| `historical_range_exceeded` | 403 | The requested span is longer than the plan allows in one request or replay. |\n| `historical_depth_exceeded` | 403 | The request reaches further back than the plan's history window. |\n| `unsupported_for_venue` | 404 | The venue does not offer this datatype. The message, `datatype` and `available_on` name where it is served. |\n| `route_not_found` | 404 | No route matches the path or method. `GET /v1/capabilities` lists the routes each venue serves. |\n| `not_found` | 404 | The route exists but the requested resource (for example an incident, endpoint or outcome id) does not. |\n| `unauthorized` | 401 | The API key is missing or invalid. |\n| `forbidden` | 403 | The key is valid but not allowed to make this request. |\n| `insufficient_credits` | 429 | The monthly credit allowance is spent (402 on pay-per-request routes). |\n| `rate_limited` | 429 | Too many requests or concurrent queries. Retry after the interval in the rate-limit headers. |\n| `conflict` | 409 | The request conflicts with the current state of the resource. |\n| `upstream_unavailable` | 503 | A dependency is unavailable or saturated. Retry shortly; the response carries `Retry-After`. |\n| `internal_error` | 500 | An unexpected server error. Quote `request_id` when contacting support. |\n\n**WebSocket only** (sent in `{\"type\":\"error\"}` messages, never by REST)\n\n| Code | Where | Meaning |\n|---|---|---|\n| `endpoint_unsupported` | WebSocket | This WebSocket endpoint does not serve the channel or operation. The message names the endpoint that does. |\n| `slow_consumer` | WebSocket | The connection fell behind a stream and messages were dropped. Re-subscribe, or restart the replay, to resynchronise. |\n\n**Route-specific codes**\n\n| Code | HTTP | Meaning |\n|---|---|---|\n| `positions_unavailable` | 503 | Account positions are temporarily unavailable for this venue. |\n| `reconstruction_unavailable` | 503 | The as-of positions state for this instant cannot be reconstructed right now. |\n| `snapshot_advanced` | 409 | A positions market cursor pinned a snapshot that has since been replaced or expired. Restart pagination. |\n| `pagination_unavailable` | 503 | The next positions page cannot be served right now. Retry the same cursor shortly. |\n| `api_key_limit_reached` | 403 | The account already holds the maximum number of API keys for its plan. |\n| `wallet_requires_plan` | 402 | A wallet-authenticated key needs an active plan for this request. |\n| `wallet_account_required` | 403 | Wallet sign-in needs an existing account linked to the wallet. |\n| `wallet_free_signup_retired` | 410 | Free wallet sign-up is no longer offered. |\n| `account_disabled` | 403 | The account is disabled. |\n| `oauth_not_permitted` | 403 | This route is not available to OAuth access tokens. |\n| `insufficient_scope` | 403 | The OAuth access token lacks the scope this route requires. |\n\n**Legacy names.** Requests without `0xArchive-Version: 2026-10-01` keep the four names that predate the contract; with the header they receive the contract names instead.\n\n| Code | HTTP | Meaning |\n|---|---|---|\n| `invalid_query_params` | 400 | Legacy name of `invalid_parameter` (query parameter), or of `invalid_cursor` when the parameter is `cursor`, sent without the version header. |\n| `invalid_path_params` | 400 | Legacy name of `invalid_parameter` (path parameter), sent without the version header. |\n| `history_window_exceeded` | 403 | Legacy name of `historical_depth_exceeded`, sent without the version header. |\n| `request_range_exceeded` | 403 | Legacy name of `historical_range_exceeded`, sent without the version header. |\n\nTreat any value not listed here as a generic error of the HTTP status.",
"type": "string",
"enum": [
"invalid_parameter",
"invalid_symbol",
"invalid_interval",
"invalid_cursor",
"invalid_time_range",
"range_before_coverage",
"historical_range_exceeded",
"historical_depth_exceeded",
"unsupported_for_venue",
"route_not_found",
"not_found",
"unauthorized",
"forbidden",
"insufficient_credits",
"rate_limited",
"conflict",
"upstream_unavailable",
"internal_error",
"endpoint_unsupported",
"slow_consumer",
"positions_unavailable",
"reconstruction_unavailable",
"snapshot_advanced",
"pagination_unavailable",
"api_key_limit_reached",
"wallet_requires_plan",
"wallet_account_required",
"wallet_free_signup_retired",
"account_disabled",
"oauth_not_permitted",
"insufficient_scope",
"invalid_query_params",
"invalid_path_params",
"history_window_exceeded",
"request_range_exceeded"
],
"example": "invalid_parameter"
},
"max_concurrent": {
"description": "`rate_limited` concurrency refusals only: simultaneous queries the plan allows.",
"type": "integer"
},
"param": {
"description": "The parameter that failed validation, when one did.",
"type": "string",
"example": "side"
},
"request_id": {
"description": "Unique request ID for support.",
"type": "string",
"format": "uuid"
},
"success": {
"description": "Always `false` on an error.",
"type": "boolean",
"enum": [
false
]
},
"suggestion": {
"description": "Present when the symbol exists on another venue: where to request it instead.",
"type": "object",
"properties": {
"endpoint": {
"type": "string",
"example": "/v1/hyperliquid/hip3/trades/xyz:TSLA"
},
"symbol": {
"type": "string",
"example": "xyz:TSLA"
},
"venue": {
"type": "string",
"example": "hip3"
}
}
},
"valid_values": {
"description": "Accepted values of `param`, when the set is fixed.",
"type": "array",
"items": {
"type": "string"
},
"example": [
"buy",
"sell"
]
},
"venue": {
"description": "`unsupported_for_venue` only: the venue the request asked.",
"type": "string",
"example": "spot"
}
}
}
OpenAPI example: internal_error
{
"success": false,
"code": 500,
"error_code": "internal_error",
"error": "Internal server error",
"request_id": "3f2a9c71-5b0e-4d68-9a4c-7e1d2b6f8a05"
}
OpenAPI example: upstream_unavailable
{
"success": false,
"code": 503,
"error_code": "upstream_unavailable",
"error": "The service is temporarily unavailable. Retry shortly.",
"request_id": "3f2a9c71-5b0e-4d68-9a4c-7e1d2b6f8a05"
}