{
  "openapi": "3.1.0",
  "info": {
    "title": "BackQuant API v2",
    "description": "\n# BackQuant API v2\n\nOptions + gamma-exposure focused public API. Built on the same data the\nBackQuant Pro Terminal renders - pre-computed every 30s, served from cache.\n\n## What's in v2\n\n* **Discovery**: `/v2/symbols` (universe + per-symbol freshness + supported\n  endpoint list), `/v2/expiries` (active expiry tokens with DTE), `/v2/status`\n  (per-symbol-per-category health with thresholds + overall classification).\n* **GEX**: composable levels (HVL / call wall / put support / max-pain /\n  expected move / gamma-flip zones), strike profile with typed expiry\n  filter, expiry profile, strike × expiry heatmap with downsampling,\n  greek time-heatmap with DTE/OI/IV filters, history (cursor-paginated),\n  Postgres-backed stress history, **per-expiry max-pain with pain curve**.\n* **Options**: filtered options chain with two-layer projection (top-level\n  `?fields=` and per-contract `?include=oi,iv,greeks,bid_ask,volume,gex`)\n  plus moneyness filter (`?moneyness_min=0.9&moneyness_max=1.1`), expiry\n  summary table, full IV suite (surface / term structure / 25Δ-10Δ skew /\n  curves / **single-expiry smile** / IV-RV history / VRP), expected move,\n  **Breeden-Litzenberger probability density and surface**, typed greek\n  profiles (delta / theta / vanna / charm / vega), strike × time charm/vega\n  surfaces, strike × expiry 3D greek surface, OI by expiry + history,\n  put/call ratio (intraday or daily), 0DTE & weekly premium tide,\n  dated-futures term structure.\n* **Liquidation**: heatmap + leverage-tiered distribution.\n* **Multi**: `/v2/multi/gex/levels` - bundled multi-symbol read across the\n  universe in one round-trip, with the same `?include=` model as the\n  single-symbol endpoint.\n\n## Authentication\n\nEvery v2 route (except `/v2/openapi.json`, `/v2/docs`, `/v2/redoc`, and\n`/v2/health`) requires the `X-API-Key` header.\n\n```\nX-API-Key: bq_live_your_api_key_here\n```\n\n**Get your API key at [backquant.com/api-access](https://backquant.com/api-access).**\n\nThe same key works across v1 and v2 - if you already have a v1 key, no\nre-issuance is needed.\n\n## Rate limits\n\nTwo budgets, both derived from your subscription tier: a **monthly request\nallowance** per account, and a **per-minute burst** per key. Size your\nintegration against the monthly figure - sustained polling at the burst rate\nexhausts the month early.\n\n| Plan                      | Monthly allowance | Burst    | Sustained   |\n|---------------------------|-------------------|----------|-------------|\n| Starter (Terminal Yearly) | 10,000 req/month  | 10/min   | ~333/day    |\n| Standard (Crypto API)     | 250,000 req/month | 60/min   | ~8,300/day  |\n| Pro (Terminal + API)      | 1,000,000/month   | 120/min  | ~33,000/day |\n| Enterprise                | custom            | 600/min  | custom      |\n\nHeaders `X-RateLimit-Limit / -Remaining / -Reset` (burst) and\n`X-Quota-Limit / -Used / -Remaining / -Period` (monthly) are included in\nevery response; the rate-limit triple is echoed inside `meta.rate_limit`\nwhen populated by middleware. Exceeding either budget returns `429`.\n\nThe live ladder is served at `GET /v2/meta` under `rate_limits`.\n\n## Response envelope\n\n```json\n{\n  \"success\": true,\n  \"data\": { ... },\n  \"meta\": {\n    \"version\": \"2.0\",\n    \"timestamp\": \"2026-04-29T12:00:00.000Z\",\n    \"request_id\": \"req_…\",\n    \"symbol\": \"BTCUSDT\",\n    \"spot_price\": 67213.5,\n    \"computed_at\": \"2026-04-29T11:59:48.000Z\",\n    \"freshness_seconds\": 12.0,\n    \"source\": [\"deribit\",\"bybit\",\"okx\",\"binance\",\"derive\",\"thalex\",\"delta_india\",\"delta\",\"bullish\",\"paradex\"],\n    \"exchanges_filtered\": [\"deribit\",\"bybit\"]\n  }\n}\n```\n\n## Errors\n\n```json\n{\n  \"success\": false,\n  \"error\": {\n    \"code\": \"NOT_FOUND\",\n    \"message\": \"No data for BTCUSDT\"\n  },\n  \"meta\": { \"version\": \"2.0\", \"timestamp\": \"...\" }\n}\n```\n\n| Code                  | When |\n|-----------------------|------|\n| `UNAUTHORIZED`        | Missing or invalid API key |\n| `FORBIDDEN`           | Subscription doesn't allow API access |\n| `NOT_FOUND`           | Symbol/expiry/etc. not present in cache |\n| `VALIDATION_ERROR`    | Bad query parameters |\n| `RATE_LIMIT_EXCEEDED` | Per-tier limit hit |\n| `UPSTREAM_ERROR`      | Cache or DB temporarily unreachable |\n| `INTERNAL_ERROR`      | Anything else |\n    ",
    "version": "2.14"
  },
  "paths": {
    "/health": {
      "get": {
        "tags": [
          "Meta"
        ],
        "summary": "v2 health check (no auth)",
        "description": "Lightweight liveness/readiness probe for external monitors. Reports overall status plus per-subsystem (redis, db) flags. Auth-free - uses the same `check_connection_health()` Fly.io's load balancer hits at `/health`. Rate limit: **60/minute per IP**.\n\nStatus values: `ok` (all subsystems healthy), `degraded` (one subsystem failing), `unhealthy` (cache + DB both unreachable).",
        "operationId": "get_health_health_get",
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/meta": {
      "get": {
        "tags": [
          "Meta"
        ],
        "summary": "API-level metadata",
        "description": "Static metadata about the v2 API. Supported symbol and exchange catalogs, the full error code list with HTTP status mapping, the auth scheme, the rate-limit ladder, the response envelope shape, and links to the OpenAPI spec / Swagger UI / ReDoc / endpoint catalog. Cheap (in-memory, no I/O).\n\nRequires `X-API-Key` like every other v2 route - anonymous discovery is via `/v2/openapi.json` (FastAPI standard, no auth).",
        "operationId": "get_meta_meta_get",
        "parameters": [
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/endpoints": {
      "get": {
        "tags": [
          "Meta"
        ],
        "summary": "Live catalog of every v2 route",
        "description": "Introspects the running FastAPI sub-app and returns one entry per route with path, HTTP methods, tag, summary, description, and the parameter list. Each parameter carries its name, location (`query` / `path` / `header`), required flag, type, default, numeric bounds (if any), and `enum` array when the parameter is Literal-typed.\n\nDerived from in-memory route metadata - no Redis or DB I/O. Requires `X-API-Key`. For totally anonymous discovery use `/v2/openapi.json` (FastAPI built-in).",
        "operationId": "get_endpoints_endpoints_get",
        "parameters": [
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/changelog": {
      "get": {
        "tags": [
          "Meta"
        ],
        "summary": "API version history with breaking-change flags",
        "description": "Returns the v2 release log plus the lifecycle status of v1. Customers integrating against either version use this to decide when to schedule re-integration work - `breaking: true` on any release is the signal to test, and `v1_status` flips to `deprecated` / `sunset` long before v1 is ever turned off.\n\nResponse is static - no I/O, sub-millisecond - so polling it from a CI job daily is free.",
        "operationId": "get_changelog_changelog_get",
        "parameters": [
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChangelogResponse"
                }
              }
            }
          },
          "401": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/V2ErrorEnvelope"
                }
              }
            },
            "description": "Unauthorized"
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/symbols": {
      "get": {
        "tags": [
          "Discovery"
        ],
        "summary": "Supported symbols + per-symbol availability",
        "description": "Lists every symbol covered by v2 with the data categories that are currently live, the freshness of each category, the spot price, the count of active expiries, and the full set of supported endpoints. Recommended first call for new integrations.",
        "operationId": "get_symbols_symbols_get",
        "parameters": [
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/expiries": {
      "get": {
        "tags": [
          "Discovery"
        ],
        "summary": "Active expiry tokens with DTE",
        "description": "Currently-tradeable expiry tokens for a symbol with DTE and an ISO date when the token is parseable. Use this to populate filter UIs without pulling the heavier /options/expiry-summary.",
        "operationId": "get_expiries_expiries_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/status": {
      "get": {
        "tags": [
          "Discovery"
        ],
        "summary": "v2 service status - per symbol, per category freshness",
        "description": "Operational status. Each (symbol × category) cell is classified as `healthy`, `degraded`, `unhealthy`, or `unavailable` based on cache age. The `overall_status` is the worst case across the grid. Thresholds in the response reflect the underlying compute cadence.\n\n**`venues`** reports each of the ten venues as `chain` (options chain aggregation) and `tape` (live trade tape), each `on` / `off` / `unknown`. `chain_symbols` lists the symbols the venue is live on and `chain_contracts` how many instruments it contributed on the last cycle - a venue that is `on` but delivering `0` contracts is visible rather than reading as healthy. `unknown` means no fresh status was published (a writer is down), never `off`.",
        "operationId": "get_status_status_get",
        "parameters": [
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/gex/levels": {
      "get": {
        "tags": [
          "GEX"
        ],
        "summary": "Composable GEX key levels",
        "description": "All-expiry HVL/walls plus 0DTE-specific levels in a single call. Use `?include=` to opt in to optional sections - `spot,candles,zones,max_pain,expected_move,ranked`. Filter by exchange with `?exchanges=deribit,bybit,okx,binance`.\n\n`expected_move` `*_1sd` / `*_2sd` are the move to the nearest expiry with 7 to 30 days left (`days_to_expiry`), not a day's move; `upper_1d` / `lower_1d` are the one-day 1-sigma band (null until published).\n\n`max_pain` is the max pain of the 0DTE expiry (the front expiry: the next 08:00 UTC settle, when it is within a day), from that expiry's own open interest on every venue, the same number as `/v2/gex/max-pain?expiry=0dte`; null when no expiry settles within a day. The `odte` levels are that expiry's. `gamma_flip_zones` is every price where cumulative net GEX changes sign, within 0.5x to 2x spot, under either positioning model. `candles` are the Binance perpetual's 5-minute klines, the last 336 (about 28 hours); `spot.perps_price` is the last close.\n\n**`?exchanges=`** needs the per-venue split only the std model has: with `positioning=flow` a venue filter serves std, with `meta.extra.positioning_fallback_reason` = `exchange_filter_needs_std`. `max_pain` and `gamma_flip_zones` are not venue-filtered (`meta.extra.exchanges_not_applied_to`). Under `as_of` no venue filter is possible and `meta.exchanges_filtered` is null with `meta.extra.exchanges_not_applied`.\n\n**Positioning (default: flow).** `positioning=flow` (default) rebuilds HVL/walls/ranked from the chain + aggressor tape (BTC/ETH). `positioning=std` serves the legacy Redis textbook-signed levels. On flow fallback, `meta.extra.positioning_fallback_reason` explains why. Secondary walls (call_wall_2/3) are only present on the std cache path.\n\nThe WebSocket channel `gex.levels.{SYMBOL}` publishes the SAME flow-signed levels from the same builder - REST and WS agree.",
        "operationId": "get_levels_gex_levels_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "exchanges",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Comma-separated venue filter, e.g. `deribit,bybit`. Restricts the response to those venues' contribution, recomputed from the per-venue breakdown - it is a re-aggregation, not a post-hoc scaling. Unknown names are ignored; an all-invalid filter returns every venue rather than nothing. Venues: `deribit`, `bybit`, `okx`, `binance`, `derive`, `thalex`, `delta_india`, `delta`, `bullish`, `paradex`. A venue with no contracts on the surface contributes zero - use `GET /v2/status` to tell that apart from a venue that is switched off.",
              "title": "Exchanges"
            },
            "description": "Comma-separated venue filter, e.g. `deribit,bybit`. Restricts the response to those venues' contribution, recomputed from the per-venue breakdown - it is a re-aggregation, not a post-hoc scaling. Unknown names are ignored; an all-invalid filter returns every venue rather than nothing. Venues: `deribit`, `bybit`, `okx`, `binance`, `derive`, `thalex`, `delta_india`, `delta`, `bullish`, `paradex`. A venue with no contracts on the surface contributes zero - use `GET /v2/status` to tell that apart from a venue that is switched off."
          },
          {
            "name": "include",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Comma-separated optional sections: candles,expected_move,max_pain,ranked,spot,zones",
              "title": "Include"
            },
            "description": "Comma-separated optional sections: candles,expected_move,max_pain,ranked,spot,zones"
          },
          {
            "name": "positioning",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "description": "Dealer positioning model. **`flow`** (default) is BackQuant's measured dealer model, available for BTC/ETH; it falls back to `std` when it cannot be produced for a symbol. **`std`** is the textbook convention (call:+OI / put:-OI). The response reports which model actually ran in `meta.extra.positioning`.",
              "default": "flow",
              "title": "Positioning"
            },
            "description": "Dealer positioning model. **`flow`** (default) is BackQuant's measured dealer model, available for BTC/ETH; it falls back to `std` when it cannot be produced for a symbol. **`std`** is the textbook convention (call:+OI / put:-OI). The response reports which model actually ran in `meta.extra.positioning`."
          },
          {
            "name": "as_of",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "ISO-8601 instant to answer as of, e.g. `2026-08-20T14:30:00Z`. Omit for the current value. Resolves to the nearest chain snapshot AT OR BEFORE the requested time (never after, which would be look-ahead bias); the snapshot actually used and the lag are reported in `meta.extra.as_of`. Under `positioning=flow` the dealer flow map is rebuilt from the tape as it stood at that instant, so a given timestamp always returns the same numbers. Bounded by your plan's history window.",
              "title": "As Of"
            },
            "description": "ISO-8601 instant to answer as of, e.g. `2026-08-20T14:30:00Z`. Omit for the current value. Resolves to the nearest chain snapshot AT OR BEFORE the requested time (never after, which would be look-ahead bias); the snapshot actually used and the lag are reported in `meta.extra.as_of`. Under `positioning=flow` the dealer flow map is rebuilt from the tape as it stood at that instant, so a given timestamp always returns the same numbers. Bounded by your plan's history window."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GexLevelsResponse"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/V2ErrorEnvelope"
                }
              }
            },
            "description": "Not Found"
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/gex/strike-profile": {
      "get": {
        "tags": [
          "GEX"
        ],
        "summary": "GEX by strike",
        "description": "Gamma exposure aggregated by strike. `?expiry=all` (default) covers every expiry, `?expiry=0dte` filters to the front expiry (the next 08:00 UTC settle, when it is within a day), and an explicit expiry token (e.g. `28MAR25`) returns just that expiration.\n\n**Positioning (default: flow).** `positioning=flow` rebuilds the profile from the chain + aggressor tape (BTC/ETH). `positioning=std` serves the Redis textbook-signed cache. See `meta.extra.positioning`.\n\nStrike-axis filters (intersected when more than one is set):\n* `strike_min` / `strike_max` - absolute bounds.\n* `moneyness_min` / `moneyness_max` - strike/spot ratio bounds,   e.g. `0.9..1.1` keeps the ATM ±10% slab.\n* `spot_window_pct` - symmetric window in percent (e.g. `5` for   ±5% of spot). Combined by intersection with the others.\n\nWhen any strike filter narrows the set, `ranked_top_10` is rebuilt from the surviving strikes - the cached pre-filter ranking is not reused.\n\n**Per-venue open interest (`by_venue`):** `{venue: {call_oi, put_oi, total_oi, notional_oi_usd}}` rolled up over the strikes actually returned. OI is coin-native on every venue and attribution is positioning-independent, so the block is identical under `flow` and `std`. All ten venues are always present (zero-filled); use `GET /v2/status` to tell a zero-OI venue from a disabled one. `by_venue_unattributed` is non-null only when some OI could not be attributed to a venue. `expiry=<token>` returns `by_venue: null` with `by_venue_note` - a single-expiry venue split is not published.",
        "operationId": "get_strike_profile_gex_strike_profile_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "exchanges",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Comma-separated venue filter, e.g. `deribit,bybit`. Restricts the response to those venues' contribution, recomputed from the per-venue breakdown - it is a re-aggregation, not a post-hoc scaling. Unknown names are ignored; an all-invalid filter returns every venue rather than nothing. Venues: `deribit`, `bybit`, `okx`, `binance`, `derive`, `thalex`, `delta_india`, `delta`, `bullish`, `paradex`. A venue with no contracts on the surface contributes zero - use `GET /v2/status` to tell that apart from a venue that is switched off.",
              "title": "Exchanges"
            },
            "description": "Comma-separated venue filter, e.g. `deribit,bybit`. Restricts the response to those venues' contribution, recomputed from the per-venue breakdown - it is a re-aggregation, not a post-hoc scaling. Unknown names are ignored; an all-invalid filter returns every venue rather than nothing. Venues: `deribit`, `bybit`, `okx`, `binance`, `derive`, `thalex`, `delta_india`, `delta`, `bullish`, `paradex`. A venue with no contracts on the surface contributes zero - use `GET /v2/status` to tell that apart from a venue that is switched off."
          },
          {
            "name": "expiry",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "description": "Which expiry to include: `all` for every expiry, `0dte` for today's expiry only, or a specific date (`YYYY-MM-DD`) or Deribit token (`28MAR25`).",
              "default": "all",
              "title": "Expiry"
            },
            "description": "Which expiry to include: `all` for every expiry, `0dte` for today's expiry only, or a specific date (`YYYY-MM-DD`) or Deribit token (`28MAR25`)."
          },
          {
            "name": "strike_min",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "number",
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ],
              "description": "Absolute lower strike bound",
              "title": "Strike Min"
            },
            "description": "Absolute lower strike bound"
          },
          {
            "name": "strike_max",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "number",
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ],
              "description": "Absolute upper strike bound",
              "title": "Strike Max"
            },
            "description": "Absolute upper strike bound"
          },
          {
            "name": "moneyness_min",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "number",
                  "maximum": 10,
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ],
              "description": "Strike/spot lower bound (e.g. `0.9`)",
              "title": "Moneyness Min"
            },
            "description": "Strike/spot lower bound (e.g. `0.9`)"
          },
          {
            "name": "moneyness_max",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "number",
                  "maximum": 10,
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ],
              "description": "Strike/spot upper bound (e.g. `1.1`)",
              "title": "Moneyness Max"
            },
            "description": "Strike/spot upper bound (e.g. `1.1`)"
          },
          {
            "name": "spot_window_pct",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "number",
                  "maximum": 200,
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ],
              "description": "Symmetric strike window in % around spot (e.g. `5` for ±5%)",
              "title": "Spot Window Pct"
            },
            "description": "Symmetric strike window in % around spot (e.g. `5` for ±5%)"
          },
          {
            "name": "positioning",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "description": "Dealer positioning model. **`flow`** (default) is BackQuant's measured dealer model, available for BTC/ETH; it falls back to `std` when it cannot be produced for a symbol. **`std`** is the textbook convention (call:+OI / put:-OI). The response reports which model actually ran in `meta.extra.positioning`.",
              "default": "flow",
              "title": "Positioning"
            },
            "description": "Dealer positioning model. **`flow`** (default) is BackQuant's measured dealer model, available for BTC/ETH; it falls back to `std` when it cannot be produced for a symbol. **`std`** is the textbook convention (call:+OI / put:-OI). The response reports which model actually ran in `meta.extra.positioning`."
          },
          {
            "name": "as_of",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "ISO-8601 instant to answer as of, e.g. `2026-08-20T14:30:00Z`. Omit for the current value. Resolves to the nearest chain snapshot AT OR BEFORE the requested time (never after, which would be look-ahead bias); the snapshot actually used and the lag are reported in `meta.extra.as_of`. Under `positioning=flow` the dealer flow map is rebuilt from the tape as it stood at that instant, so a given timestamp always returns the same numbers. Bounded by your plan's history window.",
              "title": "As Of"
            },
            "description": "ISO-8601 instant to answer as of, e.g. `2026-08-20T14:30:00Z`. Omit for the current value. Resolves to the nearest chain snapshot AT OR BEFORE the requested time (never after, which would be look-ahead bias); the snapshot actually used and the lag are reported in `meta.extra.as_of`. Under `positioning=flow` the dealer flow map is rebuilt from the tape as it stood at that instant, so a given timestamp always returns the same numbers. Bounded by your plan's history window."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GexStrikeProfileResponse"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/V2ErrorEnvelope"
                }
              }
            },
            "description": "Not Found"
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/gex/expiry-profile": {
      "get": {
        "tags": [
          "GEX"
        ],
        "summary": "GEX by expiry",
        "description": "Net / call / put gamma per expiration date with days-to-expiry. Useful for spotting where dealer exposure rolls off.\n\n**Positioning (default: flow).** Multi-venue chain + aggressor tape aggregation. See `meta.extra.aggregation`.\n\nDTE-axis filters:\n* `dte_min` / `dte_max` - bound the DTE window.\n* `weekly_only=true` - exclude monthly + quarterly anchors   (defined as the last Friday of the month). Tokens we cannot   parse are kept rather than silently dropped.",
        "operationId": "get_expiry_profile_gex_expiry_profile_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "exchanges",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Comma-separated venue filter, e.g. `deribit,bybit`. Restricts the response to those venues' contribution, recomputed from the per-venue breakdown - it is a re-aggregation, not a post-hoc scaling. Unknown names are ignored; an all-invalid filter returns every venue rather than nothing. Venues: `deribit`, `bybit`, `okx`, `binance`, `derive`, `thalex`, `delta_india`, `delta`, `bullish`, `paradex`. A venue with no contracts on the surface contributes zero - use `GET /v2/status` to tell that apart from a venue that is switched off.",
              "title": "Exchanges"
            },
            "description": "Comma-separated venue filter, e.g. `deribit,bybit`. Restricts the response to those venues' contribution, recomputed from the per-venue breakdown - it is a re-aggregation, not a post-hoc scaling. Unknown names are ignored; an all-invalid filter returns every venue rather than nothing. Venues: `deribit`, `bybit`, `okx`, `binance`, `derive`, `thalex`, `delta_india`, `delta`, `bullish`, `paradex`. A venue with no contracts on the surface contributes zero - use `GET /v2/status` to tell that apart from a venue that is switched off."
          },
          {
            "name": "dte_min",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "integer",
                  "maximum": 720,
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ],
              "description": "DTE lower bound",
              "title": "Dte Min"
            },
            "description": "DTE lower bound"
          },
          {
            "name": "dte_max",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "integer",
                  "maximum": 720,
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ],
              "description": "DTE upper bound",
              "title": "Dte Max"
            },
            "description": "DTE upper bound"
          },
          {
            "name": "weekly_only",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean",
              "description": "Exclude monthly + quarterly anchors (last-Friday-of-month).",
              "default": false,
              "title": "Weekly Only"
            },
            "description": "Exclude monthly + quarterly anchors (last-Friday-of-month)."
          },
          {
            "name": "positioning",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "description": "Dealer positioning model. **`flow`** (default) is BackQuant's measured dealer model, available for BTC/ETH; it falls back to `std` when it cannot be produced for a symbol. **`std`** is the textbook convention (call:+OI / put:-OI). The response reports which model actually ran in `meta.extra.positioning`.",
              "default": "flow",
              "title": "Positioning"
            },
            "description": "Dealer positioning model. **`flow`** (default) is BackQuant's measured dealer model, available for BTC/ETH; it falls back to `std` when it cannot be produced for a symbol. **`std`** is the textbook convention (call:+OI / put:-OI). The response reports which model actually ran in `meta.extra.positioning`."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/gex/strike-expiry-heatmap": {
      "get": {
        "tags": [
          "GEX"
        ],
        "summary": "2D strike × expiry GEX matrix",
        "description": "Rows are strikes, columns are expiries (sorted ascending DTE).\n\n**Positioning (default: flow).** Rebuilt from the multi-venue chain + aggressor tape when `positioning=flow`.\n\nFilters apply BEFORE downsampling so the cap parameters operate on the already-narrowed grid:\n* `dte_min` / `dte_max` - drop expiries outside the DTE window.\n* `moneyness_min` / `moneyness_max` - drop strikes outside the   moneyness window (e.g. `0.8..1.2` keeps ATM ±20%).\n* `max_strikes` - cap on strikes returned (kept closest to spot).\n* `max_expiries` - cap on expiries (kept nearest by DTE).",
        "operationId": "get_strike_expiry_heatmap_gex_strike_expiry_heatmap_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "exchanges",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Comma-separated venue filter, e.g. `deribit,bybit`. Restricts the response to those venues' contribution, recomputed from the per-venue breakdown - it is a re-aggregation, not a post-hoc scaling. Unknown names are ignored; an all-invalid filter returns every venue rather than nothing. Venues: `deribit`, `bybit`, `okx`, `binance`, `derive`, `thalex`, `delta_india`, `delta`, `bullish`, `paradex`. A venue with no contracts on the surface contributes zero - use `GET /v2/status` to tell that apart from a venue that is switched off.",
              "title": "Exchanges"
            },
            "description": "Comma-separated venue filter, e.g. `deribit,bybit`. Restricts the response to those venues' contribution, recomputed from the per-venue breakdown - it is a re-aggregation, not a post-hoc scaling. Unknown names are ignored; an all-invalid filter returns every venue rather than nothing. Venues: `deribit`, `bybit`, `okx`, `binance`, `derive`, `thalex`, `delta_india`, `delta`, `bullish`, `paradex`. A venue with no contracts on the surface contributes zero - use `GET /v2/status` to tell that apart from a venue that is switched off."
          },
          {
            "name": "dte_min",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "integer",
                  "maximum": 720,
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ],
              "description": "DTE lower bound",
              "title": "Dte Min"
            },
            "description": "DTE lower bound"
          },
          {
            "name": "dte_max",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "integer",
                  "maximum": 720,
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ],
              "description": "DTE upper bound",
              "title": "Dte Max"
            },
            "description": "DTE upper bound"
          },
          {
            "name": "moneyness_min",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "number",
                  "maximum": 10,
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ],
              "description": "Strike/spot lower bound",
              "title": "Moneyness Min"
            },
            "description": "Strike/spot lower bound"
          },
          {
            "name": "moneyness_max",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "number",
                  "maximum": 10,
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ],
              "description": "Strike/spot upper bound",
              "title": "Moneyness Max"
            },
            "description": "Strike/spot upper bound"
          },
          {
            "name": "max_strikes",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 400,
              "minimum": 10,
              "description": "Cap on number of strikes returned",
              "default": 60,
              "title": "Max Strikes"
            },
            "description": "Cap on number of strikes returned"
          },
          {
            "name": "max_expiries",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 60,
              "minimum": 2,
              "description": "Cap on number of expiries returned",
              "default": 20,
              "title": "Max Expiries"
            },
            "description": "Cap on number of expiries returned"
          },
          {
            "name": "positioning",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "description": "Dealer positioning model. **`flow`** (default) is BackQuant's measured dealer model, available for BTC/ETH; it falls back to `std` when it cannot be produced for a symbol. **`std`** is the textbook convention (call:+OI / put:-OI). The response reports which model actually ran in `meta.extra.positioning`.",
              "default": "flow",
              "title": "Positioning"
            },
            "description": "Dealer positioning model. **`flow`** (default) is BackQuant's measured dealer model, available for BTC/ETH; it falls back to `std` when it cannot be produced for a symbol. **`std`** is the textbook convention (call:+OI / put:-OI). The response reports which model actually ran in `meta.extra.positioning`."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/gex/time-heatmap": {
      "get": {
        "tags": [
          "GEX"
        ],
        "summary": "Strike × time greek heatmap",
        "description": "Time-series of greek exposures by strike. Pick the greek (`gex|dex|vex|charm|vanna`) and bound by DTE / OI / IV.\n\n**Units.** gex $ per 1% move, dex $ delta, vex $ per vol point, charm $ delta per day, vanna $ delta per vol point.\n\n**Positioning (default: flow).** Each historical snapshot is re-signed with the current multi-venue aggressor tape (BTC/ETH) when `positioning=flow`. `std` uses textbook OI signs (or the legacy redis cache when unfiltered + std).\n\nUnfiltered std+gex still serves the pre-computed cache (cheap); flow and filters rebuild from the last ~48 raw snapshots.",
        "operationId": "get_time_heatmap_gex_time_heatmap_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "greek",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "gex",
                "dex",
                "vex",
                "charm",
                "vanna"
              ],
              "type": "string",
              "description": "Greek to display.",
              "default": "gex",
              "title": "Greek"
            },
            "description": "Greek to display."
          },
          {
            "name": "dte_min",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 365,
              "minimum": 0,
              "description": "Inclusive lower bound on days-to-expiry for contributing contracts.",
              "default": 0,
              "title": "Dte Min"
            },
            "description": "Inclusive lower bound on days-to-expiry for contributing contracts."
          },
          {
            "name": "dte_max",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 365,
              "minimum": 0,
              "description": "Inclusive upper bound on days-to-expiry.",
              "default": 365,
              "title": "Dte Max"
            },
            "description": "Inclusive upper bound on days-to-expiry."
          },
          {
            "name": "min_oi",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "minimum": 0,
              "description": "Drop contracts with open interest below this value.",
              "default": 0,
              "title": "Min Oi"
            },
            "description": "Drop contracts with open interest below this value."
          },
          {
            "name": "iv_min",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "maximum": 500,
              "minimum": 0,
              "description": "Inclusive lower bound on IV (in % e.g. 50 for 50%).",
              "default": 0,
              "title": "Iv Min"
            },
            "description": "Inclusive lower bound on IV (in % e.g. 50 for 50%)."
          },
          {
            "name": "iv_max",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "maximum": 500,
              "minimum": 0,
              "description": "Inclusive upper bound on IV (in %).",
              "default": 200,
              "title": "Iv Max"
            },
            "description": "Inclusive upper bound on IV (in %)."
          },
          {
            "name": "positioning",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "description": "Dealer positioning model. **`flow`** (default) is BackQuant's measured dealer model, available for BTC/ETH; it falls back to `std` when it cannot be produced for a symbol. **`std`** is the textbook convention (call:+OI / put:-OI). The response reports which model actually ran in `meta.extra.positioning`.",
              "default": "flow",
              "title": "Positioning"
            },
            "description": "Dealer positioning model. **`flow`** (default) is BackQuant's measured dealer model, available for BTC/ETH; it falls back to `std` when it cannot be produced for a symbol. **`std`** is the textbook convention (call:+OI / put:-OI). The response reports which model actually ran in `meta.extra.positioning`."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/gex/history": {
      "get": {
        "tags": [
          "GEX"
        ],
        "summary": "Total GEX history (cursor-paginated)",
        "description": "Time-series of total GEX (and net-local-5pct, call/put walls when available). Use `?limit` (≤1000) to cap the page size and `?before=<ISO ts>` to walk backwards into older history.\n\n**Positioning:** historical series were stored under the **std** (textbook OI) model. Live surfaces default to flow; this endpoint remains std until dual-written FLOW history is available. These stored series are std-signed; live surfaces default to flow.",
        "operationId": "get_history_gex_history_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 1000,
              "minimum": 1,
              "description": "Max points to return",
              "default": 200,
              "title": "Limit"
            },
            "description": "Max points to return"
          },
          {
            "name": "before",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "ISO timestamp cursor - exclusive upper bound",
              "title": "Before"
            },
            "description": "ISO timestamp cursor - exclusive upper bound"
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/gex/stress-history": {
      "get": {
        "tags": [
          "GEX"
        ],
        "summary": "Long-window GEX levels from Postgres (per symbol)",
        "description": "Persistent record of HVL / call wall / put wall / net GEX, suitable for backtests or regime analysis. Window is bounded to 30 days (720 hours) so a query never blows out the read pool. A level that did not exist at that time (no flip within 25% of spot, no wall on a side) is `null`, never `0`.\n\n**Per symbol.** Each symbol has its own stored series. BTC has the deepest history; the other symbols began accruing when multi-symbol storage shipped (migration 065) and can be shorter or empty for an older window. An empty response means no stored rows for that symbol and window, never another symbol's data.\n\n**Positioning:** stored under **std** (textbook OI). Live GEX defaults to flow; this endpoint remains std historical, so do not overlay it directly on live flow-signed levels.",
        "operationId": "get_stress_history_gex_stress_history_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "days",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 30,
              "minimum": 1,
              "description": "Window in days (max 30)",
              "default": 7,
              "title": "Days"
            },
            "description": "Window in days (max 30)"
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/gex/max-pain": {
      "get": {
        "tags": [
          "GEX"
        ],
        "summary": "Max-pain strike (per-expiry)",
        "description": "The strike at which option writers profit most at expiry. Use `?expiry=0dte` for the front expiry (the next 08:00 UTC settle, when it is within a day; `expiry_tokens` names it), computed from that expiry's own open interest, `?expiry=all` for a per-expiry table covering every active expiration, or pass a specific expiry token (e.g. `28MAR25`) to also receive the full pain curve by strike.",
        "operationId": "get_max_pain_gex_max_pain_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "expiry",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "description": "Which expiry to include: `all` for every expiry, `0dte` for today's expiry only, or a specific date (`YYYY-MM-DD`) or Deribit token (`28MAR25`).",
              "default": "all",
              "title": "Expiry"
            },
            "description": "Which expiry to include: `all` for every expiry, `0dte` for today's expiry only, or a specific date (`YYYY-MM-DD`) or Deribit token (`28MAR25`)."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MaxPainResponse"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/V2ErrorEnvelope"
                }
              }
            },
            "description": "Not Found"
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/gex/ladder": {
      "get": {
        "tags": [
          "GEX"
        ],
        "summary": "Strike ladder: dealer exposure by strike x expiry",
        "description": "Dealer exposure per strike and per expiry for one metric, the grid behind the terminal's HEATMAP. Every value is dealer position x greek per contract, summed per (strike, expiry):\n\n* `gex` - $ of delta dealers must trade per 1% move\n* `dex` - $ delta\n* `vanna` - $ of delta per +1 vol point\n* `charm` - $ of delta per day of time passing\n* `vega` - $ per +1 vol point\n* `oi` - open interest in coin units (unsigned). Every venue is stored coin-consistent, so this differs from a venue's own contract count where a contract is not one coin (OKX: 0.01 BTC, 0.1 ETH).\n* `pos` - the dealer position itself, in coin units\n\n`cells` has one row per strike in `strikes` and one column per expiry in `expiries` (the nearest `expiries`, default 8). `total` is each strike summed over every expiry in scope, including those beyond the columns, and `top` / `king` rank strikes by it. For `gex`, `levels` carries the gamma flip and walls by the same rule as /v2/gex/levels.\n\n**Positioning (default: flow).** `flow` uses BackQuant's measured dealer position (BTC and ETH); `std` the textbook convention (call:+OI, put:-OI). Under `flow` each venue's trades count until that venue's settle (08:00 UTC; Delta Exchange and Delta India 12:00 UTC), so from 08:00 to 12:00 UTC the day's expiry carries Delta's own position. See `meta.extra.positioning`; `oi` is unsigned.\n\n`expiry` scopes which expiries count: `all`, `0dte`, `front`, `week` (7 days), `month` (31 days), or a comma list of ISO dates or tokens like `30OCT26`. `span` keeps strikes within spot x (1 +/- span); `group` merges strikes into buckets about that many strike steps wide. Every venue in the chain is included.",
        "operationId": "get_gex_ladder_gex_ladder_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "metric",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "gex",
                "dex",
                "vanna",
                "charm",
                "vega",
                "oi",
                "pos"
              ],
              "type": "string",
              "description": "Which exposure: gex, dex, vanna, charm, vega, oi or pos.",
              "default": "gex",
              "title": "Metric"
            },
            "description": "Which exposure: gex, dex, vanna, charm, vega, oi or pos."
          },
          {
            "name": "positioning",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Dealer positioning model. **`flow`** (default) is BackQuant's measured dealer model, available for BTC/ETH; it falls back to `std` when it cannot be produced for a symbol. **`std`** is the textbook convention (call:+OI / put:-OI). The response reports which model actually ran in `meta.extra.positioning`.",
              "default": "flow",
              "title": "Positioning"
            },
            "description": "Dealer positioning model. **`flow`** (default) is BackQuant's measured dealer model, available for BTC/ETH; it falls back to `std` when it cannot be produced for a symbol. **`std`** is the textbook convention (call:+OI / put:-OI). The response reports which model actually ran in `meta.extra.positioning`."
          },
          {
            "name": "expiry",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "maxLength": 400,
              "description": "all, 0dte, front, week, month, or a comma list of ISO dates / tokens (30OCT26).",
              "default": "all",
              "title": "Expiry"
            },
            "description": "all, 0dte, front, week, month, or a comma list of ISO dates / tokens (30OCT26)."
          },
          {
            "name": "expiries",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 24,
              "minimum": 0,
              "description": "How many of the nearest expiries get their own column.",
              "default": 8,
              "title": "Expiries"
            },
            "description": "How many of the nearest expiries get their own column."
          },
          {
            "name": "span",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "number",
                  "maximum": 0.5,
                  "minimum": 0.005
                },
                {
                  "type": "null"
                }
              ],
              "description": "Strikes within spot x (1 +/- span). Default 0.12.",
              "title": "Span"
            },
            "description": "Strikes within spot x (1 +/- span). Default 0.12."
          },
          {
            "name": "group",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 20,
              "minimum": 1,
              "description": "Merge strikes into buckets about this many strike steps wide.",
              "default": 1,
              "title": "Group"
            },
            "description": "Merge strikes into buckets about this many strike steps wide."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/gex/dealer-flow": {
      "get": {
        "tags": [
          "GEX",
          "Flow"
        ],
        "summary": "Dealer hedge flow time series (gamma + vanna + charm)",
        "description": "Estimated dealer hedging flow across successive chain snapshots. Components: `gamma_flow` (−ΔS% × net GEX: long-gamma dealers sell a rally and buy a drop), `charm_flow` (−Δt in days × net charm, $ delta per day), `vanna_flow` (reserved), plus `total_flow` and `cumulative_flow`.\n\nEvery component uses one sign: positive ≈ dealers buying the underlying to re-hedge; negative ≈ selling. Default `positioning=flow` (BackQuant's measured dealer model). See `meta.extra.formula` for the exact calculation and units.",
        "operationId": "get_dealer_flow_gex_dealer_flow_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "positioning",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "description": "Dealer positioning model. **`flow`** (default) is BackQuant's measured dealer model, available for BTC/ETH; it falls back to `std` when it cannot be produced for a symbol. **`std`** is the textbook convention (call:+OI / put:-OI). The response reports which model actually ran in `meta.extra.positioning`.",
              "default": "flow",
              "title": "Positioning"
            },
            "description": "Dealer positioning model. **`flow`** (default) is BackQuant's measured dealer model, available for BTC/ETH; it falls back to `std` when it cannot be produced for a symbol. **`std`** is the textbook convention (call:+OI / put:-OI). The response reports which model actually ran in `meta.extra.positioning`."
          },
          {
            "name": "as_of",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "ISO-8601 instant to answer as of, e.g. `2026-08-20T14:30:00Z`. Omit for the current value. Resolves to the nearest chain snapshot AT OR BEFORE the requested time (never after, which would be look-ahead bias); the snapshot actually used and the lag are reported in `meta.extra.as_of`. Under `positioning=flow` the dealer flow map is rebuilt from the tape as it stood at that instant, so a given timestamp always returns the same numbers. Bounded by your plan's history window.",
              "title": "As Of"
            },
            "description": "ISO-8601 instant to answer as of, e.g. `2026-08-20T14:30:00Z`. Omit for the current value. Resolves to the nearest chain snapshot AT OR BEFORE the requested time (never after, which would be look-ahead bias); the snapshot actually used and the lag are reported in `meta.extra.as_of`. Under `positioning=flow` the dealer flow map is rebuilt from the tape as it stood at that instant, so a given timestamp always returns the same numbers. Bounded by your plan's history window."
          },
          {
            "name": "include",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Optional sections. `by_venue` reports how the current dealer flow map splits across the venues that traded each contract, and how often they disagree on direction. Off by default; the query cost is the same, it just returns more.",
              "title": "Include"
            },
            "description": "Optional sections. `by_venue` reports how the current dealer flow map splits across the venues that traded each contract, and how often they disagree on direction. Off by default; the query cost is the same, it just returns more."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/gex/gamma-flow": {
      "get": {
        "tags": [
          "GEX",
          "Flow"
        ],
        "summary": "Total gamma flow time series",
        "description": "Gamma component of dealer hedge flow only: each point is `−ΔS% × net_GEX` under the selected positioning model, with a running cumulative over the returned snapshots (`timestamps`, the most recent chain snapshots, not a trading session). Positive = dealers buying: long-gamma dealers (net GEX > 0) sell a rally and buy a drop. HIRO-adjacent dealer gamma pressure.",
        "operationId": "get_gamma_flow_gex_gamma_flow_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "positioning",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "description": "Dealer positioning model. **`flow`** (default) is BackQuant's measured dealer model, available for BTC/ETH; it falls back to `std` when it cannot be produced for a symbol. **`std`** is the textbook convention (call:+OI / put:-OI). The response reports which model actually ran in `meta.extra.positioning`.",
              "default": "flow",
              "title": "Positioning"
            },
            "description": "Dealer positioning model. **`flow`** (default) is BackQuant's measured dealer model, available for BTC/ETH; it falls back to `std` when it cannot be produced for a symbol. **`std`** is the textbook convention (call:+OI / put:-OI). The response reports which model actually ran in `meta.extra.positioning`."
          },
          {
            "name": "as_of",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "ISO-8601 instant to answer as of, e.g. `2026-08-20T14:30:00Z`. Omit for the current value. Resolves to the nearest chain snapshot AT OR BEFORE the requested time (never after, which would be look-ahead bias); the snapshot actually used and the lag are reported in `meta.extra.as_of`. Under `positioning=flow` the dealer flow map is rebuilt from the tape as it stood at that instant, so a given timestamp always returns the same numbers. Bounded by your plan's history window.",
              "title": "As Of"
            },
            "description": "ISO-8601 instant to answer as of, e.g. `2026-08-20T14:30:00Z`. Omit for the current value. Resolves to the nearest chain snapshot AT OR BEFORE the requested time (never after, which would be look-ahead bias); the snapshot actually used and the lag are reported in `meta.extra.as_of`. Under `positioning=flow` the dealer flow map is rebuilt from the tape as it stood at that instant, so a given timestamp always returns the same numbers. Bounded by your plan's history window."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/gex/delta-flow": {
      "get": {
        "tags": [
          "GEX",
          "Flow"
        ],
        "summary": "Customer delta flow (HIRO-style) from options tape",
        "description": "Time-bucketed **customer** signed Black-Scholes delta notional from the **Deribit** prints of the options tape (the other venues are not included; `meta.source`). This is the HIRO-style *delta* line: buy-side vs sell-side aggressor delta $, plus cumulative net over the window.\n\nDistinct from /dealer-flow (which is hedge pressure from GEX×moves). Customer flow, not dealer flow: see the note in `meta.extra`.",
        "operationId": "get_delta_flow_gex_delta_flow_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "hours",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 720,
              "minimum": 1,
              "description": "Lookback hours",
              "default": 24,
              "title": "Hours"
            },
            "description": "Lookback hours"
          },
          {
            "name": "bucket_minutes",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 1440,
              "minimum": 1,
              "default": 5,
              "title": "Bucket Minutes"
            }
          },
          {
            "name": "min_size",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "minimum": 0,
              "description": "Min premium_usd filter",
              "default": 0,
              "title": "Min Size"
            },
            "description": "Min premium_usd filter"
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/gex/dealer-flow/by-level": {
      "get": {
        "tags": [
          "GEX",
          "Flow"
        ],
        "summary": "Expected dealer hedge $ if spot walks to each strike",
        "description": "DEALERFLOW-style level map: the dollar delta dealers would trade if spot walked from where it is to each strike, from cumulative net GEX under FLOW/STD signing: −cumulative walking up from spot, +cumulative walking down. Positive ≈ expected dealer buying if spot reaches that level. Long-gamma dealers sell into a rally (negative above spot) and buy into a drop (positive below).",
        "operationId": "get_dealer_flow_by_level_gex_dealer_flow_by_level_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "positioning",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "description": "Dealer positioning model. **`flow`** (default) is BackQuant's measured dealer model, available for BTC/ETH; it falls back to `std` when it cannot be produced for a symbol. **`std`** is the textbook convention (call:+OI / put:-OI). The response reports which model actually ran in `meta.extra.positioning`.",
              "default": "flow",
              "title": "Positioning"
            },
            "description": "Dealer positioning model. **`flow`** (default) is BackQuant's measured dealer model, available for BTC/ETH; it falls back to `std` when it cannot be produced for a symbol. **`std`** is the textbook convention (call:+OI / put:-OI). The response reports which model actually ran in `meta.extra.positioning`."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/options/chain": {
      "get": {
        "tags": [
          "Options"
        ],
        "summary": "Filtered options chain",
        "description": "Per-contract data (greeks, OI, IV, bid/ask) plus aggregate stats. Filters supported:\n\n* `expiries` - CSV of tokens (e.g. `28MAR25,25APR25`).\n* `dte_min` / `dte_max` - days-to-expiry bounds.\n* `oi_min` / `oi_max` - open interest bounds.\n* `delta_min` / `delta_max` - applied to |delta| (0..1).\n* `strike_min` / `strike_max` - absolute strike bounds.\n* `moneyness_min` / `moneyness_max` - strike / spot ratio bounds,   e.g. `0.9..1.1` keeps strikes within ±10% of spot. Useful for   cross-symbol screens since it normalises the strike grid.\n* `option_type` - `call`, `put`, or `both`.\n\nTwo layers of projection:\n\n* `fields` (top-level): comma-sep subset of `aggregates,available_expiries,contracts` - drops whole sections of the   response, e.g. `?fields=contracts` to skip aggregates.\n* `include` (per-contract): comma-sep subset of `bid_ask,gex,greeks,iv,oi,volume` - keeps only the   named sub-sections of each contract dict. Core identity fields (`strike,expiry,dte,type`) are always present. Default   is every section, matching v1 shape.\n\nPayload is capped at `?max_contracts=` (default 2000, hard ceiling 5000). On overflow the response is truncated to the closest-to-spot subset and `truncated=true` is set with `total_matching_count` so the client knows to narrow the filter.\n\nResponse is cached for 30s keyed by the exact filter combination, so repeated calls with identical filters are sub-millisecond.\n\n**Greeks are per contract, Black-Scholes:** `delta` per coin, `gamma` per $1 of spot, `theta` $ per day, `vega` $ per vol point, `vanna` delta per vol point, `charm` delta per day. `gex` is the contract's $ per 1% move, dealer-signed (puts negative).\n\n**Where each number comes from.** A chain row mixes two kinds of field on purpose, and which is which matters:\n\n* **Positioning is cross-venue.** `oi` is summed across all ten   venues. See `GET /v2/status` for which are live.\n* **Prices are one venue's.** `bid`, `ask` and `mark` are one   venue's quote, not a consolidated one: Deribit's wherever Deribit   lists the contract (the reference book for crypto options),   otherwise the first venue that lists it, in the order Bybit, OKX,   Binance, Derive, Thalex, Delta, Bullish, Paradex. On BTC and ETH   they are in coin, the way Deribit quotes: USD premium over that   expiry's forward (Deribit, OKX, Bybit); the few rows only a smaller   venue lists are converted at the index instead, so on far expiries   they can sit a few percent apart. For best bid and offer across every venue, with   the venue named on each side, use `GET /v2/options/venue-book`.\n* **Activity is cross-venue on BTC and ETH.** `volume`,   `notional_volume` and `trade_count` are measured over a rolling   24 hours from our own aggressor tape, which spans all ten   venues for these two symbols. `volume` is contracts,   `notional_volume` is premium in USD, `trade_count` is prints.\n* **Activity is single-venue on SOL and HYPE.** Our tape does not   span venues for them, so these fields carry the source venue's own   figures rather than a total that would look cross-venue and not   be. SOL is Deribit's; HYPE is Derive's.\n\n**`null` is not `0`.** On these three activity fields, `0` means measured and nothing traded, while `null` means not measured. SOL reports `trade_count: null` because no venue publishes a per-contract trade count for it, and on BTC/ETH all three read `null` in the rare window where the cross-venue measurement is unavailable - we report it as missing rather than substituting a single-venue number under a cross-venue field. Treating `null` and `0` as the same is how a contract that traded thousands of times can read as untraded.\n\n**Under `as_of`.** The activity fields are RECOMPUTED for the 24 hours ending at the resolved snapshot, from the same cross-venue tape, so a historical chain does not serve figures that were only ever single-venue. `meta.extra.activity_rebuilt` reports that it happened. `bid` and `ask` are a different case: on chains persisted before 2026-09-01 they are `0` because they were never recorded, and no amount of recomputation can recover them. `meta.extra.quotes_note` says so on every such response rather than leaving a caller to read those zeros as an unquoted market.\n\n**`aggregates.atm_iv`** is the at-the-money IV (percent) of the front live expiry among the matching contracts, read at that expiry's forward; `aggregates.atm_iv_expiry` names the expiry (the next one when the front's quotes do not reach its forward). `delta` is the Black-Scholes delta on spot, the sensitivity `gex` and dollar delta use; the 25-delta figures on `/v2/options/iv/*` are read on Black-76 forward deltas, the venues' convention.",
        "operationId": "get_chain_options_chain_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "expiries",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "CSV of expiry tokens (e.g. 28MAR25,25APR25)",
              "title": "Expiries"
            },
            "description": "CSV of expiry tokens (e.g. 28MAR25,25APR25)"
          },
          {
            "name": "dte_min",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "integer",
                  "maximum": 720,
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ],
              "description": "Inclusive lower bound on days-to-expiry.",
              "title": "Dte Min"
            },
            "description": "Inclusive lower bound on days-to-expiry."
          },
          {
            "name": "dte_max",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "integer",
                  "maximum": 720,
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ],
              "description": "Inclusive upper bound on days-to-expiry.",
              "title": "Dte Max"
            },
            "description": "Inclusive upper bound on days-to-expiry."
          },
          {
            "name": "oi_min",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "number",
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ],
              "description": "Minimum open interest per contract.",
              "title": "Oi Min"
            },
            "description": "Minimum open interest per contract."
          },
          {
            "name": "oi_max",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "number",
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ],
              "description": "Maximum open interest per contract.",
              "title": "Oi Max"
            },
            "description": "Maximum open interest per contract."
          },
          {
            "name": "delta_min",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "number",
                  "maximum": 1,
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ],
              "description": "Minimum |delta| (0..1).",
              "title": "Delta Min"
            },
            "description": "Minimum |delta| (0..1)."
          },
          {
            "name": "delta_max",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "number",
                  "maximum": 1,
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ],
              "description": "Maximum |delta| (0..1).",
              "title": "Delta Max"
            },
            "description": "Maximum |delta| (0..1)."
          },
          {
            "name": "strike_min",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "number",
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ],
              "description": "Minimum strike price (absolute).",
              "title": "Strike Min"
            },
            "description": "Minimum strike price (absolute)."
          },
          {
            "name": "strike_max",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "number",
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ],
              "description": "Maximum strike price (absolute).",
              "title": "Strike Max"
            },
            "description": "Maximum strike price (absolute)."
          },
          {
            "name": "moneyness_min",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "number",
                  "maximum": 10,
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ],
              "description": "Strike/spot lower bound (e.g. `0.9` for ATM-10%).",
              "title": "Moneyness Min"
            },
            "description": "Strike/spot lower bound (e.g. `0.9` for ATM-10%)."
          },
          {
            "name": "moneyness_max",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "number",
                  "maximum": 10,
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ],
              "description": "Strike/spot upper bound (e.g. `1.1` for ATM+10%).",
              "title": "Moneyness Max"
            },
            "description": "Strike/spot upper bound (e.g. `1.1` for ATM+10%)."
          },
          {
            "name": "option_type",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "call",
                "put",
                "both"
              ],
              "type": "string",
              "description": "Filter to call, put, or both contract types.",
              "default": "both",
              "title": "Option Type"
            },
            "description": "Filter to call, put, or both contract types."
          },
          {
            "name": "max_contracts",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 5000,
              "minimum": 1,
              "description": "Cap on the number of contracts returned (default 2000, hard ceiling 5000). When more contracts match the filters, the response is truncated to the closest-to-spot subset and `truncated=true` is set with `total_matching_count` so the client knows to narrow the filter.",
              "default": 2000,
              "title": "Max Contracts"
            },
            "description": "Cap on the number of contracts returned (default 2000, hard ceiling 5000). When more contracts match the filters, the response is truncated to the closest-to-spot subset and `truncated=true` is set with `total_matching_count` so the client knows to narrow the filter."
          },
          {
            "name": "fields",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Top-level projection: aggregates,available_expiries,contracts",
              "title": "Fields"
            },
            "description": "Top-level projection: aggregates,available_expiries,contracts"
          },
          {
            "name": "include",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Per-contract projection: bid_ask,gex,greeks,iv,oi,volume. Default is all sections.",
              "title": "Include"
            },
            "description": "Per-contract projection: bid_ask,gex,greeks,iv,oi,volume. Default is all sections."
          },
          {
            "name": "as_of",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "ISO-8601 instant to answer as of, e.g. `2026-08-20T14:30:00Z`. Omit for the current value. Resolves to the nearest chain snapshot AT OR BEFORE the requested time (never after, which would be look-ahead bias); the snapshot actually used and the lag are reported in `meta.extra.as_of`. Under `positioning=flow` the dealer flow map is rebuilt from the tape as it stood at that instant, so a given timestamp always returns the same numbers. Bounded by your plan's history window.",
              "title": "As Of"
            },
            "description": "ISO-8601 instant to answer as of, e.g. `2026-08-20T14:30:00Z`. Omit for the current value. Resolves to the nearest chain snapshot AT OR BEFORE the requested time (never after, which would be look-ahead bias); the snapshot actually used and the lag are reported in `meta.extra.as_of`. Under `positioning=flow` the dealer flow map is rebuilt from the tape as it stood at that instant, so a given timestamp always returns the same numbers. Bounded by your plan's history window."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ChainResponse"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/V2ErrorEnvelope"
                }
              }
            },
            "description": "Not Found"
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/options/expiry-summary": {
      "get": {
        "tags": [
          "Options"
        ],
        "summary": "Per-expiry IV / skew / PCR / OI / GEX (with OPEX enrichment)",
        "description": "One row per active expiry with the metrics most useful for chain-wide screening:\n\n**Pre-computed every 30s** - ATM IV, 25Δ skew, put/call 25Δ IVs, PCR, call/put/total OI, net GEX.\n\n**Added by v2 (OPEX enrichment, on-the-fly):**\n* `type` - `daily | weekly | monthly | quarterly` (Deribit token   parsed; quarterlies are last Fridays of Mar/Jun/Sep/Dec).\n* `is_anchor` - true for monthly + quarterly anchors.\n* `expiry_date` - ISO date when the token parses cleanly.\n* `notional_oi_usd` - `total_oi × spot_price` (each contract is   1 unit of underlying on Deribit-style chains).\n* `max_pain` - `{strike, value}` from a per-expiry max-pain pass   over the latest chain snapshot. Cached 30s, shared with   `/v2/gex/max-pain` and `/v2/options/opex`.\n* `by_venue` - `{venue: {call_oi, put_oi, total_oi,   notional_oi_usd}}` for that expiry. OI is coin-native on every   venue; `notional_oi_usd = total_oi x spot`, using the same spot as   the response. All ten venues are always present (zero-filled) -   `GET /v2/status` distinguishes a zero-OI venue from a disabled   one. Delta India and Delta Global are independent books and are   summed, never deduped.\n* `by_venue_unattributed` - residual open interest the aggregator   could not attribute to a venue; `null` when the split reconciles   with `call_oi` / `put_oi` (the normal case).",
        "operationId": "get_expiry_summary_options_expiry_summary_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExpirySummaryResponse"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/V2ErrorEnvelope"
                }
              }
            },
            "description": "Not Found"
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/options/iv/surface": {
      "get": {
        "tags": [
          "Options"
        ],
        "summary": "IV surface (strike × expiry)",
        "description": "The fitted implied-volatility surface from the ten-venue chain, out to 180 days: `z_grid[i][j]` is the vol (percent) at tenor `y_grid[i]` (days, ascending) and strike `x_grid[j]`; holes are null where the expiry never traded that far out.\n\nEach expiry is fitted with raw SVI on its own forward (put-call parity), the grid is lifted where needed so total variance never falls with maturity, and quotes too cheap to price are dropped. `expiry_forwards` gives each expiry's forward, fit method and error and, where it fitted, the SVI parameters `svi` {a, b, rho, m, sigma} (total variance w(k) = a + b (rho (k - m) + sqrt((k - m)^2 + sigma^2)), k = ln(K / F)), its years to expiry `t` and the log-moneyness span `k_range` of its quotes. The fit itself uses the quotes within four ATM standard deviations of the forward, and `smile_rmse` (vol points) is measured on those. The parameters are each expiry's own fit; the grid's calendar lift is not in them. `n_quotes` is how many out-of-the-money quotes the expiry's smile has. `long_expiries` carries the same fields for the expiries past 180 days (to about 18 months), which are fitted but not on the grid. `delta_surface` is the same surface by delta (Black-76 forward deltas). Each fitted smile's static-arbitrage checks are on /v2/options/iv/constant-maturity.\n\nThe top-level `forward` is the spot the per-expiry forwards were solved from (equal to `spot_price`), not a forward: each expiry's own forward is in `expiry_forwards` / `long_expiries`.",
        "operationId": "get_iv_surface_options_iv_surface_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "as_of",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "ISO-8601 instant to answer as of, e.g. `2026-08-20T14:30:00Z`. Omit for the current value. Resolves to the nearest chain snapshot AT OR BEFORE the requested time (never after, which would be look-ahead bias); the snapshot actually used and the lag are reported in `meta.extra.as_of`. Under `positioning=flow` the dealer flow map is rebuilt from the tape as it stood at that instant, so a given timestamp always returns the same numbers. Bounded by your plan's history window.",
              "title": "As Of"
            },
            "description": "ISO-8601 instant to answer as of, e.g. `2026-08-20T14:30:00Z`. Omit for the current value. Resolves to the nearest chain snapshot AT OR BEFORE the requested time (never after, which would be look-ahead bias); the snapshot actually used and the lag are reported in `meta.extra.as_of`. Under `positioning=flow` the dealer flow map is rebuilt from the tape as it stood at that instant, so a given timestamp always returns the same numbers. Bounded by your plan's history window."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/options/iv/term-structure": {
      "get": {
        "tags": [
          "Options"
        ],
        "summary": "ATM IV by tenor",
        "description": "At-the-money implied volatility for each active expiration, read at that expiry's forward (`forwards`, parallel to `expiries`) by interpolating between the strikes either side of it.\n\nFilters:\n* `exchanges` - comma-separated venue filter. An expiry none of the   chosen venues quotes has a null `atm_iv`.\n* `dte_max` - drop tenors with DTE > dte_max (focus on the front   of the curve).\n* `historical_compare_days=N` - also include the constant-maturity   ATM IV from N days ago, sourced from the `iv_history` Postgres   table. Returned as a separate `historical` block under   `compare`. Different shape from the live curve - historical is   by DTE-bucket (7/14/30/60/90/180/365) since that's how the   worker stores it; the client can interpolate onto the live   tenor grid for visualisation.",
        "operationId": "get_iv_term_options_iv_term_structure_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "as_of",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "ISO-8601 instant to answer as of, e.g. `2026-08-20T14:30:00Z`. Omit for the current value. Resolves to the nearest chain snapshot AT OR BEFORE the requested time (never after, which would be look-ahead bias); the snapshot actually used and the lag are reported in `meta.extra.as_of`. Under `positioning=flow` the dealer flow map is rebuilt from the tape as it stood at that instant, so a given timestamp always returns the same numbers. Bounded by your plan's history window.",
              "title": "As Of"
            },
            "description": "ISO-8601 instant to answer as of, e.g. `2026-08-20T14:30:00Z`. Omit for the current value. Resolves to the nearest chain snapshot AT OR BEFORE the requested time (never after, which would be look-ahead bias); the snapshot actually used and the lag are reported in `meta.extra.as_of`. Under `positioning=flow` the dealer flow map is rebuilt from the tape as it stood at that instant, so a given timestamp always returns the same numbers. Bounded by your plan's history window."
          },
          {
            "name": "exchanges",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Comma-separated venue filter, e.g. `deribit,bybit`. Restricts the response to those venues' contribution, recomputed from the per-venue breakdown - it is a re-aggregation, not a post-hoc scaling. Unknown names are ignored; an all-invalid filter returns every venue rather than nothing. Venues: `deribit`, `bybit`, `okx`, `binance`, `derive`, `thalex`, `delta_india`, `delta`, `bullish`, `paradex`. A venue with no contracts on the surface contributes zero - use `GET /v2/status` to tell that apart from a venue that is switched off.",
              "title": "Exchanges"
            },
            "description": "Comma-separated venue filter, e.g. `deribit,bybit`. Restricts the response to those venues' contribution, recomputed from the per-venue breakdown - it is a re-aggregation, not a post-hoc scaling. Unknown names are ignored; an all-invalid filter returns every venue rather than nothing. Venues: `deribit`, `bybit`, `okx`, `binance`, `derive`, `thalex`, `delta_india`, `delta`, `bullish`, `paradex`. A venue with no contracts on the surface contributes zero - use `GET /v2/status` to tell that apart from a venue that is switched off."
          },
          {
            "name": "dte_max",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "integer",
                  "maximum": 720,
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ],
              "description": "Drop tenors with DTE greater than this value.",
              "title": "Dte Max"
            },
            "description": "Drop tenors with DTE greater than this value."
          },
          {
            "name": "historical_compare_days",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "integer",
                  "maximum": 365,
                  "minimum": 1
                },
                {
                  "type": "null"
                }
              ],
              "description": "Days back for historical CMT IV comparison (1-365).",
              "title": "Historical Compare Days"
            },
            "description": "Days back for historical CMT IV comparison (1-365)."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IvTermStructureResponse"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/V2ErrorEnvelope"
                }
              }
            },
            "description": "Not Found"
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/options/iv/skew": {
      "get": {
        "tags": [
          "Options"
        ],
        "summary": "25Δ / 10Δ skew + 25Δ butterfly per expiry",
        "description": "Delta-interpolated risk-reversal and butterfly per active expiry. `skew_25d` = 25Δ put IV − 25Δ call IV (positive = put premium, fear bid); `butterfly_25d` = (25Δ put IV + 25Δ call IV) / 2 − ATM IV (smile curvature / wing pricing). Computed from real delta-bracketed options, not strike proxies: deltas are Black-76 on each expiry's forward (`forward`), the venues' convention, and ATM is the IV at that forward. A 25Δ or 10Δ point the quotes do not reach (no quote within 0.05 delta of it) is null rather than the nearest quote held flat.",
        "operationId": "get_iv_skew_options_iv_skew_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "as_of",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "ISO-8601 instant to answer as of, e.g. `2026-08-20T14:30:00Z`. Omit for the current value. Resolves to the nearest chain snapshot AT OR BEFORE the requested time (never after, which would be look-ahead bias); the snapshot actually used and the lag are reported in `meta.extra.as_of`. Under `positioning=flow` the dealer flow map is rebuilt from the tape as it stood at that instant, so a given timestamp always returns the same numbers. Bounded by your plan's history window.",
              "title": "As Of"
            },
            "description": "ISO-8601 instant to answer as of, e.g. `2026-08-20T14:30:00Z`. Omit for the current value. Resolves to the nearest chain snapshot AT OR BEFORE the requested time (never after, which would be look-ahead bias); the snapshot actually used and the lag are reported in `meta.extra.as_of`. Under `positioning=flow` the dealer flow map is rebuilt from the tape as it stood at that instant, so a given timestamp always returns the same numbers. Bounded by your plan's history window."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IvSkewResponse"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/V2ErrorEnvelope"
                }
              }
            },
            "description": "Not Found"
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/options/iv/curves": {
      "get": {
        "tags": [
          "Options"
        ],
        "summary": "Full IV smile per expiry",
        "description": "Merged-IV smile (OTM puts below spot, OTM calls above) for every active expiry, sorted by DTE.",
        "operationId": "get_iv_curves_options_iv_curves_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/options/iv/smile": {
      "get": {
        "tags": [
          "Options"
        ],
        "summary": "Single-expiry IV smile",
        "description": "Implied volatility by strike for one expiry, from the fitted surface (see /v2/options/iv/surface): rebuilt from the expiry's SVI fit between its lowest and highest quoted strikes, never past them (`method: svi`), or its row of the surface grid where the smile did not fit (`method: interp`, mostly same-day expiries). Each point gives the strike, log-moneyness against the expiry's forward and the vol in percent; the response adds that expiry's ATM vol, 25- and 10-delta risk reversal and butterfly, and the static-arbitrage checks on its fit (`butterfly_free`: Durrleman's density condition g(k) >= 0 between its lowest and highest quoted strikes; `calendar_free`: its total variance is at or above the previous fitted expiry's; both null on an `interp` row).\n\n`expiry` takes a token (`30OCT26`) or an ISO date. Omitted, the nearest fitted expiry is returned. `available_expiries` lists every expiry on the surface.",
        "operationId": "get_iv_smile_options_iv_smile_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "expiry",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Expiry token (`30OCT26`) or ISO date. Omit for the nearest fitted expiry.",
              "title": "Expiry"
            },
            "description": "Expiry token (`30OCT26`) or ISO date. Omit for the nearest fitted expiry."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/options/iv/constant-maturity": {
      "get": {
        "tags": [
          "Options"
        ],
        "summary": "Constant-maturity vol: ATM, risk reversals, butterflies",
        "description": "ATM vol and the 25- and 10-delta wings at fixed tenors (7, 14, 30, 60, 90, 120, 180, 270 and 365 days), from the expiries whose smile fitted on the surface, including the long-dated ones past its grid. Per expiry, ATM is the vol at the forward and each wing the vol at the strike of that delta (Black-76 forward deltas; a put's delta is read on the call-equivalent axis, so the 25-delta put sits at call delta 0.75), read off the expiry's quoted smile with total variance linear in log-moneyness between neighbouring quotes. Each point's total variance is then interpolated linearly in time between the two expiries that bracket the tenor. No extrapolation: a tenor outside the fitted expiries, or a wing beyond the quoted strikes, is null.\n\nConventions, all in vol points: `rr_25` = 25-delta call vol minus 25-delta put vol (negative when puts are bid), `bf_25` = their average minus ATM; the same for 10-delta. Note `/v2/options/iv/skew` reports put minus call.\n\n`expiries` gives the same numbers at each fitted expiry's own maturity with its quote count `n_quotes` and static-arbitrage checks; `bracket_dte` names the expiries each tenor sits between. `arbitrage` summarises the checks over every fitted smile: `butterfly_free` (Durrleman's density condition g(k) >= 0 across each expiry's quoted strikes), `calendar_free` (total variance does not fall from one fitted expiry to the next across their common strikes) and any `violations`. Current values, refreshed with the surface every 30 seconds.",
        "operationId": "get_iv_constant_maturity_options_iv_constant_maturity_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/options/iv/iv-rv": {
      "get": {
        "tags": [
          "Options"
        ],
        "summary": "Implied vs realized vol history",
        "description": "Implied vol (Deribit DVOL, percent) against 30-day realized vol (hourly returns, annualised), hourly points over the last 30 days, and `spread` = iv - rv per point (vol points).",
        "operationId": "get_iv_rv_options_iv_iv_rv_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "days",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 365,
              "minimum": 7,
              "description": "Trailing window in days (7-365).",
              "default": 90,
              "title": "Days"
            },
            "description": "Trailing window in days (7-365)."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/IvRvResponse"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/V2ErrorEnvelope"
                }
              }
            },
            "description": "Not Found"
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/options/vrp": {
      "get": {
        "tags": [
          "Options"
        ],
        "summary": "Volatility Risk Premium",
        "description": "Difference between implied and realized vol; positive = options expensive.",
        "operationId": "get_vrp_options_vrp_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "days",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 365,
              "minimum": 7,
              "description": "Trailing window in days (7-365).",
              "default": 90,
              "title": "Days"
            },
            "description": "Trailing window in days (7-365)."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/options/expected-move": {
      "get": {
        "tags": [
          "Options"
        ],
        "summary": "Implied 1σ move",
        "description": "ATM-implied 1- and 2-sigma expected move to the nearest liquid expiry: the closest expiry 7-30 days out, else the closest one 1-60 days out (`days_to_expiry` says which). Move = `atm_iv` x sqrt(days/365) x spot; `straddle_price` is the ATM straddle for the same expiry. ATM is read at that expiry's forward.\n\nThe 1-day move is separate: `expected_move_1d` = spot x `atm_iv_1d` x sqrt(1/365), with `upper_1d` / `lower_1d` around spot, where `atm_iv_1d` is the ATM IV of the front live expiry (the next to settle at 08:00 UTC, passed over inside its last 4 hours; `expiry_1d` names it). The 7-30 day move above is not a daily range. With `exchanges=`, both moves are recomputed from the chosen venues' own ATM IVs (null where none quotes the expiry).\n\nUnit: `atm_iv` and `atm_iv_1d` here are decimals (0.33 = 33%). Elsewhere in v2, `atm_iv` is in percent (33.0 = 33%).",
        "operationId": "get_expected_move_options_expected_move_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "as_of",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "ISO-8601 instant to answer as of, e.g. `2026-08-20T14:30:00Z`. Omit for the current value. Resolves to the nearest chain snapshot AT OR BEFORE the requested time (never after, which would be look-ahead bias); the snapshot actually used and the lag are reported in `meta.extra.as_of`. Under `positioning=flow` the dealer flow map is rebuilt from the tape as it stood at that instant, so a given timestamp always returns the same numbers. Bounded by your plan's history window.",
              "title": "As Of"
            },
            "description": "ISO-8601 instant to answer as of, e.g. `2026-08-20T14:30:00Z`. Omit for the current value. Resolves to the nearest chain snapshot AT OR BEFORE the requested time (never after, which would be look-ahead bias); the snapshot actually used and the lag are reported in `meta.extra.as_of`. Under `positioning=flow` the dealer flow map is rebuilt from the tape as it stood at that instant, so a given timestamp always returns the same numbers. Bounded by your plan's history window."
          },
          {
            "name": "exchanges",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Comma-separated venue filter, e.g. `deribit,bybit`. Restricts the response to those venues' contribution, recomputed from the per-venue breakdown - it is a re-aggregation, not a post-hoc scaling. Unknown names are ignored; an all-invalid filter returns every venue rather than nothing. Venues: `deribit`, `bybit`, `okx`, `binance`, `derive`, `thalex`, `delta_india`, `delta`, `bullish`, `paradex`. A venue with no contracts on the surface contributes zero - use `GET /v2/status` to tell that apart from a venue that is switched off.",
              "title": "Exchanges"
            },
            "description": "Comma-separated venue filter, e.g. `deribit,bybit`. Restricts the response to those venues' contribution, recomputed from the per-venue breakdown - it is a re-aggregation, not a post-hoc scaling. Unknown names are ignored; an all-invalid filter returns every venue rather than nothing. Venues: `deribit`, `bybit`, `okx`, `binance`, `derive`, `thalex`, `delta_india`, `delta`, `bullish`, `paradex`. A venue with no contracts on the surface contributes zero - use `GET /v2/status` to tell that apart from a venue that is switched off."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ExpectedMoveResponse"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/V2ErrorEnvelope"
                }
              }
            },
            "description": "Not Found"
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/options/probability/density": {
      "get": {
        "tags": [
          "Options"
        ],
        "summary": "Risk-neutral PDF/CDF (per expiry)",
        "description": "Breeden-Litzenberger probability density derived from option prices. Returns PDF, normalized PDF, CDF (above and below spot), and distribution stats (mean, std, mode, skew, kurtosis, 25/50/75 percentile prices) per expiry.\n\nFilters:\n* `expiry` - slice to a single expiry token (case-insensitive).\n* `dte_max` - drop expiries with DTE > dte_max so near-term clients   can avoid carrying the long tail.\n* `confidence_band` - when set to `0.68` or `0.95` (the most   common choices), each expiry payload gets a `confidence_band`   object with `lower` / `upper` price levels containing that much   implied probability mass, computed by interpolating the CDF.",
        "operationId": "get_probability_density_options_probability_density_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "expiry",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Filter to one expiry token (e.g. 28MAR25)",
              "title": "Expiry"
            },
            "description": "Filter to one expiry token (e.g. 28MAR25)"
          },
          {
            "name": "dte_max",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "integer",
                  "maximum": 720,
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ],
              "description": "Drop expiries with DTE greater than this value.",
              "title": "Dte Max"
            },
            "description": "Drop expiries with DTE greater than this value."
          },
          {
            "name": "confidence_band",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "number",
                  "maximum": 0.999,
                  "minimum": 0.5
                },
                {
                  "type": "null"
                }
              ],
              "description": "Confidence level for the implied price band, e.g. `0.68` for ≈1σ or `0.95` for ≈2σ. Adds `confidence_band` per expiry.",
              "title": "Confidence Band"
            },
            "description": "Confidence level for the implied price band, e.g. `0.68` for ≈1σ or `0.95` for ≈2σ. Adds `confidence_band` per expiry."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProbabilityDensityResponse"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/V2ErrorEnvelope"
                }
              }
            },
            "description": "Not Found"
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/options/probability/surface": {
      "get": {
        "tags": [
          "Options"
        ],
        "summary": "3D probability surface (PDF over strike × expiry)",
        "description": "Risk-neutral probability density across the full strike × expiry grid as a single matrix, suitable for 3D visualisations or surface-fit applications. Built from the same Breeden-Litzenberger extraction as /options/probability/density but pre-aligned onto a unified strike axis so cross-expiry comparisons are direct.",
        "operationId": "get_probability_surface_options_probability_surface_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/options/greeks/{greek}": {
      "get": {
        "tags": [
          "Options"
        ],
        "summary": "Greek exposure profile by strike",
        "description": "Net greek exposure per strike. `greek` is one of `delta` (DEX), `theta`, `vanna`, `charm`, `vega`.\n\n**Units** (`unit` in the response): delta $ delta, theta $ per day, vanna $ delta per vol point, charm $ delta per day, vega $ per vol point.\n\n**Positioning (default: flow).** Weights by BackQuant's measured dealer model (BTC/ETH) or textbook ±OI.\n\nFilters:\n* `exchanges` - comma-separated venue filter. Only the std profile   has a per-venue split, so with `positioning=flow` a venue filter   serves std (`positioning_fallback_reason`   `exchange_filter_needs_std`); with `dte_max` it cannot apply and   `meta.extra.exchanges_not_applied` says so.\n* `moneyness_min` / `moneyness_max` - strike/spot ratio bounds,   e.g. `0.9..1.1` keeps ATM ±10% exposure only.\n* `dte_max` - re-aggregates from the raw chain to limit   contributing contracts to `DTE ≤ dte_max`.\n* `positioning` - `flow` (default) or `std`.",
        "operationId": "get_greek_profile_options_greeks__greek__get",
        "parameters": [
          {
            "name": "greek",
            "in": "path",
            "required": true,
            "schema": {
              "enum": [
                "delta",
                "theta",
                "vanna",
                "charm",
                "vega"
              ],
              "type": "string",
              "description": "Which greek profile to return",
              "title": "Greek"
            },
            "description": "Which greek profile to return"
          },
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "exchanges",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Comma-separated venue filter, e.g. `deribit,bybit`. Restricts the response to those venues' contribution, recomputed from the per-venue breakdown - it is a re-aggregation, not a post-hoc scaling. Unknown names are ignored; an all-invalid filter returns every venue rather than nothing. Venues: `deribit`, `bybit`, `okx`, `binance`, `derive`, `thalex`, `delta_india`, `delta`, `bullish`, `paradex`. A venue with no contracts on the surface contributes zero - use `GET /v2/status` to tell that apart from a venue that is switched off.",
              "title": "Exchanges"
            },
            "description": "Comma-separated venue filter, e.g. `deribit,bybit`. Restricts the response to those venues' contribution, recomputed from the per-venue breakdown - it is a re-aggregation, not a post-hoc scaling. Unknown names are ignored; an all-invalid filter returns every venue rather than nothing. Venues: `deribit`, `bybit`, `okx`, `binance`, `derive`, `thalex`, `delta_india`, `delta`, `bullish`, `paradex`. A venue with no contracts on the surface contributes zero - use `GET /v2/status` to tell that apart from a venue that is switched off."
          },
          {
            "name": "moneyness_min",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "number",
                  "maximum": 10,
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ],
              "description": "Strike/spot lower bound",
              "title": "Moneyness Min"
            },
            "description": "Strike/spot lower bound"
          },
          {
            "name": "moneyness_max",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "number",
                  "maximum": 10,
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ],
              "description": "Strike/spot upper bound",
              "title": "Moneyness Max"
            },
            "description": "Strike/spot upper bound"
          },
          {
            "name": "dte_max",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "integer",
                  "maximum": 720,
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ],
              "description": "Limit aggregation to contracts with `DTE ≤ dte_max`. Triggers a recomputation from the raw chain.",
              "title": "Dte Max"
            },
            "description": "Limit aggregation to contracts with `DTE ≤ dte_max`. Triggers a recomputation from the raw chain."
          },
          {
            "name": "positioning",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "description": "Dealer positioning model. **`flow`** (default) is BackQuant's measured dealer model, available for BTC/ETH; it falls back to `std` when it cannot be produced for a symbol. **`std`** is the textbook convention (call:+OI / put:-OI). The response reports which model actually ran in `meta.extra.positioning`.",
              "default": "flow",
              "title": "Positioning"
            },
            "description": "Dealer positioning model. **`flow`** (default) is BackQuant's measured dealer model, available for BTC/ETH; it falls back to `std` when it cannot be produced for a symbol. **`std`** is the textbook convention (call:+OI / put:-OI). The response reports which model actually ran in `meta.extra.positioning`."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/options/greeks/surfaces/{greek}": {
      "get": {
        "tags": [
          "Options"
        ],
        "summary": "Strike × time greek surface",
        "description": "Time-evolving surface for `charm` or `vega` - strike on one axis, time on the other. Already pre-computed for the pro terminal; exposed here for quant tooling that wants the same view.\n\n**Units** (`unit` in the response): charm $ delta per day, vega $ per vol point, each summed over open interest at the strike.\n\n`exchange_breakdown` - the per-venue split repeated at every point on the surface - is roughly three quarters of the payload and is **opt-in** via `?include=exchange_breakdown`. Same flag and same default as `GET /v2/options/pcr`.",
        "operationId": "get_greek_surface_options_greeks_surfaces__greek__get",
        "parameters": [
          {
            "name": "greek",
            "in": "path",
            "required": true,
            "schema": {
              "enum": [
                "charm",
                "vega"
              ],
              "type": "string",
              "description": "`charm` or `vega`",
              "title": "Greek"
            },
            "description": "`charm` or `vega`"
          },
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "include",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Optional sections: `exchange_breakdown` (the per-venue split at every point on the surface). Omitted by default because it is roughly three quarters of the payload.",
              "title": "Include"
            },
            "description": "Optional sections: `exchange_breakdown` (the per-venue split at every point on the surface). Omitted by default because it is roughly three quarters of the payload."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/options/greeks/3d/surface": {
      "get": {
        "tags": [
          "Options"
        ],
        "summary": "Strike × expiry surface for any greek",
        "description": "Z = the greek's $ exposure summed over OI per (strike, expiry) cell (no dealer sign). Useful for 3D visualizations or for spotting where a particular greek is concentrated across the term structure.\n\n**Units** (`unit` in the response): delta $ delta, gamma $ per 1% move, theta $ per day, vega $ per vol point, vanna $ delta per vol point, charm $ delta per day.",
        "operationId": "get_greek_3d_surface_options_greeks_3d_surface_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "greek",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "delta",
                "gamma",
                "theta",
                "vega",
                "vanna",
                "charm"
              ],
              "type": "string",
              "description": "Which greek to surface",
              "default": "gamma",
              "title": "Greek"
            },
            "description": "Which greek to surface"
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/options/oi/by-expiry": {
      "get": {
        "tags": [
          "Options"
        ],
        "summary": "Call/put OI per expiry",
        "description": "Open interest aggregated by expiration with calls and puts split.\n\n**Per-venue split (`by_venue`)** - one entry per expiry, parallel to `expiries`: `{venue: {call_oi, put_oi, total_oi, notional_oi_usd}}`. OI is coin-native on every venue, so a cross-venue sum needs no conversion; `notional_oi_usd = total_oi x spot`. All ten venues are always present (zero-filled) - use `GET /v2/status` to tell a zero-OI venue from a disabled one. `by_venue_unattributed` (also parallel to `expiries`) is non-null only when some open interest could not be attributed to a venue. With `?exchanges=` set, both blocks cover only the requested venues, matching the filtered totals.\n\n`total_call_oi` / `total_put_oi` and the OI CDFs always describe the rows actually returned: apply a DTE filter and they are recomputed over the surviving expiries rather than left reporting the whole chain.\n\nDTE-axis filters:\n* `dte_min` / `dte_max` - bound the DTE window.\n* `weekly_only=true` - exclude monthly + quarterly anchors   (last-Friday-of-month). Useful when monthly OI dominates the   picture and you want to see the weekly distribution alone.",
        "operationId": "get_oi_by_expiry_options_oi_by_expiry_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "exchanges",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Comma-separated venue filter, e.g. `deribit,bybit`. Restricts the response to those venues' contribution, recomputed from the per-venue breakdown - it is a re-aggregation, not a post-hoc scaling. Unknown names are ignored; an all-invalid filter returns every venue rather than nothing. Venues: `deribit`, `bybit`, `okx`, `binance`, `derive`, `thalex`, `delta_india`, `delta`, `bullish`, `paradex`. A venue with no contracts on the surface contributes zero - use `GET /v2/status` to tell that apart from a venue that is switched off.",
              "title": "Exchanges"
            },
            "description": "Comma-separated venue filter, e.g. `deribit,bybit`. Restricts the response to those venues' contribution, recomputed from the per-venue breakdown - it is a re-aggregation, not a post-hoc scaling. Unknown names are ignored; an all-invalid filter returns every venue rather than nothing. Venues: `deribit`, `bybit`, `okx`, `binance`, `derive`, `thalex`, `delta_india`, `delta`, `bullish`, `paradex`. A venue with no contracts on the surface contributes zero - use `GET /v2/status` to tell that apart from a venue that is switched off."
          },
          {
            "name": "dte_min",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "integer",
                  "maximum": 720,
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ],
              "description": "DTE lower bound",
              "title": "Dte Min"
            },
            "description": "DTE lower bound"
          },
          {
            "name": "dte_max",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "integer",
                  "maximum": 720,
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ],
              "description": "DTE upper bound",
              "title": "Dte Max"
            },
            "description": "DTE upper bound"
          },
          {
            "name": "weekly_only",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean",
              "description": "Exclude monthly + quarterly anchors (last-Friday-of-month).",
              "default": false,
              "title": "Weekly Only"
            },
            "description": "Exclude monthly + quarterly anchors (last-Friday-of-month)."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/options/oi/history": {
      "get": {
        "tags": [
          "Options"
        ],
        "summary": "Total OI history (cursor-paginated)",
        "description": "Time-series of total / call / put open interest. Use `?limit` to cap page size and `?before=<ISO ts>` to walk backwards into older history (the cursor is the timestamp of the oldest row in the previous page, returned as `next_cursor`).",
        "operationId": "get_oi_history_options_oi_history_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 2000,
              "minimum": 1,
              "description": "Maximum points returned (1-2000).",
              "default": 200,
              "title": "Limit"
            },
            "description": "Maximum points returned (1-2000)."
          },
          {
            "name": "before",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "ISO timestamp cursor - exclusive upper bound for paging older.",
              "title": "Before"
            },
            "description": "ISO timestamp cursor - exclusive upper bound for paging older."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/options/pcr": {
      "get": {
        "tags": [
          "Options"
        ],
        "summary": "Put/call ratio",
        "description": "OI-weighted put/call ratio. `?granularity=intraday` returns the rolling intraday series; `daily` returns one value per UTC day.",
        "operationId": "get_pcr_options_pcr_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "granularity",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "intraday",
                "daily"
              ],
              "type": "string",
              "description": "`intraday` returns the rolling intraday series; `daily` returns one row per UTC day.",
              "default": "intraday",
              "title": "Granularity"
            },
            "description": "`intraday` returns the rolling intraday series; `daily` returns one row per UTC day."
          },
          {
            "name": "days",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 365,
              "minimum": 1,
              "description": "Trim window in days. Applies to BOTH granularities: intraday was previously served in full regardless of this value.",
              "default": 30,
              "title": "Days"
            },
            "description": "Trim window in days. Applies to BOTH granularities: intraday was previously served in full regardless of this value."
          },
          {
            "name": "include",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Optional sections: `exchange_breakdown` (per-venue call/put OI for every point). Omitted by default because it is roughly four fifths of the payload and is rarely read.",
              "title": "Include"
            },
            "description": "Optional sections: `exchange_breakdown` (per-venue call/put OI for every point). Omitted by default because it is roughly four fifths of the payload and is rarely read."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/options/premium-tide": {
      "get": {
        "tags": [
          "Options"
        ],
        "summary": "Net premium & volume tilt",
        "description": "Deribit option premium (USD) and contract volume in 1-minute buckets, split into calls and puts. Each bucket holds that minute's increment, so sum a range of buckets for its total; `call_premium_total` and `put_premium_total` are the sums over what is returned. Buckets are in time order.\n\n* `horizon=0dte` (default): today's session, the options expiring this UTC day, traded from 00:00 UTC up to their 08:00 UTC expiry. `session_date` names the session; after the expiry it is still that day's session until the next one starts.\n* `horizon=weekly`: options expiring within 7 days, over the last 3 days of buckets.\n\n`trade_count` is the number of trades the series has absorbed since it began, not the count for this window.",
        "operationId": "get_premium_tide_options_premium_tide_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "horizon",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "0dte",
                "weekly"
              ],
              "type": "string",
              "description": "`0dte` returns today's session; `weekly` returns options expiring within 7 days over the last 3 days.",
              "default": "0dte",
              "title": "Horizon"
            },
            "description": "`0dte` returns today's session; `weekly` returns options expiring within 7 days over the last 3 days."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/options/range": {
      "get": {
        "tags": [
          "Options"
        ],
        "summary": "Calibrated options range",
        "description": "How far price is likely to move over the next 1, 4 and 24 hours: the move Deribit's implied vol index (DVOL) prices, rescaled to how far price has actually moved. Options overprice moves on average (the variance risk premium), so the raw priced range holds more often than it claims; here the multipliers are fitted on the last 30 days of hourly moves so the bands hold about 68% and 90% of the time.\n\nPer horizon: `priced_move` (the 1 sigma log move DVOL prices), `band_68` and `band_90` (price `low` / `high` around spot, the log `log_half_width` and the `multiplier` applied to the priced move), and `record`: how often the bands held out of sample (each day fitted only on the days before it), with the `days` and `samples` behind it.\n\n`include=past` adds the past bands per horizon (hourly for a week, 4-hourly for a month, daily from 00:00 UTC for half a year, within your plan's history depth) as compact rows in `past_columns` order: `time` (UTC, when the band starts), `price_at_start`, the 68% and 90% bands as prices (`low_68`, `high_68`, `low_90`, `high_90`), `price_at_end`, and whether price ended inside each band (`held_68`, `held_90`). The latest band is still running: its end price and held flags are null. Like the record, every past band is out of sample (fitted only on days before its own). BTC and ETH.",
        "operationId": "get_options_range_options_range_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "include",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "`past` adds the past bands per horizon.",
              "title": "Include"
            },
            "description": "`past` adds the past bands per horizon."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/options/futures/term-structure": {
      "get": {
        "tags": [
          "Options"
        ],
        "summary": "Dated-futures annualized basis curve",
        "description": "Deribit-listed dated futures annualized basis vs spot, by maturity. Useful as a complement to the IV term structure for assessing carry in the calendar.",
        "operationId": "get_futures_term_structure_options_futures_term_structure_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/options/opex": {
      "get": {
        "tags": [
          "Options"
        ],
        "summary": "OPEX calendar with per-expiry context",
        "description": "Curated calendar of upcoming options expirations with everything needed for OPEX-day workflows in one call:\n\n* Token + ISO date + DTE + classification (daily / weekly /   monthly / quarterly) + `is_anchor` flag.\n* OI block: `call_oi`, `put_oi`, `total_oi`, `pcr`,   `notional_oi_usd` (= total_oi × spot, since each crypto   options contract is 1 unit of underlying).\n* IV block: `atm_iv`, `skew_25d`, `put_25d_iv`, `call_25d_iv`.\n* Gamma block: `net_gex`, `call_resistance`, `put_support`   (computed per expiry from the strike × expiry heatmap), and   `max_pain` (`{strike, value}` from the shared per-expiry   cache used by `/v2/gex/max-pain` and `/v2/options/expiry-  summary`).\n\n`next_anchor` points at the closest monthly/quarterly. Filter with `?types=monthly,quarterly` for the institutional-roll view or `?horizon=` to bound the look-ahead window.",
        "operationId": "get_opex_options_opex_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "horizon",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 365,
              "minimum": 1,
              "description": "Look-ahead window in days (1-365). Drops expiries beyond this.",
              "default": 30,
              "title": "Horizon"
            },
            "description": "Look-ahead window in days (1-365). Drops expiries beyond this."
          },
          {
            "name": "types",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "CSV filter on the `type` field: any subset of daily,weekly,monthly,quarterly. Default returns all types.",
              "title": "Types"
            },
            "description": "CSV filter on the `type` field: any subset of daily,weekly,monthly,quarterly. Default returns all types."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OpexResponse"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/V2ErrorEnvelope"
                }
              }
            },
            "description": "Not Found"
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/options/greeks/trace/{greek}": {
      "get": {
        "tags": [
          "Options"
        ],
        "summary": "Forward (time × price) greek projection - gamma / charm / vanna",
        "description": "Black-Scholes forward projection of dealer **gamma**, **charm**, or **vanna** across a (time × price) grid, holding today's chain constant and decaying τ toward each contract's expiry.\n\nReturns a 2D `field` of cell values, the `time_axis_ms` and `price_axis` it's keyed on, and the contracts it consumed. Intended for desk-grade dealer-positioning visualisations (the BackQuant Pro Terminal's TRACE panel runs the same math client-side).\n\n**Positioning (default: flow).**\n* `positioning=flow` (**default**) - BackQuant's measured dealer model (BTC/ETH). Falls back to `std` when it cannot be produced for the symbol (SOL/HYPE).\n* `positioning=std` - textbook call:+OI / put:−OI.\nResponse `meta.extra.positioning` is the model that actually ran; `positioning_fallback_reason` is set on fallback.\n\n**Units:**\n* `gamma` → `$ per 1% spot move` (γ × S² × qty × 0.01).\n* `charm` → `$ of delta per day` (dΔ/dt per day × qty × S).\n* `vanna` → `$ of delta per vol point` (∂Δ/∂σ per vol point × qty × S).\n* `delta_change` → dealer $ delta at (price,time) minus at (spot,now).\nEvery cell is priced at its own row's price, the same numbers as the terminal's TRACE panel.\n\nAlso see `/v2/options/greeks/trace/{greek}/summary` for pin/accel reads.\n\n**Performance:** the field is computed on cache miss in ~50-100 ms for typical grids. Cached for 30 s per `(symbol, full-param-hash)` so identical repeated calls are essentially free.\n\n**What-if vol shifts:** `vol_shift_pct` multiplies every contract's σ by `1 + vol_shift_pct/100` before evaluation. Lets you build vol-up / vol-down surfaces without re-fetching.",
        "operationId": "get_greek_trace_options_greeks_trace__greek__get",
        "parameters": [
          {
            "name": "greek",
            "in": "path",
            "required": true,
            "schema": {
              "enum": [
                "gamma",
                "charm",
                "vanna",
                "delta_change"
              ],
              "type": "string",
              "description": "Which field to project: gamma | charm | vanna | delta_change (dealer delta at cell minus dealer delta at spot/now - path of hedge pressure).",
              "title": "Greek"
            },
            "description": "Which field to project: gamma | charm | vanna | delta_change (dealer delta at cell minus dealer delta at spot/now - path of hedge pressure)."
          },
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "expiry",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "description": "Expiry filter. `0dte` = the front expiry: the next 08:00 UTC settle, when it is within 24h (today's expiry before 08:00 UTC, tomorrow's after it; the same expiry as GEX `0dte`), `all` = every active expiry, or a specific Deribit token (e.g. `28MAR25`).",
              "default": "0dte",
              "title": "Expiry"
            },
            "description": "Expiry filter. `0dte` = the front expiry: the next 08:00 UTC settle, when it is within 24h (today's expiry before 08:00 UTC, tomorrow's after it; the same expiry as GEX `0dte`), `all` = every active expiry, or a specific Deribit token (e.g. `28MAR25`)."
          },
          {
            "name": "time_steps",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 200,
              "minimum": 2,
              "description": "Number of buckets along the time axis. Higher = smoother surface, larger payload. Capped at 200.",
              "default": 60,
              "title": "Time Steps"
            },
            "description": "Number of buckets along the time axis. Higher = smoother surface, larger payload. Capped at 200."
          },
          {
            "name": "price_steps",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 200,
              "minimum": 2,
              "description": "Number of buckets along the price axis. Higher = smoother, larger payload. Capped at 200.",
              "default": 80,
              "title": "Price Steps"
            },
            "description": "Number of buckets along the price axis. Higher = smoother, larger payload. Capped at 200."
          },
          {
            "name": "price_range_pct",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "maximum": 50,
              "exclusiveMinimum": 0,
              "description": "Price half-width as a percent of spot. Default 8 = ±8% around spot. Capped at ±50% - wider than that and BS gamma at the wings is essentially zero anyway.",
              "default": 8.0,
              "title": "Price Range Pct"
            },
            "description": "Price half-width as a percent of spot. Default 8 = ±8% around spot. Capped at ±50% - wider than that and BS gamma at the wings is essentially zero anyway."
          },
          {
            "name": "horizon_hours",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "maximum": 720,
              "exclusiveMinimum": 0,
              "description": "Time horizon in hours from now. Default 24 = one trading day. Use longer horizons for multi-week trace overlays - capped at 720 h (30 days).",
              "default": 24.0,
              "title": "Horizon Hours"
            },
            "description": "Time horizon in hours from now. Default 24 = one trading day. Use longer horizons for multi-week trace overlays - capped at 720 h (30 days)."
          },
          {
            "name": "vol_shift_pct",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "maximum": 50,
              "minimum": -50,
              "description": "What-if shift applied to every contract's IV (additive percent of σ - `+5` ⇒ multiply σ by 1.05). Use to build vol-up / vol-down surfaces without re-fetching.",
              "default": 0.0,
              "title": "Vol Shift Pct"
            },
            "description": "What-if shift applied to every contract's IV (additive percent of σ - `+5` ⇒ multiply σ by 1.05). Use to build vol-up / vol-down surfaces without re-fetching."
          },
          {
            "name": "min_oi",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "minimum": 0,
              "description": "Drop contracts with OI below this threshold before summing. Useful for de-noising the wings.",
              "default": 0.0,
              "title": "Min Oi"
            },
            "description": "Drop contracts with OI below this threshold before summing. Useful for de-noising the wings."
          },
          {
            "name": "positioning",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "description": "Dealer positioning model. **`flow`** (default) is BackQuant's measured dealer model, available for BTC/ETH; it falls back to `std` when it cannot be produced for a symbol. **`std`** is the textbook convention (call:+OI / put:-OI). The response reports which model actually ran in `meta.extra.positioning`.",
              "default": "flow",
              "title": "Positioning"
            },
            "description": "Dealer positioning model. **`flow`** (default) is BackQuant's measured dealer model, available for BTC/ETH; it falls back to `std` when it cannot be produced for a symbol. **`std`** is the textbook convention (call:+OI / put:-OI). The response reports which model actually ran in `meta.extra.positioning`."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TraceResponse"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/V2ErrorEnvelope"
                }
              }
            },
            "description": "Unprocessable Entity"
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/options/greeks/trace/{greek}/summary": {
      "get": {
        "tags": [
          "Options"
        ],
        "summary": "TRACE field summary - pin zones, accel pockets, lean",
        "description": "Same projection as `/greeks/trace/{greek}` but returns an interpretability summary instead of the full 2D field: pin zones (high |field|), near-spot acceleration pockets, late-vs-early lean along spot, and zero-contour samples at the horizon.\n\nSupports `gamma`, `charm`, `vanna`, `delta_change`. Default `positioning=flow`.",
        "operationId": "get_greek_trace_summary_options_greeks_trace__greek__summary_get",
        "parameters": [
          {
            "name": "greek",
            "in": "path",
            "required": true,
            "schema": {
              "enum": [
                "gamma",
                "charm",
                "vanna",
                "delta_change"
              ],
              "type": "string",
              "title": "Greek"
            }
          },
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "expiry",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "default": "0dte",
              "title": "Expiry"
            }
          },
          {
            "name": "time_steps",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 200,
              "minimum": 2,
              "default": 40,
              "title": "Time Steps"
            }
          },
          {
            "name": "price_steps",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 200,
              "minimum": 2,
              "default": 60,
              "title": "Price Steps"
            }
          },
          {
            "name": "price_range_pct",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "maximum": 50,
              "exclusiveMinimum": 0,
              "default": 8.0,
              "title": "Price Range Pct"
            }
          },
          {
            "name": "horizon_hours",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "maximum": 720,
              "exclusiveMinimum": 0,
              "default": 24.0,
              "title": "Horizon Hours"
            }
          },
          {
            "name": "vol_shift_pct",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "maximum": 50,
              "minimum": -50,
              "default": 0.0,
              "title": "Vol Shift Pct"
            }
          },
          {
            "name": "min_oi",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "minimum": 0,
              "default": 0.0,
              "title": "Min Oi"
            }
          },
          {
            "name": "positioning",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "description": "Dealer positioning model. **`flow`** (default) is BackQuant's measured dealer model, available for BTC/ETH; it falls back to `std` when it cannot be produced for a symbol. **`std`** is the textbook convention (call:+OI / put:-OI). The response reports which model actually ran in `meta.extra.positioning`.",
              "default": "flow",
              "title": "Positioning"
            },
            "description": "Dealer positioning model. **`flow`** (default) is BackQuant's measured dealer model, available for BTC/ETH; it falls back to `std` when it cannot be produced for a symbol. **`std`** is the textbook convention (call:+OI / put:-OI). The response reports which model actually ran in `meta.extra.positioning`."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/options/venue-book": {
      "get": {
        "tags": [
          "Options"
        ],
        "summary": "Consolidated cross-venue book and quote dispersion",
        "description": "Best bid and best offer for each contract **across every venue we collect**, with the venue named on each side, plus how far apart those venues are quoting the same contract.\n\nThis is not what `/options/chain` returns. The chain's `bid`/`ask` come from the aggregated row, which is based on a single venue; this endpoint is the genuine best-of, and by construction its spread is never wider than any individual venue's.\n\n**Scope.** Computed only for liquid contracts (0.85-1.15 moneyness, 2+ DTE). Outside that band implied vol stops carrying information: deep-ITM contracts have almost no vega, so a trivial price difference reads as tens of vol points. Contracts quoted by a single venue are omitted, since every field here is a comparison.\n\n**On `crossed`.** A crossed market (best bid vol above best ask vol) is reported as an observation, not an opportunity. Venue quote timestamps are collection times rather than exchange quote times, so a stale quote on the thinner venue cannot be ruled out, and measured crossings are small, short-dated and consistently one-directional - which points at structural causes (settlement, index, funding) rather than anything capturable.\n\n**Ordering.** `sort=spread` and `sort=spread_pct` rank contracts with a non-negative spread first, ascending, and place crossed books after them. A crossed quote's spread is negative, so ordering on the raw number would fill the whole page with books nobody can trade on: on a typical BTC chain a majority of in-band contracts are crossed. They are still returned, and `crossed_only=true` selects them.\n\n**On `mixed_settlement`.** Deribit's and OKX's BTC/ETH options are inverse (coin-settled); the USDC venues are linear. Implied vol is comparable across the two to first order, but part of any gap flagged this way is numeraire rather than volatility.",
        "operationId": "get_venue_book_options_venue_book_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "expiries",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Comma-separated expiry tokens, e.g. `26DEC25,27MAR26`.",
              "title": "Expiries"
            },
            "description": "Comma-separated expiry tokens, e.g. `26DEC25,27MAR26`."
          },
          {
            "name": "option_type",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "enum": [
                    "call",
                    "put"
                  ],
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Restrict to calls or puts.",
              "title": "Option Type"
            },
            "description": "Restrict to calls or puts."
          },
          {
            "name": "crossed_only",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean",
              "description": "Return only contracts where best bid vol exceeds best ask vol. Read the note on `crossed` above before acting on this.",
              "default": false,
              "title": "Crossed Only"
            },
            "description": "Return only contracts where best bid vol exceeds best ask vol. Read the note on `crossed` above before acting on this."
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "spread",
                "spread_pct",
                "dispersion",
                "strike"
              ],
              "type": "string",
              "description": "Ordering for the returned contracts. The two spread sorts rank tradeable (non-negative) spreads first and crossed books last - see **Ordering** above.",
              "default": "spread_pct",
              "title": "Sort"
            },
            "description": "Ordering for the returned contracts. The two spread sorts rank tradeable (non-negative) spreads first and crossed books last - see **Ordering** above."
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 1000,
              "minimum": 1,
              "description": "Max contracts returned.",
              "default": 200,
              "title": "Limit"
            },
            "description": "Max contracts returned."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/liquidation/heatmap": {
      "get": {
        "tags": [
          "Liquidation"
        ],
        "summary": "Liquidation intensity heatmap (price × time)",
        "description": "Estimated liquidation levels normalized to a 0-100 scale, gridded by price bin and time bucket. A model of where open positions would be liquidated, built from the cross-venue perp open interest and taker volume, not a record of liquidations that happened. Includes the OHLC candles plotted alongside so the heatmap can be rendered standalone.",
        "operationId": "get_liquidation_heatmap_liquidation_heatmap_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/liquidation/distribution": {
      "get": {
        "tags": [
          "Liquidation"
        ],
        "summary": "Liquidation histogram with leverage tiers",
        "description": "Per-price-level estimated resting long and short positions from the liquidation model, in coins of the base asset (BTC for BTCUSDT), not USD and not liquidations that happened. `leverage_tier` is the model's leverage cohort whose liquidation, for a position opened at the current price, lies nearest the level (a distance label that moves with price), and `tier_color` ranks it, highest leverage first. Includes cumulative series for visualizing concentration.",
        "operationId": "get_liquidation_distribution_liquidation_distribution_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/multi/gex/levels": {
      "get": {
        "tags": [
          "Multi"
        ],
        "summary": "GEX levels across multiple symbols (bundled)",
        "description": "Multi-symbol GEX levels in one round-trip. Returns a `results` map keyed by symbol with the same shape per-entry as /v2/gex/levels. Symbols with no current data return null in `results` and appear in `missing` rather than failing the whole request. Up to 8 symbols per request.\n\n**Positioning (default: flow).** Each symbol is rebuilt from the multi-venue chain + aggressor tape when `positioning=flow` (BTC/ETH). SOL/HYPE fall back to std. See per-symbol `positioning` and top-level `meta.extra.aggregation`.\n\nIncludes: `ranked` (top-10 strikes by |GEX|), `max_pain` (0DTE only), `expected_move` (1σ / 2σ implied range to the nearest expiry with 7 to 30 days left, `days_to_expiry`, plus the one-day band `upper_1d` / `lower_1d`), `zones` (gamma flip zones).",
        "operationId": "get_multi_gex_levels_multi_gex_levels_get",
        "parameters": [
          {
            "name": "symbols",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "description": "Comma-separated symbols, e.g. `BTCUSDT,ETHUSDT,SOLUSDT,HYPEUSDT`.",
              "examples": {
                "all-four": {
                  "value": "BTCUSDT,ETHUSDT,SOLUSDT,HYPEUSDT"
                }
              },
              "title": "Symbols"
            },
            "description": "Comma-separated symbols, e.g. `BTCUSDT,ETHUSDT,SOLUSDT,HYPEUSDT`."
          },
          {
            "name": "exchanges",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Comma-separated venue filter, e.g. `deribit,bybit`. Restricts the response to those venues' contribution, recomputed from the per-venue breakdown - it is a re-aggregation, not a post-hoc scaling. Unknown names are ignored; an all-invalid filter returns every venue rather than nothing. Venues: `deribit`, `bybit`, `okx`, `binance`, `derive`, `thalex`, `delta_india`, `delta`, `bullish`, `paradex`. A venue with no contracts on the surface contributes zero - use `GET /v2/status` to tell that apart from a venue that is switched off.",
              "title": "Exchanges"
            },
            "description": "Comma-separated venue filter, e.g. `deribit,bybit`. Restricts the response to those venues' contribution, recomputed from the per-venue breakdown - it is a re-aggregation, not a post-hoc scaling. Unknown names are ignored; an all-invalid filter returns every venue rather than nothing. Venues: `deribit`, `bybit`, `okx`, `binance`, `derive`, `thalex`, `delta_india`, `delta`, `bullish`, `paradex`. A venue with no contracts on the surface contributes zero - use `GET /v2/status` to tell that apart from a venue that is switched off."
          },
          {
            "name": "include",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Optional sections: expected_move,max_pain,ranked,zones",
              "title": "Include"
            },
            "description": "Optional sections: expected_move,max_pain,ranked,zones"
          },
          {
            "name": "positioning",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "description": "Dealer positioning model. **`flow`** (default) is BackQuant's measured dealer model, available for BTC/ETH; it falls back to `std` when it cannot be produced for a symbol. **`std`** is the textbook convention (call:+OI / put:-OI). The response reports which model actually ran in `meta.extra.positioning`.",
              "default": "flow",
              "title": "Positioning"
            },
            "description": "Dealer positioning model. **`flow`** (default) is BackQuant's measured dealer model, available for BTC/ETH; it falls back to `std` when it cannot be produced for a symbol. **`std`** is the textbook convention (call:+OI / put:-OI). The response reports which model actually ran in `meta.extra.positioning`."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MultiGexLevelsResponse"
                }
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/V2ErrorEnvelope"
                }
              }
            },
            "description": "Bad Request"
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/market/candles": {
      "get": {
        "tags": [
          "Market"
        ],
        "summary": "OHLCV candles",
        "description": "Open, high, low, close and volume for a crypto symbol, with the buy/sell volume split where the venue publishes it.\n\nServed from the cross-venue aggregate. Long windows are read from continuous aggregates rather than raw 1-minute rows, so asking for a year at `1d` is no more expensive than asking for a day at `1m`. The source actually used is reported in `meta.extra.sources`.\n\nWindows are capped at one year (matching retention) and at 30,000 points. Your plan's historical window applies on top of that: see `history_depth` in `GET /v2/meta`.",
        "operationId": "get_candles_market_candles_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "interval",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "1m",
                "5m",
                "15m",
                "30m",
                "1h",
                "4h",
                "1d"
              ],
              "type": "string",
              "description": "Candle interval.",
              "default": "1h",
              "title": "Interval"
            },
            "description": "Candle interval."
          },
          {
            "name": "hours",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 8760,
              "minimum": 1,
              "description": "Lookback window in hours.",
              "default": 168,
              "title": "Hours"
            },
            "description": "Lookback window in hours."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/market/open-interest": {
      "get": {
        "tags": [
          "Market"
        ],
        "summary": "Open interest series",
        "description": "Aggregate perpetual open interest over time, on the same interval grid as `/market/candles` so the two align without client-side resampling.",
        "operationId": "get_open_interest_market_open_interest_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "interval",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "1m",
                "5m",
                "15m",
                "30m",
                "1h",
                "4h",
                "1d"
              ],
              "type": "string",
              "description": "Series interval.",
              "default": "1h",
              "title": "Interval"
            },
            "description": "Series interval."
          },
          {
            "name": "hours",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 8760,
              "minimum": 1,
              "description": "Lookback window in hours.",
              "default": 168,
              "title": "Hours"
            },
            "description": "Lookback window in hours."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/market/funding": {
      "get": {
        "tags": [
          "Market"
        ],
        "summary": "Funding rate series",
        "description": "Aggregate perpetual funding rate over time, on the same interval grid as `/market/candles`. `30m` merges the two 15-minute bars of each half hour (first open, highest high, lowest low, last close).\n\nNote the source cadence: funding settles on each venue's own schedule, so a fine interval does not create new settlements, it resamples the ones that exist.",
        "operationId": "get_funding_market_funding_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "interval",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "1m",
                "5m",
                "15m",
                "30m",
                "1h",
                "4h",
                "1d"
              ],
              "type": "string",
              "description": "Series interval.",
              "default": "1h",
              "title": "Interval"
            },
            "description": "Series interval."
          },
          {
            "name": "hours",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 8760,
              "minimum": 1,
              "description": "Lookback window in hours.",
              "default": 168,
              "title": "Hours"
            },
            "description": "Lookback window in hours."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/market/cvd": {
      "get": {
        "tags": [
          "Market"
        ],
        "summary": "Cumulative volume delta",
        "description": "Aggressor buy volume, sell volume, their per-bucket difference, and the running cumulative across the window.\n\nDerived from the same buy/sell columns the candle series carries, so requesting candles and CVD over one window costs a single underlying read rather than two.\n\n**On OHLC.** `delta` is exact, and `open`/`close` are the running total at each bucket's boundaries, also exact. `high` and `low` require the path the cumulative took INSIDE the bucket, which bucket totals do not carry, so they are returned as `null` with `ohlc_complete: false` rather than interpolated. A fabricated wick would be worse than an honest gap.\n\nThe cumulative is relative to the start of the window, not an all-time figure. Compare shapes across windows, not levels.",
        "operationId": "get_cvd_market_cvd_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "market",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "perp",
                "spot"
              ],
              "type": "string",
              "description": "`perp` for the perpetual aggregate, `spot` for spot.",
              "default": "perp",
              "title": "Market"
            },
            "description": "`perp` for the perpetual aggregate, `spot` for spot."
          },
          {
            "name": "interval",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "1m",
                "5m",
                "15m",
                "30m",
                "1h",
                "4h",
                "1d"
              ],
              "type": "string",
              "description": "Series interval.",
              "default": "1h",
              "title": "Interval"
            },
            "description": "Series interval."
          },
          {
            "name": "hours",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 8760,
              "minimum": 1,
              "description": "Lookback window in hours.",
              "default": 168,
              "title": "Hours"
            },
            "description": "Lookback window in hours."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/market/liquidations": {
      "get": {
        "tags": [
          "Market"
        ],
        "summary": "Liquidation series",
        "description": "Long and short liquidations over time, on the same interval grid as the other market series so they align without resampling. `30m` is the sum of the two 15-minute buckets in each half hour.\n\nThis is the time series. For the strike-style views see `/liquidation/heatmap` and `/liquidation/distribution`.",
        "operationId": "get_liquidations_market_liquidations_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "interval",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "1m",
                "5m",
                "15m",
                "30m",
                "1h",
                "4h",
                "1d"
              ],
              "type": "string",
              "description": "Series interval.",
              "default": "1h",
              "title": "Interval"
            },
            "description": "Series interval."
          },
          {
            "name": "hours",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 8760,
              "minimum": 1,
              "description": "Lookback window in hours.",
              "default": 168,
              "title": "Hours"
            },
            "description": "Lookback window in hours."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/market/bundle": {
      "get": {
        "tags": [
          "Market"
        ],
        "summary": "Price, open interest and funding in one call",
        "description": "Every time-indexed market series for a symbol, over one window, in a single request: price, open interest, funding, CVD on both the perpetual and spot aggregates, and liquidations.\n\nUse this instead of calling the individual endpoints: it is one round trip instead of six, and measured about 3x faster.\n\n**Every series shares one `timestamps` array.** Index `i` of any series corresponds to `timestamps[i]`, so you can zip them positionally without joining on time. The series come from different tables and do not all carry every bucket, so a gap is `null` at that position - never carried forward from the previous bucket, which would invent data. `meta.extra.coverage` reports how many buckets each series actually filled.\n\n**Quota:** charged per series requested, not per request. Three series cost three units, exactly as three separate calls would. The saving is latency and round trips, not allowance, so bundling is never a way to get more data for less.\n\n**Cost to us:** none beyond the individual endpoints. Each series is fetched through the same cache key those endpoints use, so a bundle following individual calls is served from cache, and concurrent callers share one computation.\n\nPartial failure does not fail the request: a series that cannot be served is returned as `null` with its reason under `meta.extra.errors`, so one cold series never costs you the others.",
        "operationId": "get_bundle_market_bundle_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "interval",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "1m",
                "5m",
                "15m",
                "30m",
                "1h",
                "4h",
                "1d"
              ],
              "type": "string",
              "description": "Interval for the gridded series.",
              "default": "1h",
              "title": "Interval"
            },
            "description": "Interval for the gridded series."
          },
          {
            "name": "hours",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 8760,
              "minimum": 1,
              "description": "Lookback window in hours, applied to every series.",
              "default": 168,
              "title": "Hours"
            },
            "description": "Lookback window in hours, applied to every series."
          },
          {
            "name": "series",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Comma-separated subset of `candles`, `open_interest`, `funding`, `cvd_perp`, `cvd_spot`, `liquidations`. Defaults to all six. Ask only for what you need - each one costs a quota unit.",
              "title": "Series"
            },
            "description": "Comma-separated subset of `candles`, `open_interest`, `funding`, `cvd_perp`, `cvd_spot`, `liquidations`. Defaults to all six. Ask only for what you need - each one costs a quota unit."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/etf/flows": {
      "get": {
        "tags": [
          "ETF"
        ],
        "summary": "Spot ETF daily flows",
        "description": "Daily creations and redemptions for spot crypto ETFs, per fund and in total, with running cumulatives.\n\n`region=us` (default) covers the US spot ETFs. `region=hk` covers the Hong Kong listings and is available for BTC only.\n\nFlows publish on trading days, so the newest date is normally the previous business day. Check `meta.extra.days_since_latest` before treating the last point as current.",
        "operationId": "get_etf_flows_etf_flows_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTC",
                "ETH",
                "SOL",
                "XRP"
              ],
              "type": "string",
              "description": "Underlying asset.",
              "default": "BTC",
              "title": "Symbol"
            },
            "description": "Underlying asset."
          },
          {
            "name": "region",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "us",
                "hk"
              ],
              "type": "string",
              "description": "Listing region.",
              "default": "us",
              "title": "Region"
            },
            "description": "Listing region."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/etf/premium": {
      "get": {
        "tags": [
          "ETF"
        ],
        "summary": "Spot ETF premium or discount to NAV",
        "description": "Premium or discount of each fund's market price to its net asset value. Available for BTC. `symbol=ETH` is accepted but returns 404: the source publishes premium / discount for the BTC funds only.",
        "operationId": "get_etf_premium_etf_premium_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTC",
                "ETH"
              ],
              "type": "string",
              "description": "Underlying asset.",
              "default": "BTC",
              "title": "Symbol"
            },
            "description": "Underlying asset."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/etf/aum": {
      "get": {
        "tags": [
          "ETF"
        ],
        "summary": "Spot ETF assets under management",
        "description": "Spot ETF net assets for all funds of the asset combined, as CoinGlass reports them: carried forward by each day's net flow and not revalued with price, so not the funds' market value (`net_assets_basis`, `net_assets_note`). `change` and `net_flow` are the day's net flow. Available for BTC and ETH.",
        "operationId": "get_etf_aum_etf_aum_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTC",
                "ETH"
              ],
              "type": "string",
              "description": "Underlying asset.",
              "default": "BTC",
              "title": "Symbol"
            },
            "description": "Underlying asset."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/cot/markets": {
      "get": {
        "tags": [
          "COT"
        ],
        "summary": "COT instruments",
        "description": "The curated futures markets the CFTC Commitments of Traders report covers here, with each one's asset class, the report it reads (Traders in Financial Futures, Disaggregated or Legacy), its primary trader category and the categories compared as smart and fast money. `key` is what /v2/cot/instrument takes.",
        "operationId": "get_cot_markets_cot_markets_get",
        "parameters": [
          {
            "name": "asset_class",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Asset class: crypto, equity, rates, fx, commodity_energy, commodity_metal, commodity_ag. Default all.",
              "default": "all",
              "title": "Asset Class"
            },
            "description": "Asset class: crypto, equity, rates, fx, commodity_energy, commodity_metal, commodity_ag. Default all."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/cot/summary": {
      "get": {
        "tags": [
          "COT"
        ],
        "summary": "COT positioning across markets",
        "description": "Each instrument's latest weekly positioning for its primary trader category: `net` contracts (long minus short), `wow_change`, net as a share of open interest, where net sits in its own 1-year and 3-year history (`percentile_1y`, `percentile_3y`, 0 to 100) and its 3-year z-score, the same rank and z-score over the requested `window` (`percentile_window`, `zscore_window`, with `window_weeks_used` weekly reports behind them), plus the smart-versus-fast money `divergence_score` and `flags` for extremes. Sorted most extreme first by default.\n\nCFTC data as of each report's Tuesday, released the following Friday.",
        "operationId": "get_cot_summary_cot_summary_get",
        "parameters": [
          {
            "name": "asset_class",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Asset class: crypto, equity, rates, fx, commodity_energy, commodity_metal, commodity_ag. Default crypto.",
              "default": "crypto",
              "title": "Asset Class"
            },
            "description": "Asset class: crypto, equity, rates, fx, commodity_energy, commodity_metal, commodity_ag. Default crypto."
          },
          {
            "name": "window",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "1y",
                "3y",
                "5y",
                "all"
              ],
              "type": "string",
              "description": "History percentile_window, zscore_window, the flags and the sort are taken over.",
              "default": "3y",
              "title": "Window"
            },
            "description": "History percentile_window, zscore_window, the flags and the sort are taken over."
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "extremity",
                "wow_abs",
                "divergence",
                "net",
                "percentile"
              ],
              "type": "string",
              "description": "extremity (percentile furthest from 50), wow_abs, divergence, net or percentile.",
              "default": "extremity",
              "title": "Sort"
            },
            "description": "extremity (percentile furthest from 50), wow_abs, divergence, net or percentile."
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 200,
              "minimum": 1,
              "description": "Rows returned.",
              "default": 50,
              "title": "Limit"
            },
            "description": "Rows returned."
          },
          {
            "name": "extreme_only",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean",
              "description": "Only rows flagged as extreme.",
              "default": false,
              "title": "Extreme Only"
            },
            "description": "Only rows flagged as extreme."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/cot/instrument": {
      "get": {
        "tags": [
          "COT"
        ],
        "summary": "COT history for one market",
        "description": "One instrument's weekly Commitments of Traders history: net contracts per trader category (`categories`, each a dated series), the `focus` category with its statistics, open interest and, where the report has both, the smart-minus-fast money divergence. `key` comes from /v2/cot/markets (`BTC`, `ETH`, `SP500`...). `weeks` is clamped to your plan's history depth.",
        "operationId": "get_cot_instrument_cot_instrument_get",
        "parameters": [
          {
            "name": "key",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 24,
              "description": "Instrument key from /v2/cot/markets.",
              "default": "BTC",
              "title": "Key"
            },
            "description": "Instrument key from /v2/cot/markets."
          },
          {
            "name": "category",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string",
                  "maxLength": 40
                },
                {
                  "type": "null"
                }
              ],
              "description": "Trader category to focus; defaults to the instrument's primary one.",
              "title": "Category"
            },
            "description": "Trader category to focus; defaults to the instrument's primary one."
          },
          {
            "name": "weeks",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 520,
              "minimum": 4,
              "description": "Weeks of history.",
              "default": 156,
              "title": "Weeks"
            },
            "description": "Weeks of history."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/filings/insider": {
      "get": {
        "tags": [
          "Filings"
        ],
        "summary": "Insider transactions (SEC Form 4)",
        "description": "Form 4 transactions by the officers, directors and 10% owners of COIN and HOOD, newest first: who, their role, the SEC `transaction_code` with a readable `transaction` (purchase, sale, award, option_exercise, tax_withholding, gift...), shares, price, `value_usd` and the holding after. Purchases and sales are the discretionary trades; awards, exercises and tax withholding are compensation mechanics. `purchases_usd` and `sales_usd` sum the non-derivative purchases and sales only (option and award lines carry exercise prices, not trade values). Purchases and sales of the company's other securities (a preferred series) are not listed; `security_title` names the security of each line. Filings reach EDGAR within minutes of acceptance. `lookback` is clamped to your plan's history depth.",
        "operationId": "get_insider_filings_insider_get",
        "parameters": [
          {
            "name": "ticker",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "COIN",
                "HOOD"
              ],
              "type": "string",
              "description": "COIN or HOOD.",
              "default": "COIN",
              "title": "Ticker"
            },
            "description": "COIN or HOOD."
          },
          {
            "name": "lookback",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "3m",
                "6m",
                "1y"
              ],
              "type": "string",
              "description": "3m, 6m or 1y.",
              "default": "1y",
              "title": "Lookback"
            },
            "description": "3m, 6m or 1y."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/filings/holders": {
      "get": {
        "tags": [
          "Filings"
        ],
        "summary": "Institutional holders (SEC 13F)",
        "description": "The largest institutional holders of MSTR, COIN, HOOD or IBIT from the latest quarterly 13F filings, with each manager's change in shares from the quarter before (`share_change`, `share_change_pct`; null when the manager did not file it last quarter). 13F filings are due 45 days after quarter end, so `period_end` is that quarter.",
        "operationId": "get_holders_filings_holders_get",
        "parameters": [
          {
            "name": "ticker",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "MSTR",
                "COIN",
                "HOOD",
                "IBIT"
              ],
              "type": "string",
              "description": "MSTR, COIN, HOOD or IBIT.",
              "default": "IBIT",
              "title": "Ticker"
            },
            "description": "MSTR, COIN, HOOD or IBIT."
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 100,
              "minimum": 1,
              "description": "Holders returned.",
              "default": 25,
              "title": "Limit"
            },
            "description": "Holders returned."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/tape": {
      "get": {
        "tags": [
          "Tape"
        ],
        "summary": "Multi-venue options tape - paginated trade history",
        "description": "Returns options trades from every venue we collect - `deribit`, `bybit`, `okx`, `binance`, `derive`, `thalex`, `delta`, `delta_india`, `bullish`, `paradex` (BTC + ETH today). Names are given as the tokens you pass to `?venues=`. Cursor-paginated; pass the response's `next_cursor` as `?before=` to walk older.\n\nVenue mix varies a lot by coin and by day, so do not assume a handful of venues carries the flow: filtering to a subset can drop most of the tape without any indication it happened. `meta.source` reports the venues a given response drew on.\n\nAll filters compose with AND. Empty values are no-ops. The default page is the latest 200 trades for the requested coin across all venues.",
        "operationId": "get_tape_tape_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "venues",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "CSV venue filter - any of: deribit, bybit, okx, binance, derive, thalex, delta, delta_india, bullish, paradex.",
              "examples": [
                "deribit,bybit"
              ],
              "title": "Venues"
            },
            "description": "CSV venue filter - any of: deribit, bybit, okx, binance, derive, thalex, delta, delta_india, bullish, paradex."
          },
          {
            "name": "instrument",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Exact instrument match (e.g. BTC-30JUN26-100000-C). Case-sensitive.",
              "title": "Instrument"
            },
            "description": "Exact instrument match (e.g. BTC-30JUN26-100000-C). Case-sensitive."
          },
          {
            "name": "option_type",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "enum": [
                    "call",
                    "put"
                  ],
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Filter to calls or puts.",
              "title": "Option Type"
            },
            "description": "Filter to calls or puts."
          },
          {
            "name": "strike_min",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "number",
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ],
              "description": "Lower bound on strike (inclusive).",
              "title": "Strike Min"
            },
            "description": "Lower bound on strike (inclusive)."
          },
          {
            "name": "strike_max",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "number",
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ],
              "description": "Upper bound on strike (inclusive).",
              "title": "Strike Max"
            },
            "description": "Upper bound on strike (inclusive)."
          },
          {
            "name": "premium_min_usd",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "number",
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ],
              "description": "Minimum trade size in USD (premium_usd column).",
              "title": "Premium Min Usd"
            },
            "description": "Minimum trade size in USD (premium_usd column)."
          },
          {
            "name": "tags",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "CSV of tags. 0dte → the trade was on its front live expiry: the contract settled within 24h after the print (08:00 UTC, 12:00 UTC on delta / delta_india). whale → premium_usd ≥ $250k (configurable via premium_min_usd). atm → strike within ±2% of the trade's index_price.",
              "examples": [
                "0dte,whale"
              ],
              "title": "Tags"
            },
            "description": "CSV of tags. 0dte → the trade was on its front live expiry: the contract settled within 24h after the print (08:00 UTC, 12:00 UTC on delta / delta_india). whale → premium_usd ≥ $250k (configurable via premium_min_usd). atm → strike within ±2% of the trade's index_price."
          },
          {
            "name": "before",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "ISO timestamp - return trades strictly BEFORE this. Walking-backward cursor.",
              "examples": [
                "2026-05-29T01:00:00Z"
              ],
              "title": "Before"
            },
            "description": "ISO timestamp - return trades strictly BEFORE this. Walking-backward cursor."
          },
          {
            "name": "after",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "ISO timestamp - return trades strictly AFTER this. Walking-forward cursor.",
              "examples": [
                "2026-05-29T00:00:00Z"
              ],
              "title": "After"
            },
            "description": "ISO timestamp - return trades strictly AFTER this. Walking-forward cursor."
          },
          {
            "name": "order",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "desc",
                "asc"
              ],
              "type": "string",
              "description": "Sort by time descending (default, newest first) or ascending.",
              "default": "desc",
              "title": "Order"
            },
            "description": "Sort by time descending (default, newest first) or ascending."
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 5000,
              "minimum": 1,
              "description": "Max trades per page (1-5000). A page that would end inside a group of prints sharing one timestamp includes the whole group, so it can be longer than `limit`; the cursor never splits such a group.",
              "default": 200,
              "title": "Limit"
            },
            "description": "Max trades per page (1-5000). A page that would end inside a group of prints sharing one timestamp includes the whole group, so it can be longer than `limit`; the cursor never splits such a group."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/tape/recent": {
      "get": {
        "tags": [
          "Tape"
        ],
        "summary": "Latest N trades (shorthand for /tape?limit=N&order=desc)",
        "description": "Convenience endpoint for clients who just want the newest N trades across all venues without setting up cursor pagination. Equivalent to `/v2/tape?limit=N&order=desc`.",
        "operationId": "get_tape_recent_tape_recent_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "venues",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Venues"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 1000,
              "minimum": 1,
              "default": 100,
              "title": "Limit"
            }
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/tape/stats": {
      "get": {
        "tags": [
          "Tape"
        ],
        "summary": "Tape statistics for a window",
        "description": "Aggregate stats over a time window - useful for Methix-style scorers that don't need raw trades, just the summary numbers. Computes count, total premium, buy/sell split, call/put split, per-venue breakdown, all in a single query.\n\n**`contracts` is traded size in COIN units** (the sum of each print's `amount`, stored coin-consistent for every venue), not a count of venue contracts: one OKX BTC contract is 0.01 BTC. `size_coin` carries the same number under an exact name; `calls` / `puts` are print counts.",
        "operationId": "get_tape_stats_tape_stats_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "venues",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Venues"
            }
          },
          {
            "name": "hours",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 168,
              "minimum": 1,
              "description": "Window in hours (max 7d).",
              "default": 24,
              "title": "Hours"
            },
            "description": "Window in hours (max 7d)."
          },
          {
            "name": "premium_min_usd",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "number",
                  "minimum": 0
                },
                {
                  "type": "null"
                }
              ],
              "title": "Premium Min Usd"
            }
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/tape/imbalance": {
      "get": {
        "tags": [
          "Tape"
        ],
        "summary": "Time-bucketed aggressor imbalance (premium or HIRO-style delta)",
        "description": "Server-side rollup of the options tape into time buckets. `weight=flow` (default) returns multi-venue premium quadrants (call/put × buy/sell) + passive. `weight=delta` returns customer BS delta-notional (HIRO-style; Deribit-quality prints). Client can running-sum `net` for a cumulative line.",
        "operationId": "get_tape_imbalance_tape_imbalance_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "hours",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 720,
              "minimum": 1,
              "default": 24,
              "title": "Hours"
            }
          },
          {
            "name": "bucket_minutes",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 1440,
              "minimum": 1,
              "default": 5,
              "title": "Bucket Minutes"
            }
          },
          {
            "name": "min_size",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "minimum": 0,
              "description": "Min premium_usd",
              "default": 0,
              "title": "Min Size"
            },
            "description": "Min premium_usd"
          },
          {
            "name": "weight",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "flow",
                "delta",
                "prem"
              ],
              "type": "string",
              "description": "flow/prem = premium quadrants; delta = BS delta notional",
              "default": "flow",
              "title": "Weight"
            },
            "description": "flow/prem = premium quadrants; delta = BS delta notional"
          },
          {
            "name": "venues",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "CSV venues (flow only)",
              "title": "Venues"
            },
            "description": "CSV venues (flow only)"
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/tape/strike-heat": {
      "get": {
        "tags": [
          "Tape"
        ],
        "summary": "Aggressor premium heat by strike",
        "description": "Net / absolute premium by strike over a lookback window from the multi-venue options tape. Useful for heatmaps of where aggressive money is concentrating.",
        "operationId": "get_tape_strike_heat_tape_strike_heat_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "hours",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 168,
              "minimum": 1,
              "default": 24,
              "title": "Hours"
            }
          },
          {
            "name": "venues",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Venues"
            }
          },
          {
            "name": "min_size",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "minimum": 0,
              "default": 0,
              "title": "Min Size"
            }
          },
          {
            "name": "top",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 200,
              "minimum": 5,
              "default": 40,
              "title": "Top"
            }
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/tape/whale": {
      "get": {
        "tags": [
          "Tape"
        ],
        "summary": "Largest options prints in the window",
        "description": "Top trades by premium_usd across venues. Default min premium $100k. Includes instrument, direction, strike, expiry, venue, IV.",
        "operationId": "get_tape_whale_tape_whale_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "hours",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 168,
              "minimum": 1,
              "default": 24,
              "title": "Hours"
            }
          },
          {
            "name": "venues",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Venues"
            }
          },
          {
            "name": "premium_min_usd",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "minimum": 0,
              "default": 100000,
              "title": "Premium Min Usd"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "maximum": 500,
              "minimum": 1,
              "default": 50,
              "title": "Limit"
            }
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    },
    "/tape/flow-by-strike": {
      "get": {
        "tags": [
          "Tape"
        ],
        "summary": "Aggressor flow by strike (bought vs sold calls/puts)",
        "description": "REAL multi-venue taker flow on still-open contracts (not yet past their settle: 08:00 UTC, 12:00 UTC on delta / delta_india) - cumulative sold/bought pressure behind live open interest, not a rolling lookback.\n\nFour quadrants per strike: `call_buy`, `call_sell`, `put_buy`, `put_sell` - each with `premium` (USD), `size` (contracts/coin-eq), and `trades` count. Every venue stamps native taker `direction` at ingest (Deribit/Bybit/OKX/Binance/Derive/Thalex), so this is exact aggressor side, not quote-rule inference.\n\nUse `expiry` or `expiries` (YYYY-MM-DD) to restrict to one or more live expiries. Omit both for all open contracts. Optional `venues` CSV and `min_premium_usd` whale filter.\n\nResponse shape matches the terminal / internal crypto flow endpoint so integrators can rebuild TRACE-style dealer maps.",
        "operationId": "get_tape_flow_by_strike_tape_flow_by_strike_get",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "schema": {
              "enum": [
                "BTCUSDT",
                "ETHUSDT",
                "SOLUSDT",
                "HYPEUSDT"
              ],
              "type": "string",
              "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT.",
              "default": "BTCUSDT",
              "title": "Symbol"
            },
            "description": "Trading symbol: BTCUSDT, ETHUSDT, SOLUSDT, or HYPEUSDT."
          },
          {
            "name": "expiry",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Single live expiry YYYY-MM-DD. Omit for all open contracts.",
              "title": "Expiry"
            },
            "description": "Single live expiry YYYY-MM-DD. Omit for all open contracts."
          },
          {
            "name": "expiries",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Comma-separated live expiries YYYY-MM-DD to COMBINE; takes precedence over `expiry`.",
              "title": "Expiries"
            },
            "description": "Comma-separated live expiries YYYY-MM-DD to COMBINE; takes precedence over `expiry`."
          },
          {
            "name": "min_premium_usd",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "minimum": 0,
              "description": "Minimum premium_usd per trade (whale filter).",
              "default": 0,
              "title": "Min Premium Usd"
            },
            "description": "Minimum premium_usd per trade (whale filter)."
          },
          {
            "name": "venues",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "CSV venue filter. Default: all. Allowed: binance, bullish, bybit, delta, delta_india, deribit, derive, okx, paradex, thalex",
              "title": "Venues"
            },
            "description": "CSV venue filter. Default: all. Allowed: binance, bullish, bybit, delta, delta_india, deribit, derive, okx, paradex, thalex"
          },
          {
            "name": "include",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Optional sections. `by_venue` splits each strike's flow across the venues that traded it, and reports how often they disagree on direction under `meta.extra.venue_disagreement`. Off by default because it multiplies the row count; the query cost is the same.",
              "title": "Include"
            },
            "description": "Optional sections. `by_venue` splits each strike's flow across the venues that traded it, and reports how often they disagree on direction under `meta.extra.venue_disagreement`. Off by default because it multiplies the row count; the query cost is the same."
          },
          {
            "name": "X-API-Key",
            "in": "header",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Api-Key"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful Response",
            "content": {
              "application/json": {
                "schema": {}
              }
            }
          },
          "401": {
            "description": "Invalid or missing API key",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "UNAUTHORIZED",
                    "message": "Invalid API key"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No data available for the requested resource",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "No data for BTCUSDT"
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "422": {
            "description": "Validation error on query parameters",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "VALIDATION_ERROR",
                    "message": "Invalid request parameters",
                    "details": {
                      "errors": []
                    }
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded",
            "content": {
              "application/json": {
                "example": {
                  "success": false,
                  "error": {
                    "code": "RATE_LIMIT_EXCEEDED",
                    "message": "Rate limit exceeded. Try again later."
                  },
                  "meta": {
                    "version": "2.0",
                    "timestamp": "2026-04-29T12:00:00Z"
                  }
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": []
          }
        ]
      }
    }
  },
  "components": {
    "schemas": {
      "Candle": {
        "properties": {
          "datetime": {
            "type": "string",
            "title": "Datetime"
          },
          "open": {
            "type": "number",
            "title": "Open"
          },
          "high": {
            "type": "number",
            "title": "High"
          },
          "low": {
            "type": "number",
            "title": "Low"
          },
          "close": {
            "type": "number",
            "title": "Close"
          },
          "volume": {
            "type": "number",
            "title": "Volume"
          }
        },
        "type": "object",
        "required": [
          "datetime",
          "open",
          "high",
          "low",
          "close",
          "volume"
        ],
        "title": "Candle"
      },
      "ChainAggregates": {
        "properties": {
          "net_gex": {
            "type": "number",
            "title": "Net Gex"
          },
          "call_gex": {
            "type": "number",
            "title": "Call Gex"
          },
          "put_gex": {
            "type": "number",
            "title": "Put Gex"
          },
          "total_oi": {
            "type": "number",
            "title": "Total Oi"
          },
          "call_oi": {
            "type": "number",
            "title": "Call Oi"
          },
          "put_oi": {
            "type": "number",
            "title": "Put Oi"
          },
          "pcr": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Pcr"
          },
          "atm_iv": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Atm Iv",
            "description": "ATM implied volatility in percent (33.0 = 33%) of the front live expiry among the matching contracts, read at that expiry's forward."
          },
          "atm_iv_expiry": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Atm Iv Expiry",
            "description": "The expiry token `atm_iv` was read from (null when no expiry's quotes reach its forward)."
          },
          "contract_count": {
            "type": "integer",
            "title": "Contract Count"
          }
        },
        "type": "object",
        "required": [
          "net_gex",
          "call_gex",
          "put_gex",
          "total_oi",
          "call_oi",
          "put_oi",
          "contract_count"
        ],
        "title": "ChainAggregates"
      },
      "ChainData": {
        "properties": {
          "contracts": {
            "anyOf": [
              {
                "items": {
                  "$ref": "#/components/schemas/OptionContract"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Contracts"
          },
          "aggregates": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ChainAggregates"
              },
              {
                "type": "null"
              }
            ]
          },
          "available_expiries": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Available Expiries"
          },
          "truncated": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Truncated",
            "description": "True when the matching set exceeded `max_contracts`."
          },
          "total_matching_count": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Total Matching Count",
            "description": "Total contracts matching the filters (pre-truncation)."
          },
          "max_contracts": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Max Contracts"
          }
        },
        "type": "object",
        "title": "ChainData"
      },
      "ChainResponse": {
        "properties": {
          "success": {
            "type": "boolean",
            "const": true,
            "title": "Success",
            "default": true
          },
          "data": {
            "$ref": "#/components/schemas/ChainData"
          },
          "meta": {
            "$ref": "#/components/schemas/V2Meta"
          }
        },
        "type": "object",
        "required": [
          "data",
          "meta"
        ],
        "title": "ChainResponse"
      },
      "ChangelogData": {
        "properties": {
          "current_version": {
            "type": "string",
            "title": "Current Version"
          },
          "v1_status": {
            "type": "string",
            "enum": [
              "stable",
              "deprecated",
              "sunset"
            ],
            "title": "V1 Status",
            "description": "Lifecycle status of the v1 API. `stable` = fully supported indefinitely. `deprecated` = still serving but no new features; migrate to v2. `sunset` = scheduled removal date in changes[]."
          },
          "releases": {
            "items": {
              "$ref": "#/components/schemas/ChangelogEntry"
            },
            "type": "array",
            "title": "Releases"
          },
          "docs_url": {
            "type": "string",
            "title": "Docs Url",
            "default": "/v2/docs"
          },
          "openapi_url": {
            "type": "string",
            "title": "Openapi Url",
            "default": "/v2/openapi.json"
          }
        },
        "type": "object",
        "required": [
          "current_version",
          "v1_status",
          "releases"
        ],
        "title": "ChangelogData"
      },
      "ChangelogEntry": {
        "properties": {
          "version": {
            "type": "string",
            "title": "Version"
          },
          "released_at": {
            "type": "string",
            "title": "Released At",
            "description": "ISO date."
          },
          "breaking": {
            "type": "boolean",
            "title": "Breaking",
            "description": "True if any change in this release breaks existing client code.",
            "default": false
          },
          "summary": {
            "type": "string",
            "title": "Summary"
          },
          "changes": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Changes",
            "default": []
          }
        },
        "type": "object",
        "required": [
          "version",
          "released_at",
          "summary"
        ],
        "title": "ChangelogEntry"
      },
      "ChangelogResponse": {
        "properties": {
          "success": {
            "type": "boolean",
            "const": true,
            "title": "Success",
            "default": true
          },
          "data": {
            "$ref": "#/components/schemas/ChangelogData"
          },
          "meta": {
            "$ref": "#/components/schemas/V2Meta"
          }
        },
        "type": "object",
        "required": [
          "data",
          "meta"
        ],
        "title": "ChangelogResponse"
      },
      "ExpectedMoveData": {
        "properties": {
          "spot_price": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Spot Price"
          },
          "atm_iv": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Atm Iv"
          },
          "days_to_expiry": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Days To Expiry"
          },
          "expected_move_1sd": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Expected Move 1Sd"
          },
          "expected_move_1sd_pct": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Expected Move 1Sd Pct"
          },
          "expected_move_2sd": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Expected Move 2Sd"
          },
          "expected_move_2sd_pct": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Expected Move 2Sd Pct"
          },
          "upper_1sd": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Upper 1Sd"
          },
          "lower_1sd": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Lower 1Sd"
          },
          "upper_2sd": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Upper 2Sd"
          },
          "lower_2sd": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Lower 2Sd"
          },
          "straddle_price": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Straddle Price"
          },
          "atm_iv_1d": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Atm Iv 1D",
            "description": "Front live expiry's ATM IV (decimal) behind the 1-day move."
          },
          "expected_move_1d": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Expected Move 1D",
            "description": "spot x atm_iv_1d x sqrt(1/365)."
          },
          "upper_1d": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Upper 1D"
          },
          "lower_1d": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Lower 1D"
          },
          "expiry_1d": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Expiry 1D",
            "description": "The expiry `atm_iv_1d` came from."
          },
          "exchange_breakdown_1d": {
            "anyOf": [
              {
                "additionalProperties": {
                  "type": "number"
                },
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Exchange Breakdown 1D",
            "description": "Each venue's ATM IV (decimal) for `expiry_1d`; `exchanges=` averages these."
          },
          "ts": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Ts"
          }
        },
        "additionalProperties": true,
        "type": "object",
        "title": "ExpectedMoveData",
        "description": "`atm_iv` / `atm_iv_1d` are decimals (0.33 = 33%) on this endpoint."
      },
      "ExpectedMoveResponse": {
        "properties": {
          "success": {
            "type": "boolean",
            "const": true,
            "title": "Success",
            "default": true
          },
          "data": {
            "$ref": "#/components/schemas/ExpectedMoveData"
          },
          "meta": {
            "$ref": "#/components/schemas/V2Meta"
          }
        },
        "type": "object",
        "required": [
          "data",
          "meta"
        ],
        "title": "ExpectedMoveResponse"
      },
      "ExpiryRow": {
        "properties": {
          "expiry": {
            "type": "string",
            "title": "Expiry"
          },
          "dte": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Dte"
          },
          "atm_iv": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Atm Iv",
            "description": "ATM implied volatility in percent (33.0 = 33%)."
          },
          "skew_25d": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Skew 25D"
          },
          "put_25d_iv": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Put 25D Iv"
          },
          "call_25d_iv": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Call 25D Iv"
          },
          "pcr": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Pcr"
          },
          "call_oi": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Call Oi"
          },
          "put_oi": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Put Oi"
          },
          "total_oi": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Total Oi"
          },
          "net_gex": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Net Gex"
          },
          "type": {
            "type": "string",
            "enum": [
              "daily",
              "weekly",
              "monthly",
              "quarterly",
              "unknown"
            ],
            "title": "Type"
          },
          "is_anchor": {
            "type": "boolean",
            "title": "Is Anchor"
          },
          "expiry_date": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Expiry Date",
            "description": "ISO date when token parses cleanly."
          },
          "notional_oi_usd": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Notional Oi Usd"
          },
          "max_pain": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/GexMaxPainBlock"
              },
              {
                "type": "null"
              }
            ]
          },
          "by_venue": {
            "anyOf": [
              {
                "additionalProperties": {
                  "$ref": "#/components/schemas/VenueOI"
                },
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "By Venue",
            "description": "Per-venue open interest for this expiry (all ten venues, zero-filled). Null only when no venue split is available."
          },
          "by_venue_unattributed": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/VenueOI"
              },
              {
                "type": "null"
              }
            ],
            "description": "Open interest not attributable to a venue; null when the split reconciles with call_oi / put_oi."
          }
        },
        "type": "object",
        "required": [
          "expiry",
          "type",
          "is_anchor"
        ],
        "title": "ExpiryRow",
        "description": "Per-expiry row, enriched with OPEX classification + max-pain."
      },
      "ExpirySummaryData": {
        "properties": {
          "expiries": {
            "items": {
              "$ref": "#/components/schemas/ExpiryRow"
            },
            "type": "array",
            "title": "Expiries"
          },
          "anchor_count": {
            "type": "integer",
            "title": "Anchor Count"
          },
          "type_counts": {
            "$ref": "#/components/schemas/ExpirySummaryTypeCounts"
          }
        },
        "type": "object",
        "required": [
          "expiries",
          "anchor_count",
          "type_counts"
        ],
        "title": "ExpirySummaryData"
      },
      "ExpirySummaryResponse": {
        "properties": {
          "success": {
            "type": "boolean",
            "const": true,
            "title": "Success",
            "default": true
          },
          "data": {
            "$ref": "#/components/schemas/ExpirySummaryData"
          },
          "meta": {
            "$ref": "#/components/schemas/V2Meta"
          }
        },
        "type": "object",
        "required": [
          "data",
          "meta"
        ],
        "title": "ExpirySummaryResponse"
      },
      "ExpirySummaryTypeCounts": {
        "properties": {
          "daily": {
            "type": "integer",
            "title": "Daily",
            "default": 0
          },
          "weekly": {
            "type": "integer",
            "title": "Weekly",
            "default": 0
          },
          "monthly": {
            "type": "integer",
            "title": "Monthly",
            "default": 0
          },
          "quarterly": {
            "type": "integer",
            "title": "Quarterly",
            "default": 0
          }
        },
        "type": "object",
        "title": "ExpirySummaryTypeCounts"
      },
      "GexAllExpiryLevels": {
        "properties": {
          "hvl": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Hvl",
            "description": "Hedging volume level (gamma-flip)."
          },
          "call_resistance": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Call Resistance"
          },
          "call_wall_2": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Call Wall 2"
          },
          "call_wall_3": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Call Wall 3"
          },
          "put_support": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Put Support"
          },
          "put_wall_2": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Put Wall 2"
          },
          "put_wall_3": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Put Wall 3"
          }
        },
        "type": "object",
        "title": "GexAllExpiryLevels"
      },
      "GexExpectedMove": {
        "properties": {
          "upper_1sd": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Upper 1Sd",
            "description": "Spot + 1 sigma move to the expiry `days_to_expiry` days out (the nearest expiry with 7 to 30 days left), not a 1-day move."
          },
          "lower_1sd": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Lower 1Sd",
            "description": "Spot - 1 sigma move to the same expiry as upper_1sd."
          },
          "upper_2sd": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Upper 2Sd",
            "description": "Spot + 2 sigma move to the same expiry as upper_1sd."
          },
          "lower_2sd": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Lower 2Sd",
            "description": "Spot - 2 sigma move to the same expiry as upper_1sd."
          },
          "days_to_expiry": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Days To Expiry",
            "description": "Days to the expiry the *_1sd / *_2sd bands are measured to."
          },
          "upper_1d": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Upper 1D",
            "description": "Spot + 1 sigma move over ONE day (ATM IV scaled to 1/365 of a year). Null until published."
          },
          "lower_1d": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Lower 1D",
            "description": "Spot - 1 sigma move over one day. Null until published."
          }
        },
        "type": "object",
        "title": "GexExpectedMove"
      },
      "GexLevelsData": {
        "properties": {
          "all_expiry": {
            "$ref": "#/components/schemas/GexAllExpiryLevels"
          },
          "odte": {
            "$ref": "#/components/schemas/GexOdteLevels"
          },
          "positioning": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "flow",
                  "std"
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Positioning",
            "description": "Dealer positioning model that produced these levels. `flow` (default) is measured from the aggressor tape; `std` is the textbook call:+OI / put:-OI fallback."
          },
          "ranked": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/GexRanked"
              },
              {
                "type": "null"
              }
            ]
          },
          "max_pain": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/GexMaxPainBlock"
              },
              {
                "type": "null"
              }
            ]
          },
          "expected_move": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/GexExpectedMove"
              },
              {
                "type": "null"
              }
            ]
          },
          "gamma_flip_zones": {
            "anyOf": [
              {
                "items": {
                  "additionalProperties": true,
                  "type": "object"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Gamma Flip Zones"
          },
          "spot": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/GexSpotBlock"
              },
              {
                "type": "null"
              }
            ]
          },
          "candles": {
            "anyOf": [
              {
                "items": {
                  "$ref": "#/components/schemas/Candle"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Candles"
          }
        },
        "type": "object",
        "required": [
          "all_expiry",
          "odte"
        ],
        "title": "GexLevelsData"
      },
      "GexLevelsResponse": {
        "properties": {
          "success": {
            "type": "boolean",
            "const": true,
            "title": "Success",
            "default": true
          },
          "data": {
            "$ref": "#/components/schemas/GexLevelsData"
          },
          "meta": {
            "$ref": "#/components/schemas/V2Meta"
          }
        },
        "type": "object",
        "required": [
          "data",
          "meta"
        ],
        "title": "GexLevelsResponse"
      },
      "GexMaxPainBlock": {
        "properties": {
          "strike": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Strike"
          },
          "value": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Value"
          }
        },
        "type": "object",
        "title": "GexMaxPainBlock"
      },
      "GexOdteLevels": {
        "properties": {
          "hvl": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Hvl"
          },
          "call_resistance": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Call Resistance"
          },
          "put_support": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Put Support"
          }
        },
        "type": "object",
        "title": "GexOdteLevels"
      },
      "GexRanked": {
        "properties": {
          "all_expiry_top_10": {
            "items": {
              "$ref": "#/components/schemas/GexRankedLevel"
            },
            "type": "array",
            "title": "All Expiry Top 10",
            "default": []
          },
          "odte_top_10": {
            "items": {
              "$ref": "#/components/schemas/GexRankedLevel"
            },
            "type": "array",
            "title": "Odte Top 10",
            "default": []
          }
        },
        "type": "object",
        "title": "GexRanked"
      },
      "GexRankedLevel": {
        "properties": {
          "rank": {
            "type": "integer",
            "title": "Rank"
          },
          "strike": {
            "type": "number",
            "title": "Strike"
          },
          "gex": {
            "type": "number",
            "title": "Gex"
          },
          "abs_gex": {
            "type": "number",
            "title": "Abs Gex"
          }
        },
        "type": "object",
        "required": [
          "rank",
          "strike",
          "gex",
          "abs_gex"
        ],
        "title": "GexRankedLevel"
      },
      "GexSpotBlock": {
        "properties": {
          "spot_price": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Spot Price"
          },
          "perps_price": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Perps Price"
          }
        },
        "type": "object",
        "title": "GexSpotBlock"
      },
      "GexStrikeProfileData": {
        "properties": {
          "expiry": {
            "type": "string",
            "title": "Expiry",
            "description": "`all`, `0dte`, or a specific expiry token."
          },
          "dte": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Dte",
            "description": "Days-to-expiry, present for specific-expiry calls."
          },
          "strikes": {
            "items": {
              "type": "number"
            },
            "type": "array",
            "title": "Strikes"
          },
          "net_gex": {
            "items": {
              "anyOf": [
                {
                  "type": "number"
                },
                {
                  "type": "null"
                }
              ]
            },
            "type": "array",
            "title": "Net Gex"
          },
          "call_gex": {
            "anyOf": [
              {
                "items": {
                  "anyOf": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Call Gex"
          },
          "put_gex": {
            "anyOf": [
              {
                "items": {
                  "anyOf": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Put Gex"
          },
          "call_oi": {
            "anyOf": [
              {
                "items": {
                  "anyOf": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Call Oi"
          },
          "put_oi": {
            "anyOf": [
              {
                "items": {
                  "anyOf": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Put Oi"
          },
          "total_oi": {
            "anyOf": [
              {
                "items": {
                  "anyOf": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Total Oi"
          },
          "ranked_top_10": {
            "anyOf": [
              {
                "items": {
                  "$ref": "#/components/schemas/GexRankedLevel"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Ranked Top 10",
            "description": "Top-N strikes by |GEX|. Rebuilt post-filter when narrowing."
          },
          "filtered_strike_window": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/GexStrikeWindow"
              },
              {
                "type": "null"
              }
            ],
            "description": "Echo of the resolved strike window when any strike-axis filter was applied."
          },
          "positioning": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "flow",
                  "std"
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Positioning"
          },
          "by_venue": {
            "anyOf": [
              {
                "additionalProperties": {
                  "$ref": "#/components/schemas/VenueOI"
                },
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "By Venue",
            "description": "Per-venue open interest rolled up over the strikes returned. All ten venues are present (zero-filled); null for a single-expiry request, where no venue split is published (see by_venue_note). Attribution is positioning-independent."
          },
          "by_venue_unattributed": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/VenueOI"
              },
              {
                "type": "null"
              }
            ],
            "description": "Open interest that could not be attributed to a venue. Null when the split reconciles with the totals - the normal case."
          },
          "by_venue_note": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "By Venue Note",
            "description": "Why by_venue is null, when it is."
          }
        },
        "type": "object",
        "required": [
          "expiry",
          "strikes",
          "net_gex"
        ],
        "title": "GexStrikeProfileData"
      },
      "GexStrikeProfileResponse": {
        "properties": {
          "success": {
            "type": "boolean",
            "const": true,
            "title": "Success",
            "default": true
          },
          "data": {
            "$ref": "#/components/schemas/GexStrikeProfileData"
          },
          "meta": {
            "$ref": "#/components/schemas/V2Meta"
          }
        },
        "type": "object",
        "required": [
          "data",
          "meta"
        ],
        "title": "GexStrikeProfileResponse"
      },
      "GexStrikeWindow": {
        "properties": {
          "min": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Min"
          },
          "max": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Max"
          }
        },
        "type": "object",
        "title": "GexStrikeWindow"
      },
      "IvRvData": {
        "properties": {
          "timestamps": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Timestamps"
          },
          "iv": {
            "anyOf": [
              {
                "items": {
                  "anyOf": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Iv",
            "description": "Implied vol (Deribit DVOL), percent."
          },
          "rv": {
            "anyOf": [
              {
                "items": {
                  "anyOf": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Rv",
            "description": "30-day realized vol, percent."
          },
          "spread": {
            "anyOf": [
              {
                "items": {
                  "anyOf": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Spread",
            "description": "iv - rv per point, vol points."
          }
        },
        "additionalProperties": true,
        "type": "object",
        "title": "IvRvData"
      },
      "IvRvResponse": {
        "properties": {
          "success": {
            "type": "boolean",
            "const": true,
            "title": "Success",
            "default": true
          },
          "data": {
            "$ref": "#/components/schemas/IvRvData"
          },
          "meta": {
            "$ref": "#/components/schemas/V2Meta"
          }
        },
        "type": "object",
        "required": [
          "data",
          "meta"
        ],
        "title": "IvRvResponse"
      },
      "IvSkewData": {
        "properties": {
          "expiries": {
            "anyOf": [
              {
                "items": {
                  "$ref": "#/components/schemas/IvSkewExpiryRow"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Expiries"
          },
          "spot_price": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Spot Price"
          },
          "ts": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Ts"
          }
        },
        "additionalProperties": true,
        "type": "object",
        "title": "IvSkewData"
      },
      "IvSkewExpiryRow": {
        "properties": {
          "expiry": {
            "type": "string",
            "title": "Expiry"
          },
          "expiry_label": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Expiry Label"
          },
          "dte": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Dte",
            "description": "Days to the 08:00 UTC settle (fractional)."
          },
          "atm_iv": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Atm Iv",
            "description": "ATM implied volatility in percent (33.0 = 33%), at the expiry's forward."
          },
          "put_25d_iv": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Put 25D Iv"
          },
          "call_25d_iv": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Call 25D Iv"
          },
          "skew_25d": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Skew 25D"
          },
          "put_10d_iv": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Put 10D Iv"
          },
          "call_10d_iv": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Call 10D Iv"
          },
          "skew_10d": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Skew 10D"
          },
          "butterfly_25d": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Butterfly 25D"
          },
          "forward": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Forward",
            "description": "The expiry's forward the deltas and ATM were read against."
          }
        },
        "type": "object",
        "required": [
          "expiry"
        ],
        "title": "IvSkewExpiryRow"
      },
      "IvSkewResponse": {
        "properties": {
          "success": {
            "type": "boolean",
            "const": true,
            "title": "Success",
            "default": true
          },
          "data": {
            "$ref": "#/components/schemas/IvSkewData"
          },
          "meta": {
            "$ref": "#/components/schemas/V2Meta"
          }
        },
        "type": "object",
        "required": [
          "data",
          "meta"
        ],
        "title": "IvSkewResponse"
      },
      "IvTermCompare": {
        "properties": {
          "days_ago": {
            "type": "integer",
            "title": "Days Ago"
          },
          "target_date": {
            "type": "string",
            "title": "Target Date"
          },
          "historical": {
            "items": {
              "$ref": "#/components/schemas/IvTermHistoricalBucket"
            },
            "type": "array",
            "title": "Historical"
          },
          "shape": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Shape"
          },
          "matched_count": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Matched Count"
          },
          "available": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Available"
          },
          "reason": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Reason"
          }
        },
        "type": "object",
        "required": [
          "days_ago",
          "target_date",
          "historical"
        ],
        "title": "IvTermCompare"
      },
      "IvTermHistoricalBucket": {
        "properties": {
          "dte_bucket": {
            "type": "integer",
            "title": "Dte Bucket"
          },
          "atm_iv": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Atm Iv",
            "description": "ATM implied volatility in percent (33.0 = 33%)."
          },
          "ts": {
            "type": "string",
            "title": "Ts"
          }
        },
        "type": "object",
        "required": [
          "dte_bucket",
          "ts"
        ],
        "title": "IvTermHistoricalBucket"
      },
      "IvTermStructureData": {
        "properties": {
          "expiries": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Expiries"
          },
          "dtes": {
            "anyOf": [
              {
                "items": {
                  "type": "number"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Dtes"
          },
          "days_to_expiry": {
            "anyOf": [
              {
                "items": {
                  "type": "number"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Days To Expiry",
            "description": "Days to each expiry's 08:00 UTC settle (fractional, e.g. 0.8)."
          },
          "atm_iv": {
            "anyOf": [
              {
                "items": {
                  "anyOf": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Atm Iv",
            "description": "ATM implied volatility per expiry, in percent (33.0 = 33%), read at the expiry's forward; null where the chosen venues do not quote the expiry."
          },
          "forwards": {
            "anyOf": [
              {
                "items": {
                  "anyOf": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Forwards",
            "description": "The forward each expiry's ATM was read at, parallel to `expiries`."
          },
          "ts": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Ts"
          },
          "spot_price": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Spot Price"
          },
          "filtered_dte_window": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Filtered Dte Window"
          },
          "compare": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/IvTermCompare"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": true,
        "type": "object",
        "title": "IvTermStructureData",
        "description": "The shape varies slightly by collector version - we document the\nfields we know about and leave room for additional ones via extra=allow."
      },
      "IvTermStructureResponse": {
        "properties": {
          "success": {
            "type": "boolean",
            "const": true,
            "title": "Success",
            "default": true
          },
          "data": {
            "$ref": "#/components/schemas/IvTermStructureData"
          },
          "meta": {
            "$ref": "#/components/schemas/V2Meta"
          }
        },
        "type": "object",
        "required": [
          "data",
          "meta"
        ],
        "title": "IvTermStructureResponse"
      },
      "MaxPainPainCurveEntry": {
        "properties": {
          "strike": {
            "type": "number",
            "title": "Strike"
          },
          "pain": {
            "type": "number",
            "title": "Pain"
          }
        },
        "type": "object",
        "required": [
          "strike",
          "pain"
        ],
        "title": "MaxPainPainCurveEntry"
      },
      "MaxPainPerExpiry": {
        "properties": {
          "expiry": {
            "type": "string",
            "title": "Expiry"
          },
          "dte": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Dte"
          },
          "max_pain": {
            "$ref": "#/components/schemas/GexMaxPainBlock"
          }
        },
        "type": "object",
        "required": [
          "expiry",
          "max_pain"
        ],
        "title": "MaxPainPerExpiry"
      },
      "MaxPainResponse": {
        "properties": {
          "success": {
            "type": "boolean",
            "const": true,
            "title": "Success",
            "default": true
          },
          "data": {
            "$ref": "#/components/schemas/MaxPainResponseData"
          },
          "meta": {
            "$ref": "#/components/schemas/V2Meta"
          }
        },
        "type": "object",
        "required": [
          "data",
          "meta"
        ],
        "title": "MaxPainResponse"
      },
      "MaxPainResponseData": {
        "properties": {
          "expiry": {
            "type": "string",
            "title": "Expiry",
            "description": "`0dte`, `all`, or a specific expiry token."
          },
          "dte": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Dte"
          },
          "expiry_tokens": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Expiry Tokens",
            "description": "Which expiry tokens were treated as 0DTE for this calculation. Present only when `?expiry=0dte`, so a caller can see exactly which expirations the number covers."
          },
          "max_pain": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/GexMaxPainBlock"
              },
              {
                "type": "null"
              }
            ]
          },
          "pain_curve": {
            "anyOf": [
              {
                "items": {
                  "$ref": "#/components/schemas/MaxPainPainCurveEntry"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Pain Curve",
            "description": "Per-strike total pain. Present only when a specific expiry is requested."
          },
          "per_expiry": {
            "anyOf": [
              {
                "items": {
                  "$ref": "#/components/schemas/MaxPainPerExpiry"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Per Expiry",
            "description": "Per-expiry max-pain table. Present only when `?expiry=all`."
          }
        },
        "type": "object",
        "required": [
          "expiry"
        ],
        "title": "MaxPainResponseData"
      },
      "MultiGexLevelsData": {
        "properties": {
          "results": {
            "additionalProperties": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/MultiSymbolEntry"
                },
                {
                  "type": "null"
                }
              ]
            },
            "type": "object",
            "title": "Results",
            "description": "Per-symbol entries; null for missing symbols."
          },
          "requested": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Requested"
          },
          "served": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Served"
          },
          "missing": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Missing"
          },
          "invalid": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Invalid"
          }
        },
        "type": "object",
        "required": [
          "results",
          "requested",
          "served",
          "missing",
          "invalid"
        ],
        "title": "MultiGexLevelsData"
      },
      "MultiGexLevelsResponse": {
        "properties": {
          "success": {
            "type": "boolean",
            "const": true,
            "title": "Success",
            "default": true
          },
          "data": {
            "$ref": "#/components/schemas/MultiGexLevelsData"
          },
          "meta": {
            "$ref": "#/components/schemas/V2Meta"
          }
        },
        "type": "object",
        "required": [
          "data",
          "meta"
        ],
        "title": "MultiGexLevelsResponse"
      },
      "MultiSymbolEntry": {
        "properties": {
          "all_expiry": {
            "$ref": "#/components/schemas/GexAllExpiryLevels"
          },
          "odte": {
            "$ref": "#/components/schemas/GexOdteLevels"
          },
          "spot_price": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Spot Price"
          },
          "computed_at": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Computed At"
          },
          "ranked": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/GexRanked"
              },
              {
                "type": "null"
              }
            ]
          },
          "max_pain": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/GexMaxPainBlock"
              },
              {
                "type": "null"
              }
            ]
          },
          "expected_move": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/GexExpectedMove"
              },
              {
                "type": "null"
              }
            ]
          },
          "gamma_flip_zones": {
            "anyOf": [
              {
                "items": {},
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Gamma Flip Zones"
          }
        },
        "type": "object",
        "required": [
          "all_expiry",
          "odte"
        ],
        "title": "MultiSymbolEntry",
        "description": "One symbol's slice of the bundle. Same shape as a single-symbol\n/v2/gex/levels response, sans the wrapper envelope."
      },
      "OpexData": {
        "properties": {
          "symbol": {
            "type": "string",
            "title": "Symbol"
          },
          "horizon_days": {
            "type": "integer",
            "title": "Horizon Days"
          },
          "spot_price": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Spot Price"
          },
          "expirations": {
            "items": {
              "$ref": "#/components/schemas/OpexExpiration"
            },
            "type": "array",
            "title": "Expirations"
          },
          "count": {
            "type": "integer",
            "title": "Count"
          },
          "type_counts": {
            "$ref": "#/components/schemas/ExpirySummaryTypeCounts"
          },
          "next_anchor": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/OpexNextAnchor"
              },
              {
                "type": "null"
              }
            ]
          },
          "filtered_types": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Filtered Types"
          }
        },
        "type": "object",
        "required": [
          "symbol",
          "horizon_days",
          "expirations",
          "count",
          "type_counts"
        ],
        "title": "OpexData"
      },
      "OpexExpiration": {
        "properties": {
          "expiry": {
            "type": "string",
            "title": "Expiry"
          },
          "expiry_date": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Expiry Date"
          },
          "dte": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Dte"
          },
          "type": {
            "type": "string",
            "enum": [
              "daily",
              "weekly",
              "monthly",
              "quarterly",
              "unknown"
            ],
            "title": "Type"
          },
          "is_anchor": {
            "type": "boolean",
            "title": "Is Anchor"
          },
          "oi": {
            "$ref": "#/components/schemas/OpexOI"
          },
          "iv": {
            "$ref": "#/components/schemas/OpexIV"
          },
          "gamma": {
            "$ref": "#/components/schemas/OpexGamma"
          }
        },
        "type": "object",
        "required": [
          "expiry",
          "type",
          "is_anchor",
          "oi",
          "iv",
          "gamma"
        ],
        "title": "OpexExpiration"
      },
      "OpexGamma": {
        "properties": {
          "net_gex": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Net Gex"
          },
          "call_resistance": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Call Resistance"
          },
          "put_support": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Put Support"
          },
          "max_pain": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/GexMaxPainBlock"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "type": "object",
        "title": "OpexGamma"
      },
      "OpexIV": {
        "properties": {
          "atm_iv": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Atm Iv",
            "description": "ATM implied volatility in percent (33.0 = 33%)."
          },
          "skew_25d": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Skew 25D"
          },
          "put_25d_iv": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Put 25D Iv"
          },
          "call_25d_iv": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Call 25D Iv"
          }
        },
        "type": "object",
        "title": "OpexIV"
      },
      "OpexNextAnchor": {
        "properties": {
          "type": {
            "type": "string",
            "title": "Type"
          },
          "expiry": {
            "type": "string",
            "title": "Expiry"
          },
          "expiry_date": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Expiry Date"
          },
          "dte": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Dte"
          }
        },
        "type": "object",
        "required": [
          "type",
          "expiry"
        ],
        "title": "OpexNextAnchor"
      },
      "OpexOI": {
        "properties": {
          "call_oi": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Call Oi"
          },
          "put_oi": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Put Oi"
          },
          "total_oi": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Total Oi"
          },
          "pcr": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Pcr"
          },
          "notional_oi_usd": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Notional Oi Usd"
          }
        },
        "type": "object",
        "title": "OpexOI"
      },
      "OpexResponse": {
        "properties": {
          "success": {
            "type": "boolean",
            "const": true,
            "title": "Success",
            "default": true
          },
          "data": {
            "$ref": "#/components/schemas/OpexData"
          },
          "meta": {
            "$ref": "#/components/schemas/V2Meta"
          }
        },
        "type": "object",
        "required": [
          "data",
          "meta"
        ],
        "title": "OpexResponse"
      },
      "OptionContract": {
        "properties": {
          "strike": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Strike"
          },
          "expiry": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Expiry"
          },
          "dte": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Dte"
          },
          "type": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "call",
                  "put"
                ]
              },
              {
                "type": "null"
              }
            ],
            "title": "Type"
          },
          "oi": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Oi"
          },
          "iv": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Iv"
          },
          "mark": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Mark"
          },
          "bid": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Bid"
          },
          "ask": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Ask"
          },
          "volume": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Volume"
          },
          "notional_volume": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Notional Volume"
          },
          "trade_count": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Trade Count"
          },
          "delta": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Delta"
          },
          "gamma": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Gamma"
          },
          "theta": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Theta"
          },
          "vega": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Vega"
          },
          "vanna": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Vanna"
          },
          "charm": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Charm"
          },
          "gex": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Gex"
          }
        },
        "type": "object",
        "title": "OptionContract",
        "description": "Per-contract row. Optional fields reflect ?include= projection."
      },
      "ProbabilityConfidenceBand": {
        "properties": {
          "confidence": {
            "type": "number",
            "title": "Confidence"
          },
          "lower": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Lower"
          },
          "upper": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Upper"
          },
          "lower_percentile": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Lower Percentile"
          },
          "upper_percentile": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Upper Percentile"
          },
          "available": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Available"
          },
          "reason": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Reason"
          }
        },
        "type": "object",
        "required": [
          "confidence"
        ],
        "title": "ProbabilityConfidenceBand"
      },
      "ProbabilityDensityData": {
        "properties": {
          "expiries": {
            "additionalProperties": {
              "$ref": "#/components/schemas/ProbabilityExpiryPayload"
            },
            "type": "object",
            "title": "Expiries",
            "description": "Keyed by expiry token (e.g. `28MAR25`)."
          },
          "spot_price": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Spot Price"
          },
          "filtered_dte_max": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Filtered Dte Max"
          },
          "confidence_band_requested": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Confidence Band Requested"
          }
        },
        "type": "object",
        "required": [
          "expiries"
        ],
        "title": "ProbabilityDensityData"
      },
      "ProbabilityDensityResponse": {
        "properties": {
          "success": {
            "type": "boolean",
            "const": true,
            "title": "Success",
            "default": true
          },
          "data": {
            "$ref": "#/components/schemas/ProbabilityDensityData"
          },
          "meta": {
            "$ref": "#/components/schemas/V2Meta"
          }
        },
        "type": "object",
        "required": [
          "data",
          "meta"
        ],
        "title": "ProbabilityDensityResponse"
      },
      "ProbabilityExpiryPayload": {
        "properties": {
          "strikes": {
            "anyOf": [
              {
                "items": {
                  "type": "number"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Strikes"
          },
          "pdf": {
            "anyOf": [
              {
                "items": {
                  "anyOf": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Pdf"
          },
          "pdf_normalized": {
            "anyOf": [
              {
                "items": {
                  "anyOf": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Pdf Normalized"
          },
          "cdf_above": {
            "anyOf": [
              {
                "items": {
                  "anyOf": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Cdf Above"
          },
          "cdf_below": {
            "anyOf": [
              {
                "items": {
                  "anyOf": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Cdf Below"
          },
          "mode": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Mode"
          },
          "mean": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Mean"
          },
          "std": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Std"
          },
          "skewness": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Skewness"
          },
          "kurtosis": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Kurtosis"
          },
          "prob_25": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Prob 25"
          },
          "prob_50": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Prob 50"
          },
          "prob_75": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Prob 75"
          },
          "forward": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Forward",
            "description": "The expiry's forward the distribution is centred on."
          },
          "confidence_band": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ProbabilityConfidenceBand"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "additionalProperties": true,
        "type": "object",
        "title": "ProbabilityExpiryPayload",
        "description": "Per-expiry PDF/CDF data. Many fields are optional because the cache\nshape evolves with worker versions; SDKs treat absent fields as null."
      },
      "TraceData": {
        "properties": {
          "greek": {
            "type": "string",
            "enum": [
              "gamma",
              "charm",
              "vanna",
              "delta_change"
            ],
            "title": "Greek",
            "description": "Which greek the field encodes."
          },
          "expiry": {
            "type": "string",
            "title": "Expiry",
            "description": "Expiry filter applied - `all`, `0dte`, or a Deribit token."
          },
          "spot_price": {
            "type": "number",
            "title": "Spot Price",
            "description": "Spot at the time of computation."
          },
          "vol_shift_pct": {
            "type": "number",
            "title": "Vol Shift Pct",
            "description": "What-if IV shift applied to every contract (percent, additive in σ multiplier)."
          },
          "field_units": {
            "type": "string",
            "title": "Field Units",
            "description": "Units of each cell, all $ at the cell's price - `dealer_gamma_dollars_per_pct_spot` for gamma (γ × S² × qty × 0.01), `dealer_charm_usd_delta_per_day` for charm, `dealer_vanna_usd_delta_per_vol_pt` for vanna, `dealer_delta_change_usd_from_spot_now` for delta_change. Cells are sized by the effective positioning model (see `positioning`)."
          },
          "positioning": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Positioning",
            "description": "Effective positioning model for this field: flow | std."
          },
          "time_axis_ms": {
            "items": {
              "type": "integer"
            },
            "type": "array",
            "title": "Time Axis Ms",
            "description": "Unix-ms timestamps along the time axis. Length = `time_steps`."
          },
          "price_axis": {
            "items": {
              "type": "number"
            },
            "type": "array",
            "title": "Price Axis",
            "description": "Spot prices along the price axis. Length = `price_steps`."
          },
          "field": {
            "items": {
              "items": {
                "type": "number"
              },
              "type": "array"
            },
            "type": "array",
            "title": "Field",
            "description": "2D field. `field[t][p]` is the cell value at time `time_axis_ms[t]` and price `price_axis[p]`."
          },
          "field_min": {
            "type": "number",
            "title": "Field Min"
          },
          "field_max": {
            "type": "number",
            "title": "Field Max"
          },
          "abs_field_max": {
            "type": "number",
            "title": "Abs Field Max",
            "description": "`max(|field_min|, |field_max|)`. Convenient symmetric scale for renderers."
          },
          "contracts_used": {
            "type": "integer",
            "title": "Contracts Used",
            "description": "Number of per-contract rows that contributed to the field."
          },
          "expiries_in_window": {
            "items": {
              "type": "string"
            },
            "type": "array",
            "title": "Expiries In Window",
            "description": "Deribit-style expiry tokens of contracts that contributed."
          },
          "tau_floor_seconds": {
            "type": "number",
            "title": "Tau Floor Seconds",
            "description": "Floor on τ used near expiry to prevent the BS-gamma cliff. Cells right at expiry are computed with τ = `tau_floor_seconds`."
          }
        },
        "type": "object",
        "required": [
          "greek",
          "expiry",
          "spot_price",
          "vol_shift_pct",
          "field_units",
          "time_axis_ms",
          "price_axis",
          "field",
          "field_min",
          "field_max",
          "abs_field_max",
          "contracts_used",
          "expiries_in_window",
          "tau_floor_seconds"
        ],
        "title": "TraceData",
        "description": "Single forward-projected greek field."
      },
      "TraceResponse": {
        "properties": {
          "success": {
            "type": "boolean",
            "const": true,
            "title": "Success",
            "default": true
          },
          "data": {
            "$ref": "#/components/schemas/TraceData"
          },
          "meta": {
            "$ref": "#/components/schemas/V2Meta"
          }
        },
        "type": "object",
        "required": [
          "data",
          "meta"
        ],
        "title": "TraceResponse"
      },
      "V2Error": {
        "properties": {
          "code": {
            "type": "string",
            "title": "Code",
            "description": "Stable machine-readable error code (see /v2/meta)."
          },
          "message": {
            "type": "string",
            "title": "Message",
            "description": "Human-readable description."
          },
          "details": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Details",
            "description": "Optional structured payload - e.g. validation_error returns the failing field list."
          }
        },
        "type": "object",
        "required": [
          "code",
          "message"
        ],
        "title": "V2Error"
      },
      "V2ErrorEnvelope": {
        "properties": {
          "success": {
            "type": "boolean",
            "const": false,
            "title": "Success",
            "default": false
          },
          "error": {
            "$ref": "#/components/schemas/V2Error"
          },
          "meta": {
            "$ref": "#/components/schemas/V2Meta"
          }
        },
        "type": "object",
        "required": [
          "error",
          "meta"
        ],
        "title": "V2ErrorEnvelope",
        "description": "Returned for every non-2xx response."
      },
      "V2Meta": {
        "properties": {
          "version": {
            "type": "string",
            "const": "2.0",
            "title": "Version",
            "description": "API version tag."
          },
          "timestamp": {
            "type": "string",
            "title": "Timestamp",
            "description": "ISO 8601 wall-clock when the response was built."
          },
          "request_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Request Id",
            "description": "X-Request-ID for tracing across logs / Sentry."
          },
          "symbol": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Symbol",
            "description": "Symbol the response is about, if applicable."
          },
          "spot_price": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Spot Price",
            "description": "Current spot price for the symbol."
          },
          "computed_at": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Computed At",
            "description": "ISO 8601 of when the underlying cache value was last written."
          },
          "freshness_seconds": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Freshness Seconds",
            "description": "`now - computed_at` in seconds; useful for staleness alarms."
          },
          "source": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Source",
            "description": "Upstream venue list the data flowed through."
          },
          "exchanges_filtered": {
            "anyOf": [
              {
                "items": {
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Exchanges Filtered",
            "description": "Echo of the `?exchanges=` filter when one was applied."
          },
          "rate_limit": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Rate Limit",
            "description": "`{limit, remaining, reset}` echo of the rate-limit headers."
          },
          "extra": {
            "anyOf": [
              {
                "additionalProperties": true,
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Extra",
            "description": "Open dict for endpoint-specific metadata (filter_hash, etc.)."
          }
        },
        "type": "object",
        "required": [
          "version",
          "timestamp"
        ],
        "title": "V2Meta",
        "description": "The meta block returned alongside every v2 response.\n\nEvery field after `version`/`timestamp` is optional because endpoints\nattach different combinations - e.g. `/v2/status` skips `symbol`, the\nchain endpoint sets `extra.filter_hash`, etc. Listing them here means\nSDKs get a typed accessor for each instead of a generic `meta: dict`."
      },
      "VenueOI": {
        "properties": {
          "call_oi": {
            "type": "number",
            "title": "Call Oi",
            "description": "Call open interest, coin units."
          },
          "put_oi": {
            "type": "number",
            "title": "Put Oi",
            "description": "Put open interest, coin units."
          },
          "total_oi": {
            "type": "number",
            "title": "Total Oi",
            "description": "call_oi + put_oi, coin units."
          },
          "notional_oi_usd": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Notional Oi Usd",
            "description": "total_oi x spot, using the same spot the response reports."
          }
        },
        "type": "object",
        "required": [
          "call_oi",
          "put_oi",
          "total_oi"
        ],
        "title": "VenueOI",
        "description": "One venue's open interest on a surface. OI is coin-native on every\nvenue, so cross-venue sums need no conversion."
      }
    },
    "securitySchemes": {
      "ApiKeyAuth": {
        "type": "apiKey",
        "in": "header",
        "name": "X-API-Key",
        "description": "Your BackQuant API key (same key as v1)"
      }
    }
  },
  "tags": [
    {
      "name": "Meta",
      "description": "Unauthenticated metadata + endpoint catalog (planning your integration)"
    },
    {
      "name": "Discovery",
      "description": "Symbol catalog, active expiries, and service status"
    },
    {
      "name": "GEX",
      "description": "Gamma exposure analytics"
    },
    {
      "name": "Options",
      "description": "Options chain, IV, greeks, probability, premium tide"
    },
    {
      "name": "Liquidation",
      "description": "Liquidation heatmap and distribution"
    },
    {
      "name": "Multi",
      "description": "Bundled multi-symbol endpoints (single round-trip across the universe)"
    },
    {
      "name": "COT",
      "description": "CFTC Commitments of Traders: futures positioning by trader category (public CFTC data)"
    },
    {
      "name": "Filings",
      "description": "SEC Form 4 insider trades and 13F holders for MSTR, COIN, HOOD and IBIT (public SEC data)"
    }
  ]
}
