{
  "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## What's *not* in v2\n\nMacro indicators, perpetual-futures data (funding/OI/CVD), spot prices,\ncross-asset benchmarks, ETF flows, equities — all excluded for upstream\nredistribution reasons. v1 still serves these for backwards compatibility.\n\n## Authentication\n\nSame `X-API-Key` header as v1; existing API keys work without re-issuance.\n\n```\nX-API-Key: bq_live_your_api_key_here\n```\n\n## Rate limits\n\nPer-key, derived from your subscription tier:\n\n| Tier        | Limit                |\n|-------------|----------------------|\n| Monthly     | 60 requests/min      |\n| Yearly      | 120 requests/min     |\n| Enterprise  | No limit             |\n\nHeaders `X-RateLimit-Limit / -Remaining / -Reset` are included in every\nresponse, and the same triple is echoed inside `meta.rate_limit` when\npopulated by middleware.\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\"],\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.0.0"
  },
  "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.",
        "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`.",
        "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",
              "title": "Exchanges"
            },
            "description": "Comma-separated venue filter"
          },
          {
            "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": "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 today's expiry only, and an explicit expiry token (e.g. `28MAR25`) returns just that expiration.\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.",
        "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",
              "title": "Exchanges"
            },
            "description": "Comma-separated venue filter"
          },
          {
            "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": "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\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",
              "title": "Exchanges"
            },
            "description": "Comma-separated venue filter"
          },
          {
            "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": []
          }
        ]
      }
    },
    "/gex/strike-expiry-heatmap": {
      "get": {
        "tags": [
          "GEX"
        ],
        "summary": "2D strike × expiry GEX matrix",
        "description": "Rows are strikes, columns are expiries (sorted ascending DTE).\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",
              "title": "Exchanges"
            },
            "description": "Comma-separated venue filter"
          },
          {
            "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": "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. Without filters this serves the pre-computed cache (cheap); with filters it reconstructs from raw snapshots (more work, but still bounded to the last ~48 ticks).",
        "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": "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.",
        "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",
        "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.",
        "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 cheapest path (read straight from the 0DTE levels cache), `?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": []
          }
        ]
      }
    },
    "/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.",
        "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": "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`.",
        "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": "2D implied-volatility grid: rows are strikes, columns are expiries (sorted by ascending DTE). Useful for vol-surface visualisations and identifying skew/term-structure shape at a glance.",
        "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": "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.\n\nFilters:\n* `exchanges` — comma-separated venue filter.\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": "exchanges",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Comma-separated venue filter",
              "title": "Exchanges"
            },
            "description": "Comma-separated venue filter"
          },
          {
            "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.",
        "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": "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 — the cheap path when you only need a single tenor. Pass `?expiry=` as a Deribit-style token (e.g. `28MAR25`); omit it to receive the default front-month smile from `iv:smile:{symbol}:default`. The lookup is case-insensitive on the token; if neither cased form exists, this returns 404 with the available tokens hinted in the error.",
        "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 (e.g. `28MAR25`). Omit for the default front-month smile.",
              "title": "Expiry"
            },
            "description": "Expiry token (e.g. `28MAR25`). Omit for the default front-month smile."
          },
          {
            "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": "Daily implied (DVOL/ATM-IV) and 30d realized vol with the spread.",
        "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": {}
              }
            }
          },
          "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/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-straddle-derived 1- and 2-sigma expected move (1d horizon).",
        "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": "exchanges",
            "in": "query",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Comma-separated venue filter",
              "title": "Exchanges"
            },
            "description": "Comma-separated venue 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": []
          }
        ]
      }
    },
    "/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\nFilters:\n* `exchanges` — comma-separated venue filter.\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`. The default cached   greeks profile spans every active expiry; this lets you isolate   near-term exposure. Cached 30s per `(symbol, greek, dte_max,   exchanges)` so repeated requests stay cheap.",
        "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",
              "title": "Exchanges"
            },
            "description": "Comma-separated venue filter"
          },
          {
            "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": "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.",
        "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": "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 = sum(greek × OI) per (strike, expiry) cell. Useful for 3D visualizations or for spotting where a particular greek is concentrated across the term structure.",
        "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\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",
              "title": "Exchanges"
            },
            "description": "Comma-separated venue filter"
          },
          {
            "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 for daily mode",
              "default": 30,
              "title": "Days"
            },
            "description": "Trim window for daily mode"
          },
          {
            "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": "Net premium and notional volume from Deribit-side trades, split into call and put flow. Use `?horizon=0dte` for today's tape or `weekly` for the rolling weekly aggregate.",
        "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 tape; `weekly` returns the rolling weekly aggregate.",
              "default": "0dte",
              "title": "Horizon"
            },
            "description": "`0dte` returns today's tape; `weekly` returns the rolling weekly aggregate."
          },
          {
            "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": []
          }
        ]
      }
    },
    "/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. 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 long and short liquidation volumes, with a leverage tier estimate based on distance from current price and cumulative-volume 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. Includes: `ranked` (top-10 strikes by |GEX|), `max_pain` (0DTE only), `expected_move` (1σ / 2σ implied range), `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",
              "title": "Exchanges"
            },
            "description": "Comma-separated venue filter"
          },
          {
            "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": "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"
                }
              }
            }
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/V2ErrorEnvelope"
                }
              }
            },
            "description": "Bad Request"
          },
          "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"
          },
          "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"
      },
      "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"
          },
          "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"
              }
            ]
          }
        },
        "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"
          },
          "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"
          }
        },
        "type": "object",
        "title": "GexExpectedMove"
      },
      "GexLevelsData": {
        "properties": {
          "all_expiry": {
            "$ref": "#/components/schemas/GexAllExpiryLevels"
          },
          "odte": {
            "$ref": "#/components/schemas/GexOdteLevels"
          },
          "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."
          }
        },
        "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"
      },
      "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": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Dte"
          },
          "atm_iv": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Atm Iv"
          },
          "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"
          }
        },
        "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"
          },
          "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": "integer"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Dtes"
          },
          "days_to_expiry": {
            "anyOf": [
              {
                "items": {
                  "type": "integer"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Days To Expiry"
          },
          "atm_iv": {
            "anyOf": [
              {
                "items": {
                  "anyOf": [
                    {
                      "type": "number"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Atm Iv"
          },
          "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"
          },
          "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"
          },
          "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"
          },
          "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."
      },
      "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`."
      }
    },
    "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)"
    }
  ],
  "servers": [
    {
      "url": "/v2"
    }
  ]
}