{
  "openapi": "3.1.0",
  "info": {
    "title": "quantedTrader API",
    "version": "1",
    "summary": "Options positioning, vol and flow for 5,000+ US stocks & ETFs.",
    "description": "GEX, DEX, VEX and CEX (gamma, delta, vanna, charm exposure) by strike, walls, zero gamma and the gamma flip, implied and realized volatility, options flow and quantedFlow signals, a whole-market screener and minute-by-minute history. 50,000 requests per account per day, 5 per second (bursts of 10); only successful answers count. Also served as an MCP server at https://api.quantedoptions.com/v1/mcp. Reference: https://www.quantedoptions.com/trader-api/docs.",
    "contact": {
      "name": "quantedOptions",
      "url": "https://www.quantedoptions.com/trader-api/docs"
    }
  },
  "servers": [
    {
      "url": "https://api.quantedoptions.com"
    }
  ],
  "security": [
    {
      "ApiKeyHeader": []
    },
    {
      "BearerKey": []
    }
  ],
  "tags": [
    {
      "name": "Positioning"
    },
    {
      "name": "Volatility"
    },
    {
      "name": "Flow"
    },
    {
      "name": "Screener"
    },
    {
      "name": "History"
    },
    {
      "name": "Bulk"
    },
    {
      "name": "Reference"
    }
  ],
  "paths": {
    "/v1/ticker/{symbol}/levels": {
      "get": {
        "operationId": "getTickerSymbolLevels",
        "tags": [
          "Positioning"
        ],
        "summary": "Key levels at a minute: call and put walls (largest positive / most negative net GEX strike, either side of spot), gamma walls (call-only /…",
        "description": "Key levels at a minute: call and put walls (largest positive / most negative net GEX strike, either side of spot), gamma walls (call-only / put-only), zero gamma, the gamma flip the quantedTrader page draws, the regime, and the largest gamma nodes with their distance from spot. From 2026-10-05 also: max pain (the strike where the book’s open contracts would pay the least at settlement) and the highest call / put / total open interest strikes; hedge_flow, the shares and dollars dealers would trade to stay hedged for spot moves of ±0.5, ±1 and ±2% (each contract’s delta repriced at the moved spot from its own IV; dealers long calls and short puts as in GEX; negative = dealers sell, positive = buy) plus the charm drift to the 16:00 close (−CEX × minutes left / 1440); and front, the front expiry’s magnet (largest |net GEX| strike), max pain, pin score (0–100: net GEX within ±1% of spot ÷ the front expiry’s gross |net GEX|, floored at 0), share of the name’s gamma and 1-sigma expected move to settlement.",
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Ticker, e.g. NVDA, SPY, SPX. See /v1/ticker/universe.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "date",
            "in": "query",
            "required": false,
            "description": "Session date (ET). Default: the current or most recent session. Every session from 2026-06-12 on, minute by minute (with minute / timestamp); without a minute a past date returns that session’s close (its last capture of the 16:00 minute).",
            "schema": {
              "type": "string",
              "format": "date",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "expiry",
            "in": "query",
            "required": false,
            "description": "\"all\" (default), \"0dte\" (alias \"front\"), \"allx0\" (all but the front expiry) or an expiry date YYYY-MM-DD listed for that symbol and minute. \"0dte\" / \"front\" is the front expiry: the nearest listed expiry on or after the session date, so it is a true 0DTE only for names with a daily expiry (SPX, SPY, QQQ, IWM); /levels names it in front_expiry. Named books are case-insensitive; anything else is a 400, an unlisted date a 404 with the listed ones.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "minute",
            "in": "query",
            "required": false,
            "description": "A single minute (ET), for today or any session since 2026-06-12. Default: the latest minute: the newest published capture of the 16:00 minute or earlier (a few seconds after each minute, at most 5 minutes behind; after the close, 16:00). A minute that was not captured answers 404 with the nearest minutes; a past minute costs one request like any other.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{2}:\\d{2}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer (JSON). Field definitions: the API reference and the MCP resource quantedoptions://docs/fields.",
            "headers": {
              "X-Quota-Limit": {
                "$ref": "#/components/headers/X-Quota-Limit"
              },
              "X-Quota-Remaining": {
                "$ref": "#/components/headers/X-Quota-Remaining"
              },
              "X-Quota-Reset": {
                "$ref": "#/components/headers/X-Quota-Reset"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Burst": {
                "$ref": "#/components/headers/X-RateLimit-Burst"
              },
              "X-Request-Cost": {
                "$ref": "#/components/headers/X-Request-Cost"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        }
      }
    },
    "/v1/ticker/{symbol}/exposure-buckets": {
      "get": {
        "operationId": "getTickerSymbolExposureBuckets",
        "tags": [
          "Positioning"
        ],
        "summary": "GEX, DEX, VEX and CEX with call / put open interest by expiry bucket (0dte, 1-7d, 8-30d, 31-90d, 91d+: calendar days from the session date…",
        "description": "GEX, DEX, VEX and CEX with call / put open interest by expiry bucket (0dte, 1-7d, 8-30d, 31-90d, 91d+: calendar days from the session date to expiry) and for every listed expiry, in one call, plus the front expiry’s share of gamma. Buckets sum to the totals up to rounding. Sessions from 2026-10-05 (earlier dates answer 404 with available_from).",
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Ticker, e.g. NVDA, SPY, SPX. See /v1/ticker/universe.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "date",
            "in": "query",
            "required": false,
            "description": "Session date (ET). Default: the current or most recent session. Every session from 2026-06-12 on, minute by minute (with minute / timestamp); without a minute a past date returns that session’s close (its last capture of the 16:00 minute).",
            "schema": {
              "type": "string",
              "format": "date",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "minute",
            "in": "query",
            "required": false,
            "description": "A single minute (ET), for today or any session since 2026-06-12. Default: the latest minute: the newest published capture of the 16:00 minute or earlier (a few seconds after each minute, at most 5 minutes behind; after the close, 16:00). A minute that was not captured answers 404 with the nearest minutes; a past minute costs one request like any other.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{2}:\\d{2}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer (JSON). Field definitions: the API reference and the MCP resource quantedoptions://docs/fields.",
            "headers": {
              "X-Quota-Limit": {
                "$ref": "#/components/headers/X-Quota-Limit"
              },
              "X-Quota-Remaining": {
                "$ref": "#/components/headers/X-Quota-Remaining"
              },
              "X-Quota-Reset": {
                "$ref": "#/components/headers/X-Quota-Reset"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Burst": {
                "$ref": "#/components/headers/X-RateLimit-Burst"
              },
              "X-Request-Cost": {
                "$ref": "#/components/headers/X-Request-Cost"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        }
      }
    },
    "/v1/ticker/{symbol}/oi-changes": {
      "get": {
        "operationId": "getTickerSymbolOiChanges",
        "tags": [
          "Positioning"
        ],
        "summary": "Open interest now vs the previous session’s close: call / put totals and changes, the strikes with the largest builds and unwinds (every…",
        "description": "Open interest now vs the previous session’s close: call / put totals and changes, the strikes with the largest builds and unwinds (every live expiry summed) and the contracts that changed the most. Contracts that expired since are reported apart (expired_oi), not as unwinds. Open interest is settled once a day before the open: until it is published (early premarket) oi_updated is false and changes read 0. Sessions from 2026-10-05 (earlier dates answer 404 with available_from).",
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Ticker, e.g. NVDA, SPY, SPX. See /v1/ticker/universe.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "date",
            "in": "query",
            "required": false,
            "description": "Session date (ET). Default: the current or most recent session. Every session from 2026-06-12 on, minute by minute (with minute / timestamp); without a minute a past date returns that session’s close (its last capture of the 16:00 minute).",
            "schema": {
              "type": "string",
              "format": "date",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "minute",
            "in": "query",
            "required": false,
            "description": "A single minute (ET), for today or any session since 2026-06-12. Default: the latest minute: the newest published capture of the 16:00 minute or earlier (a few seconds after each minute, at most 5 minutes behind; after the close, 16:00). A minute that was not captured answers 404 with the nearest minutes; a past minute costs one request like any other.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{2}:\\d{2}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer (JSON). Field definitions: the API reference and the MCP resource quantedoptions://docs/fields.",
            "headers": {
              "X-Quota-Limit": {
                "$ref": "#/components/headers/X-Quota-Limit"
              },
              "X-Quota-Remaining": {
                "$ref": "#/components/headers/X-Quota-Remaining"
              },
              "X-Quota-Reset": {
                "$ref": "#/components/headers/X-Quota-Reset"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Burst": {
                "$ref": "#/components/headers/X-RateLimit-Burst"
              },
              "X-Request-Cost": {
                "$ref": "#/components/headers/X-Request-Cost"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        }
      }
    },
    "/v1/ticker/{symbol}/exposures": {
      "get": {
        "operationId": "getTickerSymbolExposures",
        "tags": [
          "Positioning"
        ],
        "summary": "GEX, DEX, VEX or CEX (gamma, delta, vanna, charm exposure) by strike (calls, puts, net), every minute",
        "description": "GEX, DEX, VEX or CEX (gamma, delta, vanna, charm exposure) by strike (calls, puts, net), every minute. Dollars; units and signs under Definitions.",
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Ticker, e.g. NVDA, SPY, SPX. See /v1/ticker/universe.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "metric",
            "in": "query",
            "required": true,
            "description": "\"gex\", \"dex\", \"vex\" or \"cex\".",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "date",
            "in": "query",
            "required": false,
            "description": "Session date (ET). Default: the current or most recent session. Every session from 2026-06-12 on, minute by minute (with minute / timestamp); without a minute a past date returns that session’s close (its last capture of the 16:00 minute).",
            "schema": {
              "type": "string",
              "format": "date",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "expiry",
            "in": "query",
            "required": false,
            "description": "\"all\" (default), \"0dte\" (alias \"front\"), \"allx0\" (all but the front expiry) or an expiry date YYYY-MM-DD listed for that symbol and minute. \"0dte\" / \"front\" is the front expiry: the nearest listed expiry on or after the session date, so it is a true 0DTE only for names with a daily expiry (SPX, SPY, QQQ, IWM); /levels names it in front_expiry. Named books are case-insensitive; anything else is a 400, an unlisted date a 404 with the listed ones.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "minute",
            "in": "query",
            "required": false,
            "description": "A single minute (ET), for today or any session since 2026-06-12. Default: the latest minute: the newest published capture of the 16:00 minute or earlier (a few seconds after each minute, at most 5 minutes behind; after the close, 16:00). A minute that was not captured answers 404 with the nearest minutes; a past minute costs one request like any other.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{2}:\\d{2}$"
            }
          },
          {
            "name": "band",
            "in": "query",
            "required": false,
            "description": "Strikes within ± this fraction of spot: 0.02, 0.05, 0.1 or 0.2. Default: every strike.",
            "schema": {
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer (JSON). Field definitions: the API reference and the MCP resource quantedoptions://docs/fields.",
            "headers": {
              "X-Quota-Limit": {
                "$ref": "#/components/headers/X-Quota-Limit"
              },
              "X-Quota-Remaining": {
                "$ref": "#/components/headers/X-Quota-Remaining"
              },
              "X-Quota-Reset": {
                "$ref": "#/components/headers/X-Quota-Reset"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Burst": {
                "$ref": "#/components/headers/X-RateLimit-Burst"
              },
              "X-Request-Cost": {
                "$ref": "#/components/headers/X-Request-Cost"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        }
      }
    },
    "/v1/ticker/{symbol}/surface": {
      "get": {
        "operationId": "getTickerSymbolSurface",
        "tags": [
          "Volatility"
        ],
        "summary": "Implied volatility surface: IV by strike and expiry, skew and term structure",
        "description": "Implied volatility surface: IV by strike and expiry, skew and term structure.",
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Ticker, e.g. NVDA, SPY, SPX. See /v1/ticker/universe.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "date",
            "in": "query",
            "required": false,
            "description": "Session date (ET). Default: the current or most recent session. Every session from 2026-06-12 on, minute by minute (with minute / timestamp); without a minute a past date returns that session’s close (its last capture of the 16:00 minute).",
            "schema": {
              "type": "string",
              "format": "date",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "minute",
            "in": "query",
            "required": false,
            "description": "A single minute (ET), for today or any session since 2026-06-12. Default: the latest minute: the newest published capture of the 16:00 minute or earlier (a few seconds after each minute, at most 5 minutes behind; after the close, 16:00). A minute that was not captured answers 404 with the nearest minutes; a past minute costs one request like any other.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{2}:\\d{2}$"
            }
          },
          {
            "name": "max_expiries",
            "in": "query",
            "required": false,
            "description": "12 (default), 24 or 60.",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "band",
            "in": "query",
            "required": false,
            "description": "Strikes within ± this fraction of spot: 0.1, 0.2 (default) or 0.5.",
            "schema": {
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer (JSON). Field definitions: the API reference and the MCP resource quantedoptions://docs/fields.",
            "headers": {
              "X-Quota-Limit": {
                "$ref": "#/components/headers/X-Quota-Limit"
              },
              "X-Quota-Remaining": {
                "$ref": "#/components/headers/X-Quota-Remaining"
              },
              "X-Quota-Reset": {
                "$ref": "#/components/headers/X-Quota-Reset"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Burst": {
                "$ref": "#/components/headers/X-RateLimit-Burst"
              },
              "X-Request-Cost": {
                "$ref": "#/components/headers/X-Request-Cost"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        }
      }
    },
    "/v1/ticker/{symbol}/iv-rank": {
      "get": {
        "operationId": "getTickerSymbolIvRank",
        "tags": [
          "Volatility"
        ],
        "summary": "IV rank and IV percentile with the ATM implied volatility they are computed from",
        "description": "IV rank and IV percentile with the ATM implied volatility they are computed from.",
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Ticker, e.g. NVDA, SPY, SPX. See /v1/ticker/universe.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "date",
            "in": "query",
            "required": false,
            "description": "Session date (ET). Default: the current or most recent session. Every session from 2026-06-12 on, minute by minute (with minute / timestamp); without a minute a past date returns that session’s close (its last capture of the 16:00 minute).",
            "schema": {
              "type": "string",
              "format": "date",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer (JSON). Field definitions: the API reference and the MCP resource quantedoptions://docs/fields.",
            "headers": {
              "X-Quota-Limit": {
                "$ref": "#/components/headers/X-Quota-Limit"
              },
              "X-Quota-Remaining": {
                "$ref": "#/components/headers/X-Quota-Remaining"
              },
              "X-Quota-Reset": {
                "$ref": "#/components/headers/X-Quota-Reset"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Burst": {
                "$ref": "#/components/headers/X-RateLimit-Burst"
              },
              "X-Request-Cost": {
                "$ref": "#/components/headers/X-Request-Cost"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        }
      }
    },
    "/v1/ticker/{symbol}/flow": {
      "get": {
        "operationId": "getTickerSymbolFlow",
        "tags": [
          "Flow"
        ],
        "summary": "Options flow: premium and volume by side, unusual prints, call/put balance through the session",
        "description": "Options flow: premium and volume by side, unusual prints, call/put balance through the session.",
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Ticker, e.g. NVDA, SPY, SPX. See /v1/ticker/universe.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "date",
            "in": "query",
            "required": false,
            "description": "Session date (ET). Default: the current or most recent session. Every session from 2026-06-12 on, minute by minute (with minute / timestamp); without a minute a past date returns that session’s close (its last capture of the 16:00 minute).",
            "schema": {
              "type": "string",
              "format": "date",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "expiry",
            "in": "query",
            "required": false,
            "description": "\"all\" (default), \"0dte\" (alias \"front\"), \"allx0\" (all but the front expiry) or an expiry date YYYY-MM-DD listed for that symbol and minute. \"0dte\" / \"front\" is the front expiry: the nearest listed expiry on or after the session date, so it is a true 0DTE only for names with a daily expiry (SPX, SPY, QQQ, IWM); /levels names it in front_expiry. Named books are case-insensitive; anything else is a 400, an unlisted date a 404 with the listed ones.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "minute",
            "in": "query",
            "required": false,
            "description": "A single minute (ET), for today or any session since 2026-06-12. Default: the latest minute: the newest published capture of the 16:00 minute or earlier (a few seconds after each minute, at most 5 minutes behind; after the close, 16:00). A minute that was not captured answers 404 with the nearest minutes; a past minute costs one request like any other.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{2}:\\d{2}$"
            }
          },
          {
            "name": "window",
            "in": "query",
            "required": false,
            "description": "Look-back window for the premium split and top contracts: 5, 15 (default), 30 or 60.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer (JSON). Field definitions: the API reference and the MCP resource quantedoptions://docs/fields.",
            "headers": {
              "X-Quota-Limit": {
                "$ref": "#/components/headers/X-Quota-Limit"
              },
              "X-Quota-Remaining": {
                "$ref": "#/components/headers/X-Quota-Remaining"
              },
              "X-Quota-Reset": {
                "$ref": "#/components/headers/X-Quota-Reset"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Burst": {
                "$ref": "#/components/headers/X-RateLimit-Burst"
              },
              "X-Request-Cost": {
                "$ref": "#/components/headers/X-Request-Cost"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        }
      }
    },
    "/v1/ticker/{symbol}/timeline": {
      "get": {
        "operationId": "getTickerSymbolTimeline",
        "tags": [
          "History"
        ],
        "summary": "Minute-by-minute series for the session: spot, net GEX, net DEX and session call / put premium (fields ts, spot, gex, dex, call_prem…",
        "description": "Minute-by-minute series for the session: spot, net GEX, net DEX and session call / put premium (fields ts, spot, gex, dex, call_prem, put_prem). Levels at any minute: /levels with date and minute (or the get_session_story tool).",
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Ticker, e.g. NVDA, SPY, SPX. See /v1/ticker/universe.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "date",
            "in": "query",
            "required": false,
            "description": "Session date (ET). Default: the current or most recent session. Every session from 2026-06-12 on, minute by minute (with minute / timestamp); without a minute a past date returns that session’s close (its last capture of the 16:00 minute).",
            "schema": {
              "type": "string",
              "format": "date",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer (JSON). Field definitions: the API reference and the MCP resource quantedoptions://docs/fields.",
            "headers": {
              "X-Quota-Limit": {
                "$ref": "#/components/headers/X-Quota-Limit"
              },
              "X-Quota-Remaining": {
                "$ref": "#/components/headers/X-Quota-Remaining"
              },
              "X-Quota-Reset": {
                "$ref": "#/components/headers/X-Quota-Reset"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Burst": {
                "$ref": "#/components/headers/X-RateLimit-Burst"
              },
              "X-Request-Cost": {
                "$ref": "#/components/headers/X-Request-Cost"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        }
      }
    },
    "/v1/ticker/{symbol}/signals": {
      "get": {
        "operationId": "getTickerSymbolSignals",
        "tags": [
          "Flow"
        ],
        "summary": "quantedFlow for one symbol: the contracts trading above their open interest (at least 500 contracts) at the latest scan, their premium by…",
        "description": "quantedFlow for one symbol: the contracts trading above their open interest (at least 500 contracts) at the latest scan, their premium by side, the dollars traded in the last 5, 30 and 60 minutes, and the top strikes.",
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Ticker, e.g. NVDA, SPY, SPX. See /v1/ticker/universe.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "date",
            "in": "query",
            "required": false,
            "description": "Session date (ET). Default: the current or most recent session. Every session from 2026-06-12 on, minute by minute (with minute / timestamp); without a minute a past date returns that session’s close (its last capture of the 16:00 minute).",
            "schema": {
              "type": "string",
              "format": "date",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "timestamp",
            "in": "query",
            "required": false,
            "description": "The latest quantedFlow scan at or before this minute (ET), on date (default: today). Alias: minute. Default: the latest scan.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{2}:\\d{2}$"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Signals listed: 10, 25 (default), 50, 100 or 200.",
            "schema": {
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer (JSON). Field definitions: the API reference and the MCP resource quantedoptions://docs/fields.",
            "headers": {
              "X-Quota-Limit": {
                "$ref": "#/components/headers/X-Quota-Limit"
              },
              "X-Quota-Remaining": {
                "$ref": "#/components/headers/X-Quota-Remaining"
              },
              "X-Quota-Reset": {
                "$ref": "#/components/headers/X-Quota-Reset"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Burst": {
                "$ref": "#/components/headers/X-RateLimit-Burst"
              },
              "X-Request-Cost": {
                "$ref": "#/components/headers/X-Request-Cost"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        }
      }
    },
    "/v1/flow/signals": {
      "get": {
        "operationId": "getFlowSignals",
        "tags": [
          "Flow"
        ],
        "summary": "The quantedFlow Flow Signals board across all names: 50 contracts, at most 2 per ticker, index names excluded, ranked by volume / open…",
        "description": "The quantedFlow Flow Signals board across all names: 50 contracts, at most 2 per ticker, index names excluded, ranked by volume / open interest, premium or the volume added in the latest scan. Each row also compares that latest burst with the contract’s own pace over the previous 30 minutes.",
        "parameters": [
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "description": "\"voi\" (default), \"premium\" or \"delta_vol\".",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dte",
            "in": "query",
            "required": false,
            "description": "\"all\" (default), \"0\", \"7\", \"30\", \"90\" or \"90p\".",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sector",
            "in": "query",
            "required": false,
            "description": "Sector slug: comm, cons_disc, cons_stap, energy, fin, health, industrial, materials, realestate, tech or utilities.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "baseline",
            "in": "query",
            "required": false,
            "description": "true (default) adds each row’s pace over the previous 30 minutes.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "date",
            "in": "query",
            "required": false,
            "description": "Session date (ET). Default: the current or most recent session. Every session from 2026-06-12 on, minute by minute (with minute / timestamp); without a minute a past date returns that session’s close (its last capture of the 16:00 minute).",
            "schema": {
              "type": "string",
              "format": "date",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "timestamp",
            "in": "query",
            "required": false,
            "description": "The latest quantedFlow scan at or before this minute (ET), on date (default: today). Alias: minute. Default: the latest scan.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{2}:\\d{2}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer (JSON). Field definitions: the API reference and the MCP resource quantedoptions://docs/fields.",
            "headers": {
              "X-Quota-Limit": {
                "$ref": "#/components/headers/X-Quota-Limit"
              },
              "X-Quota-Remaining": {
                "$ref": "#/components/headers/X-Quota-Remaining"
              },
              "X-Quota-Reset": {
                "$ref": "#/components/headers/X-Quota-Reset"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Burst": {
                "$ref": "#/components/headers/X-RateLimit-Burst"
              },
              "X-Request-Cost": {
                "$ref": "#/components/headers/X-Request-Cost"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        }
      }
    },
    "/v1/flow/premium": {
      "get": {
        "operationId": "getFlowPremium",
        "tags": [
          "Flow"
        ],
        "summary": "Names ranked by quantedFlow premium: today, the last 5 sessions, or the dollars traded in the last hour",
        "description": "Names ranked by quantedFlow premium: today, the last 5 sessions, or the dollars traded in the last hour.",
        "parameters": [
          {
            "name": "period",
            "in": "query",
            "required": false,
            "description": "\"day\" (default) or \"week\".",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "metric",
            "in": "query",
            "required": false,
            "description": "\"premium\" (default) or \"flow_1h\" (day only).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "side",
            "in": "query",
            "required": false,
            "description": "\"all\" (default), \"C\" or \"P\".",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "10, 25 (default), 50, 100, 250, 500 or 1000 names.",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "include_index",
            "in": "query",
            "required": false,
            "description": "false (default) keeps index names out.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "date",
            "in": "query",
            "required": false,
            "description": "Session date (ET). Default: the current or most recent session. Every session from 2026-06-12 on, minute by minute (with minute / timestamp); without a minute a past date returns that session’s close (its last capture of the 16:00 minute).",
            "schema": {
              "type": "string",
              "format": "date",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "timestamp",
            "in": "query",
            "required": false,
            "description": "The latest quantedFlow scan at or before this minute (ET), on date (default: today). Alias: minute. Default: the latest scan. With period \"week\" it sets the last session’s scan; the 4 earlier sessions count their last scan.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{2}:\\d{2}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer (JSON). Field definitions: the API reference and the MCP resource quantedoptions://docs/fields.",
            "headers": {
              "X-Quota-Limit": {
                "$ref": "#/components/headers/X-Quota-Limit"
              },
              "X-Quota-Remaining": {
                "$ref": "#/components/headers/X-Quota-Remaining"
              },
              "X-Quota-Reset": {
                "$ref": "#/components/headers/X-Quota-Reset"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Burst": {
                "$ref": "#/components/headers/X-RateLimit-Burst"
              },
              "X-Request-Cost": {
                "$ref": "#/components/headers/X-Request-Cost"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        }
      }
    },
    "/v1/screen": {
      "get": {
        "operationId": "getScreen",
        "tags": [
          "Screener"
        ],
        "summary": "Screen every covered symbol from a snapshot refreshed every minute: net GEX, distance to zero gamma, walls and the largest node, IV, IV…",
        "description": "Screen every covered symbol from a snapshot refreshed every minute: net GEX, distance to zero gamma, walls and the largest node, IV, IV rank, skew (wings failing the sanity check read null), term slope, session premium and quantedFlow premium. What changed: net GEX vs the open (first capture at or after 09:30 ET) and vs the previous close in dollars and %, whether spot crossed the zero-gamma flip since the open, wall moves since the open and the previous close’s walls. Realized vol (rv10, rv20 from session closes: our /history closes, else the daily IV history’s; rv_source says which) and iv_rv_spread (iv30 − rv20). Gamma by expiry: front, within 7 days (net_gex_week), later, and the front expiry’s share. Front expiry and open interest: max_pain_front and max_pain_dist_pct, pin_score (0–100), oi_chg_total and oi_chg_pct (open interest vs the previous close).",
        "parameters": [
          {
            "name": "filter",
            "in": "query",
            "required": false,
            "description": "Comma-separated conditions, e.g. \"iv_rank>=80,net_gex<0,sector=tech\" or \"flip_crossed_today=above_to_below,iv_rv_spread>0.05\". Operators >= <= > < = !=; every numeric field is filterable. String fields take = or !=: sector, type, regime, spot_vs_flip, spot_vs_flip_open (above | below), flip_crossed_today (above_to_below | below_to_above | none), rv_source (history | ivhistory | mixed).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "description": "Field to rank by (default net_gex), e.g. net_gex_chg_open, net_gex_chg_prev_pct, rv20, iv_rv_spread, gex_0dte_share. /v1/screen?describe=true lists every field and its definition.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "order",
            "in": "query",
            "required": false,
            "description": "\"desc\" (default) or \"asc\".",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "1–500, default 50.",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "date",
            "in": "query",
            "required": false,
            "description": "A past session (or today with timestamp): the screen as stored then. Stored on the hour 10:00–15:00 ET and at the 16:00 close; without timestamp a past date is its close. The body’s as_of names the stored snapshot. Default: the live screen.",
            "schema": {
              "type": "string",
              "format": "date",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "timestamp",
            "in": "query",
            "required": false,
            "description": "With date (default: today): the latest stored snapshot at or before this minute (ET). Alias: minute. None stored then: 404 with the times stored that day.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{2}:\\d{2}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer (JSON). Field definitions: the API reference and the MCP resource quantedoptions://docs/fields.",
            "headers": {
              "X-Quota-Limit": {
                "$ref": "#/components/headers/X-Quota-Limit"
              },
              "X-Quota-Remaining": {
                "$ref": "#/components/headers/X-Quota-Remaining"
              },
              "X-Quota-Reset": {
                "$ref": "#/components/headers/X-Quota-Reset"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Burst": {
                "$ref": "#/components/headers/X-RateLimit-Burst"
              },
              "X-Request-Cost": {
                "$ref": "#/components/headers/X-Request-Cost"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        }
      }
    },
    "/v1/screen/sectors": {
      "get": {
        "operationId": "getScreenSectors",
        "tags": [
          "Screener"
        ],
        "summary": "The same snapshot summarised by sector (ETFs and indexes as their own buckets): names, total and median net GEX, share of names in negative…",
        "description": "The same snapshot summarised by sector (ETFs and indexes as their own buckets): names, total and median net GEX, share of names in negative gamma, median IV rank, median iv_rv_spread, session call / put premium and quantedFlow premium. Sorted by total net GEX; describe=true lists the fields.",
        "parameters": [
          {
            "name": "date",
            "in": "query",
            "required": false,
            "description": "A past session (or today with timestamp): the screen as stored then. Stored on the hour 10:00–15:00 ET and at the 16:00 close; without timestamp a past date is its close. The body’s as_of names the stored snapshot. Default: the live screen.",
            "schema": {
              "type": "string",
              "format": "date",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "timestamp",
            "in": "query",
            "required": false,
            "description": "With date (default: today): the latest stored snapshot at or before this minute (ET). Alias: minute. None stored then: 404 with the times stored that day.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{2}:\\d{2}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer (JSON). Field definitions: the API reference and the MCP resource quantedoptions://docs/fields.",
            "headers": {
              "X-Quota-Limit": {
                "$ref": "#/components/headers/X-Quota-Limit"
              },
              "X-Quota-Remaining": {
                "$ref": "#/components/headers/X-Quota-Remaining"
              },
              "X-Quota-Reset": {
                "$ref": "#/components/headers/X-Quota-Reset"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Burst": {
                "$ref": "#/components/headers/X-RateLimit-Burst"
              },
              "X-Request-Cost": {
                "$ref": "#/components/headers/X-Request-Cost"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        }
      }
    },
    "/v1/ticker/{symbol}/term-structure": {
      "get": {
        "operationId": "getTickerSymbolTermStructure",
        "tags": [
          "Volatility"
        ],
        "summary": "Per expiry: ATM IV, the 1-sigma expected move and range, and the 25-delta risk reversal, skew and butterfly; the shape (iv7 vs iv30); wings…",
        "description": "Per expiry: ATM IV, the 1-sigma expected move and range, and the 25-delta risk reversal, skew and butterfly; the shape (iv7 vs iv30); wings dropped by the sanity check are listed in dropped_wings.",
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Ticker, e.g. NVDA, SPY, SPX. See /v1/ticker/universe.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "date",
            "in": "query",
            "required": false,
            "description": "Session date (ET). Default: the current or most recent session. Every session from 2026-06-12 on, minute by minute (with minute / timestamp); without a minute a past date returns that session’s close (its last capture of the 16:00 minute).",
            "schema": {
              "type": "string",
              "format": "date",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "minute",
            "in": "query",
            "required": false,
            "description": "A single minute (ET), for today or any session since 2026-06-12. Default: the latest minute: the newest published capture of the 16:00 minute or earlier (a few seconds after each minute, at most 5 minutes behind; after the close, 16:00). A minute that was not captured answers 404 with the nearest minutes; a past minute costs one request like any other.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{2}:\\d{2}$"
            }
          },
          {
            "name": "max_expiries",
            "in": "query",
            "required": false,
            "description": "6, 12, 24 (default) or 60.",
            "schema": {
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer (JSON). Field definitions: the API reference and the MCP resource quantedoptions://docs/fields.",
            "headers": {
              "X-Quota-Limit": {
                "$ref": "#/components/headers/X-Quota-Limit"
              },
              "X-Quota-Remaining": {
                "$ref": "#/components/headers/X-Quota-Remaining"
              },
              "X-Quota-Reset": {
                "$ref": "#/components/headers/X-Quota-Reset"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Burst": {
                "$ref": "#/components/headers/X-RateLimit-Burst"
              },
              "X-Request-Cost": {
                "$ref": "#/components/headers/X-Request-Cost"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        }
      }
    },
    "/v1/ticker/{symbol}/history": {
      "get": {
        "operationId": "getTickerSymbolHistory",
        "tags": [
          "History"
        ],
        "summary": "One row per session (its last capture at or before 16:00 ET; market holidays are not sessions): spot, net GEX and DEX, zero gamma, walls…",
        "description": "One row per session (its last capture at or before 16:00 ET; market holidays are not sessions): spot, net GEX and DEX, zero gamma, walls, largest node, IV30, skew, IV rank and premium by side (walls as in /levels: largest positive / most negative net GEX strike). zero_gamma starts 2026-09-08 (earlier captures carry no per-contract IV); before that IV30, skew and IV rank come from the daily IV history. When the last row is today’s session still in progress, \"partial\" names its date (else null).",
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Ticker, e.g. NVDA, SPY, SPX. See /v1/ticker/universe.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "start",
            "in": "query",
            "required": false,
            "description": "First session.",
            "schema": {
              "type": "string",
              "format": "date",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "end",
            "in": "query",
            "required": false,
            "description": "Last session (start after end is a 400).",
            "schema": {
              "type": "string",
              "format": "date",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "1–120 sessions, default 20. Counts one request per 10 sessions returned (rounded up).",
            "schema": {
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer (JSON). Field definitions: the API reference and the MCP resource quantedoptions://docs/fields.",
            "headers": {
              "X-Quota-Limit": {
                "$ref": "#/components/headers/X-Quota-Limit"
              },
              "X-Quota-Remaining": {
                "$ref": "#/components/headers/X-Quota-Remaining"
              },
              "X-Quota-Reset": {
                "$ref": "#/components/headers/X-Quota-Reset"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Burst": {
                "$ref": "#/components/headers/X-RateLimit-Burst"
              },
              "X-Request-Cost": {
                "$ref": "#/components/headers/X-Request-Cost"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        }
      }
    },
    "/v1/ticker/bulk": {
      "get": {
        "operationId": "getTickerBulk",
        "tags": [
          "Bulk"
        ],
        "summary": "Levels, exposures, vol, flow or quantedFlow signals for up to 50 symbols in one call, with a result or an error per symbol",
        "description": "Levels, exposures, vol, flow or quantedFlow signals for up to 50 symbols in one call, with a result or an error per symbol. Counts as one request per symbol.",
        "parameters": [
          {
            "name": "resource",
            "in": "query",
            "required": true,
            "description": "\"levels\", \"exposures\", \"vol\", \"flow\" or \"signals\".",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "symbols",
            "in": "query",
            "required": true,
            "description": "Up to 50 comma-separated tickers.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "date",
            "in": "query",
            "required": false,
            "description": "Session date (ET). Default: the current or most recent session. Every session from 2026-06-12 on, minute by minute (with minute / timestamp); without a minute a past date returns that session’s close (its last capture of the 16:00 minute).",
            "schema": {
              "type": "string",
              "format": "date",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "expiry",
            "in": "query",
            "required": false,
            "description": "\"all\" (default), \"0dte\" (alias \"front\"), \"allx0\" (all but the front expiry) or an expiry date YYYY-MM-DD listed for that symbol and minute. \"0dte\" / \"front\" is the front expiry: the nearest listed expiry on or after the session date, so it is a true 0DTE only for names with a daily expiry (SPX, SPY, QQQ, IWM); /levels names it in front_expiry. Named books are case-insensitive; anything else is a 400, an unlisted date a 404 with the listed ones.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "metric",
            "in": "query",
            "required": false,
            "description": "exposures: \"gex\" (default), \"dex\", \"vex\" or \"cex\".",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "band",
            "in": "query",
            "required": false,
            "description": "exposures: 0.02, 0.05, 0.1 (default) or 0.2.",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "window",
            "in": "query",
            "required": false,
            "description": "flow: 5, 15 (default), 30 or 60.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "signals: 10 (default), 25, 50, 100 or 200.",
            "schema": {
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer (JSON). Field definitions: the API reference and the MCP resource quantedoptions://docs/fields.",
            "headers": {
              "X-Quota-Limit": {
                "$ref": "#/components/headers/X-Quota-Limit"
              },
              "X-Quota-Remaining": {
                "$ref": "#/components/headers/X-Quota-Remaining"
              },
              "X-Quota-Reset": {
                "$ref": "#/components/headers/X-Quota-Reset"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Burst": {
                "$ref": "#/components/headers/X-RateLimit-Burst"
              },
              "X-Request-Cost": {
                "$ref": "#/components/headers/X-Request-Cost"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        }
      }
    },
    "/v1/ticker/search": {
      "get": {
        "operationId": "getTickerSearch",
        "tags": [
          "Reference"
        ],
        "summary": "Find covered symbols by ticker, company name or sector; each match has symbol, name, sector, sector_label and type",
        "description": "Find covered symbols by ticker, company name or sector; each match has symbol, name, sector, sector_label and type.",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": false,
            "description": "Ticker or name.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sector",
            "in": "query",
            "required": false,
            "description": "Sector slug or name.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer (JSON). Field definitions: the API reference and the MCP resource quantedoptions://docs/fields.",
            "headers": {
              "X-Quota-Limit": {
                "$ref": "#/components/headers/X-Quota-Limit"
              },
              "X-Quota-Remaining": {
                "$ref": "#/components/headers/X-Quota-Remaining"
              },
              "X-Quota-Reset": {
                "$ref": "#/components/headers/X-Quota-Reset"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Burst": {
                "$ref": "#/components/headers/X-RateLimit-Burst"
              },
              "X-Request-Cost": {
                "$ref": "#/components/headers/X-Request-Cost"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        }
      }
    },
    "/v1/ticker/universe": {
      "get": {
        "operationId": "getTickerUniverse",
        "tags": [
          "Reference"
        ],
        "summary": "Every covered symbol (5,000+ US stocks & ETFs); with detail=true, its name, type (stock, adr, etf, etn, fund or index; null when unknown)…",
        "description": "Every covered symbol (5,000+ US stocks & ETFs); with detail=true, its name, type (stock, adr, etf, etn, fund or index; null when unknown), sector, first available date and latest capture.",
        "parameters": [
          {
            "name": "detail",
            "in": "query",
            "required": false,
            "description": "true adds name, type, sector, first and latest capture per symbol.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer (JSON). Field definitions: the API reference and the MCP resource quantedoptions://docs/fields.",
            "headers": {
              "X-Quota-Limit": {
                "$ref": "#/components/headers/X-Quota-Limit"
              },
              "X-Quota-Remaining": {
                "$ref": "#/components/headers/X-Quota-Remaining"
              },
              "X-Quota-Reset": {
                "$ref": "#/components/headers/X-Quota-Reset"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Burst": {
                "$ref": "#/components/headers/X-RateLimit-Burst"
              },
              "X-Request-Cost": {
                "$ref": "#/components/headers/X-Request-Cost"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        }
      }
    },
    "/v1/status": {
      "get": {
        "operationId": "getStatus",
        "tags": [
          "Reference"
        ],
        "summary": "Service status, read from the reference symbol SPY: the latest session, its last published minute, lag and the history stored",
        "description": "Service status, read from the reference symbol SPY: the latest session, its last published minute, lag and the history stored. Your remaining quota is in every response's X-Quota-Remaining header.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "The answer (JSON). Field definitions: the API reference and the MCP resource quantedoptions://docs/fields.",
            "headers": {
              "X-Quota-Limit": {
                "$ref": "#/components/headers/X-Quota-Limit"
              },
              "X-Quota-Remaining": {
                "$ref": "#/components/headers/X-Quota-Remaining"
              },
              "X-Quota-Reset": {
                "$ref": "#/components/headers/X-Quota-Reset"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Burst": {
                "$ref": "#/components/headers/X-RateLimit-Burst"
              },
              "X-Request-Cost": {
                "$ref": "#/components/headers/X-Request-Cost"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        }
      }
    },
    "/v1/ticker/status": {
      "get": {
        "operationId": "getTickerStatus",
        "tags": [
          "Reference"
        ],
        "summary": "The same service status (reference SPY), plus when the screener snapshot was last built",
        "description": "The same service status (reference SPY), plus when the screener snapshot was last built. For one symbol’s freshness use /v1/ticker/{symbol}/status.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "The answer (JSON). Field definitions: the API reference and the MCP resource quantedoptions://docs/fields.",
            "headers": {
              "X-Quota-Limit": {
                "$ref": "#/components/headers/X-Quota-Limit"
              },
              "X-Quota-Remaining": {
                "$ref": "#/components/headers/X-Quota-Remaining"
              },
              "X-Quota-Reset": {
                "$ref": "#/components/headers/X-Quota-Reset"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Burst": {
                "$ref": "#/components/headers/X-RateLimit-Burst"
              },
              "X-Request-Cost": {
                "$ref": "#/components/headers/X-Request-Cost"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        }
      }
    },
    "/v1/ticker/{symbol}/status": {
      "get": {
        "operationId": "getTickerSymbolStatus",
        "tags": [
          "Reference"
        ],
        "summary": "One symbol’s freshness: its latest session, last published minute, lag in minutes and the sessions stored",
        "description": "One symbol’s freshness: its latest session, last published minute, lag in minutes and the sessions stored.",
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Ticker, e.g. NVDA, SPY, SPX. See /v1/ticker/universe.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The answer (JSON). Field definitions: the API reference and the MCP resource quantedoptions://docs/fields.",
            "headers": {
              "X-Quota-Limit": {
                "$ref": "#/components/headers/X-Quota-Limit"
              },
              "X-Quota-Remaining": {
                "$ref": "#/components/headers/X-Quota-Remaining"
              },
              "X-Quota-Reset": {
                "$ref": "#/components/headers/X-Quota-Reset"
              },
              "X-RateLimit-Limit": {
                "$ref": "#/components/headers/X-RateLimit-Limit"
              },
              "X-RateLimit-Burst": {
                "$ref": "#/components/headers/X-RateLimit-Burst"
              },
              "X-Request-Cost": {
                "$ref": "#/components/headers/X-Request-Cost"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "ApiKeyHeader": {
        "type": "apiKey",
        "in": "header",
        "name": "X-API-Key",
        "description": "Your quantedTrader API key (qo_tk_…). Never sent in the URL."
      },
      "BearerKey": {
        "type": "http",
        "scheme": "bearer",
        "description": "The same key as Authorization: Bearer qo_tk_…."
      }
    },
    "schemas": {
      "Error": {
        "type": "object",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "string",
            "description": "What went wrong, in one sentence."
          }
        },
        "additionalProperties": true
      }
    },
    "headers": {
      "X-Quota-Limit": {
        "description": "Requests per day for this account.",
        "schema": {
          "type": "integer"
        }
      },
      "X-Quota-Remaining": {
        "description": "Requests left today (UTC day).",
        "schema": {
          "type": "integer"
        }
      },
      "X-Quota-Reset": {
        "description": "When the quota resets (00:00 UTC), ISO 8601.",
        "schema": {
          "type": "string"
        }
      },
      "X-RateLimit-Limit": {
        "description": "Requests per second, sustained.",
        "schema": {
          "type": "number"
        }
      },
      "X-RateLimit-Burst": {
        "description": "Burst size.",
        "schema": {
          "type": "number"
        }
      },
      "X-Request-Cost": {
        "description": "Requests this call counted (bulk: one per symbol; history: one per 10 sessions).",
        "schema": {
          "type": "integer"
        }
      },
      "Retry-After": {
        "description": "Seconds to wait before retrying.",
        "schema": {
          "type": "integer"
        }
      }
    },
    "responses": {
      "BadRequest": {
        "description": "A missing, mistyped or out-of-range parameter; the body names it and the allowed values.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "Unauthorized": {
        "description": "Missing, unknown or revoked key (api_key_required, invalid_key, key_revoked).",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "Forbidden": {
        "description": "No active plan (not_entitled) or a key of the wrong type (wrong_key_type).",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "NotFound": {
        "description": "Unknown endpoint or symbol, or a session / minute that was not captured (with the nearest ones).",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "TooManyRequests": {
        "description": "rate_limited, daily_quota_exceeded, too_many_locations or too_many_failed_auths.",
        "headers": {
          "Retry-After": {
            "$ref": "#/components/headers/Retry-After"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "Unavailable": {
        "description": "A minute still being built or storage briefly unreachable.",
        "headers": {
          "Retry-After": {
            "$ref": "#/components/headers/Retry-After"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      }
    }
  },
  "x-mcp": {
    "url": "https://api.quantedoptions.com/v1/mcp",
    "transport": "streamable-http",
    "tools": [
      "get_levels",
      "get_0dte",
      "get_hedge_flow",
      "get_exposure_by_expiry",
      "get_oi_changes",
      "get_exposure_profile",
      "get_vol_snapshot",
      "get_flow",
      "get_session_story",
      "compare_symbols",
      "scan_universe",
      "get_sector_summary",
      "get_history",
      "find_symbols",
      "get_quantedflow",
      "get_flow_signals",
      "get_flow_premium",
      "get_term_structure",
      "get_bulk_snapshot",
      "get_vol_surface",
      "get_account"
    ],
    "resources": [
      "quantedoptions://docs/fields",
      "quantedoptions://docs/methodology",
      "quantedoptions://docs/limits",
      "quantedoptions://coverage"
    ]
  }
}
