> ## Documentation Index
> Fetch the complete documentation index at: https://docs.0xarchive.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Submit product feedback JSON Schema

> Submit product feedback JSON Schema contract. Includes route metadata, request parameters, response statuses, examples, and JSON fields for implementation.

Source OpenAPI: 0xArchive API 1.9.0; 230 paths; 228 component schemas.

Anonymous submissions are allowed. If credentials are supplied via X-API-Key, Authorization: Bearer, or the ox\_access\_token browser cookie, they must validate; an authenticated submission is associated only with the server-validated account. OAuth access tokens require the mcp:feedback.write scope. The optional email field is for anonymous contact and never establishes account identity; authenticated submissions use the account email. type accepts bug, feature, question, or other. For security reports send type=other and category=security. category defaults to support. Reproduction details should be appended to message; this endpoint has no free-text context field. The message is limited to 5,000 UTF-8 bytes. Do not include secrets.

## Route Metadata

| Field | Value |
| - | - |
| Method | `POST` |
| Path | `/v1/feedback` |
| operationId | `submitFeedback` |
| Tag | Feedback |
| Family | Feedback |
| Deprecated or legacy | no |

## Human endpoint reference

Open [`POST /v1/feedback`](https://docs.0xarchive.io/api-reference/feedback/submit-product-feedback) for authentication, parameters, responses, and examples.

## Request Parameters

### Header Parameters

```json theme={"theme":"github-dark"}
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "submitFeedback 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"
    },
    "Idempotency-Key": {
      "description": "Optional key with 8-128 visible ASCII characters (0x21-0x7e). Reuse it only for an identical retry; a different request with the same key returns 409.",
      "type": "string",
      "minLength": 8,
      "maxLength": 128,
      "pattern": "^[!-~]{8,128}$",
      "x-parameter-location": "header"
    }
  }
}
```

## Request Body

### application/json

```json theme={"theme":"github-dark"}
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "submitFeedback request body",
  "description": "A product feedback request. Anonymous submissions are allowed. Account identity is derived only from a validated credential, never from request fields. Optional structured context fields are flat on the request and share a 2,048-byte serialized limit.",
  "type": "object",
  "required": [
    "message",
    "type"
  ],
  "properties": {
    "category": {
      "description": "Optional feedback category. Defaults to support.",
      "type": "string",
      "enum": [
        "support",
        "security"
      ],
      "default": "support"
    },
    "data_type": {
      "description": "Optional data-type identifier (maximum 64 UTF-8 bytes).",
      "type": "string"
    },
    "email": {
      "description": "Optional contact email for anonymous submissions. If a credential authenticates the request, this field is ignored and the account email is used; this field never establishes account identity.",
      "type": "string",
      "format": "email",
      "maxLength": 254
    },
    "end": {
      "description": "Optional end timestamp in Unix milliseconds. When both start and end are supplied, start must not exceed end.",
      "type": "integer",
      "format": "int64",
      "minimum": 0,
      "maximum": 253402300799999
    },
    "error_code": {
      "description": "Optional error-code identifier (maximum 128 UTF-8 bytes).",
      "type": "string"
    },
    "market_family": {
      "description": "Optional market-family identifier (maximum 64 UTF-8 bytes).",
      "type": "string"
    },
    "message": {
      "description": "Required nonblank message, limited to 5,000 UTF-8 bytes. Include any free-text reproduction details in this field; there is no separate free-text context property.",
      "type": "string",
      "minLength": 1,
      "maxLength": 5000
    },
    "request_id": {
      "description": "Optional request identifier (maximum 128 UTF-8 bytes).",
      "type": "string"
    },
    "route": {
      "description": "Optional route identifier (maximum 512 UTF-8 bytes).",
      "type": "string"
    },
    "start": {
      "description": "Optional start timestamp in Unix milliseconds. When both start and end are supplied, start must not exceed end.",
      "type": "integer",
      "format": "int64",
      "minimum": 0,
      "maximum": 253402300799999
    },
    "surface": {
      "description": "Optional surface identifier (maximum 64 UTF-8 bytes).",
      "type": "string"
    },
    "symbol": {
      "description": "Optional symbol identifier (maximum 128 UTF-8 bytes).",
      "type": "string"
    },
    "type": {
      "description": "Feedback type. Security reports use type=other with category=security.",
      "type": "string",
      "enum": [
        "bug",
        "feature",
        "question",
        "other"
      ]
    },
    "venue": {
      "description": "Optional venue identifier (maximum 64 UTF-8 bytes).",
      "type": "string"
    }
  }
}
```

## Response Contracts

### Status 202

HTTP 202: feedback accepted with a receipt identifier.

#### application/json

```json theme={"theme":"github-dark"}
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "submitFeedback response 202",
  "description": "Receipt returned when feedback has been accepted. The standard response envelope, plus the legacy `message` field.",
  "type": "object",
  "required": [
    "data",
    "message",
    "meta",
    "success"
  ],
  "properties": {
    "data": {
      "type": "object",
      "required": [
        "id",
        "status"
      ],
      "properties": {
        "id": {
          "description": "Feedback receipt identifier. Quote it if you contact support about this report.",
          "type": "string",
          "format": "uuid",
          "example": "53f2a55a-72b9-43e6-a182-f266bc47e302"
        },
        "status": {
          "type": "string",
          "enum": [
            "received"
          ],
          "example": "received"
        }
      }
    },
    "message": {
      "description": "Human-readable acknowledgement kept from the earlier response. It does not promise a reply.",
      "type": "string",
      "example": "Thank you for your feedback!"
    },
    "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",
      "enum": [
        true
      ],
      "example": true
    }
  }
}
```

##### OpenAPI example

```json theme={"theme":"github-dark"}
{
  "success": true,
  "data": {
    "id": "53f2a55a-72b9-43e6-a182-f266bc47e302",
    "status": "received"
  },
  "meta": {
    "count": 1,
    "request_id": "9b2f4f0e-3c55-4a7a-9d0e-6a1c2b7e5f10"
  },
  "message": "Thank you for your feedback!"
}
```

### Status 400

Invalid request: a parameter, symbol, interval, cursor or time range failed validation. See `error_code`.

#### application/json

```json theme={"theme":"github-dark"}
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "submitFeedback 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`

```json theme={"theme":"github-dark"}
{
  "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`

```json theme={"theme":"github-dark"}
{
  "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`

```json theme={"theme":"github-dark"}
{
  "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`

```json theme={"theme":"github-dark"}
{
  "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`

```json theme={"theme":"github-dark"}
{
  "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

A supplied X-API-Key, bearer token, or browser session cookie is invalid or expired.

#### application/json

```json theme={"theme":"github-dark"}
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "submitFeedback 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"
    }
  }
}
```

### Status 403

The authenticated credential is valid but does not have permission to submit feedback.

#### application/json

```json theme={"theme":"github-dark"}
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "submitFeedback 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"
    }
  }
}
```

### Status 409

The same Idempotency-Key was already used for a different feedback request.

#### application/json

```json theme={"theme":"github-dark"}
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "submitFeedback response 409",
  "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"
    }
  }
}
```

### Status 429

Rate limit, concurrency limit or monthly credits exceeded. See `error_code`.

#### application/json

```json theme={"theme":"github-dark"}
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "submitFeedback 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`

```json theme={"theme":"github-dark"}
{
  "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`

```json theme={"theme":"github-dark"}
{
  "success": false,
  "code": 429,
  "error_code": "rate_limited",
  "error": "Rate limit exceeded",
  "request_id": "3f2a9c71-5b0e-4d68-9a4c-7e1d2b6f8a05"
}
```

### Status 500

The feedback submission could not be accepted due to a server error.

#### application/json

```json theme={"theme":"github-dark"}
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "submitFeedback response 500",
  "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"
    }
  }
}
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.