{
 "openapi": "3.1.0",
 "info": {
  "title": "FirmTape levels API",
  "version": "1.0.0",
  "description": "The volume book's zero-gamma flip, call wall, put wall and net gamma for SPX, the ES, NQ and RTY futures and every ticker FirmTape measures, as JSON for chart plugins and scripts. While the session runs, the newest reading; a finished day answers with its closing levels, read at the levels minute (15:45 ET, 12:45 on a 13:00 close). Part of the LIVE plan."
 },
 "servers": [
  {
   "url": "https://firmtape.com"
  }
 ],
 "security": [
  {
   "bearer": []
  },
  {
   "queryKey": []
  }
 ],
 "x-product": "live",
 "x-features": [
  "levels-api",
  "integrations",
  "walls-and-levels",
  "futures-views"
 ],
 "components": {
  "securitySchemes": {
   "bearer": {
    "type": "http",
    "scheme": "bearer",
    "description": "An API key with the `live` scope (`ftpl_...`), made on Account, Integrations. A `lab` key (`labk_...`) also works."
   },
   "queryKey": {
    "type": "apiKey",
    "in": "query",
    "name": "key",
    "description": "Legacy: the same key in the address, for platforms that cannot send headers."
   }
  },
  "schemas": {
   "Error": {
    "type": "object",
    "required": [
     "error"
    ],
    "properties": {
     "error": {
      "type": "object",
      "required": [
       "code",
       "message"
      ],
      "properties": {
       "code": {
        "type": "string",
        "description": "A stable code from the error catalog."
       },
       "message": {
        "type": "string",
        "description": "What happened, in words."
       },
       "pricing": {
        "type": "string",
        "description": "Where to start the plan the call needs."
       },
       "retry_after_s": {
        "type": "integer",
        "description": "With `rate_limited`: seconds to wait."
       },
       "oldest": {
        "type": "string",
        "description": "With `history_too_old`: the oldest day the key may ask for."
       },
       "live": {
        "type": "array",
        "items": {
         "type": "string"
        },
        "description": "With `contract_not_live`: the contracts measured that day."
       }
      }
     }
    }
   },
   "Level": {
    "type": "object",
    "required": [
     "sym"
    ],
    "properties": {
     "sym": {
      "type": "string",
      "description": "The symbol answered: SPX, ES, NQ, RTY or a ticker. A micro (MES, MNQ, M2K) answers as its future."
     },
     "requested": {
      "type": "string",
      "description": "Present when the symbol asked differs from `sym` (`MES` answered as `ES`)."
     },
     "name": {
      "type": "string",
      "description": "The symbol's name."
     },
     "class": {
      "type": "string",
      "description": "`index`, `future`, `etf` or `stock`."
     },
     "contract": {
      "type": "string",
      "description": "Futures: the contract the levels are moved to, e.g. `ESZ26`."
     },
     "session": {
      "type": "string",
      "description": "`open` while the book is current, `closed` outside market hours, `stale` when market hours are on but the book has not moved for a while.",
      "enum": [
       "open",
       "closed",
       "stale"
      ]
     },
     "day": {
      "type": "string",
      "description": "The ET trading day of the reading, `YYYY-MM-DD`."
     },
     "book": {
      "type": "string",
      "description": "Always `volume`: every level is the volume book, the one the terminal draws.",
      "const": "volume"
     },
     "price": {
      "type": [
       "number",
       "null"
      ],
      "description": "The price at the reading.",
      "x-unit": "index points"
     },
     "price_as_of": {
      "type": "string",
      "description": "When that price was taken, ISO 8601 in New York time."
     },
     "flip": {
      "type": [
       "number",
       "null"
      ],
      "description": "Zero-gamma flip of the volume book. On a finished day, read at the levels minute (`levels_at`).",
      "x-unit": "index points"
     },
     "call_wall": {
      "type": [
       "number",
       "null"
      ],
      "description": "Call wall: the strike with the largest call gamma. On a finished day, read at the levels minute.",
      "x-unit": "index points"
     },
     "put_wall": {
      "type": [
       "number",
       "null"
      ],
      "description": "Put wall: the strike with the largest put gamma. On a finished day, read at the levels minute.",
      "x-unit": "index points"
     },
     "net_gamma": {
      "type": "object",
      "description": "Net dealer gamma of the book: its value, its sign and its unit, named on every answer.",
      "properties": {
       "value": {
        "type": [
         "number",
         "null"
        ],
        "description": "Net dealer gamma, in `unit`."
       },
       "sign": {
        "type": [
         "string",
         "null"
        ],
        "enum": [
         "positive",
         "negative",
         null
        ],
        "description": "The sign of `value`."
       },
       "unit": {
        "type": "string",
        "description": "`usd_m_per_point` (millions of USD per index point: SPX, ES) or `usd_per_1pct` (USD per 1% move: tickers, NQ, RTY).",
        "enum": [
         "usd_m_per_point",
         "usd_per_1pct"
        ]
       }
      }
     },
     "at_flip": {
      "type": "boolean",
      "description": "SPX and ES: the price is within 5 points of the flip, where the side is not a reliable reading."
     },
     "dealer_gamma": {
      "type": [
       "string",
       "null"
      ],
      "enum": [
       "long",
       "short",
       null
      ],
      "description": "SPX and ES: the side of net gamma; null at the flip."
     },
     "gamma_pctl": {
      "type": [
       "number",
       "null"
      ],
      "description": "SPX and ES: the volume book's gamma at spot against the same minute of the last 20 sessions, a decile from -11 to +11. A measurement, with no measured forward edge."
     },
     "as_of": {
      "type": "string",
      "description": "When the book was built, ISO 8601 in New York time."
     },
     "as_of_unix": {
      "type": "integer",
      "description": "The same instant, Unix seconds."
     },
     "age_s": {
      "type": "integer",
      "description": "Seconds since the book was built.",
      "x-unit": "seconds"
     },
     "cadence": {
      "type": "object",
      "description": "How often the book and the price are rebuilt.",
      "properties": {
       "book": {
        "type": "string",
        "description": "`1s` (SPX, ES) or `5m` (tickers, NQ, RTY)."
       },
       "price": {
        "type": "string",
        "description": "`1s`."
       }
      }
     },
     "grade": {
      "type": [
       "string",
       "null"
      ],
      "description": "Tickers, NQ, RTY: the chain's trust grade (A best). Null for SPX and ES."
     },
     "flip_status": {
      "type": [
       "string",
       "null"
      ],
      "description": "Tickers: whether the flip was found inside the strike grid."
     },
     "oi": {
      "type": [
       "object",
       "null"
      ],
      "description": "The open-interest book's levels, the same fields; null when the symbol has none.",
      "properties": {
       "flip": {
        "type": [
         "number",
         "null"
        ],
        "description": "Zero-gamma flip of the open-interest book.",
        "x-unit": "index points"
       },
       "call_wall": {
        "type": [
         "number",
         "null"
        ],
        "description": "Call wall of the open-interest book.",
        "x-unit": "index points"
       },
       "put_wall": {
        "type": [
         "number",
         "null"
        ],
        "description": "Put wall of the open-interest book.",
        "x-unit": "index points"
       },
       "net_gamma": {
        "type": "object",
        "description": "Net dealer gamma of the book: its value, its sign and its unit, named on every answer.",
        "properties": {
         "value": {
          "type": [
           "number",
           "null"
          ],
          "description": "Net dealer gamma, in `unit`."
         },
         "sign": {
          "type": [
           "string",
           "null"
          ],
          "enum": [
           "positive",
           "negative",
           null
          ],
          "description": "The sign of `value`."
         },
         "unit": {
          "type": "string",
          "description": "`usd_m_per_point` (millions of USD per index point: SPX, ES) or `usd_per_1pct` (USD per 1% move: tickers, NQ, RTY).",
          "enum": [
           "usd_m_per_point",
           "usd_per_1pct"
          ]
         }
        }
       },
       "flip_status": {
        "type": [
         "string",
         "null"
        ],
        "description": "Tickers: whether the flip was found inside the strike grid (`ok`) or not."
       }
      }
     },
     "basis": {
      "type": "object",
      "description": "ES, NQ, RTY: the day's basis that moved the index levels.",
      "properties": {
       "value": {
        "type": [
         "number",
         "null"
        ],
        "description": "Future minus index.",
        "x-unit": "index points"
       },
       "index": {
        "type": "string",
        "description": "The index the book is measured on: SPX, NDX or RUT."
       },
       "passes": {
        "type": "integer",
        "description": "Basis passes measured so far today."
       },
       "rule": {
        "type": "string",
        "description": "How the basis is made: the running median of the day's passes, rounded to the future's tick."
       }
      }
     },
     "source": {
      "type": "string",
      "description": "Futures: which index book and which basis."
     },
     "levels_at": {
      "type": "string",
      "description": "A finished day only: the levels minute (ET) `flip`, `call_wall` and `put_wall` were read at. Absent while the session runs.",
      "enum": [
       "15:45",
       "12:45"
      ]
     },
     "last_second": {
      "type": "object",
      "description": "A finished day only: the replaced fields as the session's last second had them.",
      "properties": {
       "flip": {
        "type": [
         "number",
         "null"
        ],
        "description": "Flip at the last second.",
        "x-unit": "index points"
       },
       "call_wall": {
        "type": [
         "number",
         "null"
        ],
        "description": "Call wall at the last second.",
        "x-unit": "index points"
       },
       "put_wall": {
        "type": [
         "number",
         "null"
        ],
        "description": "Put wall at the last second.",
        "x-unit": "index points"
       },
       "at_flip": {
        "type": "boolean",
        "description": "At the flip, at the last second."
       },
       "dealer_gamma": {
        "type": [
         "string",
         "null"
        ],
        "enum": [
         "long",
         "short",
         null
        ],
        "description": "The side, at the last second."
       }
      }
     },
     "next_update_s": {
      "type": "integer",
      "description": "When a new reading is worth asking for: 3 for SPX and ES, up to 300 for a five-minute book, 60 when the session is not open.",
      "x-unit": "seconds"
     },
     "gamma": {
      "type": "object",
      "description": "With `include=gamma`: the symbol's gamma by strike (the fields of `GET /api/v1/gamma`), or an `error`."
     },
     "error": {
      "type": "object",
      "description": "This symbol failed; the others in the call still answer.",
      "properties": {
       "code": {
        "type": "string",
        "description": "`unknown_symbol`, `no_data`, `no_basis` or `contract_not_live`."
       },
       "message": {
        "type": "string",
        "description": "What happened, in words."
       },
       "live": {
        "type": "array",
        "items": {
         "type": "string"
        },
        "description": "With `contract_not_live`: the contracts measured that day."
       }
      }
     }
    }
   }
  }
 },
 "paths": {
  "/api/v1/levels": {
   "get": {
    "x-plan": "live",
    "x-key": "live",
    "x-limit": "120 a minute per key; a 304 is free",
    "operationId": "getLevels",
    "x-slug": "levels",
    "summary": "Get levels",
    "description": "The volume book's flip, call wall, put wall and net gamma for up to 20 symbols in one call, with the open-interest book alongside under `oi`.",
    "x-features": [
     "levels-api",
     "walls-and-levels",
     "futures-views",
     "integrations"
    ],
    "x-since": "2026-09-30",
    "x-changes": [
     [
      "2026-10-11",
      "A finished day answers with its closing levels, read at 15:45 ET; `levels_at` and `last_second` added."
     ],
     [
      "2026-10-11",
      "RTY and M2K."
     ]
    ],
    "parameters": [
     {
      "name": "sym",
      "in": "query",
      "required": true,
      "description": "Comma list, up to 20: `SPX,ES,NQ,QQQ`. MES, MNQ and M2K answer as ES, NQ and RTY; a dated contract (`ESH27`) names that contract.",
      "schema": {
       "type": "string"
      },
      "x-error": "missing_sym, too_many_symbols"
     },
     {
      "name": "include",
      "in": "query",
      "required": false,
      "description": "`gamma` adds each symbol's gamma by strike: one request per chart.",
      "schema": {
       "type": "string",
       "enum": [
        "gamma"
       ]
      }
     },
     {
      "name": "book",
      "in": "query",
      "required": false,
      "description": "With `include=gamma`: which book's strikes.",
      "schema": {
       "type": "string",
       "enum": [
        "vol",
        "oi"
       ],
       "default": "vol"
      },
      "x-error": "bad_book"
     },
     {
      "name": "contract",
      "in": "query",
      "required": false,
      "description": "Futures: a dated contract in the two weeks before a roll, e.g. `ESH27`. The levels move by that contract's own basis.",
      "schema": {
       "type": "string"
      },
      "x-default": "the front quarterly",
      "x-error": "contract_not_live"
     },
     {
      "name": "errors",
      "in": "query",
      "required": false,
      "description": "`200`: an error answers 200 with the same body and the real status in `X-FirmTape-Status`, for clients that cannot read a status.",
      "schema": {
       "type": "string",
       "enum": [
        "200"
       ]
      }
     },
     {
      "name": "key",
      "in": "query",
      "required": false,
      "description": "Legacy: the key in the address, for platforms that cannot send headers. Prefer the header.",
      "schema": {
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "One entry per symbol asked, in order. A symbol that fails carries its own `error`; the rest still answer.",
      "headers": {
       "X-RateLimit-Limit": "120",
       "X-RateLimit-Remaining": "117"
      },
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "required": [
          "book",
          "next_update_s",
          "levels"
         ],
         "properties": {
          "book": {
           "type": "string",
           "description": "Always `volume`.",
           "const": "volume"
          },
          "next_update_s": {
           "type": "integer",
           "description": "The smallest `next_update_s` of the symbols.",
           "x-unit": "seconds"
          },
          "levels": {
           "type": "array",
           "items": {
            "$ref": "#/components/schemas/Level"
           },
           "description": "The readings."
          }
         }
        },
        "example": {
         "book": "volume",
         "next_update_s": 3,
         "levels": [
          {
           "sym": "ES",
           "name": "E-mini S&P 500",
           "class": "future",
           "contract": "ESZ26",
           "session": "open",
           "day": "2026-09-30",
           "book": "volume",
           "price": 6771.5,
           "price_as_of": "2026-09-30T10:15:03-04:00",
           "flip": 6752.25,
           "call_wall": 6800,
           "put_wall": 6700,
           "net_gamma": {
            "value": -812.4,
            "sign": "negative",
            "unit": "usd_m_per_point"
           },
           "at_flip": false,
           "dealer_gamma": "short",
           "gamma_pctl": -4,
           "as_of": "2026-09-30T10:15:03-04:00",
           "as_of_unix": 1790777703,
           "age_s": 1,
           "cadence": {
            "book": "1s",
            "price": "1s"
           },
           "grade": null,
           "oi": {
            "flip": 6731.4,
            "call_wall": 6825,
            "put_wall": 6700,
            "net_gamma": {
             "value": 1234.5,
             "sign": "positive",
             "unit": "usd_m_per_point"
            }
           },
           "basis": {
            "value": 59.5,
            "index": "SPX",
            "passes": 4,
            "rule": "running median of the day's basis passes up to that time, rounded to 0.25"
           },
           "source": "SPX volume book moved by the ES basis",
           "next_update_s": 3
          }
         ]
        }
       }
      }
     },
     "304": {
      "description": "Not modified: the reading behind the `ETag` you sent has not changed. Not counted against the limit."
     },
     "400": {
      "description": "A parameter is wrong.",
      "x-codes": [
       "missing_sym",
       "too_many_symbols",
       "bad_book"
      ],
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "401": {
      "description": "No key, or an unknown or revoked one.",
      "x-codes": [
       "no_key",
       "bad_key"
      ],
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "403": {
      "description": "The account holds no LIVE plan.",
      "x-codes": [
       "live_required"
      ],
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Over the minute's limit, or the key is in use from a fourth address this hour.",
      "x-codes": [
       "rate_limited",
       "too_many_places"
      ],
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/api/v1/gamma": {
   "get": {
    "x-plan": "live",
    "x-key": "live",
    "x-limit": "120 a minute per key; a 304 is free",
    "operationId": "getGamma",
    "x-slug": "gamma",
    "summary": "Gamma by strike",
    "description": "The newest book's dealer gamma strike by strike, for one symbol, in the volume or the open-interest book.",
    "x-features": [
     "levels-api",
     "ladder-columns",
     "integrations"
    ],
    "x-since": "2026-09-30",
    "parameters": [
     {
      "name": "sym",
      "in": "query",
      "required": true,
      "description": "One symbol: SPX, ES, NQ, RTY (or MES, MNQ, M2K), a dated contract such as `ESH27`, or a ticker from `/api/v1/symbols`.",
      "schema": {
       "type": "string"
      },
      "x-error": "missing_sym"
     },
     {
      "name": "book",
      "in": "query",
      "required": false,
      "description": "`vol` or `oi`.",
      "schema": {
       "type": "string",
       "enum": [
        "vol",
        "oi"
       ],
       "default": "vol"
      },
      "x-error": "bad_book"
     },
     {
      "name": "contract",
      "in": "query",
      "required": false,
      "description": "Futures: a dated contract in the two weeks before a roll, e.g. `ESH27`. The levels move by that contract's own basis.",
      "schema": {
       "type": "string"
      },
      "x-default": "the front quarterly",
      "x-error": "contract_not_live"
     },
     {
      "name": "errors",
      "in": "query",
      "required": false,
      "description": "`200`: an error answers 200 with the same body and the real status in `X-FirmTape-Status`, for clients that cannot read a status.",
      "schema": {
       "type": "string",
       "enum": [
        "200"
       ]
      }
     },
     {
      "name": "key",
      "in": "query",
      "required": false,
      "description": "Legacy: the key in the address, for platforms that cannot send headers. Prefer the header.",
      "schema": {
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Strikes and gamma, index-aligned.",
      "headers": {
       "X-RateLimit-Limit": "120",
       "X-RateLimit-Remaining": "117"
      },
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "required": [
          "sym",
          "book",
          "strikes",
          "gamma",
          "unit"
         ],
         "properties": {
          "sym": {
           "type": "string",
           "description": "The symbol answered."
          },
          "name": {
           "type": "string",
           "description": "Futures: the future's name."
          },
          "book": {
           "type": "string",
           "description": "`volume` or `open_interest`.",
           "enum": [
            "volume",
            "open_interest"
           ]
          },
          "session": {
           "type": "string",
           "description": "`open`, `closed` or `stale`.",
           "enum": [
            "open",
            "closed",
            "stale"
           ]
          },
          "as_of": {
           "type": "string",
           "description": "When the book was built, ISO 8601 in New York time."
          },
          "as_of_unix": {
           "type": "integer",
           "description": "The same instant, Unix seconds."
          },
          "age_s": {
           "type": "integer",
           "description": "Seconds since the book was built.",
           "x-unit": "seconds"
          },
          "day": {
           "type": "string",
           "description": "The ET trading day."
          },
          "unit": {
           "type": "string",
           "description": "`usd_m_per_point` or `usd_per_1pct`."
          },
          "unit_text": {
           "type": "string",
           "description": "The unit in words."
          },
          "strike_step": {
           "type": [
            "number",
            "null"
           ],
           "description": "The usual distance between strikes.",
           "x-unit": "index points"
          },
          "strikes": {
           "type": "array",
           "items": {
            "type": "number"
           },
           "description": "The strikes, rising.",
           "x-unit": "index points"
          },
          "gamma": {
           "type": "array",
           "items": {
            "type": [
             "number",
             "null"
            ]
           },
           "description": "Dealer gamma at each strike, in `unit`."
          },
          "contract": {
           "type": [
            "string",
            "null"
           ],
           "description": "Futures: the contract."
          },
          "basis": {
           "type": "object",
           "description": "Futures: the basis that moved the strikes.",
           "properties": {
            "value": {
             "type": [
              "number",
              "null"
             ],
             "description": "Future minus index.",
             "x-unit": "index points"
            },
            "index": {
             "type": "string",
             "description": "The index."
            },
            "rule": {
             "type": "string",
             "description": "How the basis is made."
            },
            "note": {
             "type": "string",
             "description": "The strikes in words."
            }
           }
          }
         }
        },
        "example": {
         "sym": "SPX",
         "book": "volume",
         "session": "open",
         "as_of": "2026-09-30T14:00:00-04:00",
         "as_of_unix": 1790791200,
         "age_s": 5,
         "day": "2026-09-30",
         "unit": "usd_m_per_point",
         "unit_text": "millions of USD of dealer gamma per 1 index point",
         "strike_step": 5,
         "strikes": [
          6700,
          6705,
          6710
         ],
         "gamma": [
          -5.5,
          1.25,
          9.75
         ]
        }
       }
      }
     },
     "304": {
      "description": "Not modified. Not counted."
     },
     "400": {
      "description": "A parameter is wrong.",
      "x-codes": [
       "missing_sym",
       "bad_book"
      ],
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "401": {
      "description": "No key, or an unknown or revoked one.",
      "x-codes": [
       "no_key",
       "bad_key"
      ],
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "403": {
      "description": "No LIVE plan.",
      "x-codes": [
       "live_required"
      ],
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "No such symbol, or no book yet.",
      "x-codes": [
       "unknown_symbol",
       "no_data",
       "no_basis",
       "contract_not_live"
      ],
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Over a limit.",
      "x-codes": [
       "rate_limited",
       "too_many_places"
      ],
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/api/v1/history": {
   "get": {
    "x-plan": "live",
    "x-key": "live",
    "x-limit": "120 a minute per key; the last 90 days, older with DATASET",
    "operationId": "getHistory",
    "x-slug": "history",
    "summary": "Level history of a day",
    "description": "One day's price, flip, call wall, put wall and net gamma as columns and rows: SPX and ES one row per 10 seconds, tickers, NQ and RTY one per five-minute book.",
    "x-features": [
     "levels-api",
     "deep-history"
    ],
    "x-since": "2026-09-30",
    "x-changes": [
     [
      "2026-10-05",
      "The last 90 days for an account key; older days answer `history_too_old` unless the account holds DATASET."
     ]
    ],
    "parameters": [
     {
      "name": "sym",
      "in": "query",
      "required": true,
      "description": "One symbol: SPX, ES, NQ, RTY (or MES, MNQ, M2K), a dated contract such as `ESH27`, or a ticker from `/api/v1/symbols`.",
      "schema": {
       "type": "string"
      },
      "x-error": "missing_sym"
     },
     {
      "name": "day",
      "in": "query",
      "required": false,
      "description": "`YYYY-MM-DD`, within the last 90 days; older with the DATASET licence.",
      "schema": {
       "type": "string",
       "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
      },
      "x-default": "the running or most recent session",
      "x-error": "bad_day, history_too_old"
     },
     {
      "name": "contract",
      "in": "query",
      "required": false,
      "description": "Futures: a dated contract in the two weeks before a roll, e.g. `ESH27`. The levels move by that contract's own basis.",
      "schema": {
       "type": "string"
      },
      "x-default": "the front quarterly",
      "x-error": "contract_not_live"
     },
     {
      "name": "errors",
      "in": "query",
      "required": false,
      "description": "`200`: an error answers 200 with the same body and the real status in `X-FirmTape-Status`, for clients that cannot read a status.",
      "schema": {
       "type": "string",
       "enum": [
        "200"
       ]
      }
     },
     {
      "name": "key",
      "in": "query",
      "required": false,
      "description": "Legacy: the key in the address, for platforms that cannot send headers. Prefer the header.",
      "schema": {
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Columns and rows.",
      "headers": {
       "X-RateLimit-Limit": "120",
       "X-RateLimit-Remaining": "117"
      },
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "required": [
          "sym",
          "day",
          "columns",
          "rows"
         ],
         "properties": {
          "sym": {
           "type": "string",
           "description": "The symbol."
          },
          "day": {
           "type": "string",
           "description": "The ET trading day."
          },
          "book": {
           "type": "string",
           "description": "Always `volume`.",
           "const": "volume"
          },
          "step": {
           "type": "string",
           "description": "`10s` or `5m`.",
           "enum": [
            "10s",
            "5m"
           ]
          },
          "unit": {
           "type": "string",
           "description": "Net gamma's unit."
          },
          "unit_text": {
           "type": "string",
           "description": "The unit in words."
          },
          "columns": {
           "type": "array",
           "items": {
            "type": "string"
           },
           "description": "`t`, `price`, `flip`, `call_wall`, `put_wall`, `net_gamma`."
          },
          "rows": {
           "type": "array",
           "items": {
            "type": "array"
           },
           "description": "One row per step: the ET time, then the columns' values (index points; net gamma in `unit`)."
          },
          "contract": {
           "type": [
            "string",
            "null"
           ],
           "description": "Futures: the contract."
          },
          "basis": {
           "type": "object",
           "description": "Futures: the basis as it stood at each row.",
           "properties": {
            "index": {
             "type": "string",
             "description": "The index."
            },
            "rule": {
             "type": "string",
             "description": "How the basis is made."
            },
            "first": {
             "type": [
              "number",
              "null"
             ],
             "description": "Basis at the first row.",
             "x-unit": "index points"
            },
            "last": {
             "type": [
              "number",
              "null"
             ],
             "description": "Basis at the last row.",
             "x-unit": "index points"
            },
            "note": {
             "type": "string",
             "description": "In words."
            }
           }
          }
         }
        },
        "example": {
         "sym": "SPX",
         "day": "2026-09-30",
         "book": "volume",
         "step": "10s",
         "unit": "usd_m_per_point",
         "unit_text": "millions of USD of dealer gamma per 1 index point",
         "columns": [
          "t",
          "price",
          "flip",
          "call_wall",
          "put_wall",
          "net_gamma"
         ],
         "rows": [
          [
           "09:30:09",
           6712.4,
           6692,
           6742,
           6662,
           -812.4
          ],
          [
           "09:30:19",
           6713.1,
           6692,
           6742,
           6662,
           -790.2
          ]
         ]
        }
       }
      }
     },
     "304": {
      "description": "Not modified. Not counted."
     },
     "400": {
      "description": "A parameter is wrong.",
      "x-codes": [
       "missing_sym",
       "bad_day"
      ],
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "401": {
      "description": "No key, or an unknown or revoked one.",
      "x-codes": [
       "no_key",
       "bad_key"
      ],
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "403": {
      "description": "No LIVE plan, or a day older than 90 days without DATASET.",
      "x-codes": [
       "live_required",
       "history_too_old"
      ],
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "No such symbol, or no series for that day.",
      "x-codes": [
       "unknown_symbol",
       "no_data",
       "no_basis",
       "contract_not_live"
      ],
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Over a limit.",
      "x-codes": [
       "rate_limited",
       "too_many_places"
      ],
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/api/v1/symbols": {
   "get": {
    "operationId": "listSymbols",
    "x-slug": "symbols",
    "summary": "Every symbol",
    "security": [],
    "x-plan": "replay",
    "x-key": "none",
    "x-limit": "120 a minute per address",
    "description": "Every symbol the levels API answers for: class, cadence, whether it has an open-interest book, the unit and the trust grade. No key needed.",
    "x-features": [
     "levels-api",
     "symbols-on-the-site"
    ],
    "x-since": "2026-09-30",
    "responses": {
     "200": {
      "description": "The list.",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "required": [
          "count",
          "symbols"
         ],
         "properties": {
          "count": {
           "type": "integer",
           "description": "How many symbols."
          },
          "book": {
           "type": "string",
           "description": "Always `volume`.",
           "const": "volume"
          },
          "symbols": {
           "type": "array",
           "description": "One entry per symbol.",
           "items": {
            "type": "object",
            "required": [
             "sym"
            ],
            "properties": {
             "sym": {
              "type": "string",
              "description": "The symbol."
             },
             "aliases": {
              "type": "array",
              "items": {
               "type": "string"
              },
              "description": "Futures: the micro that answers as it."
             },
             "name": {
              "type": "string",
              "description": "Its name."
             },
             "class": {
              "type": "string",
              "description": "`index`, `future`, `etf` or `stock`."
             },
             "cadence": {
              "type": "object",
              "description": "How often its book and price are rebuilt.",
              "properties": {
               "book": {
                "type": "string",
                "description": "`1s` or `5m`."
               },
               "price": {
                "type": "string",
                "description": "`1s`."
               }
              }
             },
             "has_oi": {
              "type": "boolean",
              "description": "Whether it has an open-interest book."
             },
             "grade": {
              "type": [
               "string",
               "null"
              ],
              "description": "The chain's trust grade."
             },
             "unit": {
              "type": "string",
              "description": "Net gamma's unit."
             },
             "source": {
              "type": "string",
              "description": "Where its book comes from."
             }
            }
           }
          }
         }
        },
        "example": {
         "count": 2,
         "book": "volume",
         "symbols": [
          {
           "sym": "SPX",
           "name": "S&P 500 Index",
           "class": "index",
           "cadence": {
            "book": "1s",
            "price": "1s"
           },
           "has_oi": true,
           "grade": null,
           "unit": "usd_m_per_point",
           "source": "FirmTape SPX engine, from the full options tape"
          },
          {
           "sym": "QQQ",
           "name": "Invesco QQQ Trust",
           "class": "etf",
           "cadence": {
            "book": "5m",
            "price": "1s"
           },
           "has_oi": true,
           "grade": "A",
           "unit": "usd_per_1pct"
          }
         ]
        }
       }
      }
     }
    }
   }
  },
  "/api/v1/expected_move": {
   "get": {
    "x-plan": "live",
    "x-key": "live",
    "x-limit": "120 a minute per key; a 304 is free",
    "operationId": "getExpectedMove",
    "x-slug": "expected-move",
    "summary": "Expected move and close odds",
    "description": "SPX's expected move left to the close (twice the ATM straddle) and the 0DTE chain's own odds for the close, as READOUTS shows them; with `day`, the same at a minute of a finished session against what the close did.",
    "x-features": [
     "expected-move",
     "readouts",
     "levels-api"
    ],
    "x-since": "2026-10-03",
    "parameters": [
     {
      "name": "sym",
      "in": "query",
      "required": false,
      "description": "SPX only.",
      "schema": {
       "type": "string",
       "enum": [
        "SPX"
       ],
       "default": "SPX"
      },
      "x-error": "spx_only"
     },
     {
      "name": "day",
      "in": "query",
      "required": false,
      "description": "A finished session, `YYYY-MM-DD`; leave it out for today.",
      "schema": {
       "type": "string",
       "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
      },
      "x-default": "today",
      "x-error": "bad_day, not_finished"
     },
     {
      "name": "time",
      "in": "query",
      "required": false,
      "description": "With `day`: the ET minute, `HH:MM`, 09:31 to 15:59.",
      "schema": {
       "type": "string",
       "pattern": "^\\d{2}:\\d{2}$"
      },
      "x-default": "10:00",
      "x-error": "bad_time"
     },
     {
      "name": "errors",
      "in": "query",
      "required": false,
      "description": "`200`: an error answers 200 with the same body and the real status in `X-FirmTape-Status`, for clients that cannot read a status.",
      "schema": {
       "type": "string",
       "enum": [
        "200"
       ]
      }
     },
     {
      "name": "key",
      "in": "query",
      "required": false,
      "description": "Legacy: the key in the address, for platforms that cannot send headers. Prefer the header.",
      "schema": {
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "The expected move and the odds; with `day`, the `outcome` too.",
      "headers": {
       "X-RateLimit-Limit": "120",
       "X-RateLimit-Remaining": "117"
      },
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "required": [
          "sym",
          "day",
          "price",
          "levels"
         ],
         "properties": {
          "sym": {
           "type": "string",
           "description": "`SPX`.",
           "const": "SPX"
          },
          "day": {
           "type": "string",
           "description": "The ET trading day."
          },
          "session": {
           "type": "string",
           "description": "`open`, `closed` or `stale`."
          },
          "as_of": {
           "type": "string",
           "description": "The reading's time, ISO 8601 in New York time."
          },
          "as_of_unix": {
           "type": "integer",
           "description": "The same, Unix seconds."
          },
          "age_s": {
           "type": "integer",
           "description": "Seconds since the reading.",
           "x-unit": "seconds"
          },
          "price": {
           "type": [
            "number",
            "null"
           ],
           "description": "SPX at the reading.",
           "x-unit": "index points"
          },
          "minutes_left": {
           "type": "integer",
           "description": "Minutes to 16:00 ET; 0 when closed.",
           "x-unit": "minutes"
          },
          "left_to_close": {
           "type": [
            "object",
            "null"
           ],
           "description": "Twice the ATM straddle from here to 16:00; null when closed or unpriced.",
           "properties": {
            "points": {
             "type": [
              "number",
              "null"
             ],
             "description": "The expected move left.",
             "x-unit": "index points"
            },
            "low": {
             "type": [
              "number",
              "null"
             ],
             "description": "Price minus it.",
             "x-unit": "index points"
            },
            "high": {
             "type": [
              "number",
              "null"
             ],
             "description": "Price plus it.",
             "x-unit": "index points"
            },
            "source": {
             "type": "string",
             "description": "Where the straddle came from."
            },
            "note": {
             "type": "string",
             "description": "What it measured over the archive."
            }
           }
          },
          "close_odds": {
           "type": [
            "object",
            "null"
           ],
           "description": "The 0DTE chain's odds for the close, with 30 or more minutes left; null otherwise.",
           "properties": {
            "frame_t": {
             "type": [
              "string",
              "null"
             ],
             "description": "The ladder frame's ET minute."
            },
            "range_80": {
             "type": "array",
             "items": {
              "type": [
               "number",
               "null"
              ]
             },
             "description": "The 10th and 90th percentile of the close.",
             "x-unit": "index points"
            },
            "middle_half": {
             "type": "array",
             "items": {
              "type": [
               "number",
               "null"
              ]
             },
             "description": "The 25th and 75th percentile.",
             "x-unit": "index points"
            },
            "median": {
             "type": [
              "number",
              "null"
             ],
             "description": "The median close.",
             "x-unit": "index points"
            },
            "beyond_pct": {
             "type": "object",
             "description": "Odds, percent, that the close ends beyond each level, away from spot.",
             "properties": {
              "flip": {
               "type": [
                "number",
                "null"
               ],
               "description": "Beyond the flip.",
               "x-unit": "percent"
              },
              "call_wall": {
               "type": [
                "number",
                "null"
               ],
               "description": "Beyond the call wall.",
               "x-unit": "percent"
              },
              "put_wall": {
               "type": [
                "number",
                "null"
               ],
               "description": "Beyond the put wall.",
               "x-unit": "percent"
              }
             }
            },
            "note": {
             "type": "string",
             "description": "How the odds are made and how they held."
            }
           }
          },
          "close_odds_note": {
           "type": "string",
           "description": "Why `close_odds` is absent."
          },
          "levels": {
           "type": "object",
           "description": "The volume book's levels at the reading.",
           "properties": {
            "flip": {
             "type": [
              "number",
              "null"
             ],
             "description": "Flip.",
             "x-unit": "index points"
            },
            "call_wall": {
             "type": [
              "number",
              "null"
             ],
             "description": "Call wall.",
             "x-unit": "index points"
            },
            "put_wall": {
             "type": [
              "number",
              "null"
             ],
             "description": "Put wall.",
             "x-unit": "index points"
            },
            "book": {
             "type": "string",
             "description": "`volume`."
            }
           }
          },
          "levels_at": {
           "type": "string",
           "description": "A finished day: the levels minute."
          },
          "last_second": {
           "type": "object",
           "description": "A finished day: the levels at the last second.",
           "properties": {
            "flip": {
             "type": [
              "number",
              "null"
             ],
             "description": "Flip.",
             "x-unit": "index points"
            },
            "call_wall": {
             "type": [
              "number",
              "null"
             ],
             "description": "Call wall.",
             "x-unit": "index points"
            },
            "put_wall": {
             "type": [
              "number",
              "null"
             ],
             "description": "Put wall.",
             "x-unit": "index points"
            }
           }
          },
          "outcome": {
           "type": "object",
           "description": "With `day`: what the close did.",
           "properties": {
            "close": {
             "type": [
              "number",
              "null"
             ],
             "description": "The close.",
             "x-unit": "index points"
            },
            "close_as_of": {
             "type": "string",
             "description": "Its time."
            },
            "inside_left_to_close": {
             "type": [
              "boolean",
              "null"
             ],
             "description": "Whether the close landed inside the expected move."
            },
            "inside_range_80": {
             "type": [
              "boolean",
              "null"
             ],
             "description": "Inside the 80% range."
            },
            "inside_middle_half": {
             "type": [
              "boolean",
              "null"
             ],
             "description": "Inside the middle half."
            },
            "vs_median": {
             "type": [
              "number",
              "null"
             ],
             "description": "Close minus the median.",
             "x-unit": "index points"
            }
           }
          }
         }
        },
        "example": {
         "sym": "SPX",
         "day": "2026-09-30",
         "session": "open",
         "as_of": "2026-09-30T14:00:04-04:00",
         "as_of_unix": 1790791204,
         "age_s": 1,
         "price": 6712.14,
         "minutes_left": 120,
         "left_to_close": {
          "points": 24.6,
          "low": 6687.54,
          "high": 6736.74,
          "source": "the session's ATM straddle",
          "note": "twice the ATM straddle from here to 16:00; spot plus or minus it held 91% of closes over 1,108 sessions"
         },
         "close_odds": {
          "frame_t": "14:00",
          "range_80": [
           6694.1,
           6729.8
          ],
          "middle_half": [
           6703.2,
           6720.9
          ],
          "median": 6712.3,
          "beyond_pct": {
           "flip": 18.2,
           "call_wall": 3.1,
           "put_wall": 4.4
          },
          "note": "the 0DTE chain's own odds for the close"
         },
         "levels": {
          "flip": 6692,
          "call_wall": 6742,
          "put_wall": 6662,
          "book": "volume"
         }
        }
       }
      }
     },
     "304": {
      "description": "Not modified. Not counted."
     },
     "400": {
      "description": "A parameter is wrong.",
      "x-codes": [
       "spx_only",
       "bad_day",
       "not_finished",
       "bad_time"
      ],
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "401": {
      "description": "No key, or an unknown or revoked one.",
      "x-codes": [
       "no_key",
       "bad_key"
      ],
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "403": {
      "description": "No LIVE plan.",
      "x-codes": [
       "live_required"
      ],
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "404": {
      "description": "No reading for that day.",
      "x-codes": [
       "no_data"
      ],
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Over a limit.",
      "x-codes": [
       "rate_limited",
       "too_many_places"
      ],
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/api/v1/levels.txt": {
   "get": {
    "x-plan": "live",
    "x-key": "live",
    "x-limit": "120 a minute per key; a 304 is free",
    "operationId": "getLevelsString",
    "x-slug": "levels-string",
    "summary": "Levels string (FT1)",
    "description": "The same readings as one pasteable line, the FT1 levels string, for the TradingView and thinkorswim scripts, which cannot call an API: up to 8 symbols, each with its top `g` gamma strikes.",
    "x-features": [
     "integrations",
     "levels-api"
    ],
    "x-since": "2026-09-30",
    "parameters": [
     {
      "name": "sym",
      "in": "query",
      "required": true,
      "description": "Comma list, up to 8.",
      "schema": {
       "type": "string"
      },
      "x-error": "missing_sym, too_many_symbols"
     },
     {
      "name": "g",
      "in": "query",
      "required": false,
      "description": "Gamma strikes per symbol, 0 to 30.",
      "schema": {
       "type": "integer",
       "minimum": 0,
       "maximum": 30,
       "default": 20
      },
      "x-error": "bad_g"
     },
     {
      "name": "errors",
      "in": "query",
      "required": false,
      "description": "`200`: an error answers 200 with the same body and the real status in `X-FirmTape-Status`, for clients that cannot read a status.",
      "schema": {
       "type": "string",
       "enum": [
        "200"
       ]
      }
     },
     {
      "name": "key",
      "in": "query",
      "required": false,
      "description": "Legacy: the key in the address, for platforms that cannot send headers. Prefer the header.",
      "schema": {
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "One line of text, starting `FT1`. Each block carries the key's mark `k=`.",
      "headers": {
       "X-RateLimit-Limit": "120",
       "X-RateLimit-Remaining": "117"
      },
      "content": {
       "text/plain": {
        "schema": {
         "type": "string"
        },
        "example": "FT1|ES|...\n"
       }
      }
     },
     "304": {
      "description": "Not modified. Not counted."
     },
     "400": {
      "description": "A parameter is wrong.",
      "x-codes": [
       "missing_sym",
       "too_many_symbols",
       "bad_g"
      ],
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "401": {
      "description": "No key.",
      "x-codes": [
       "no_key",
       "bad_key"
      ],
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "403": {
      "description": "No LIVE plan.",
      "x-codes": [
       "live_required"
      ],
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Over a limit.",
      "x-codes": [
       "rate_limited",
       "too_many_places"
      ],
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  },
  "/api/v1/bookmap.csv": {
   "get": {
    "x-plan": "live",
    "x-key": "live",
    "x-limit": "120 a minute per key; a 304 is free",
    "operationId": "getBookmapCsv",
    "x-slug": "bookmap-csv",
    "summary": "Bookmap Cloud Notes sheet",
    "description": "A Bookmap Cloud Notes sheet: one note with a price line per level, in the contract Bookmap names. Without a LIVE plan it answers an empty sheet that says why, so old notes go.",
    "x-features": [
     "integrations"
    ],
    "x-since": "2026-09-30",
    "parameters": [
     {
      "name": "sym",
      "in": "query",
      "required": true,
      "description": "Comma list, up to 20.",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "oi",
      "in": "query",
      "required": false,
      "description": "`1` adds the open-interest levels.",
      "schema": {
       "type": "string",
       "enum": [
        "1"
       ]
      }
     },
     {
      "name": "line",
      "in": "query",
      "required": false,
      "description": "`0` drops the horizontal price line.",
      "schema": {
       "type": "string",
       "enum": [
        "0"
       ]
      }
     },
     {
      "name": "automap",
      "in": "query",
      "required": false,
      "description": "Bookmap's data feed for the `#automap` line, or `none`.",
      "schema": {
       "type": "string",
       "default": "RITHMIC"
      }
     },
     {
      "name": "alias",
      "in": "query",
      "required": false,
      "description": "Comma list, one name per symbol, to override the contract Bookmap reads.",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "key",
      "in": "query",
      "required": false,
      "description": "Legacy: the key in the address, for platforms that cannot send headers. Prefer the header.",
      "schema": {
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "CSV. An auth or plan failure is also 200, an empty sheet whose first line names it, with `X-FirmTape-Status`.",
      "headers": {
       "X-RateLimit-Limit": "120",
       "X-RateLimit-Remaining": "117"
      },
      "content": {
       "text/csv": {
        "schema": {
         "type": "string"
        },
        "example": "#automap RITHMIC,,,,,,,\nSymbol,Price Level,Note,Foreground Color,Background Color,Text Alignment,Diameter,Draw Note Price Horizontal Line\nESZ6,6752.25,FT flip 6752.25,#000000,#E0A040,right,1,TRUE\n"
       }
      }
     },
     "304": {
      "description": "Not modified. Not counted."
     },
     "400": {
      "description": "`missing_sym` or `too_many_symbols`, as one line of text."
     }
    }
   }
  },
  "/api/v1/key": {
   "get": {
    "x-plan": "live",
    "x-key": "live",
    "x-limit": "120 a minute per key; a 304 is free",
    "operationId": "checkKey",
    "x-slug": "key",
    "summary": "Check a key",
    "description": "Whether the key works and its plan is LIVE: `{ok, plan, limit_per_minute}`. For a plugin's test button.",
    "x-features": [
     "integration-tokens",
     "levels-api"
    ],
    "x-since": "2026-09-30",
    "parameters": [
     {
      "name": "errors",
      "in": "query",
      "required": false,
      "description": "`200`: an error answers 200 with the same body and the real status in `X-FirmTape-Status`, for clients that cannot read a status.",
      "schema": {
       "type": "string",
       "enum": [
        "200"
       ]
      }
     },
     {
      "name": "key",
      "in": "query",
      "required": false,
      "description": "Legacy: the key in the address, for platforms that cannot send headers. Prefer the header.",
      "schema": {
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "The key works.",
      "headers": {
       "X-RateLimit-Limit": "120",
       "X-RateLimit-Remaining": "117"
      },
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "required": [
          "ok",
          "plan"
         ],
         "properties": {
          "ok": {
           "type": "boolean",
           "description": "Always true."
          },
          "plan": {
           "type": "string",
           "description": "`live`."
          },
          "limit_per_minute": {
           "type": "integer",
           "description": "Requests a minute this key may make."
          }
         }
        },
        "example": {
         "ok": true,
         "plan": "live",
         "limit_per_minute": 120
        }
       }
      }
     },
     "401": {
      "description": "No key.",
      "x-codes": [
       "no_key",
       "bad_key"
      ],
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "403": {
      "description": "No LIVE plan.",
      "x-codes": [
       "live_required"
      ],
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     },
     "429": {
      "description": "Over a limit.",
      "x-codes": [
       "rate_limited",
       "too_many_places"
      ],
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Error"
        }
       }
      }
     }
    }
   }
  }
 }
}