{
  "openapi": "3.1.0",
  "info": {
    "title": "Tapetide API",
    "version": "1.0.0",
    "summary": "Indian stock-market data: quotes, financials, price history, shareholding, forecasts, deals, options analytics, indices and market flows.",
    "description": "REST access to the same datasets as the Tapetide MCP server, with the same token and the same quota. Authenticate with `Authorization: Bearer <token>`; personal tokens are created at https://tapetide.com/settings/tokens. Every successful data request costs one unit from your plan's daily and monthly quota (free tier: 50/day, no monthly cap). Failed requests are refunded. Responses are complete documents: nothing is truncated to fit, and routes that page say so in `meta`. Data is for information only and is not investment advice.",
    "contact": {
      "email": "support@tapetide.com",
      "url": "https://tapetide.com"
    },
    "termsOfService": "https://tapetide.com/terms"
  },
  "servers": [
    {
      "url": "https://api.tapetide.com"
    }
  ],
  "tags": [
    {
      "name": "stocks",
      "description": "Per-stock data"
    },
    {
      "name": "market",
      "description": "Market-wide flows and gauges"
    },
    {
      "name": "indices",
      "description": "NSE index levels and rankings"
    },
    {
      "name": "options",
      "description": "Derivatives analytics"
    },
    {
      "name": "account",
      "description": "Your account"
    },
    {
      "name": "reference"
    },
    {
      "name": "fundamentals"
    },
    {
      "name": "prices"
    },
    {
      "name": "ownership"
    },
    {
      "name": "filings"
    },
    {
      "name": "news"
    },
    {
      "name": "ipos"
    },
    {
      "name": "scores"
    },
    {
      "name": "funds"
    },
    {
      "name": "macro"
    },
    {
      "name": "derivatives"
    },
    {
      "name": "live"
    },
    {
      "name": "screens"
    }
  ],
  "paths": {
    "/v1/stocks": {
      "get": {
        "operationId": "searchStocks",
        "summary": "Search stocks",
        "description": "Search ~8,200 Indian stocks by name, symbol, BSE code or ISIN. Common brand names and post-rename aliases match too (Zomato finds ETERNAL, Infosys finds INFY), and queries of 4 or more characters tolerate typos. Listed companies rank first, then by match quality (exact symbol or code, prefix, word, contains), with larger companies first within each tier. Delisted companies are included after listed ones. Use the returned `symbol` with the per-stock routes.",
        "tags": [
          "stocks"
        ],
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": true,
            "description": "Search text: a company name, symbol, BSE code or ISIN.",
            "schema": {
              "type": "string"
            },
            "example": "reliance"
          },
          {
            "name": "sector",
            "in": "query",
            "required": false,
            "description": "Filter by sector, e.g. 'Information Technology'.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "industry",
            "in": "query",
            "required": false,
            "description": "Filter by industry, e.g. 'Private Bank'.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Max results (default 10, max 50).",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50
            },
            "example": "10"
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": [
                    {
                      "symbol": "RELIANCE",
                      "name": "Reliance Industries Ltd",
                      "bse_code": "500325",
                      "nse_symbol": "RELIANCE",
                      "sector": "Petroleum Products",
                      "industry": "Refineries & Marketing",
                      "macro_sector": "Energy",
                      "is_active": true,
                      "stock_type": "EQUITY"
                    },
                    {
                      "symbol": "RPOWER",
                      "name": "Reliance Power Ltd",
                      "bse_code": "532939",
                      "nse_symbol": "RPOWER",
                      "sector": "Power",
                      "industry": "Power Generation",
                      "macro_sector": "Utilities",
                      "is_active": true,
                      "stock_type": "EQUITY"
                    }
                  ],
                  "meta": {
                    "total": 14,
                    "limit": 10,
                    "offset": 0,
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "searchStocks"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The symbol, index or document does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/stocks/{symbol}": {
      "get": {
        "operationId": "getStockProfile",
        "summary": "Company profile",
        "description": "Company overview: identity, sector and industry, about, fundamentals (PE, PB, market cap, ROE, ROCE, debt/equity), price metrics, growth (compounded sales/profit/price CAGR and return on equity by period, plus `growth_rates`) and the current quote. Add `include` for technicals, analyst ratings or the peer table.",
        "tags": [
          "stocks"
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Stock or index symbol, e.g. \"RELIANCE\", \"TCS\", \"NIFTY\". Percent-encode symbols containing \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "maxLength": 64
            },
            "example": "RELIANCE"
          },
          {
            "name": "include",
            "in": "query",
            "required": false,
            "description": "Comma-separated extra sections: technicals, ratings, peers.",
            "schema": {
              "type": "string",
              "description": "Comma-separated list.",
              "x-max-items": 3
            },
            "example": "technicals,ratings"
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "company": {
                      "symbol": "SBIN",
                      "name": "State Bank of India",
                      "display_name": "SBI",
                      "isin": "INE062A01020",
                      "nse_symbol": "SBIN",
                      "bse_code": "500112",
                      "exchange": "NSE",
                      "exchange_symbol": "SBIN",
                      "nse_listed": true,
                      "is_active": true,
                      "is_fno": true,
                      "stock_type": "EQUITY",
                      "listing_date": "1995-03-01",
                      "face_value": 1,
                      "issued_size": 9230617586,
                      "has_consolidated": true,
                      "sector": "Banks",
                      "industry": "Public Sector Bank",
                      "basic_industry": "Public Sector Bank",
                      "macro_sector": "Financial Services",
                      "sector_path": "Financial Services > Financial Services > Banks > Public Sector Bank",
                      "sector_hub": {
                        "display_name": "Bank",
                        "slug": "banks"
                      },
                      "about": "State Bank of India is a Fortune 500 company. It is an Indian Multinational, Public Sector banking and financial services statutory body headquartered in Mumbai. It is the largest and oldest bank in India with over 200 years of history.[1]",
                      "website": "sbi.co.in",
                      "ceo": "Mr. Rana Ashutosh Kumar Singh",
                      "employees": 236226
                    },
                    "fundamentals": {
                      "market_cap": 888553.61,
                      "stock_pe": 10.31,
                      "price_to_book": 1.51,
                      "book_value": 636.48,
                      "eps": 93.39,
                      "dividend_yield": 1.81,
                      "roe": 13.85,
                      "roce": 5.16,
                      "debt_to_equity": 0,
                      "ebitda": 118857.7,
                      "net_income": 85168.5,
                      "yearly_revenue": 712643.5,
                      "revenue_growth_1y": null,
                      "yoy_quarterly_profit_growth": null,
                      "high_52w": 1234.7,
                      "low_52w": 882.45,
                      "volume": 1295884,
                      "day_rsi14": 43.52825,
                      "face_value": 1,
                      "company_classification": "Largecap",
                      "sector": "Banks",
                      "industry": "Banks",
                      "sub_sector": "Financial Services"
                    },
                    "price_metrics": {
                      "as_of": "2026-10-16T15:59:40+05:30",
                      "price": 962.6,
                      "price_basis": "live",
                      "market_cap": 888553.61,
                      "pe_ttm": 10.31,
                      "pb": 1.51,
                      "eps_ttm": 93.39,
                      "book_value": 636.48,
                      "high_52w": 1234.7,
                      "low_52w": 882.45,
                      "shares_outstanding": 9230766786,
                      "statement_basis": "consolidated"
                    },
                    "quote": {
                      "symbol": "SBIN",
                      "name": "State Bank of India",
                      "price": 962.6,
                      "change": 2.6,
                      "change_pct": 0.2708333333,
                      "open": 961.1,
                      "high": 965.9,
                      "low": 951.7,
                      "prev_close": 960,
                      "volume": 7842693,
                      "updated_at": "2026-10-16T10:29:40+00:00"
                    },
                    "valuation": {
                      "method": "ttm",
                      "pe_ttm": 10.31,
                      "ttm_eps": 93.39,
                      "ttm_quarters": [
                        "Sep 2025",
                        "Dec 2025"
                      ]
                    },
                    "growth": {
                      "sales_cagr_pct": {
                        "10y": 9,
                        "5y": 13,
                        "3y": 14,
                        "ttm": 6
                      },
                      "profit_cagr_pct": {
                        "10y": 21,
                        "5y": 30,
                        "3y": 14,
                        "ttm": 6
                      },
                      "price_cagr_pct": {
                        "10y": 14,
                        "5y": 16,
                        "3y": 17,
                        "1y": 10
                      },
                      "return_on_equity_pct": {
                        "10y": 11,
                        "5y": 16,
                        "3y": 17,
                        "last_year": 15
                      }
                    },
                    "growth_rates": {
                      "cash_flow_growth": {
                        "1Y": -16.24,
                        "3Y": 76.11,
                        "5Y": -33.97
                      },
                      "ebitda_margin_growth": {
                        "1Y": -1.81,
                        "3Y": 2.01,
                        "5Y": 18.19,
                        "QoQ": 26.11
                      },
                      "net_income_growth": {
                        "1Y": 7.78,
                        "3Y": 14,
                        "5Y": 30,
                        "QoQ": 22.49
                      },
                      "revenue_growth": {
                        "1Y": 7.43,
                        "3Y": 14,
                        "5Y": 13,
                        "QoQ": -0.56
                      },
                      "roce": {
                        "1Y": -7.36,
                        "3Y": -0.96,
                        "5Y": 4.85,
                        "QoQ": 8.58
                      },
                      "roe": {
                        "1Y": -11.5,
                        "3Y": 15.11,
                        "5Y": 20.64,
                        "QoQ": 22.49
                      }
                    },
                    "technicals": {
                      "moving_averages": {
                        "summary": {
                          "buy": 2,
                          "neutral": 0,
                          "sell": 8,
                          "signal": "Strong Sell"
                        },
                        "values": [
                          {
                            "name": "SMA (10)",
                            "signal": "Buy",
                            "value": 953.69
                          },
                          {
                            "name": "EMA (10)",
                            "signal": "Buy",
                            "value": 957.37
                          }
                        ]
                      },
                      "oscillators": {
                        "summary": {
                          "buy": 2,
                          "neutral": 5,
                          "sell": 2,
                          "signal": "Neutral"
                        },
                        "values": [
                          {
                            "name": "RSI (14)",
                            "signal": "Neutral",
                            "value": 43.53
                          },
                          {
                            "name": "MACD (12,26,9)",
                            "signal": "Buy",
                            "value": -15.6
                          }
                        ]
                      },
                      "pivot_points": {
                        "camarilla": {
                          "pp": 957.05,
                          "r1": 961.51,
                          "r2": 963.02,
                          "r3": 964.52,
                          "s1": 958.49,
                          "s2": 956.98,
                          "s3": 955.48
                        },
                        "classic": {
                          "pp": 957.05,
                          "r1": 966.75,
                          "r2": 973.5,
                          "r3": 983.2,
                          "s1": 950.3,
                          "s2": 940.6,
                          "s3": 933.85
                        },
                        "fibonacci": {
                          "pp": 957.05,
                          "r1": 963.33,
                          "r2": 967.22,
                          "r3": 973.5,
                          "s1": 950.77,
                          "s2": 946.88,
                          "s3": 940.6
                        }
                      },
                      "summary": {
                        "buy": 4,
                        "neutral": 5,
                        "sell": 10,
                        "signal": "Strong Sell"
                      }
                    },
                    "ratings": {
                      "buy": 31,
                      "hold": 6,
                      "sell": 0,
                      "total_ratings": 37,
                      "percent_buy": 83.78,
                      "percent_hold": 16.22,
                      "percent_sell": 0
                    },
                    "peers": {
                      "anchor": {
                        "basic_industry": "Public Sector Bank",
                        "industry": "Public Sector Bank",
                        "macro_sector": "Financial Services",
                        "name": "State Bank of India",
                        "sector": "Banks",
                        "symbol": "SBIN"
                      },
                      "columns": [
                        {
                          "decimals": 2,
                          "default_visible": true,
                          "key": "price",
                          "label": "Price",
                          "unit": "inr"
                        },
                        {
                          "decimals": 2,
                          "default_visible": false,
                          "key": "change_pct",
                          "label": "Chg %",
                          "unit": "pct"
                        }
                      ],
                      "rows": [
                        {
                          "change_pct": 0.2751599367,
                          "debt_to_equity": null,
                          "display_name": "HDFC Bank",
                          "div_yield": 2.53,
                          "exchange_symbol": "HDFCBANK",
                          "is_extra": false,
                          "is_self": false,
                          "market_cap": 1123646.19,
                          "name": "HDFC Bank Ltd",
                          "net_profit_ttm": 82512,
                          "opm": 42.8,
                          "pb": 1.87,
                          "pe": 14.19,
                          "price": 728.85,
                          "profit_growth_yoy_q": 5.6,
                          "promoter_holding": 0,
                          "roa": 1.614065571,
                          "roce": 5.86,
                          "roe": 13.02,
                          "sales_growth_yoy_q": null,
                          "sales_ttm": 495518,
                          "symbol": "HDFCBANK"
                        },
                        {
                          "change_pct": 0.5469987045,
                          "debt_to_equity": null,
                          "display_name": "ICICI Bank",
                          "div_yield": 0.9,
                          "exchange_symbol": "ICICIBANK",
                          "is_extra": false,
                          "is_self": false,
                          "market_cap": 1002831.08,
                          "name": "ICICI Bank Ltd",
                          "net_profit_ttm": 59756,
                          "opm": 24.6,
                          "pb": 2.68,
                          "pe": 17.83,
                          "price": 1397,
                          "profit_growth_yoy_q": -0.25,
                          "promoter_holding": 0,
                          "roa": 1.987855198,
                          "roce": 5.7,
                          "roe": 15.19,
                          "sales_growth_yoy_q": null,
                          "sales_ttm": 317231.6,
                          "symbol": "ICICIBANK"
                        }
                      ],
                      "median": {
                        "change_pct": 0.4110793206,
                        "debt_to_equity": null,
                        "div_yield": 2.34,
                        "market_cap": 267656.965,
                        "net_profit_ttm": 21390,
                        "opm": 59.75,
                        "pb": 1.475,
                        "pe": 9.655,
                        "price": 588.125,
                        "profit_growth_yoy_q": 0.08,
                        "promoter_holding": 59.2,
                        "roa": 1.20230392,
                        "roce": 5.62,
                        "roe": 13.435,
                        "sales_growth_yoy_q": null,
                        "sales_ttm": 155000.15
                      },
                      "updated_at": "2026-10-15T16:00:38Z"
                    },
                    "updated_at": "2026-10-16T04:49:27.528Z"
                  },
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "getStockProfile"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The symbol, index or document does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/stocks/{symbol}/quote": {
      "get": {
        "operationId": "getStockQuote",
        "summary": "Latest quote",
        "description": "Latest price quote: LTP, change, change %, open/high/low, previous close, volume, market cap, trailing PE (`pe_ttm`) and 52-week high/low.",
        "tags": [
          "stocks"
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Stock or index symbol, e.g. \"RELIANCE\", \"TCS\", \"NIFTY\". Percent-encode symbols containing \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "maxLength": 64
            },
            "example": "RELIANCE"
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "change": -3.8,
                    "change_pct": -0.3127572016,
                    "found": true,
                    "high": 1215.4,
                    "high_52w": 1611.8,
                    "low": 1193,
                    "low_52w": 1152.2,
                    "market_cap": 1639061.09,
                    "name": "Reliance Industries Ltd",
                    "open": 1215,
                    "pe_ttm": 21.93,
                    "prev_close": 1215,
                    "price": 1211.2,
                    "requested": "RELIANCE",
                    "symbol": "RELIANCE",
                    "updated_at": "2026-10-16T10:29:44+00:00",
                    "volume": 17225283
                  },
                  "meta": {
                    "symbol": "RELIANCE",
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "getStockQuote"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The symbol, index or document does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/stocks/{symbol}/financials": {
      "get": {
        "operationId": "getFinancials",
        "summary": "Financial statements",
        "description": "Financial statements. `section` is one of quarterly (quarterly P&L), profit_loss, balance_sheet, cash_flow, ratios (all annual). Omit it for every section. Each section carries `periods` (oldest first), `data` {row: {period: value}}, `pct_changes`, `row_order` and an `availability` array with the point-in-time `available_from` date per period. This route returns the full document: `periods` defaults to every period held, and nothing is trimmed. ETFs, index funds and bonds have no statements and return 404.",
        "tags": [
          "stocks"
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Stock or index symbol, e.g. \"RELIANCE\", \"TCS\", \"NIFTY\". Percent-encode symbols containing \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "maxLength": 64
            },
            "example": "RELIANCE"
          },
          {
            "name": "section",
            "in": "query",
            "required": false,
            "description": "quarterly | profit_loss | balance_sheet | cash_flow | ratios. Accepted spellings include quarters, quarterly_results, income_statement, pnl, bs, cf.",
            "schema": {
              "type": "string"
            },
            "example": "quarterly"
          },
          {
            "name": "periods",
            "in": "query",
            "required": false,
            "description": "Latest N periods per section (max 40). Default: all periods held. Also accepted as: quarters.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 40
            },
            "example": "12"
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": [
                    {
                      "availability": [
                        {
                          "available_from": "2023-08-16",
                          "basis": "estimated",
                          "period": "Jun 2023"
                        },
                        {
                          "available_from": "2023-11-15",
                          "basis": "estimated",
                          "period": "Sep 2023"
                        }
                      ],
                      "data": {
                        "Depreciation": {
                          "Dec 2023": 0,
                          "Dec 2024": 0,
                          "Dec 2025": 0,
                          "Jun 2023": 0
                        },
                        "EPS in Rs": {
                          "Dec 2023": 4.29,
                          "Dec 2024": 4.73,
                          "Dec 2025": 4.95,
                          "Jun 2023": 4.18
                        },
                        "Expenses": {
                          "Dec 2023": 12484,
                          "Dec 2024": 10596,
                          "Dec 2025": 13933,
                          "Jun 2023": 10303
                        },
                        "Financing Margin %": {
                          "Dec 2023": -27,
                          "Dec 2024": -7,
                          "Dec 2025": -22,
                          "Jun 2023": -18
                        },
                        "Financing Profit": {
                          "Dec 2023": -3975,
                          "Dec 2024": -1133,
                          "Dec 2025": -3811,
                          "Jun 2023": -2269
                        },
                        "Gross NPA %": {
                          "Dec 2023": 1.68,
                          "Dec 2024": 1.51,
                          "Jun 2023": 1.75,
                          "Jun 2024": 1.39
                        },
                        "Interest": {
                          "Dec 2023": 5985,
                          "Dec 2024": 7170,
                          "Dec 2025": 7384,
                          "Jun 2023": 4834
                        },
                        "Net NPA %": {
                          "Dec 2023": 0.36,
                          "Dec 2024": 0.44,
                          "Jun 2023": 0.43,
                          "Jun 2024": 0.38
                        },
                        "Net Profit": {
                          "Dec 2023": 4265,
                          "Dec 2024": 4701,
                          "Dec 2025": 4924,
                          "Jun 2023": 4150
                        },
                        "Other Income": {
                          "Dec 2023": 9588,
                          "Dec 2024": 7313,
                          "Dec 2025": 10344,
                          "Jun 2023": 7855
                        },
                        "Profit before tax": {
                          "Dec 2023": 5614,
                          "Dec 2024": 6180,
                          "Dec 2025": 6533,
                          "Jun 2023": 5586
                        },
                        "Revenue": {
                          "Dec 2023": 14495,
                          "Dec 2024": 16633,
                          "Dec 2025": 17507,
                          "Jun 2023": 12869
                        },
                        "Tax %": {
                          "Dec 2023": 25,
                          "Dec 2024": 25,
                          "Dec 2025": 25,
                          "Jun 2023": 26
                        }
                      },
                      "pct_changes": {
                        "EPS in Rs": {
                          "Dec 2023": -4.5,
                          "Dec 2024": -6.7,
                          "Dec 2025": 10.2,
                          "Jun 2024": 39.5
                        },
                        "Expenses": {
                          "Dec 2023": 23.2,
                          "Dec 2024": -19.1,
                          "Dec 2025": 20,
                          "Jun 2024": -17.8
                        },
                        "Financing Margin %": {
                          "Dec 2023": -13,
                          "Dec 2024": 16,
                          "Dec 2025": -12,
                          "Jun 2024": 19
                        },
                        "Financing Profit": {
                          "Dec 2023": -103.3,
                          "Dec 2024": 70.2,
                          "Dec 2025": -119,
                          "Jun 2024": 45.9
                        },
                        "Gross NPA %": {
                          "Dec 2023": -0.01,
                          "Dec 2024": 0.03,
                          "Jun 2024": 0.01,
                          "Mar 2024": -0.3
                        },
                        "Interest": {
                          "Dec 2023": 8.1,
                          "Dec 2024": 0.4,
                          "Dec 2025": 0.7,
                          "Jun 2024": 9.5
                        },
                        "Net NPA %": {
                          "Dec 2023": -0.03,
                          "Dec 2024": -0.01,
                          "Jun 2024": 0.02,
                          "Mar 2024": 0
                        },
                        "Net Profit": {
                          "Dec 2023": -4.4,
                          "Dec 2024": -6.8,
                          "Dec 2025": 10.2,
                          "Jun 2024": 39.6
                        },
                        "Other Income": {
                          "Dec 2023": 22.2,
                          "Dec 2024": -30,
                          "Dec 2025": 34.3,
                          "Jun 2024": 2.3
                        },
                        "Profit before tax": {
                          "Dec 2023": -4.7,
                          "Dec 2024": -7,
                          "Dec 2025": 9.6,
                          "Jun 2024": 44.8
                        },
                        "Revenue": {
                          "Dec 2023": 5.7,
                          "Dec 2024": 1.3,
                          "Dec 2025": 1.8,
                          "Jun 2024": 4.5
                        },
                        "Tax %": {
                          "Dec 2023": 0,
                          "Dec 2024": 0,
                          "Dec 2025": 0,
                          "Jun 2024": 2
                        }
                      },
                      "percent_rows": [
                        "Financing Margin %",
                        "Tax %"
                      ],
                      "period_type": "quarterly",
                      "periods": [
                        "Jun 2023",
                        "Sep 2023"
                      ],
                      "row_order": [
                        "Revenue",
                        "Expenses"
                      ],
                      "section": "quarterly",
                      "updated_at": "2026-10-12T18:19:37.697Z"
                    },
                    {
                      "availability": [
                        {
                          "available_from": "2015-06-01",
                          "basis": "estimated",
                          "period": "Mar 2015"
                        },
                        {
                          "available_from": "2016-05-31",
                          "basis": "estimated",
                          "period": "Mar 2016"
                        }
                      ],
                      "data": {
                        "Depreciation": {
                          "Mar 2015": 237,
                          "Mar 2016": 345,
                          "Mar 2017": 362,
                          "Mar 2018": 383,
                          "TTM": 0
                        },
                        "Dividend Payout %": {
                          "Mar 2015": 2,
                          "Mar 2016": 3,
                          "Mar 2017": 2,
                          "Mar 2018": 2
                        },
                        "EPS in Rs": {
                          "Mar 2015": 3.94,
                          "Mar 2016": 3.77,
                          "Mar 2017": 5.37,
                          "Mar 2018": 6.51,
                          "TTM": 20.4
                        },
                        "Expenses": {
                          "Mar 2015": 9718,
                          "Mar 2016": 11541,
                          "Mar 2017": 14832,
                          "Mar 2018": 16805,
                          "TTM": 54053
                        },
                        "Financing Margin %": {
                          "Mar 2015": -25,
                          "Mar 2016": -11,
                          "Mar 2017": -18,
                          "Mar 2018": -16,
                          "TTM": -18
                        },
                        "Financing Profit": {
                          "Mar 2015": -3366,
                          "Mar 2016": -2263,
                          "Mar 2017": -3965,
                          "Mar 2018": -4141,
                          "TTM": -12961
                        },
                        "Interest": {
                          "Mar 2015": 6966,
                          "Mar 2016": 11123,
                          "Mar 2017": 11458,
                          "Mar 2018": 12467,
                          "TTM": 29795
                        },
                        "Net Profit": {
                          "Mar 2015": 3105,
                          "Mar 2016": 3524,
                          "Mar 2017": 5019,
                          "Mar 2018": 6258,
                          "TTM": 20296
                        },
                        "Other Income": {
                          "Mar 2015": 8152,
                          "Mar 2016": 7631,
                          "Mar 2017": 11660,
                          "Mar 2018": 13682,
                          "TTM": 40409
                        },
                        "Profit before tax": {
                          "Mar 2015": 4550,
                          "Mar 2016": 5024,
                          "Mar 2017": 7332,
                          "Mar 2018": 9158,
                          "TTM": 27448
                        },
                        "Revenue": {
                          "Mar 2015": 13319,
                          "Mar 2016": 20402,
                          "Mar 2017": 22324,
                          "Mar 2018": 25131,
                          "TTM": 70887
                        },
                        "Tax %": {
                          "Mar 2015": 33,
                          "Mar 2016": 32,
                          "Mar 2017": 32,
                          "Mar 2018": 33
                        }
                      },
                      "pct_changes": {
                        "Depreciation": {
                          "Mar 2016": 45.6,
                          "Mar 2017": 4.9,
                          "Mar 2018": 5.8,
                          "Mar 2019": 19.6,
                          "TTM": -100
                        },
                        "Dividend Payout %": {
                          "Mar 2016": 1,
                          "Mar 2017": -1,
                          "Mar 2018": 0,
                          "Mar 2019": 0
                        },
                        "EPS in Rs": {
                          "Mar 2016": -4.3,
                          "Mar 2017": 42.4,
                          "Mar 2018": 21.2,
                          "Mar 2019": 16,
                          "TTM": 5.2
                        },
                        "Expenses": {
                          "Mar 2016": 18.8,
                          "Mar 2017": 28.5,
                          "Mar 2018": 13.3,
                          "Mar 2019": 17.6,
                          "TTM": -0.9
                        },
                        "Financing Margin %": {
                          "Mar 2016": 14,
                          "Mar 2017": -7,
                          "Mar 2018": 2,
                          "Mar 2019": -1,
                          "TTM": 3
                        },
                        "Financing Profit": {
                          "Mar 2016": 32.8,
                          "Mar 2017": -75.2,
                          "Mar 2018": -4.4,
                          "Mar 2019": -23.5,
                          "TTM": 9.8
                        },
                        "Interest": {
                          "Mar 2016": 59.7,
                          "Mar 2017": 3,
                          "Mar 2018": 8.8,
                          "Mar 2019": 21.8,
                          "TTM": 0.6
                        },
                        "Net Profit": {
                          "Mar 2016": 13.5,
                          "Mar 2017": 42.4,
                          "Mar 2018": 24.7,
                          "Mar 2019": 15.1,
                          "TTM": 5.2
                        },
                        "Other Income": {
                          "Mar 2016": -6.4,
                          "Mar 2017": 52.8,
                          "Mar 2018": 17.3,
                          "Mar 2019": 18,
                          "TTM": -2.4
                        },
                        "Profit before tax": {
                          "Mar 2016": 10.4,
                          "Mar 2017": 45.9,
                          "Mar 2018": 24.9,
                          "Mar 2019": 15.5,
                          "TTM": 5.6
                        },
                        "Revenue": {
                          "Mar 2016": 53.2,
                          "Mar 2017": 9.4,
                          "Mar 2018": 12.6,
                          "Mar 2019": 18.7,
                          "TTM": 1.6
                        },
                        "Tax %": {
                          "Mar 2016": -1,
                          "Mar 2017": 0,
                          "Mar 2018": 1,
                          "Mar 2019": 0
                        }
                      },
                      "percent_rows": [
                        "Financing Margin %",
                        "Tax %"
                      ],
                      "period_type": "annual",
                      "periods": [
                        "Mar 2015",
                        "Mar 2016"
                      ],
                      "row_order": [
                        "Revenue",
                        "Expenses"
                      ],
                      "section": "profit_loss",
                      "updated_at": "2026-10-12T18:19:37.697Z"
                    }
                  ],
                  "meta": {
                    "count": 6,
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "getFinancials"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The symbol, index or document does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/stocks/{symbol}/price": {
      "get": {
        "operationId": "getPriceHistory",
        "summary": "Price history (OHLCV)",
        "description": "Row-per-day OHLCV: date, open, high, low, close (split/bonus-adjusted), `raw_close` (unadjusted, null where no raw print exists) and volume. `days` sets the lookback window (default 365, max 2000); `interval` is the bar size (daily or weekly). `meta.window` states the window actually served and `next_cursor` gives the `end_date` for the preceding page, so a multi-year series is paged with `end_date` until `has_more` is false.",
        "tags": [
          "stocks"
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Stock or index symbol, e.g. \"RELIANCE\", \"TCS\", \"NIFTY\". Percent-encode symbols containing \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "maxLength": 64
            },
            "example": "RELIANCE"
          },
          {
            "name": "days",
            "in": "query",
            "required": false,
            "description": "Lookback window in calendar days (default 365, max 2000).",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 2000
            },
            "example": "365"
          },
          {
            "name": "interval",
            "in": "query",
            "required": false,
            "description": "Bar size: daily (default) or weekly. Intraday bars are not served here.",
            "schema": {
              "type": "string",
              "enum": [
                "daily",
                "weekly"
              ]
            }
          },
          {
            "name": "end_date",
            "in": "query",
            "required": false,
            "description": "Inclusive YYYY-MM-DD upper bound; the paging cursor. Pass `meta.window.next_cursor` from the previous page.",
            "schema": {
              "type": "string",
              "format": "date",
              "x-min": "1900-01-01",
              "x-max": "2100-12-31"
            },
            "example": "2025-12-31"
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": [
                    {
                      "date": "2026-09-16",
                      "open": 976,
                      "high": 991.4,
                      "low": 973.2,
                      "close": 991.4,
                      "raw_close": 991.4,
                      "volume": 8609956
                    },
                    {
                      "date": "2026-09-17",
                      "open": 991.2,
                      "high": 1000.9,
                      "low": 985.2,
                      "close": 988.7,
                      "raw_close": 988.7,
                      "volume": 8624398
                    }
                  ],
                  "meta": {
                    "count": 21,
                    "days": 30,
                    "interval": "daily",
                    "adjustment": {
                      "series": "split_bonus_adjusted",
                      "dividend_adjusted": false,
                      "volume_adjusted": false,
                      "currency": "INR",
                      "raw_series_field": "raw_close"
                    },
                    "raw_close": {
                      "bars_with_raw_close": 21,
                      "bars_total": 21,
                      "coverage_pct": 100,
                      "counts_basis": "daily_bars",
                      "null_semantics": "NULL means NO RAW PRINT IS AVAILABLE for that bar. It is never a zero, never a placeholder, and must not be substituted with `close` — `close` is back-adjusted, so doing so would silently mix two price scales.",
                      "reconstruction_alternative": "where raw_close is null, a raw series can still be reconstructed from the split/bonus adjustment factors via raw(d) = adjusted(d) / cumulative_factor(d)."
                    },
                    "window": {
                      "requested_days": 30,
                      "served_days": 30,
                      "max_days": 2000,
                      "truncated": false,
                      "returned_rows": 21,
                      "has_more": true,
                      "first_date": "2026-09-16",
                      "last_date": "2026-10-15",
                      "end_date": null,
                      "next_cursor": "2026-09-15",
                      "counts_note": "returned_rows/total_matching_rows count stored bars matching this query. Neither is an assertion of how many bars SHOULD exist — that would need per-security listing/suspension data we do not have for the whole universe.",
                      "total_matching_rows": 21
                    },
                    "coverage": {
                      "first_stored_date": "2000-09-22",
                      "last_stored_date": "2026-10-15"
                    },
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "getPriceHistory"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The symbol, index or document does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/stocks/{symbol}/shareholding": {
      "get": {
        "operationId": "getShareholding",
        "summary": "Shareholding pattern",
        "description": "Promoter, FII, DII, government and public holdings over time. Every period held is returned; there is no period-type filter (the handler serves the same document to MCP).",
        "tags": [
          "stocks"
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Stock or index symbol, e.g. \"RELIANCE\", \"TCS\", \"NIFTY\". Percent-encode symbols containing \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "maxLength": 64
            },
            "example": "RELIANCE"
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "data": [
                      {
                        "data": {
                          "DIIs": {
                            "Dec 2021": 17.91,
                            "Dec 2022": 28.38,
                            "Dec 2023": 28.61,
                            "Dec 2024": 34.38
                          },
                          "FIIs": {
                            "Dec 2023": 52.31,
                            "Dec 2024": 49.2,
                            "Dec 2025": 47.67,
                            "Jun 2024": 47.17
                          },
                          "Government": {
                            "Dec 2021": 0.16,
                            "Dec 2022": 0,
                            "Dec 2023": 0,
                            "Dec 2024": 0.18
                          },
                          "No. of Shareholders": {
                            "Dec 2021": 1888280,
                            "Dec 2022": 2303290,
                            "Dec 2023": 3018250,
                            "Dec 2024": 3924440
                          },
                          "Others": {
                            "Dec 2023": 6.02,
                            "Dec 2024": 3.6,
                            "Dec 2025": 3.07,
                            "Jun 2024": 3.79
                          },
                          "Promoters": {
                            "Dec 2021": 25.8,
                            "Dec 2022": 25.6,
                            "Dec 2023": 0,
                            "Dec 2024": 0
                          },
                          "Public": {
                            "Dec 2021": 11.26,
                            "Dec 2022": 11.59,
                            "Dec 2023": 13.06,
                            "Dec 2024": 12.63
                          }
                        },
                        "period_type": "quarterly",
                        "periods": [
                          "Mar 2021",
                          "Jun 2021"
                        ],
                        "row_order": [
                          "Promoters",
                          "FIIs"
                        ]
                      }
                    ],
                    "meta": {
                      "count": 1
                    },
                    "promoter_pledge": {
                      "as_of": "Sep 2026",
                      "as_of_date": "2026-09-30",
                      "label": null,
                      "pct_of_promoter_holding": 0,
                      "pct_of_total_shares": 2.32,
                      "status": "none",
                      "unpledged_promoter_pct": null
                    }
                  },
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "getShareholding"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The symbol, index or document does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/stocks/{symbol}/forecasts": {
      "get": {
        "operationId": "getForecasts",
        "summary": "Analyst forecasts",
        "description": "Analyst estimates vs actuals: EPS, revenue, EBITDA, net income, ROA, ROE and price targets, quarterly and annual.",
        "tags": [
          "stocks"
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Stock or index symbol, e.g. \"RELIANCE\", \"TCS\", \"NIFTY\". Percent-encode symbols containing \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "maxLength": 64
            },
            "example": "RELIANCE"
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": [
                    {
                      "actuals": {
                        "ebitda": {
                          "202103": 44181.2,
                          "202203": 52554.1,
                          "202303": 63843.9,
                          "202403": 79660.7
                        },
                        "eps": {
                          "202103": 28.94,
                          "202203": 34.385,
                          "202303": 41.32,
                          "202403": 45.21
                        },
                        "net_income": {
                          "202103": 31856.8,
                          "202203": 38150.9,
                          "202303": 46148.7,
                          "202403": 65446.5
                        },
                        "price": {
                          "202003": 430.95,
                          "202103": 746.83,
                          "202203": 735.18,
                          "202303": 804.78
                        },
                        "revenue": {
                          "202103": 155885.3,
                          "202203": 167695.4,
                          "202303": 204666.1,
                          "202403": 407994.8
                        },
                        "roa": {
                          "202103": 1.77,
                          "202203": 1.8,
                          "202303": 1.82,
                          "202403": 1.62
                        },
                        "roe": {
                          "202103": 15.14,
                          "202203": 15.38,
                          "202303": 15.9,
                          "202403": 13.93
                        }
                      },
                      "bands": {
                        "ebitda": {
                          "estimate": null,
                          "high": null,
                          "low": null,
                          "period": null
                        },
                        "eps": {
                          "estimate": 53.45323,
                          "high": 57.3,
                          "low": 49,
                          "period": "202703"
                        },
                        "net_income": {
                          "estimate": 82318.28847,
                          "high": 88132.8,
                          "low": 75642.9,
                          "period": "202703"
                        },
                        "price": {
                          "estimate": 989.23077,
                          "high": 1270,
                          "low": 800,
                          "period": "202703"
                        },
                        "revenue": {
                          "estimate": 202029.9835,
                          "high": 214880.7,
                          "low": 190619.8,
                          "period": "202703"
                        },
                        "roa": {
                          "estimate": 1.79545,
                          "high": 1.9,
                          "low": 1.7,
                          "period": "202703"
                        },
                        "roe": {
                          "estimate": 13.88372,
                          "high": 14.8,
                          "low": 13,
                          "period": "202703"
                        }
                      },
                      "estimates": {
                        "ebitda": null,
                        "eps": {
                          "202503": {
                            "high": 45.015,
                            "low": 41.3,
                            "mean": 43.76688
                          },
                          "202603": {
                            "high": 50,
                            "low": 47.3,
                            "mean": 48.41603
                          },
                          "202703": {
                            "high": 57.3,
                            "low": 49,
                            "mean": 53.45323
                          },
                          "202803": {
                            "high": 67.5,
                            "low": 56.5,
                            "mean": 62.15463
                          }
                        },
                        "net_income": {
                          "202503": {
                            "high": 70672.2,
                            "low": 63197.9,
                            "mean": 66845.19398
                          },
                          "202603": {
                            "high": 76487.1,
                            "low": 67700,
                            "mean": 74225.62294
                          },
                          "202703": {
                            "high": 88132.8,
                            "low": 75642.9,
                            "mean": 82318.28847
                          },
                          "202803": {
                            "high": 104037.2,
                            "low": 86900,
                            "mean": 95729.42422
                          }
                        },
                        "price": {
                          "202703": {
                            "high": 1270,
                            "low": 800,
                            "mean": 989.23077
                          }
                        },
                        "revenue": {
                          "202503": {
                            "high": 172889.3,
                            "low": 166200,
                            "mean": 168345.906
                          },
                          "202603": {
                            "high": 196950.0111,
                            "low": 186400,
                            "mean": 192293.3068
                          },
                          "202703": {
                            "high": 214880.7,
                            "low": 190619.8,
                            "mean": 202029.9835
                          },
                          "202803": {
                            "high": 252471.8,
                            "low": 218009.4,
                            "mean": 232086.4708
                          }
                        },
                        "roa": {
                          "202503": {
                            "high": 1.91,
                            "low": 1.6,
                            "mean": 1.78697
                          },
                          "202603": {
                            "high": 1.9,
                            "low": 1.64,
                            "mean": 1.81123
                          },
                          "202703": {
                            "high": 1.9,
                            "low": 1.7,
                            "mean": 1.79545
                          },
                          "202803": {
                            "high": 2,
                            "low": 1.69,
                            "mean": 1.85336
                          }
                        },
                        "roe": {
                          "202503": {
                            "high": 14.9,
                            "low": 13.5,
                            "mean": 14.27912
                          },
                          "202603": {
                            "high": 14.9,
                            "low": 13.2,
                            "mean": 14.09742
                          },
                          "202703": {
                            "high": 14.8,
                            "low": 13,
                            "mean": 13.88372
                          },
                          "202803": {
                            "high": 15.5,
                            "low": 13.4,
                            "mean": 14.47794
                          }
                        }
                      },
                      "latest": {
                        "ebitda_actual": 106336.4,
                        "ebitda_estimate": null,
                        "ebitda_estimate_high": null,
                        "ebitda_estimate_low": null,
                        "ebitda_estimate_period": null,
                        "eps_actual": 49.5,
                        "eps_estimate": 53.45323,
                        "eps_estimate_high": 57.3,
                        "eps_estimate_low": 49,
                        "eps_estimate_period": "202703",
                        "net_income_actual": 79219.5,
                        "net_income_estimate": 82318.28847,
                        "net_income_estimate_high": 88132.8,
                        "net_income_estimate_low": 75642.9,
                        "net_income_estimate_period": "202703",
                        "price_actual": 914.1,
                        "price_estimate": 989.23077,
                        "price_estimate_high": 1270,
                        "price_estimate_low": 800,
                        "price_estimate_period": "202703",
                        "revenue_actual": 495462.8,
                        "revenue_estimate": 202029.9835,
                        "revenue_estimate_high": 214880.7,
                        "revenue_estimate_low": 190619.8,
                        "revenue_estimate_period": "202703",
                        "roa_actual": 1.61,
                        "roa_estimate": 1.79545,
                        "roa_estimate_high": 1.9,
                        "roa_estimate_low": 1.7,
                        "roa_estimate_period": "202703",
                        "roe_actual": 13.02,
                        "roe_estimate": 13.88372,
                        "roe_estimate_high": 14.8,
                        "roe_estimate_low": 13,
                        "roe_estimate_period": "202703"
                      },
                      "period_type": "A",
                      "updated_at": "2026-10-16T05:00:02.127Z"
                    },
                    {
                      "actuals": {
                        "ebitda": {
                          "202503": 25573.4,
                          "202506": 20849.8,
                          "202509": 26658.9,
                          "202512": 26961.1
                        },
                        "eps": {
                          "202503": 12.31,
                          "202506": 10.615,
                          "202509": 12.78,
                          "202512": 12.88
                        },
                        "net_income": {
                          "202503": 19284.6,
                          "202506": 17090.4,
                          "202509": 20363.8,
                          "202512": 20691
                        },
                        "price": {
                          "202506": 1000.75,
                          "202509": 951,
                          "202512": 991.2,
                          "202603": 731.55
                        },
                        "revenue": {
                          "202503": 120268.7,
                          "202506": 133055,
                          "202509": 118560.6,
                          "202512": 126927.2
                        },
                        "roa": null,
                        "roe": {
                          "202503": 3.58,
                          "202506": 3.18,
                          "202509": 3.78,
                          "202512": 3.84
                        }
                      },
                      "bands": {
                        "ebitda": {
                          "estimate": null,
                          "high": null,
                          "low": null,
                          "period": null
                        },
                        "eps": {
                          "estimate": 12.93,
                          "high": 13.16,
                          "low": 12.7,
                          "period": "202612"
                        },
                        "net_income": {
                          "estimate": 20825.4,
                          "high": 23077.2,
                          "low": 19249,
                          "period": "202612"
                        },
                        "price": {
                          "estimate": 989.23077,
                          "high": 1270,
                          "low": 800,
                          "period": "202703"
                        },
                        "revenue": {
                          "estimate": 49223.74185,
                          "high": 49407.4837,
                          "low": 49040,
                          "period": "202612"
                        },
                        "roa": {
                          "estimate": 2,
                          "high": 2,
                          "low": 2,
                          "period": "202612"
                        },
                        "roe": {
                          "estimate": 15,
                          "high": 15,
                          "low": 15,
                          "period": "202612"
                        }
                      },
                      "estimates": {
                        "ebitda": null,
                        "eps": {
                          "202509": {
                            "high": 10.63,
                            "low": 10.63,
                            "mean": 10.63
                          },
                          "202512": {
                            "high": 11.51,
                            "low": 3.1,
                            "mean": 7.305
                          },
                          "202603": {
                            "high": 12,
                            "low": 12,
                            "mean": 12
                          },
                          "202606": {
                            "high": 12.09,
                            "low": 12.09,
                            "mean": 12.09
                          }
                        },
                        "net_income": {
                          "202509": {
                            "high": 18493.3,
                            "low": 17121.4,
                            "mean": 17637.9625
                          },
                          "202512": {
                            "high": 19167.8,
                            "low": 17854.1,
                            "mean": 18510.18
                          },
                          "202603": {
                            "high": 20192.1,
                            "low": 18174.4,
                            "mean": 19109.0375
                          },
                          "202606": {
                            "high": 19785.3,
                            "low": 16698,
                            "mean": 18988.96667
                          }
                        },
                        "price": {
                          "202703": {
                            "high": 1270,
                            "low": 800,
                            "mean": 989.23077
                          }
                        },
                        "revenue": {
                          "202509": {
                            "high": 44940,
                            "low": 43765,
                            "mean": 44507.52
                          },
                          "202512": {
                            "high": 47480.7,
                            "low": 45499.6,
                            "mean": 46150
                          },
                          "202603": {
                            "high": 48224.6,
                            "low": 44093.7,
                            "mean": 47020.68333
                          },
                          "202606": {
                            "high": 48623.4,
                            "low": 47610,
                            "mean": 47972.5
                          }
                        },
                        "roa": {
                          "202509": {
                            "high": 2.7,
                            "low": 1.7,
                            "mean": 2.05
                          },
                          "202512": {
                            "high": 1.8,
                            "low": 1.8,
                            "mean": 1.8
                          },
                          "202603": {
                            "high": 2.6,
                            "low": 1.8,
                            "mean": 2.2
                          },
                          "202606": {
                            "high": 1.8,
                            "low": 1.7,
                            "mean": 1.73333
                          }
                        },
                        "roe": {
                          "202509": {
                            "high": 13.1,
                            "low": 13,
                            "mean": 13.05
                          },
                          "202512": {
                            "high": 13.5,
                            "low": 13.4,
                            "mean": 13.43333
                          },
                          "202603": {
                            "high": 13.9,
                            "low": 12.8,
                            "mean": 13.35
                          },
                          "202606": {
                            "high": 13.3,
                            "low": 13.1,
                            "mean": 13.2
                          }
                        }
                      },
                      "latest": {
                        "ebitda_actual": 27193.2,
                        "ebitda_estimate": null,
                        "ebitda_estimate_high": null,
                        "ebitda_estimate_low": null,
                        "ebitda_estimate_period": null,
                        "eps_actual": 12.5,
                        "eps_estimate": 12.93,
                        "eps_estimate_high": 13.16,
                        "eps_estimate_low": 12.7,
                        "eps_estimate_period": "202612",
                        "net_income_actual": 20382.7,
                        "net_income_estimate": 20825.4,
                        "net_income_estimate_high": 23077.2,
                        "net_income_estimate_low": 19249,
                        "net_income_estimate_period": "202612",
                        "price_actual": 708.7,
                        "price_estimate": 989.23077,
                        "price_estimate_high": 1270,
                        "price_estimate_low": 800,
                        "price_estimate_period": "202703",
                        "revenue_actual": 133110.3,
                        "revenue_estimate": 49223.74185,
                        "revenue_estimate_high": 49407.4837,
                        "revenue_estimate_low": 49040,
                        "revenue_estimate_period": "202612",
                        "roa_actual": null,
                        "roa_estimate": 2,
                        "roa_estimate_high": 2,
                        "roa_estimate_low": 2,
                        "roa_estimate_period": "202612",
                        "roe_actual": 3.35,
                        "roe_estimate": 15,
                        "roe_estimate_high": 15,
                        "roe_estimate_low": 15,
                        "roe_estimate_period": "202612"
                      },
                      "period_type": "Q",
                      "updated_at": "2026-10-16T05:00:02.055Z"
                    }
                  ],
                  "meta": {
                    "band_metric_slots": 14,
                    "band_metrics": [
                      "eps",
                      "revenue"
                    ],
                    "band_semantics": "low and high are the analyst dispersion around the estimate, not a confidence interval. A null band means no analyst range is published for that metric, never a zero-width range or a value of zero. period is stated per metric because a c...",
                    "eps_adjustments": [
                      {
                        "ex_date": "2025-08-26",
                        "factor": 0.5,
                        "period_type": "A",
                        "periods_scaled": 4,
                        "restated_before": "202503"
                      },
                      {
                        "ex_date": "2025-08-26",
                        "factor": 0.5,
                        "period_type": "Q",
                        "periods_scaled": 2,
                        "restated_before": "202509"
                      }
                    ],
                    "metric_rows_with_bands": 12,
                    "symbol": "HDFCBANK",
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "getForecasts"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The symbol, index or document does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/stocks/{symbol}/events": {
      "get": {
        "operationId": "getStockEvents",
        "summary": "News, corporate actions or filings",
        "description": "Stock events. `type` selects sentiment-tagged news (default), corporate actions (dividends, splits, bonuses, AGMs) or company filings (results, presentations, concall transcripts, annual reports, credit ratings, announcements).",
        "tags": [
          "stocks"
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Stock or index symbol, e.g. \"RELIANCE\", \"TCS\", \"NIFTY\". Percent-encode symbols containing \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "maxLength": 64
            },
            "example": "RELIANCE"
          },
          {
            "name": "type",
            "in": "query",
            "required": false,
            "description": "Event type (default news).",
            "schema": {
              "type": "string",
              "enum": [
                "news",
                "corporate_actions",
                "filings"
              ]
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Max results (default 20, max 50).",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": [
                    {
                      "article_id": 6291741,
                      "title": "FSSAI Files Legal Action Against Nestle India on Three Infant Products",
                      "body": null,
                      "sentiment": "positive",
                      "category": "companies",
                      "sub_category": "Companies",
                      "publish_date": "2026-09-18T08:16:59Z",
                      "source_url": "",
                      "related_isins": [
                        "INE239A01024"
                      ]
                    },
                    {
                      "article_id": 6875775,
                      "title": "Nestle India Q2 results preview: Strong volumes may push PAT above ₹1k cr",
                      "body": "According to brokerage estimates, *Nestle India* is positioned for robust second quarter performance with **revenue projected between ₹6,765-₹6,809 crore, representing a year-on-year growth of 20-21%**. The company's **profit after tax i...",
                      "sentiment": "positive",
                      "category": "companies",
                      "sub_category": "Companies",
                      "publish_date": "2026-10-13T09:05:26Z",
                      "source_url": "",
                      "related_isins": [
                        "INE239A01024"
                      ]
                    }
                  ],
                  "meta": {
                    "count": 2,
                    "limit": 20,
                    "offset": 0,
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "getStockEvents"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The symbol, index or document does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/stocks/{symbol}/deals": {
      "get": {
        "operationId": "getStockDeals",
        "summary": "Bulk, block, insider and SAST deals",
        "description": "Large-trade history with counterparty, side, quantity, price and value. Optionally filter to one deal type.",
        "tags": [
          "stocks"
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Stock or index symbol, e.g. \"RELIANCE\", \"TCS\", \"NIFTY\". Percent-encode symbols containing \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "maxLength": 64
            },
            "example": "RELIANCE"
          },
          {
            "name": "type",
            "in": "query",
            "required": false,
            "description": "Deal type. Omit for all.",
            "schema": {
              "type": "string",
              "enum": [
                "bulk",
                "block",
                "insider",
                "sast"
              ]
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Max deals (default 25, max 100).",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "symbol": "RELIANCE",
                    "deal_type": "all",
                    "count": 2,
                    "deals": [
                      {
                        "deal_kind": "block",
                        "entity_name": "The Mtbj Ltd. As Trst For Govrnmnt Pension Invstmnt Fund Mutb400045794",
                        "side": "Buy",
                        "quantity": "719579",
                        "price": "1310.0",
                        "value": null,
                        "trade_date": "2026-06-24"
                      },
                      {
                        "deal_kind": "block",
                        "entity_name": "The Mtbj Ltd. As Trst For Govrnmnt Pension Invstmnt Fund Mtbj400045828",
                        "side": "Sell",
                        "quantity": "719579",
                        "price": "1310.0",
                        "value": null,
                        "trade_date": "2026-06-24"
                      }
                    ]
                  },
                  "meta": {
                    "symbol": "RELIANCE",
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "getStockDeals"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The symbol, index or document does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/stocks/{symbol}/pledge": {
      "get": {
        "operationId": "getPromoterPledge",
        "summary": "Promoter share pledge",
        "description": "Percentage of promoter holding pledged over recent quarters plus recent pledge creation/release events.",
        "tags": [
          "stocks"
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Stock or index symbol, e.g. \"RELIANCE\", \"TCS\", \"NIFTY\". Percent-encode symbols containing \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "maxLength": 64
            },
            "example": "RELIANCE"
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "symbol": "ADANIPORTS",
                    "available": true,
                    "latest_pledged_pct_of_promoter_holding": "0",
                    "quarterly_trend": [
                      {
                        "quarter": "2026-09-30",
                        "pct_promoter_holding_pledged": "0",
                        "pct_total_shares_pledged": "0.75",
                        "promoter_holding_pct": "66.03"
                      },
                      {
                        "quarter": "2026-06-30",
                        "pct_promoter_holding_pledged": "0",
                        "pct_total_shares_pledged": "0.75",
                        "promoter_holding_pct": "66.03"
                      }
                    ],
                    "recent_events": [
                      {
                        "event_type": "Release",
                        "event_pct": "0.03",
                        "post_event_pct": "8.46",
                        "promoter_name": "Gautam S. Adani &  Rajesh S. Adani (on behalf of S. B. Adani Family Trust)",
                        "reporting_date": "2022-04-01"
                      },
                      {
                        "event_type": "Creation",
                        "event_pct": "0.34",
                        "post_event_pct": "9.26",
                        "promoter_name": "Gautam S. Adani &  Rajesh S. Adani (on behalf of S. B. Adani Family Trust)",
                        "reporting_date": "2022-02-28"
                      }
                    ]
                  },
                  "meta": {
                    "symbol": "ADANIPORTS",
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "getPromoterPledge"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The symbol, index or document does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/stocks/{symbol}/ratings": {
      "get": {
        "operationId": "getCreditRatings",
        "summary": "Credit ratings",
        "description": "Credit-rating actions: agency, rating, action (upgrade/downgrade/reaffirm) and outlook over time.",
        "tags": [
          "stocks"
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Stock or index symbol, e.g. \"RELIANCE\", \"TCS\", \"NIFTY\". Percent-encode symbols containing \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "maxLength": 64
            },
            "example": "RELIANCE"
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "symbol": "RELIANCE",
                    "available": true,
                    "count": 5,
                    "ratings": [
                      {
                        "agency": "CRISIL Ratings Limited",
                        "credit_rating": "CRISIL AAA",
                        "rating_action": "Reaffirm",
                        "outlook": "Stable",
                        "rating_date": "2026-09-25"
                      },
                      {
                        "agency": "CARE Ratings Limited",
                        "credit_rating": "CARE AAA",
                        "rating_action": "Reaffirm",
                        "outlook": "Stable",
                        "rating_date": "2026-09-25"
                      }
                    ]
                  },
                  "meta": {
                    "symbol": "RELIANCE",
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "getCreditRatings"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The symbol, index or document does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/stocks/{symbol}/options": {
      "get": {
        "operationId": "getOptionsAnalytics",
        "summary": "Options analytics per expiry",
        "description": "Derivatives analytics for one underlying: ATM IV, IV rank/percentile, realised vol, put-call ratios, max pain, 25-delta skew and OI, per expiry.",
        "tags": [
          "options"
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Stock or index symbol, e.g. \"RELIANCE\", \"TCS\", \"NIFTY\". Percent-encode symbols containing \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "maxLength": 64
            },
            "example": "RELIANCE"
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "symbol": "RELIANCE",
                    "available": true,
                    "as_of": "2026-10-16",
                    "iv_rank": 0.477677596,
                    "iv_percentile": 0.7193675889,
                    "realized_vol_30d": null,
                    "notes": [
                      "realized_vol_30d is not computed for RELIANCE. It is produced by a separate trailing-window pass that currently covers only the major indices — treat it as unavailable for this underlying, not as zero volatility."
                    ],
                    "expiries": [
                      {
                        "expiry": "2026-10-27",
                        "days_to_expiry": 11,
                        "atm_strike": 1210,
                        "atm_iv": 0.2411640444,
                        "put_call_ratio_oi": 0.6103188667,
                        "put_call_ratio_volume": 0.4984914195,
                        "max_pain_strike": 1210,
                        "skew_25d": -0.05457247322,
                        "total_call_oi": 95369000,
                        "total_put_oi": 58205500,
                        "oi_thin": false
                      },
                      {
                        "expiry": "2026-11-23",
                        "days_to_expiry": 38,
                        "atm_strike": 1220,
                        "atm_iv": 0.2485222084,
                        "put_call_ratio_oi": 0.5613964687,
                        "put_call_ratio_volume": 0.3567027391,
                        "max_pain_strike": 1200,
                        "skew_25d": -0.01604826339,
                        "total_call_oi": 14952000,
                        "total_put_oi": 8394000,
                        "oi_thin": false
                      }
                    ]
                  },
                  "meta": {
                    "symbol": "RELIANCE",
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "getOptionsAnalytics"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The symbol, index or document does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/stocks/{symbol}/earnings-calls": {
      "get": {
        "operationId": "getEarningsCallSummary",
        "summary": "Earnings call summaries",
        "description": "AI-generated digests of recent earnings-call transcripts and investor presentations: summary, highlights, risks, guidance and headline metrics.",
        "tags": [
          "stocks"
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Stock or index symbol, e.g. \"RELIANCE\", \"TCS\", \"NIFTY\". Percent-encode symbols containing \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "maxLength": 64
            },
            "example": "RELIANCE"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Number of recent summaries (default 2, max 5).",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 5
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "symbol": "TCS",
                    "available": true,
                    "count": 2,
                    "summaries": []
                  },
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "getEarningsCallSummary"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The symbol, index or document does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/stocks/{symbol}/documents": {
      "get": {
        "operationId": "listCompanyDocuments",
        "summary": "List parsed filings",
        "description": "Index of a company's filings parsed to text — concall transcripts, annual reports, investor presentations, IPO documents — with doc_id, type, period, date, page count, availability flags and public links to the PDF, full Markdown and summary. No prose. Newest first.",
        "tags": [
          "stocks"
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Stock or index symbol, e.g. \"RELIANCE\", \"TCS\", \"NIFTY\". Percent-encode symbols containing \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "maxLength": 64
            },
            "example": "RELIANCE"
          },
          {
            "name": "doc_types",
            "in": "query",
            "required": false,
            "description": "Comma-separated document types to include (default: all).",
            "schema": {
              "type": "string",
              "description": "Comma-separated list; each item one of: concall, annual_report, presentation, drhp, rhp.",
              "x-max-items": 5,
              "x-item-enum": [
                "concall",
                "annual_report",
                "presentation",
                "drhp",
                "rhp"
              ]
            },
            "example": "annual_report,concall"
          },
          {
            "name": "since",
            "in": "query",
            "required": false,
            "description": "Only filings dated on/after this date, YYYY-MM-DD.",
            "schema": {
              "type": "string",
              "format": "date",
              "x-min": "1900-01-01",
              "x-max": "2100-12-31"
            },
            "example": "2025-04-01"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Max documents (default 20, max 50).",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "symbol": "TCS",
                    "count": 2,
                    "documents": [
                      {
                        "doc_id": 23262437,
                        "doc_type": "concall",
                        "period": "Jul 2026",
                        "doc_date": "2026-07-01",
                        "title": "Concall - Jul 2026",
                        "num_pages": 25,
                        "has_markdown": true,
                        "has_summary": true,
                        "summary_chars": 8644,
                        "parse_quality": "ok",
                        "source_url": "https://www.bseindia.com/stockinfo/AnnPdfOpen.aspx?Pname=27523cab-de62-4f78-939a-6d9853bbd060.pdf",
                        "links": {
                          "pdf_url": "https://filings.tapetide.com/raw/concall/{company}/23262437.pdf",
                          "markdown_url": "https://filings.tapetide.com/documents/concall/{company}/23262437.md",
                          "summary_url": "https://filings.tapetide.com/summaries/concall/7080/23262437.md",
                          "page_markdown_url_pattern": "https://filings.tapetide.com/documents/concall/{company}/23262437.p{page}.md",
                          "page_url_note": "Replace {page} with the page number zero-padded to 3 digits: page 7 -> .p007.md, page 136 -> .p136.md. Unpadded (.p7.md) is 404.",
                          "page_1_markdown_url": "https://filings.tapetide.com/documents/concall/{company}/23262437.p001.md"
                        }
                      },
                      {
                        "doc_id": 23096642,
                        "doc_type": "concall",
                        "period": "Jul 2026",
                        "doc_date": "2026-07-01",
                        "title": "Concall - Jul 2026",
                        "num_pages": 29,
                        "has_markdown": true,
                        "has_summary": true,
                        "summary_chars": 9781,
                        "parse_quality": "ok",
                        "source_url": "https://www.tcs.com/content/dam/tcs/investor-relations/financial-statements/2025-26/q1/Management%20Commentary/Transcript%20of%20the%20Q1%202025-26%20Earnings%20Conference%20Call%20held%20at%201900%20hrs%20IST%20on%20Jul%2010,%202025.pdf",
                        "links": {
                          "pdf_url": "https://filings.tapetide.com/raw/concall/{company}/23096642.pdf",
                          "markdown_url": "https://filings.tapetide.com/documents/concall/{company}/23096642.md",
                          "summary_url": "https://filings.tapetide.com/summaries/concall/7080/23096642.md",
                          "page_markdown_url_pattern": "https://filings.tapetide.com/documents/concall/{company}/23096642.p{page}.md",
                          "page_url_note": "Replace {page} with the page number zero-padded to 3 digits: page 7 -> .p007.md, page 136 -> .p136.md. Unpadded (.p7.md) is 404.",
                          "page_1_markdown_url": "https://filings.tapetide.com/documents/concall/{company}/23096642.p001.md"
                        }
                      }
                    ],
                    "access": "Each document offers four ways in: GET /v1/stocks/{symbol}/documents/summary (digest as payload, default), GET /v1/stocks/{symbol}/documents/read (pages as payload), links.markdown_url (download the full Markdown and search it locally), ...",
                    "notes": []
                  },
                  "meta": {
                    "symbol": "TCS",
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listCompanyDocuments"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The symbol, index or document does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/stocks/{symbol}/documents/summary": {
      "get": {
        "operationId": "getDocumentSummary",
        "summary": "Document investor digest",
        "description": "Investor digest of one parsed filing: summary (capped at 6,000 chars with a truncated flag), highlights, risks, guidance, key metrics, plus links to the PDF and full Markdown. Pass doc_id, or doc_type for the newest of that type.",
        "tags": [
          "stocks"
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Stock or index symbol, e.g. \"RELIANCE\", \"TCS\", \"NIFTY\". Percent-encode symbols containing \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "maxLength": 64
            },
            "example": "RELIANCE"
          },
          {
            "name": "doc_id",
            "in": "query",
            "required": false,
            "description": "A doc_id from the documents index.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 2147483647
            }
          },
          {
            "name": "doc_type",
            "in": "query",
            "required": false,
            "description": "Newest document of this type when doc_id is omitted.",
            "schema": {
              "type": "string",
              "enum": [
                "concall",
                "annual_report",
                "presentation",
                "drhp",
                "rhp"
              ]
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "symbol": "TCS",
                    "available": true,
                    "doc_id": 23262437,
                    "doc_type": "concall",
                    "period": "Jul 2026",
                    "doc_date": "2026-07-15",
                    "num_pages": 25,
                    "parse_quality": "ok",
                    "summary": "# TCS Q1 FY2027 Earnings Summary\n\n## Revenue and Profitability Performance\n\nTCS delivered Q1 FY2027 revenue of ₹72,275 crore, representing 2.2% sequential growth and 13.9% year-on-year growth in rupee terms. In dollar terms, revenue was ...",
                    "truncated": true,
                    "full_length": 8644,
                    "highlights": [
                      "Revenue growth of 13.9% YoY (₹72,275 crore) and 2.2% QoQ, marking fourth consecutive quarter of growth",
                      "AI services revenue reached $2.6 billion annualized, up 13.6% QoQ"
                    ],
                    "risks": [
                      "Ongoing geopolitical uncertainties continuing to cause client project deferrals; timing of demand normalization uncertain",
                      "Consumer segment under significant pressure from airline and non-essential retail weakness in North America"
                    ],
                    "guidance": [
                      "Company does not provide specific revenue or earnings guidance",
                      "Management expects demand to \"resume at some time in Q2\" due to pent-up technology backlogs, though timing uncertain"
                    ],
                    "key_metrics": [
                      {
                        "value": "₹72,275 crore",
                        "metric": "Q1 Revenue (Rupee)",
                        "period": "Q1 FY2027"
                      },
                      {
                        "value": "$7,624 million",
                        "metric": "Q1 Revenue (Dollar)",
                        "period": "Q1 FY2027"
                      }
                    ],
                    "source_url": "https://www.bseindia.com/stockinfo/AnnPdfOpen.aspx?Pname=27523cab-de62-4f78-939a-6d9853bbd060.pdf",
                    "links": {
                      "pdf_url": "https://filings.tapetide.com/raw/concall/{company}/23262437.pdf",
                      "markdown_url": "https://filings.tapetide.com/documents/concall/{company}/23262437.md",
                      "summary_url": "https://filings.tapetide.com/summaries/concall/7080/23262437.md",
                      "page_markdown_url_pattern": "https://filings.tapetide.com/documents/concall/{company}/23262437.p{page}.md",
                      "page_url_note": "Replace {page} with the page number zero-padded to 3 digits: page 7 -> .p007.md, page 136 -> .p136.md. Unpadded (.p7.md) is 404.",
                      "page_1_markdown_url": "https://filings.tapetide.com/documents/concall/{company}/23262437.p001.md"
                    },
                    "read_more": "For the text: GET /v1/stocks/{symbol}/documents/read with doc_id=23262437 and a page range, or download links.markdown_url and search it locally."
                  },
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "getDocumentSummary"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The symbol, index or document does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/stocks/{symbol}/documents/read": {
      "get": {
        "operationId": "readDocument",
        "summary": "Read filing text by page range",
        "description": "Markdown text of a parsed filing by doc_id and page range, with <!-- page N --> markers. At most 12 pages / 24,000 chars per call (max_chars up to 60,000); the response states pages_returned and next_pages and carries links to the full Markdown and PDF for local search.",
        "tags": [
          "stocks"
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Stock or index symbol, e.g. \"RELIANCE\", \"TCS\", \"NIFTY\". Percent-encode symbols containing \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "maxLength": 64
            },
            "example": "RELIANCE"
          },
          {
            "name": "doc_id",
            "in": "query",
            "required": true,
            "description": "A doc_id from the documents index.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 2147483647
            }
          },
          {
            "name": "pages",
            "in": "query",
            "required": false,
            "description": "Inclusive 1-based range: \"1-8\", \"12\", \"40-\". Default \"1-12\".",
            "schema": {
              "type": "string"
            },
            "example": "1-8"
          },
          {
            "name": "max_chars",
            "in": "query",
            "required": false,
            "description": "Character cap for this call (default 24,000).",
            "schema": {
              "type": "integer",
              "minimum": 2000,
              "maximum": 60000
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "symbol": "TCS",
                    "doc_id": 26499590,
                    "doc_type": "concall",
                    "period": "Q2 FY2027",
                    "pages": "1",
                    "pages_returned": [
                      1
                    ],
                    "next_pages": "2",
                    "text": "<!-- page 1 -->\n# Tata Consultancy Services Ltd: Q2 FY2027 earnings call\n\nModerator: Ladies and gentlemen, good day and welcome to the TCS earnings conference call..."
                  },
                  "meta": {
                    "symbol": "TCS",
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "readDocument"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The symbol, index or document does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/documents/{doc_id}/summary": {
      "get": {
        "operationId": "getDocumentSummaryById",
        "summary": "Document investor digest by doc_id",
        "description": "Investor digest of one parsed filing, addressed by its doc_id alone (the doc_id names its company): summary (capped at 6,000 chars with a truncated flag), highlights, risks, guidance, key metrics, plus links to the PDF and full Markdown. Same response as `/v1/stocks/{symbol}/documents/summary?doc_id=`. An unknown doc_id is a 404.",
        "tags": [
          "stocks"
        ],
        "parameters": [
          {
            "name": "doc_id",
            "in": "path",
            "required": true,
            "description": "A doc_id from the documents index (GET /v1/stocks/{symbol}/documents). Names exactly one company's filing; positive integer, no leading zeros.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 2147483647
            },
            "example": 23262437
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "symbol": "TCS",
                    "available": true,
                    "doc_id": 23262437,
                    "doc_type": "concall",
                    "period": "Jul 2026",
                    "doc_date": "2026-07-15",
                    "num_pages": 25,
                    "parse_quality": "ok",
                    "summary": "# TCS Q1 FY2027 Earnings Summary\n\n## Revenue and Profitability Performance\n\nTCS delivered Q1 FY2027 revenue of ₹72,275 crore, representing 2.2% sequential growth and 13.9% year-on-year growth in rupee terms. In dollar terms, revenue was ...",
                    "truncated": true,
                    "full_length": 8644,
                    "highlights": [
                      "Revenue growth of 13.9% YoY (₹72,275 crore) and 2.2% QoQ, marking fourth consecutive quarter of growth",
                      "AI services revenue reached $2.6 billion annualized, up 13.6% QoQ"
                    ],
                    "risks": [
                      "Ongoing geopolitical uncertainties continuing to cause client project deferrals; timing of demand normalization uncertain",
                      "Consumer segment under significant pressure from airline and non-essential retail weakness in North America"
                    ],
                    "guidance": [
                      "Company does not provide specific revenue or earnings guidance",
                      "Management expects demand to \"resume at some time in Q2\" due to pent-up technology backlogs, though timing uncertain"
                    ],
                    "key_metrics": [
                      {
                        "value": "₹72,275 crore",
                        "metric": "Q1 Revenue (Rupee)",
                        "period": "Q1 FY2027"
                      },
                      {
                        "value": "$7,624 million",
                        "metric": "Q1 Revenue (Dollar)",
                        "period": "Q1 FY2027"
                      }
                    ],
                    "source_url": "https://www.bseindia.com/stockinfo/AnnPdfOpen.aspx?Pname=27523cab-de62-4f78-939a-6d9853bbd060.pdf",
                    "links": {
                      "pdf_url": "https://filings.tapetide.com/raw/concall/{company}/23262437.pdf",
                      "markdown_url": "https://filings.tapetide.com/documents/concall/{company}/23262437.md",
                      "summary_url": "https://filings.tapetide.com/summaries/concall/7080/23262437.md",
                      "page_markdown_url_pattern": "https://filings.tapetide.com/documents/concall/{company}/23262437.p{page}.md",
                      "page_url_note": "Replace {page} with the page number zero-padded to 3 digits: page 7 -> .p007.md, page 136 -> .p136.md. Unpadded (.p7.md) is 404.",
                      "page_1_markdown_url": "https://filings.tapetide.com/documents/concall/{company}/23262437.p001.md"
                    },
                    "read_more": "For the text: GET /v1/stocks/{symbol}/documents/read with doc_id=23262437 and a page range, or download links.markdown_url and search it locally."
                  },
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "getDocumentSummaryById"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The symbol, index or document does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/documents/{doc_id}/read": {
      "get": {
        "operationId": "readDocumentById",
        "summary": "Read filing text by doc_id",
        "description": "Markdown text of a parsed filing addressed by its doc_id alone (the doc_id names its company), by page range, with <!-- page N --> markers. At most 12 pages / 24,000 chars per call (max_chars up to 60,000); the response states pages_returned and next_pages and carries links to the full Markdown and PDF for local search. Same response as `/v1/stocks/{symbol}/documents/read?doc_id=`. An unknown doc_id is a 404.",
        "tags": [
          "stocks"
        ],
        "parameters": [
          {
            "name": "doc_id",
            "in": "path",
            "required": true,
            "description": "A doc_id from the documents index (GET /v1/stocks/{symbol}/documents). Names exactly one company's filing; positive integer, no leading zeros.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 2147483647
            },
            "example": 26499590
          },
          {
            "name": "pages",
            "in": "query",
            "required": false,
            "description": "Inclusive 1-based range: \"1-8\", \"12\", \"40-\". Default \"1-12\".",
            "schema": {
              "type": "string"
            },
            "example": "1-8"
          },
          {
            "name": "max_chars",
            "in": "query",
            "required": false,
            "description": "Character cap for this call (default 24,000).",
            "schema": {
              "type": "integer",
              "minimum": 2000,
              "maximum": 60000
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "symbol": "TCS",
                    "doc_id": 26499590,
                    "doc_type": "concall",
                    "period": "Q2 FY2027",
                    "pages": "1",
                    "pages_returned": [
                      1
                    ],
                    "next_pages": "2",
                    "text": "<!-- page 1 -->\n# Tata Consultancy Services Ltd: Q2 FY2027 earnings call\n\nModerator: Ladies and gentlemen, good day and welcome to the TCS earnings conference call..."
                  },
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "readDocumentById"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The symbol, index or document does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/stocks/{symbol}/ownership": {
      "get": {
        "operationId": "getStockOwnership",
        "summary": "Dividend yield history and mutual fund positions",
        "description": "Two ownership series in one call. `dividends`: dividend per share (INR) and dividend yield (%) by calendar year. `mutual_funds`: every scheme reported holding the stock in any of the last 12 monthly portfolio disclosures, with its ISIN and a per-month series of shares held and % of scheme AUM, newest month first. A scheme that exited stays listed with zero shares in the months after its exit. A zero can also mean the fund house has not yet published that month (portfolios fill in by about the 10th of the following month), so compare adjacent months before reading a zero as a sale. For one month's positions with paging, use `/v1/stocks/{symbol}/mutual-fund-holdings`.",
        "tags": [
          "stocks"
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Stock or index symbol, e.g. \"RELIANCE\", \"TCS\", \"NIFTY\". Percent-encode symbols containing \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "maxLength": 64
            },
            "example": "RELIANCE"
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "dividends": [
                      {
                        "year": 2017,
                        "dividend_per_share": 47,
                        "dividend_yield_pct": 3.3,
                        "exchange": "NSE"
                      },
                      {
                        "year": 2018,
                        "dividend_per_share": 50,
                        "dividend_yield_pct": 2.5,
                        "exchange": "NSE"
                      }
                    ],
                    "mutual_funds": [
                      {
                        "scheme_name": "ICICI Prudential Quality Fund Direct-Growth",
                        "scheme_isin": "INF109K1A187",
                        "shares_held": 175946,
                        "pct_of_scheme_aum": 1.8019,
                        "shares_change_1m": 175946,
                        "pct_of_scheme_aum_change_1m": 1.8,
                        "months": [
                          {
                            "month": "2026-09",
                            "shares_held": 175946,
                            "pct_of_scheme_aum": 1.8019
                          },
                          {
                            "month": "2026-08",
                            "shares_held": 0,
                            "pct_of_scheme_aum": 0
                          }
                        ]
                      },
                      {
                        "scheme_name": "SBI Nifty200 Quality 30 Index Fund Direct-Growth",
                        "scheme_isin": "INF200KB1811",
                        "shares_held": 75196,
                        "pct_of_scheme_aum": 5.0866,
                        "shares_change_1m": 75196,
                        "pct_of_scheme_aum_change_1m": 5.09,
                        "months": [
                          {
                            "month": "2026-09",
                            "shares_held": 75196,
                            "pct_of_scheme_aum": 5.0866
                          },
                          {
                            "month": "2026-08",
                            "shares_held": 0,
                            "pct_of_scheme_aum": 0
                          }
                        ]
                      }
                    ]
                  },
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "getStockOwnership"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The symbol, index or document does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/stocks/{symbol}/adjustment-factors": {
      "get": {
        "operationId": "getAdjustmentFactors",
        "summary": "Split/bonus adjustment factors with unquantified events",
        "description": "The split and bonus adjustment-factor timeline used to adjust the price series, oldest first: ex-date, action type, ratio, factor, cumulative factor, a confidence label and whether a second record corroborates the event. `meta.reconstruction` gives the formula to rebuild the raw (unadjusted) series. `unquantified_events` lists rights issues and demergers that are known but have NO reliable numeric factor (a rights adjustment needs the subscription price; a demerger is not a single number): do not invent a factor for them, and treat a price gap on those ex-dates as suspect rather than as a return. Factors cover splits and bonuses only; the adjusted series is price-return, not total-return. The paged, typed view of the same events is `/v1/stocks/{symbol}/corporate-adjustments`.",
        "tags": [
          "stocks"
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Stock or index symbol, e.g. \"RELIANCE\", \"TCS\", \"NIFTY\". Percent-encode symbols containing \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "maxLength": 64
            },
            "example": "RELIANCE"
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "events": [
                      {
                        "action_type": "bonus",
                        "confidence": "high",
                        "corroborated": false,
                        "cumulative_factor": 0.125,
                        "ex_date": "2009-11-26",
                        "factor": 0.5,
                        "ratio_den": 1,
                        "ratio_num": 1
                      },
                      {
                        "action_type": "bonus",
                        "confidence": "high",
                        "corroborated": true,
                        "cumulative_factor": 0.25,
                        "ex_date": "2017-09-07",
                        "factor": 0.5,
                        "ratio_den": 1,
                        "ratio_num": 1
                      }
                    ],
                    "unquantified_events": [
                      {
                        "ex_date": "2020-05-13",
                        "action_type": "rights",
                        "description": "Purchase additional shares at a discounted price before they are offered to the public.",
                        "reason": "No reliable price-adjustment factor: a rights adjustment needs the subscription price, and a demerger is not a single factor."
                      }
                    ]
                  },
                  "meta": {
                    "count": 3,
                    "unquantified_count": 1,
                    "series_adjusted": "split_bonus_adjusted",
                    "dividend_adjusted": false,
                    "reconstruction": "raw_close(d) = adjusted_close(d) / cumulative_factor_of_next_future_event(d); dates on/after the latest ex_date have cumulative_factor 1.0 (adjusted == raw). Factors cover splits + bonuses only — the adjusted series is price-return, not ...",
                    "unquantified_events_note": "rights issues and mergers/demergers are listed separately with NO factor: they cannot be reliably adjusted from available data (rights need the subscription price; demergers are not a scalar factor). Treat a price gap on these ex_dates a...",
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "getAdjustmentFactors"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The symbol, index or document does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/stocks/{symbol}/observation-status": {
      "get": {
        "operationId": "getObservationStatus",
        "summary": "Per-day observation status",
        "description": "For every calendar day in the lookback window, oldest first, why a price is or is not present: `traded`, `weekend`, `holiday`, `pre_listing`, `delisted` or `no_print`. Use it before computing returns over a series with gaps. A `no_print` day is a listed trading day with no price bar: treat it as not-a-return (carry forward or mask), never as 0%. `meta.status_counts` tallies the window; `meta.codes` defines each status and `meta.classification_limits` states what the labels cannot tell apart (`no_print` does not separate an illiquid no-trade from a suspension or missing data; `pre_listing` needs a known listing date). `traded` counts every price bar held, including bars `/v1/stocks/{symbol}/prices/daily` withholds as unverified, so that route can return fewer rows.",
        "tags": [
          "stocks"
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Stock or index symbol, e.g. \"RELIANCE\", \"TCS\", \"NIFTY\". Percent-encode symbols containing \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "maxLength": 64
            },
            "example": "RELIANCE"
          },
          {
            "name": "days",
            "in": "query",
            "required": false,
            "description": "Calendar days to look back, ending today (default 365, max 10000).",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 10000
            },
            "example": "30"
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": [
                    {
                      "date": "2026-10-09",
                      "status": "traded"
                    },
                    {
                      "date": "2026-10-10",
                      "status": "weekend"
                    }
                  ],
                  "meta": {
                    "days": 10,
                    "count": 11,
                    "status_counts": {
                      "no_print": 1,
                      "traded": 6,
                      "weekend": 4
                    },
                    "codes": {
                      "traded": "A daily price bar exists for the day.",
                      "weekend": "Saturday or Sunday: the exchange is closed.",
                      "holiday": "Full-day exchange holiday. Special sessions (e.g. Muhurat) are trading days and are not counted here.",
                      "pre_listing": "Before the security's listing date.",
                      "delisted": "On or after the date the security left the tracked universe (delisted, suspended or merged). That date can be a universe-rebuild date rather than the exact exchange effective date: read it as 'no longer listed around here', not a precise...",
                      "no_print": "A listed trading day with no price bar. Treat it as not-a-return (carry forward or mask), never as a 0% return: it may be an illiquid no-trade, a suspension or missing data."
                    },
                    "classification_limits": {
                      "pre_listing_requires_listing_date": "pre_listing can only be asserted where the listing date is known. Where it is not, days before the true listing are reported as no_print, so the absence of pre_listing is not evidence the security was trading.",
                      "delisted_boundary_is_universe_not_exchange": "The delisted boundary is when the security left the tracked universe, often a rebuild date rather than the exchange delisting date, and it is known for only a small subset of securities.",
                      "no_print_is_deliberately_ambiguous": "no_print deliberately does not distinguish an illiquid no-trade from a suspension or missing data: no per-day suspension record is available, so a more specific reason would be invented."
                    },
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "getObservationStatus"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The symbol, index or document does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/stocks/{symbol}/identifiers": {
      "get": {
        "operationId": "getIdentifiersAsOf",
        "summary": "Symbol and ISIN held on a date",
        "description": "Which NSE symbol and ISIN a company carried on a date. `status` is `resolved`, `no_identifier_on_date` or `out_of_coverage`; `identifiers` holds, per identifier kind, the value, its state (`present`, or `uncertain` inside an unobserved bracket around a rename or ISIN change, where every plausible value is listed) and the observed range it held it. Pass the symbol the company trades as today; a date outside `meta.coverage` answers `out_of_coverage`, which is a coverage limit, not 'no identifiers'. The full spell history is at `/v1/reference/symbol-history/{symbol}`.",
        "tags": [
          "reference"
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Stock or index symbol, e.g. \"RELIANCE\", \"TCS\", \"NIFTY\". Percent-encode symbols containing \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "maxLength": 64
            },
            "example": "RELIANCE"
          },
          {
            "name": "date",
            "in": "query",
            "required": false,
            "description": "As-of date, YYYY-MM-DD. Default: today (IST).",
            "schema": {
              "type": "string",
              "format": "date",
              "x-min": "1900-01-01",
              "x-max": "2100-12-31"
            },
            "example": "2024-01-15"
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "symbol": "ETERNAL",
                    "date": "2024-01-15",
                    "status": "resolved",
                    "identifiers": {
                      "isin": {
                        "certain_range": [
                          "2021-07-23",
                          "2026-10-16"
                        ],
                        "state": "present",
                        "value": "INE758T01015"
                      },
                      "nse_symbol": {
                        "certain_range": [
                          "2021-07-23",
                          "2025-04-08"
                        ],
                        "state": "present",
                        "value": "ZOMATO"
                      }
                    }
                  },
                  "meta": {
                    "coverage": {
                      "from": "2016-01-01",
                      "through": "2026-10-16",
                      "note": "Dates outside [from, through] answer out_of_coverage: there is no observation there, and the answer does not guess. A null bound means unbounded on that side, not 'no coverage'."
                    },
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "getIdentifiersAsOf"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The symbol, index or document does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/reference/resolve": {
      "get": {
        "operationId": "resolveIdentifier",
        "summary": "Resolve a symbol or ISIN as of a date",
        "description": "Resolve a historical NSE symbol or ISIN to the company that held it on a date, for old holdings files or backtests where a ticker may since have been renamed or reused. `status` is `present`, `uncertain` (the date is in an unobserved bracket around a rename or ISIN change: quarantine it rather than assert the mapping), `not_found` (no company held the value on that date, within coverage) or `out_of_coverage` (outside `meta.coverage`: never report it as 'no such symbol'). Coverage usually ends a session or two before today, so a call without `date` can answer `out_of_coverage`. Every company that matches is listed in `matches` with its state, observed range and its latest known `symbol` and `isin` for the per-stock routes; a recycled ticker therefore shows both holders.",
        "tags": [
          "reference"
        ],
        "parameters": [
          {
            "name": "value",
            "in": "query",
            "required": true,
            "description": "The identifier to resolve: an NSE symbol or an ISIN.",
            "schema": {
              "type": "string"
            },
            "example": "ZOMATO"
          },
          {
            "name": "kind",
            "in": "query",
            "required": false,
            "description": "Which identifier `value` is (default nse_symbol).",
            "schema": {
              "type": "string",
              "enum": [
                "nse_symbol",
                "isin"
              ]
            }
          },
          {
            "name": "date",
            "in": "query",
            "required": false,
            "description": "As-of date, YYYY-MM-DD. Default: today (IST).",
            "schema": {
              "type": "string",
              "format": "date",
              "x-min": "1900-01-01",
              "x-max": "2100-12-31"
            },
            "example": "2024-01-15"
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "value": "TRENT",
                    "kind": "nse_symbol",
                    "date": "2024-01-15",
                    "status": "present",
                    "matches": [
                      {
                        "certain_range": [
                          "2016-01-01",
                          "2026-10-16"
                        ],
                        "left_censored": true,
                        "right_censored": true,
                        "state": "present",
                        "symbol": "TRENT",
                        "isin": "INE849A01020"
                      }
                    ]
                  },
                  "meta": {
                    "coverage": {
                      "from": "2016-01-01",
                      "through": "2026-10-16",
                      "note": "Dates outside [from, through] answer out_of_coverage: there is no observation there, and the answer does not guess. A null bound means unbounded on that side, not 'no coverage'."
                    },
                    "states": {
                      "present": "The date is inside the range the company was observed holding the value [first_seen, last_seen].",
                      "uncertain": "The date is in an unobserved bracket around a rename or ISIN change: plausible, not proven. Quarantine it.",
                      "not_found": "No company held the value on the date, within coverage.",
                      "out_of_coverage": "The date is outside the observed coverage window."
                    },
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "resolveIdentifier"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The symbol, index or document does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/quotes": {
      "get": {
        "operationId": "getBatchQuotes",
        "summary": "Batch quotes",
        "description": "Latest quotes for up to 20 symbols in one call. Over 20 is rejected with 400; nothing is dropped silently.",
        "tags": [
          "stocks"
        ],
        "parameters": [
          {
            "name": "symbols",
            "in": "query",
            "required": true,
            "description": "Comma-separated symbols, max 20.",
            "schema": {
              "type": "string",
              "description": "Comma-separated list.",
              "x-max-items": 20
            },
            "example": "RELIANCE,TCS,HDFCBANK"
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": [
                    {
                      "change": -3.8,
                      "change_pct": -0.3127572016,
                      "found": true,
                      "high": 1215.4,
                      "low": 1193,
                      "name": "Reliance Industries Ltd",
                      "open": 1215,
                      "prev_close": 1215,
                      "price": 1211.2,
                      "requested": "RELIANCE",
                      "symbol": "RELIANCE",
                      "updated_at": "2026-10-16T10:29:44+00:00",
                      "volume": 17225283
                    },
                    {
                      "change": 115,
                      "change_pct": 4.893617021,
                      "found": true,
                      "high": 2484.7,
                      "low": 2375.7,
                      "name": "Tata Consultancy Services Ltd",
                      "open": 2382,
                      "prev_close": 2350,
                      "price": 2465,
                      "requested": "TCS",
                      "symbol": "TCS",
                      "updated_at": "2026-10-16T10:29:35+00:00",
                      "volume": 12166634
                    }
                  ],
                  "meta": {
                    "count": 2,
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "getBatchQuotes"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The symbol, index or document does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/market/pulse": {
      "get": {
        "operationId": "getMarketPulse",
        "summary": "Market pulse",
        "description": "Today's snapshot: FII/DII net flows, Nifty 50 valuations (PE/PB/DY) and the India VIX.",
        "tags": [
          "market"
        ],
        "parameters": [],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "fii_dii": {
                      "monthly": [
                        {
                          "combined": -600.88,
                          "dii_net": 48168.13,
                          "fii_net": -48769.01,
                          "month": "Oct 2026"
                        },
                        {
                          "combined": 32017.47,
                          "dii_net": 76030.29,
                          "fii_net": -44012.82,
                          "month": "Sep 2026"
                        }
                      ],
                      "summary": {
                        "dii_1yr_cumulative": 885403.68,
                        "dii_net_30d": 119538.5,
                        "dii_net_5d": 7812.81,
                        "dii_streak": -1,
                        "dii_total_net": 119538.5,
                        "fii_1yr_cumulative": -505820.25,
                        "fii_net_30d": -100613.58,
                        "fii_net_5d": -8990.5,
                        "fii_streak": 1,
                        "fii_total_net": -100613.58,
                        "period_days": 30
                      },
                      "weekly": [
                        {
                          "combined": -1177.69,
                          "dii_net": 7812.81,
                          "fii_net": -8990.5,
                          "week_end": "2026-10-16"
                        },
                        {
                          "combined": 19.19,
                          "dii_net": 30313.48,
                          "fii_net": -30294.29,
                          "week_end": "2026-10-09"
                        }
                      ],
                      "yearly": [
                        {
                          "combined": 235866.51,
                          "dii_net": 687702.98,
                          "fii_net": -451836.47,
                          "year": 2026
                        },
                        {
                          "combined": 481765.29,
                          "dii_net": 788184.38,
                          "fii_net": -306419.09,
                          "year": 2025
                        }
                      ],
                      "latest_session": {
                        "dii_buy": 17201.8,
                        "dii_net": -3661.28,
                        "dii_sell": 20863.08,
                        "fii_buy": 19951.59,
                        "fii_net": 1165.92,
                        "fii_sell": 18785.67,
                        "trade_date": "2026-10-16",
                        "fno_positioning": {
                          "client": {
                            "idx_call_long": 3823581,
                            "idx_call_short": 3767056,
                            "idx_fut_long": 276618,
                            "idx_fut_short": 56704,
                            "idx_put_long": 4191151,
                            "idx_put_short": 4682637,
                            "stk_call_long": 2396725,
                            "stk_call_short": 1365136,
                            "stk_fut_long": 3453649,
                            "stk_fut_short": 294863,
                            "stk_put_long": 1064078,
                            "stk_put_short": 1205337,
                            "total_long": 15205802,
                            "total_short": 11371733
                          },
                          "dii": {
                            "idx_call_long": 10575,
                            "idx_call_short": 1900,
                            "idx_fut_long": 51503,
                            "idx_fut_short": 14310,
                            "idx_put_long": 89881,
                            "idx_put_short": 0,
                            "stk_call_long": 5225,
                            "stk_call_short": 428253,
                            "stk_fut_long": 352565,
                            "stk_fut_short": 4680162,
                            "stk_put_long": 47310,
                            "stk_put_short": 44127,
                            "total_long": 557059,
                            "total_short": 5168752
                          },
                          "fii": {
                            "idx_call_long": 707527,
                            "idx_call_short": 981202,
                            "idx_fut_long": 39966,
                            "idx_fut_short": 312965,
                            "idx_put_long": 1318296,
                            "idx_put_short": 797059,
                            "stk_call_long": 310336,
                            "stk_call_short": 467996,
                            "stk_fut_long": 3616748,
                            "stk_fut_short": 2840084,
                            "stk_put_long": 414657,
                            "stk_put_short": 290447,
                            "total_long": 6407530,
                            "total_short": 5689753
                          },
                          "pro": {
                            "idx_call_long": 1223426,
                            "idx_call_short": 1014951,
                            "idx_fut_long": 45888,
                            "idx_fut_short": 29996,
                            "idx_put_long": 1247278,
                            "idx_put_short": 1366909,
                            "stk_call_long": 1119074,
                            "stk_call_short": 1569975,
                            "stk_fut_long": 874777,
                            "stk_fut_short": 482630,
                            "stk_put_long": 1103283,
                            "stk_put_short": 1089417,
                            "total_long": 5613725,
                            "total_short": 5553878
                          }
                        }
                      },
                      "data": [
                        {
                          "dii_buy": 17201.8,
                          "dii_net": -3661.28,
                          "dii_sell": 20863.08,
                          "fii_buy": 19951.59,
                          "fii_net": 1165.92,
                          "fii_sell": 18785.67,
                          "trade_date": "2026-10-16"
                        },
                        {
                          "dii_buy": 19438.65,
                          "dii_net": 3319.39,
                          "dii_sell": 16119.26,
                          "fii_buy": 12735.59,
                          "fii_net": -5285.37,
                          "fii_sell": 18020.96,
                          "trade_date": "2026-10-15"
                        }
                      ],
                      "notes": [
                        "Amounts in Rs crore. data = daily cash-market flows, newest first; fno_positioning (open-interest contracts by participant) is given for latest_session only.",
                        "Calendar heatmaps are omitted; weekly/monthly/yearly carry the aggregates."
                      ]
                    },
                    "valuations": {
                      "as_of": "2026-10-14",
                      "index": {
                        "code": 13,
                        "slug": "nifty-50",
                        "name": "Nifty 50"
                      },
                      "latest": {
                        "date": "2026-10-14",
                        "pe": 19.33,
                        "pb": 2.78,
                        "divyield": 1.52
                      },
                      "data": {
                        "13": [
                          {
                            "date": "2025-10-17",
                            "pe": 22.78,
                            "pb": 3.52,
                            "divyield": 1.31
                          },
                          {
                            "date": "2025-10-24",
                            "pe": 22.67,
                            "pb": 3.53,
                            "divyield": 1.3
                          }
                        ]
                      },
                      "notes": [
                        "Weekly points, oldest first. pe and pb are ratios; divyield is the dividend yield in percent."
                      ]
                    },
                    "india_vix": {
                      "available": true,
                      "as_of": "2026-10-16",
                      "india_vix": "14.06",
                      "change_pct": "0.25"
                    }
                  },
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "getMarketPulse"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The symbol, index or document does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/market/fii-dii": {
      "get": {
        "operationId": "getFiiDii",
        "summary": "FII/DII institutional flows",
        "description": "Daily cash-market flows for the last 30 sessions, F&O participant positioning, weekly/monthly/yearly aggregates, streaks and cumulative flows. Add `chart_interval` for the cumulative-flow series.",
        "tags": [
          "market"
        ],
        "parameters": [
          {
            "name": "chart_interval",
            "in": "query",
            "required": false,
            "description": "Include cumulative flow chart data for this interval.",
            "schema": {
              "type": "string",
              "enum": [
                "1m",
                "3m",
                "6m",
                "1y",
                "5y"
              ]
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "flows": {
                      "monthly": [
                        {
                          "combined": -600.88,
                          "dii_net": 48168.13,
                          "fii_net": -48769.01,
                          "month": "Oct 2026"
                        },
                        {
                          "combined": 32017.47,
                          "dii_net": 76030.29,
                          "fii_net": -44012.82,
                          "month": "Sep 2026"
                        }
                      ],
                      "summary": {
                        "dii_1yr_cumulative": 885403.68,
                        "dii_net_30d": 119538.5,
                        "dii_net_5d": 7812.81,
                        "dii_streak": -1,
                        "dii_total_net": 119538.5,
                        "fii_1yr_cumulative": -505820.25,
                        "fii_net_30d": -100613.58,
                        "fii_net_5d": -8990.5,
                        "fii_streak": 1,
                        "fii_total_net": -100613.58,
                        "period_days": 30
                      },
                      "weekly": [
                        {
                          "combined": -1177.69,
                          "dii_net": 7812.81,
                          "fii_net": -8990.5,
                          "week_end": "2026-10-16"
                        },
                        {
                          "combined": 19.19,
                          "dii_net": 30313.48,
                          "fii_net": -30294.29,
                          "week_end": "2026-10-09"
                        }
                      ],
                      "yearly": [
                        {
                          "combined": 235866.51,
                          "dii_net": 687702.98,
                          "fii_net": -451836.47,
                          "year": 2026
                        },
                        {
                          "combined": 481765.29,
                          "dii_net": 788184.38,
                          "fii_net": -306419.09,
                          "year": 2025
                        }
                      ],
                      "latest_session": {
                        "dii_buy": 17201.8,
                        "dii_net": -3661.28,
                        "dii_sell": 20863.08,
                        "fii_buy": 19951.59,
                        "fii_net": 1165.92,
                        "fii_sell": 18785.67,
                        "trade_date": "2026-10-16",
                        "fno_positioning": {
                          "client": {
                            "idx_call_long": 3823581,
                            "idx_call_short": 3767056,
                            "idx_fut_long": 276618,
                            "idx_fut_short": 56704,
                            "idx_put_long": 4191151,
                            "idx_put_short": 4682637,
                            "stk_call_long": 2396725,
                            "stk_call_short": 1365136,
                            "stk_fut_long": 3453649,
                            "stk_fut_short": 294863,
                            "stk_put_long": 1064078,
                            "stk_put_short": 1205337,
                            "total_long": 15205802,
                            "total_short": 11371733
                          },
                          "dii": {
                            "idx_call_long": 10575,
                            "idx_call_short": 1900,
                            "idx_fut_long": 51503,
                            "idx_fut_short": 14310,
                            "idx_put_long": 89881,
                            "idx_put_short": 0,
                            "stk_call_long": 5225,
                            "stk_call_short": 428253,
                            "stk_fut_long": 352565,
                            "stk_fut_short": 4680162,
                            "stk_put_long": 47310,
                            "stk_put_short": 44127,
                            "total_long": 557059,
                            "total_short": 5168752
                          },
                          "fii": {
                            "idx_call_long": 707527,
                            "idx_call_short": 981202,
                            "idx_fut_long": 39966,
                            "idx_fut_short": 312965,
                            "idx_put_long": 1318296,
                            "idx_put_short": 797059,
                            "stk_call_long": 310336,
                            "stk_call_short": 467996,
                            "stk_fut_long": 3616748,
                            "stk_fut_short": 2840084,
                            "stk_put_long": 414657,
                            "stk_put_short": 290447,
                            "total_long": 6407530,
                            "total_short": 5689753
                          },
                          "pro": {
                            "idx_call_long": 1223426,
                            "idx_call_short": 1014951,
                            "idx_fut_long": 45888,
                            "idx_fut_short": 29996,
                            "idx_put_long": 1247278,
                            "idx_put_short": 1366909,
                            "stk_call_long": 1119074,
                            "stk_call_short": 1569975,
                            "stk_fut_long": 874777,
                            "stk_fut_short": 482630,
                            "stk_put_long": 1103283,
                            "stk_put_short": 1089417,
                            "total_long": 5613725,
                            "total_short": 5553878
                          }
                        }
                      },
                      "data": [
                        {
                          "dii_buy": 17201.8,
                          "dii_net": -3661.28,
                          "dii_sell": 20863.08,
                          "fii_buy": 19951.59,
                          "fii_net": 1165.92,
                          "fii_sell": 18785.67,
                          "trade_date": "2026-10-16"
                        },
                        {
                          "dii_buy": 19438.65,
                          "dii_net": 3319.39,
                          "dii_sell": 16119.26,
                          "fii_buy": 12735.59,
                          "fii_net": -5285.37,
                          "fii_sell": 18020.96,
                          "trade_date": "2026-10-15"
                        }
                      ],
                      "notes": [
                        "Amounts in Rs crore. data = daily cash-market flows, newest first; fno_positioning (open-interest contracts by participant) is given for latest_session only.",
                        "Calendar heatmaps are omitted; weekly/monthly/yearly carry the aggregates."
                      ]
                    }
                  },
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "getFiiDii"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The symbol, index or document does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/market/vix": {
      "get": {
        "operationId": "getIndiaVix",
        "summary": "India VIX",
        "description": "Latest India VIX, daily change and recent history.",
        "tags": [
          "market"
        ],
        "parameters": [],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "available": true,
                    "as_of": "2026-10-16",
                    "india_vix": "14.06",
                    "change_pct": "0.25",
                    "history": [
                      {
                        "trade_date": "2026-10-16",
                        "close": "14.06",
                        "pct_change": "0.25",
                        "open": "14.025",
                        "high": "14.5175",
                        "low": "12.79"
                      },
                      {
                        "trade_date": "2026-10-15",
                        "close": "14.03",
                        "pct_change": "-4.07",
                        "open": "14.625",
                        "high": "14.9475",
                        "low": "13.9075"
                      }
                    ]
                  },
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "getIndiaVix"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The symbol, index or document does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/market/fpi-sectors": {
      "get": {
        "operationId": "getFpiSectors",
        "summary": "FPI sector flows",
        "description": "Foreign portfolio investor sector-wise AUM share, fortnight change and 1-year cumulative flow.",
        "tags": [
          "market"
        ],
        "parameters": [],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "meta": {
                      "latest_report_date": "2026-09-30",
                      "latest_period_start": "2026-09-16",
                      "total_sectors": 24,
                      "total_aum": 7366912
                    },
                    "series_dates": [
                      "2025-09-30",
                      "2025-09-30"
                    ],
                    "note": "cumulative_flow_series[i] is the 1-year cumulative net FPI flow into the sector as of series_dates[i]. A sector whose dates differ carries cumulative_flow_points ({date, value}) instead. ranked_by_* list sector names in the backend's ord...",
                    "sectors": [
                      {
                        "sector": "Financial Services",
                        "aum_pct": 27.5,
                        "aum_total": 2025434,
                        "fortnight_change": -8120,
                        "flow_1y": -121394,
                        "cumulative_flow_series": [
                          0,
                          328
                        ]
                      },
                      {
                        "sector": "Healthcare",
                        "aum_pct": 7.2,
                        "aum_total": 530155,
                        "fortnight_change": 3,
                        "flow_1y": -16713,
                        "cumulative_flow_series": [
                          0,
                          -4521
                        ]
                      }
                    ],
                    "ranked_by_aum": [
                      "Financial Services",
                      "Healthcare"
                    ],
                    "ranked_by_fortnight_change": [
                      "Financial Services",
                      "Others"
                    ],
                    "ranked_by_1y_flow": [
                      "Financial Services",
                      "Sovereign"
                    ]
                  },
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "getFpiSectors"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The symbol, index or document does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/market/news": {
      "get": {
        "operationId": "getMarketNews",
        "summary": "Market news",
        "description": "Latest sentiment-tagged market-wide news with category and related symbols.",
        "tags": [
          "market"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Max results (default 20, max 50).",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50
            }
          },
          {
            "name": "category",
            "in": "query",
            "required": false,
            "description": "Category filter, e.g. global, markets, ipo, companies.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sentiment",
            "in": "query",
            "required": false,
            "description": "Sentiment filter.",
            "schema": {
              "type": "string",
              "enum": [
                "positive",
                "negative",
                "neutral"
              ]
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": [
                    {
                      "article_id": 6927761,
                      "body": null,
                      "category": "companies",
                      "publish_date": "2026-10-15T06:52:53Z",
                      "related_isins": null,
                      "sector": null,
                      "sentiment": "negative",
                      "source_url": null,
                      "sub_category": "Companies",
                      "symbol": null,
                      "title": "Dell Stock Falls 8% as Barclays Cuts Rating on AI Spending"
                    },
                    {
                      "article_id": 6927771,
                      "body": null,
                      "category": "companies",
                      "publish_date": "2026-10-14T15:36:09Z",
                      "related_isins": null,
                      "sector": null,
                      "sentiment": "negative",
                      "source_url": null,
                      "sub_category": "Companies,Equity Markets",
                      "symbol": null,
                      "title": "Hathway Cable Q2 profit drops 44% to ₹10.2 crore"
                    }
                  ],
                  "meta": {
                    "count": 5,
                    "limit": 50,
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "getMarketNews"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The symbol, index or document does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/market/trending": {
      "get": {
        "operationId": "getTrendingStocks",
        "summary": "Trending stocks by signal",
        "description": "Nifty 500 stocks that tripped a price signal in the current or latest session, in four buckets: `bullish` (day, 1-week or 2-week high breaks; above pivot resistance R1-R3), `bearish` (the matching low breaks; below support S1-S3), `near_52w_high` and `near_52w_low`. Each row carries LTP, absolute and % change, volume and the `signal` that put it in the bucket (e.g. `1_week_high_break`, `within_5pct_of_52w_low`). Each bucket shows up to 20 stocks; `bucket_totals` gives the full count. For ranked gainers, losers and most-active lists use `/v1/market/movers`.",
        "tags": [
          "market"
        ],
        "parameters": [],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "buckets": {
                      "bearish": [
                        {
                          "symbol": "HDFCLIFE",
                          "name": "HDFC Life Insurance",
                          "exchange": "NSE",
                          "ltp": 553,
                          "change": 2.45,
                          "change_pct": 0.45,
                          "volume": 5304276,
                          "signal": "1_week_low_break"
                        },
                        {
                          "symbol": "SWIGGY",
                          "name": "Swiggy",
                          "exchange": "NSE",
                          "ltp": 234.3,
                          "change": 5.3,
                          "change_pct": 2.31,
                          "volume": 7590739,
                          "signal": "2_week_low_break"
                        }
                      ],
                      "bullish": [
                        {
                          "symbol": "M&M",
                          "name": "Mahindra & Mahindra",
                          "exchange": "NSE",
                          "ltp": 2920.9,
                          "change": 59.2,
                          "change_pct": 2.07,
                          "volume": 2541998,
                          "signal": "above_resistance_1"
                        },
                        {
                          "symbol": "IOC",
                          "name": "Indian Oil Corporation",
                          "exchange": "NSE",
                          "ltp": 130.38,
                          "change": 1.55,
                          "change_pct": 1.2,
                          "volume": 11845114,
                          "signal": "above_resistance_1"
                        }
                      ],
                      "near_52w_high": [
                        {
                          "symbol": "RADICO",
                          "name": "Radico Khaitan",
                          "exchange": "NSE",
                          "ltp": 4473.4,
                          "change": 24.4,
                          "change_pct": 0.55,
                          "volume": 198075,
                          "signal": "within_10pct_of_52w_high"
                        },
                        {
                          "symbol": "COFORGE",
                          "name": "Coforge",
                          "exchange": "NSE",
                          "ltp": 1951.9,
                          "change": 17.6,
                          "change_pct": 0.91,
                          "volume": 2071569,
                          "signal": "within_7pct_of_52w_high"
                        }
                      ],
                      "near_52w_low": [
                        {
                          "symbol": "DABUR",
                          "name": "Dabur India",
                          "exchange": "NSE",
                          "ltp": 385,
                          "change": 1.7,
                          "change_pct": 0.44,
                          "volume": 603841,
                          "signal": "within_2pct_of_52w_low"
                        },
                        {
                          "symbol": "COLPAL",
                          "name": "Colgate Palmolive",
                          "exchange": "NSE",
                          "ltp": 1770.9,
                          "change": -10.2,
                          "change_pct": -0.57,
                          "volume": 416946,
                          "signal": "within_2pct_of_52w_low"
                        }
                      ]
                    },
                    "bucket_totals": {
                      "bearish": 28,
                      "bullish": 5,
                      "near_52w_high": 42,
                      "near_52w_low": 27
                    }
                  },
                  "meta": {
                    "universe": "Nifty 500",
                    "notes": [
                      "Each bucket shows up to 20 stocks; bucket_totals gives the full count.",
                      "change is the absolute price change; change_pct is the % change; signal is the condition that put the stock in the bucket."
                    ],
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "getTrendingStocks"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The symbol, index or document does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/market/valuations": {
      "get": {
        "operationId": "getMarketValuations",
        "summary": "Index valuations",
        "description": "Index PE, PB and dividend yield over time. Default Nifty 50, 5 years.",
        "tags": [
          "market"
        ],
        "parameters": [
          {
            "name": "index",
            "in": "query",
            "required": false,
            "description": "nifty-50 | nifty-500 | nifty-bank | nifty-midcap-50 | nifty-it | nifty-next-50 (default nifty-50).",
            "schema": {
              "type": "string"
            },
            "example": "nifty-50"
          },
          {
            "name": "years",
            "in": "query",
            "required": false,
            "description": "Years of history (default 5, max 20).",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 20
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "as_of": "2026-10-14",
                    "index": {
                      "code": 13,
                      "slug": "nifty-50",
                      "name": "Nifty 50"
                    },
                    "latest": {
                      "date": "2026-10-14",
                      "pe": 19.33,
                      "pb": 2.78,
                      "divyield": 1.52
                    },
                    "data": {
                      "13": [
                        {
                          "date": "2025-10-17",
                          "pe": 22.78,
                          "pb": 3.52,
                          "divyield": 1.31
                        },
                        {
                          "date": "2025-10-24",
                          "pe": 22.67,
                          "pb": 3.53,
                          "divyield": 1.3
                        }
                      ]
                    },
                    "notes": [
                      "Weekly points, oldest first. pe and pb are ratios; divyield is the dividend yield in percent."
                    ]
                  },
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "getMarketValuations"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The symbol, index or document does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/indices": {
      "get": {
        "operationId": "getIndexPerformance",
        "summary": "Rank indices by return",
        "description": "Rank ~140 NSE indices by return over completed weeks or months using official closing levels. Use `category=sectoral` for sector rankings.",
        "tags": [
          "indices"
        ],
        "parameters": [
          {
            "name": "periods",
            "in": "query",
            "required": false,
            "description": "Completed periods to measure (default 3).",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 12
            }
          },
          {
            "name": "granularity",
            "in": "query",
            "required": false,
            "description": "Period length (default week).",
            "schema": {
              "type": "string",
              "enum": [
                "week",
                "month"
              ]
            }
          },
          {
            "name": "category",
            "in": "query",
            "required": false,
            "description": "Index family: sectoral, broad, thematic, strategy, ...",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "names",
            "in": "query",
            "required": false,
            "description": "Explicit index names, comma-separated. Overrides category.",
            "schema": {
              "type": "string",
              "description": "Comma-separated list.",
              "x-max-items": 30
            },
            "example": "Nifty IT,Nifty Bank"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Indices to return after ranking (default 10).",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50
            }
          },
          {
            "name": "order",
            "in": "query",
            "required": false,
            "description": "Sort direction (default gainers).",
            "schema": {
              "type": "string",
              "enum": [
                "gainers",
                "losers"
              ]
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "granularity": "week",
                    "periods_requested": 2,
                    "order": "gainers",
                    "count": 10,
                    "universe_size": 140,
                    "truncated": true,
                    "window": {
                      "baseline_close_date": "2026-09-25",
                      "latest_close_date": "2026-10-09"
                    },
                    "indices": [
                      {
                        "index": "India VIX",
                        "category": "volatility",
                        "baseline_date": "2026-09-25",
                        "baseline_close": 12.16,
                        "latest_date": "2026-10-09",
                        "latest_close": 14.38,
                        "periods_measured": 2,
                        "period_returns": [
                          {
                            "period_start": "2026-09-28",
                            "close_date": "2026-10-01",
                            "close": 14.46,
                            "change_pct": 18.91
                          },
                          {
                            "period_start": "2026-10-05",
                            "close_date": "2026-10-09",
                            "close": 14.38,
                            "change_pct": -0.55
                          }
                        ],
                        "cumulative_pct": 18.26
                      },
                      {
                        "index": "Nifty Telecommunications",
                        "category": "sectoral",
                        "baseline_date": "2026-09-25",
                        "baseline_close": 3701.6,
                        "latest_date": "2026-10-09",
                        "latest_close": 3826.48,
                        "periods_measured": 2,
                        "period_returns": [
                          {
                            "period_start": "2026-09-28",
                            "close_date": "2026-10-01",
                            "close": 3697.51,
                            "change_pct": -0.11
                          },
                          {
                            "period_start": "2026-10-05",
                            "close_date": "2026-10-09",
                            "close": 3826.48,
                            "change_pct": 3.49
                          }
                        ],
                        "cumulative_pct": 3.37
                      }
                    ],
                    "methodology": "Official NSE index closes. Each week's close is its last trading session; return = close / prior week close - 1. Cumulative is computed from the endpoint closes, not by compounding the rounded per-period figures. The in-progress week is ..."
                  },
                  "meta": {
                    "source": "exchange-official",
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "getIndexPerformance"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The symbol, index or document does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/indices/{name}/history": {
      "get": {
        "operationId": "getIndexHistory",
        "summary": "Index level history",
        "description": "OHLC plus PE/PB/dividend-yield series for one NSE index (Nifty 50, Nifty Bank, Nifty IT, India VIX, ...). `interval` is the lookback window: 1m, 3m, 6m, 1y (daily bars) or 2y, max (weekly bars).",
        "tags": [
          "indices"
        ],
        "parameters": [
          {
            "name": "name",
            "in": "path",
            "required": true,
            "description": "Index display name, e.g. \"Nifty 50\", \"Nifty IT\", \"India VIX\". Matched case-insensitively.",
            "schema": {
              "type": "string",
              "maxLength": 64
            },
            "example": "Nifty 50"
          },
          {
            "name": "interval",
            "in": "query",
            "required": false,
            "description": "Lookback window (default 3m).",
            "schema": {
              "type": "string",
              "enum": [
                "1m",
                "3m",
                "6m",
                "1y",
                "2y",
                "max"
              ]
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "index": "Nifty 50",
                    "category": "broad",
                    "interval": "1m",
                    "bar_interval": "daily",
                    "count": 20,
                    "from": "2026-09-16",
                    "to": "2026-10-14",
                    "first_close": 23217.6,
                    "latest_close": 22622.7,
                    "change_pct": -2.56,
                    "latest_valuation": {
                      "pe": 19.33,
                      "pb": 2.78,
                      "div_yield": 1.52
                    },
                    "bars": [
                      {
                        "date": "2026-09-16",
                        "open": 23201.6,
                        "high": 23284.75,
                        "low": 23116.1,
                        "close": 23217.6,
                        "turnover_cr": 20182.08,
                        "pe": 19.63,
                        "pb": 2.81,
                        "div_yield": 1.22
                      },
                      {
                        "date": "2026-09-17",
                        "open": 23195.25,
                        "high": 23363.55,
                        "low": 23193.65,
                        "close": 23270.6,
                        "turnover_cr": 18775.3,
                        "pe": 19.67,
                        "pb": 2.81,
                        "div_yield": 1.22
                      }
                    ]
                  },
                  "meta": {
                    "source": "exchange-official",
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "getIndexHistory"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The symbol, index or document does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/indices/{name}/membership/{symbol}": {
      "get": {
        "operationId": "getIndexMembershipAsOf",
        "summary": "Was a stock in an index on a date",
        "description": "Point-in-time index membership with a four-state answer, never a bare yes/no: `present` (inside an observed membership range), `uncertain` (inside an unobserved bracket around a join or exit: plausible, not proven), `absent` (observed not a member, within coverage) or `out_of_coverage` (outside the index's observed history: cannot be answered). Treat `uncertain` and `out_of_coverage` as no signal; never collapse either into `absent`. `data.matched_spell` gives the certain range and the bracket edges. `meta.coverage` states the observed window and `answerable_through`, the last date the answer can be trusted for; `meta.freshness.lag_days` says how far the projection trails the newest snapshot. Use the index `name` from `/v1/reference/indices` (one with `has_constituents: true`); an index with no membership history is a 404.",
        "tags": [
          "indices"
        ],
        "parameters": [
          {
            "name": "name",
            "in": "path",
            "required": true,
            "description": "Index display name, e.g. \"Nifty 50\", \"Nifty IT\", \"India VIX\". Matched case-insensitively.",
            "schema": {
              "type": "string",
              "maxLength": 64
            },
            "example": "Nifty 50"
          },
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Stock symbol as listed on NSE/BSE, e.g. \"RELIANCE\", \"TCS\", \"HDFCBANK\". Common brand names and post-rename aliases resolve too. Percent-encode symbols containing \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "maxLength": 64
            },
            "example": "TRENT"
          },
          {
            "name": "date",
            "in": "query",
            "required": false,
            "description": "As-of date, YYYY-MM-DD. Default: today (IST).",
            "schema": {
              "type": "string",
              "format": "date",
              "x-min": "1900-01-01",
              "x-max": "2100-12-31"
            },
            "example": "2026-05-15"
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "index": "Nifty 50",
                    "symbol": "TRENT",
                    "date": "2026-05-15",
                    "status": "present",
                    "matched_spell": {
                      "certain_range": [
                        "2026-03-15",
                        "2026-10-18"
                      ],
                      "first_absent_after": null,
                      "last_absent_before": null,
                      "left_censored": true,
                      "present_run_count": 114,
                      "right_censored": true
                    }
                  },
                  "meta": {
                    "coverage": {
                      "from": "2026-03-15",
                      "through": "2026-10-18",
                      "observed_through": "2026-10-18",
                      "answerable_through": "2026-10-18",
                      "note": "Dates outside [from, through] answer out_of_coverage: there is no observation there, which is a coverage limit, not evidence of non-membership. `through` is the newest observed snapshot; answers are trustworthy only up to `answerable_thr..."
                    },
                    "freshness": {
                      "projection_through": "2026-10-18",
                      "latest_observed": "2026-10-18",
                      "lag_days": 0,
                      "note": "projection_through is the newest snapshot folded into the membership history; lag_days is how far it trails latest_observed. A non-zero lag means recent joins and exits are not yet reflected."
                    },
                    "states": {
                      "present": "The date is inside an observed membership range [first_present, last_present].",
                      "uncertain": "The date is only inside an unobserved bracket around a join or exit: membership is plausible, not proven.",
                      "absent": "No membership range contains the date, within the observed coverage.",
                      "out_of_coverage": "The date is outside the index's observed history: membership cannot be answered."
                    },
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "getIndexMembershipAsOf"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The symbol, index or document does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/options/{symbol}/chain": {
      "get": {
        "operationId": "getOptionChain",
        "summary": "Index option chain",
        "description": "End-of-day stamped option chain for an index underlying: NIFTY, BANKNIFTY, FINNIFTY or MIDCPNIFTY only (stock option chains are not served; per-stock option analytics are at `/v1/stocks/{symbol}/options`). IV, Greeks, bid/ask and OI by strike. Read `snapshot_ts`; IV fields are percents, solved against the forward; `atm_iv_change` is percentage points vs the previous session.",
        "tags": [
          "options"
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Index underlying: NIFTY, BANKNIFTY, FINNIFTY or MIDCPNIFTY. Percent-encode symbols containing \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "maxLength": 64
            },
            "example": "NIFTY"
          },
          {
            "name": "expiry",
            "in": "query",
            "required": false,
            "description": "Expiry as YYYY-MM-DD. Omit for the nearest expiry in the snapshot.",
            "schema": {
              "type": "string",
              "format": "date",
              "x-min": "1900-01-01",
              "x-max": "2100-12-31"
            }
          },
          {
            "name": "strikes",
            "in": "query",
            "required": false,
            "description": "Strikes each side of ATM.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 25
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "underlying": "NIFTY",
                    "expiry_date": "2026-10-19",
                    "available_expiries": [
                      {
                        "expiry_date": "2026-10-19",
                        "dte": 4
                      },
                      {
                        "expiry_date": "2026-10-27",
                        "dte": 12
                      }
                    ],
                    "snapshot_ts": "2026-10-16 10:00:00+00",
                    "is_live": false,
                    "grain": "eod",
                    "dte": 4,
                    "spot": 23146.15,
                    "spot_change": 148.8,
                    "spot_pct_change": 0.647,
                    "atm_strike": 23150,
                    "atm_iv_pct": 10.5489,
                    "atm_iv_change": -14.8293,
                    "pcr": 1.3281,
                    "pcr_undefined": false,
                    "total_call_oi": 180692135,
                    "total_put_oi": 239981885,
                    "max_pain_strike": 23050,
                    "oi_support": 22000,
                    "oi_resist": 24000,
                    "lot_size": 65,
                    "n_strikes_available": 104,
                    "strikes_returned": 5,
                    "ladder": [
                      {
                        "strike": 23050,
                        "atm_offset": -2,
                        "call": {
                          "strike": 23050,
                          "option_type": "CE",
                          "ltp": 112.2,
                          "bid": 111.3,
                          "ask": 112.3,
                          "iv_pct": null,
                          "delta": null,
                          "gamma": null,
                          "theta": null,
                          "vega": null,
                          "oi": 3520140,
                          "oi_change": 213135,
                          "volume": 305082635,
                          "moneyness": "I",
                          "iv_unsolved": true,
                          "illiquid": false
                        },
                        "put": {
                          "strike": 23050,
                          "option_type": "PE",
                          "ltp": 71.05,
                          "bid": 71.05,
                          "ask": 71.65,
                          "iv_pct": 13.9236,
                          "delta": -0.3474,
                          "gamma": 0.00122,
                          "theta": -15.1434,
                          "vega": 8.0289,
                          "oi": 4167150,
                          "oi_change": 3044210,
                          "volume": 291335655,
                          "moneyness": "O",
                          "iv_unsolved": false,
                          "illiquid": false
                        }
                      },
                      {
                        "strike": 23100,
                        "atm_offset": -1,
                        "call": {
                          "strike": 23100,
                          "option_type": "CE",
                          "ltp": 84.95,
                          "bid": 84.35,
                          "ask": 84.95,
                          "iv_pct": 5.0715,
                          "delta": 0.728,
                          "gamma": 0.00301,
                          "theta": -10.2762,
                          "vega": 7.214,
                          "oi": 9558900,
                          "oi_change": 2975505,
                          "volume": 707034900,
                          "moneyness": "I",
                          "iv_unsolved": false,
                          "illiquid": false
                        },
                        "put": {
                          "strike": 23100,
                          "option_type": "PE",
                          "ltp": 93.85,
                          "bid": 93.1,
                          "ask": 93.85,
                          "iv_pct": 14.3536,
                          "delta": -0.4128,
                          "gamma": 0.00125,
                          "theta": -16.2275,
                          "vega": 8.4635,
                          "oi": 9086740,
                          "oi_change": 7890220,
                          "volume": 477284340,
                          "moneyness": "O",
                          "iv_unsolved": false,
                          "illiquid": false
                        }
                      }
                    ],
                    "ladder_truncated": true,
                    "notes": [
                      "This is an END-OF-DAY snapshot stamped 2026-10-16 10:00:00+00, not a live tick. State that timestamp when quoting these numbers.",
                      "1 strike(s) have no solved IV/Greeks (flagged `iv_unsolved`, shown as null). These are deep-in-the-money legs the volatility solver skips because IV is solved off the out-of-the-money wing — the values are NOT zero, they are unpublished...."
                    ]
                  },
                  "meta": {
                    "symbol": "NIFTY",
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "getOptionChain"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The symbol, index or document does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/options/{symbol}/iv-history": {
      "get": {
        "operationId": "getOptionIvHistory",
        "summary": "Option IV history",
        "description": "Daily ATM IV, IV rank/percentile, realised vol, PCR, max pain and skew series for ~556 underlyings including stocks. Ranges of 2y and longer are weekly bars; read `bar_interval`.",
        "tags": [
          "options"
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Stock or index symbol, e.g. \"RELIANCE\", \"TCS\", \"NIFTY\". Percent-encode symbols containing \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "maxLength": 64
            },
            "example": "RELIANCE"
          },
          {
            "name": "range",
            "in": "query",
            "required": false,
            "description": "Lookback window (default 1y).",
            "schema": {
              "type": "string",
              "enum": [
                "1m",
                "3m",
                "6m",
                "1y",
                "2y",
                "5y",
                "max"
              ]
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Envelope"
                },
                "example": {
                  "data": {
                    "underlying": "NIFTY",
                    "range": "1m",
                    "bar_interval": "daily",
                    "from_date": "2026-09-17",
                    "to_date": "2026-10-16",
                    "points": [
                      {
                        "date": "2026-09-17",
                        "expiry_date": "2026-09-22",
                        "dte": 5,
                        "spot": 23270.6,
                        "spot_is_proxy": false,
                        "atm_iv_pct": 10.5743,
                        "iv_rank_pct": 16.33,
                        "iv_percentile_pct": 49.01,
                        "rv_20_pct": 7.6879,
                        "rv_30_pct": 6.475,
                        "rv_iv_spread_pct": 4.0993,
                        "skew_25d": 0.038362,
                        "fly_25d": 0.126962,
                        "max_pain_strike": 23300,
                        "total_call_oi": 147435210,
                        "total_put_oi": 146732300,
                        "pcr_oi": 0.9952,
                        "pcr_vol": 0.9572,
                        "n_strikes": 161
                      },
                      {
                        "date": "2026-09-18",
                        "expiry_date": "2026-09-22",
                        "dte": 4,
                        "spot": 23346.4,
                        "spot_is_proxy": false,
                        "atm_iv_pct": 9.083,
                        "iv_rank_pct": 10.97,
                        "iv_percentile_pct": 24.11,
                        "rv_20_pct": 7.3265,
                        "rv_30_pct": 6.612,
                        "rv_iv_spread_pct": 2.471,
                        "skew_25d": 0.040091,
                        "fly_25d": 0.168182,
                        "max_pain_strike": 23350,
                        "total_call_oi": 159156855,
                        "total_put_oi": 178463805,
                        "pcr_oi": 1.1213,
                        "pcr_vol": 1.0012,
                        "n_strikes": 161
                      }
                    ],
                    "points_returned": 21,
                    "points_truncated": false,
                    "coverage": {
                      "atm_iv_pct": 21,
                      "iv_rank_pct": 21,
                      "iv_percentile_pct": 21,
                      "rv_20_pct": 19,
                      "rv_30_pct": 19,
                      "rv_iv_spread_pct": 19,
                      "skew_25d": 21,
                      "fly_25d": 21,
                      "pcr_oi": 21
                    },
                    "latest": {
                      "date": "2026-10-16",
                      "expiry_date": "2026-10-19",
                      "dte": 3,
                      "spot": 23100,
                      "spot_is_proxy": true,
                      "atm_iv_pct": 10.8478,
                      "iv_rank_pct": 17.32,
                      "iv_percentile_pct": 46.25,
                      "rv_20_pct": null,
                      "rv_30_pct": null,
                      "rv_iv_spread_pct": null,
                      "skew_25d": 0.058445,
                      "fly_25d": 0.178687,
                      "max_pain_strike": 23050,
                      "total_call_oi": 178055995,
                      "total_put_oi": 235729000,
                      "pcr_oi": 1.3239,
                      "pcr_vol": 0.8943,
                      "n_strikes": 171
                    },
                    "notes": [
                      "`spot` is the ATM strike (flagged `spot_is_proxy`) on 6 of 21 point(s): the feed's spot column is unset for those rows. ATM strike is spot by construction, so treat it as the spot level, but do not quote it as an exact index/share price....",
                      "IV figures are PERCENT (e.g. 10.55 means 10.55% annualised). One point per session, using the nearest expiry at least 2 days out."
                    ]
                  },
                  "meta": {
                    "symbol": "NIFTY",
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "getOptionIvHistory"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The symbol, index or document does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/me/usage": {
      "get": {
        "operationId": "getMyUsage",
        "summary": "Your quota position",
        "description": "The caller's plan and current day/month usage against the counters every request is metered on. Free: this route never charges.",
        "tags": [
          "account"
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 0,
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "example": {
                  "data": {
                    "plan": "starter",
                    "day": {
                      "period": "2026-10-16",
                      "used": 42,
                      "limit": 400,
                      "remaining": 358,
                      "resets_at": "2026-10-16T18:30:00.000Z"
                    },
                    "month": {
                      "period": "2026-10",
                      "used": 1053,
                      "limit": 5000,
                      "remaining": 3947,
                      "resets_at": "2026-10-31T18:30:00.000Z"
                    },
                    "note": "One request on either the REST API or the Tapetide MCP server costs one unit from the same counters. Failed requests are refunded. This route is free."
                  },
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "getMyUsage"
                  }
                },
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {
                      "type": "object",
                      "properties": {
                        "plan": {
                          "type": "string"
                        },
                        "day": {
                          "$ref": "#/components/schemas/QuotaWindow"
                        },
                        "month": {
                          "$ref": "#/components/schemas/QuotaWindow"
                        },
                        "note": {
                          "type": "string"
                        }
                      }
                    },
                    "meta": {
                      "type": "object"
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/market/holidays": {
      "get": {
        "operationId": "listMarketHolidays",
        "summary": "Market holidays",
        "description": "Exchange trading holidays from 2003 onward, including announced future closures. Filter with `from`/`to`; pages by date.",
        "tags": [
          "reference"
        ],
        "parameters": [
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "Earliest holiday date (inclusive).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "description": "Latest holiday date (inclusive).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "order",
            "in": "query",
            "required": false,
            "description": "Sort direction by date.",
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ],
              "default": "asc"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 100, max 500). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 500,
              "default": 100
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/MarketHolidaysItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "date": "2026-10-20",
                      "name": "Diwali Laxmi Pujan",
                      "exchange": "NSE",
                      "type": "FULL"
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listMarketHolidays",
                    "count": 1,
                    "limit": 100,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/stocks/{symbol}/fundamentals": {
      "get": {
        "operationId": "listStockFundamentals",
        "summary": "Point-in-time fundamentals",
        "description": "Financial statement metrics as a tidy series: one row per metric and fiscal period. Quarterly results from 2002 and annual statements from 1999 where the company reported them; updated as results are declared. Every row carries `available_from`, the date the value became public. Pass `as_of` to see only what was public on that date, with the value as it was then (before any later restatement) — the backtest-safe view. Where more than one reading exists for the same metric and period, a populated value is preferred over an empty one, then a non-zero value over a 0 (one dataset rounds to whole crore, so small figures can read 0 there), then the primary dataset over the secondary, then the most recently published reading on or before `as_of`. A reported 0 that means \"not reported\" is not published as a value: periods where total assets, total liabilities or share capital read 0 are omitted, and revenue reading 0 while the same period shows non-zero operating expenses is published as `value: null`. Defaults to the last 10 years of periods. Rows are ordered by period end (oldest first by default; `order=desc` for newest first), then in a fixed metric order.",
        "tags": [
          "fundamentals"
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Stock symbol, e.g. \"RELIANCE\". Percent-encode \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 64,
              "description": "Stock symbol, e.g. \"RELIANCE\". Percent-encode \"&\" (M%26M)."
            },
            "example": "RELIANCE"
          },
          {
            "name": "metrics",
            "in": "query",
            "required": false,
            "description": "Comma-separated metric names (see GET /v1/fundamentals/metrics). Default: all.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "revenue",
                  "operating_expenses",
                  "operating_profit",
                  "operating_margin_pct",
                  "other_income",
                  "interest_expense",
                  "depreciation",
                  "profit_before_tax",
                  "tax_rate_pct",
                  "net_profit",
                  "eps",
                  "dividend_payout_pct",
                  "share_capital",
                  "reserves",
                  "borrowings",
                  "other_liabilities",
                  "total_liabilities",
                  "fixed_assets",
                  "capital_work_in_progress",
                  "investments",
                  "other_assets",
                  "total_assets",
                  "cash_from_operations",
                  "cash_from_investing",
                  "cash_from_financing",
                  "net_cash_flow",
                  "free_cash_flow",
                  "cash_from_operations_to_operating_profit_pct",
                  "roce_pct",
                  "debtor_days",
                  "inventory_days",
                  "payable_days",
                  "cash_conversion_cycle_days",
                  "working_capital_days"
                ]
              },
              "minItems": 1,
              "maxItems": 34
            }
          },
          {
            "name": "period_type",
            "in": "query",
            "required": false,
            "description": "quarter or annual. Default: both.",
            "schema": {
              "type": "string",
              "enum": [
                "quarter",
                "annual"
              ]
            }
          },
          {
            "name": "basis",
            "in": "query",
            "required": false,
            "description": "Statement basis. preferred = consolidated when the company publishes consolidated annual statements (as of `as_of`), otherwise standalone.",
            "schema": {
              "type": "string",
              "enum": [
                "preferred",
                "consolidated",
                "standalone"
              ],
              "default": "preferred"
            }
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "Earliest period end (inclusive). Default: 10 years before `to`.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "description": "Latest period end (inclusive). Default: `as_of`.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "as_of",
            "in": "query",
            "required": false,
            "description": "Only values public on or before this date (inclusive). Default: today.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "order",
            "in": "query",
            "required": false,
            "description": "Sort direction by date.",
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ],
              "default": "asc"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 200, max 1000). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000,
              "default": 200
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/StockFundamentalsItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "metric": "revenue",
                      "period_type": "annual",
                      "period_end": "2025-03-31",
                      "basis": "consolidated",
                      "value": 255324,
                      "unit": "inr_crore",
                      "available_from": "2025-04-10",
                      "available_from_estimated": false
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listStockFundamentals",
                    "count": 1,
                    "limit": 200,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/fundamentals/metrics": {
      "get": {
        "operationId": "listFundamentalMetrics",
        "summary": "Fundamentals metric catalogue",
        "description": "Every metric served by GET /v1/stocks/{symbol}/fundamentals, with its statement, unit and the period types it is published for. Ordered by statement, then catalogue order.",
        "tags": [
          "fundamentals"
        ],
        "parameters": [
          {
            "name": "statement",
            "in": "query",
            "required": false,
            "description": "Only metrics from this statement.",
            "schema": {
              "type": "string",
              "enum": [
                "income_statement",
                "balance_sheet",
                "cash_flow",
                "ratios"
              ]
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 100, max 100). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 100
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/FundamentalMetricsItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "name": "revenue",
                      "statement": "income_statement",
                      "unit": "inr_crore",
                      "period_types": [
                        "quarter",
                        "annual"
                      ],
                      "description": "Revenue from operations. For banks and lenders this is total interest and operating income."
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listFundamentalMetrics",
                    "count": 1,
                    "limit": 100,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/reference/stocks": {
      "get": {
        "operationId": "listReferenceStocks",
        "summary": "Stock master list",
        "description": "Every listed Indian equity this API covers — about 7,500 companies including delisted ones — with identifiers, listing status and the four-level industry classification. Filter by `sector`, `industry` or `status`; ordered by symbol. Updated daily.",
        "tags": [
          "reference"
        ],
        "parameters": [
          {
            "name": "sector",
            "in": "query",
            "required": false,
            "description": "Exact sector name (case-insensitive), e.g. \"Information Technology\". Matches the `sector` field.",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 100
            }
          },
          {
            "name": "industry",
            "in": "query",
            "required": false,
            "description": "Exact industry name (case-insensitive), e.g. \"IT - Software\". Matches the `industry` field.",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 100
            }
          },
          {
            "name": "status",
            "in": "query",
            "required": false,
            "description": "Only companies with this listing status.",
            "schema": {
              "type": "string",
              "enum": [
                "active",
                "delisted",
                "inactive"
              ]
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 500, max 1000). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000,
              "default": 500
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/ReferenceStocksItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "symbol": "TCS",
                      "name": "Tata Consultancy Services Ltd",
                      "isin": "INE467B01029",
                      "nse_symbol": "TCS",
                      "bse_code": "532540",
                      "listed_on": [
                        "NSE",
                        "BSE"
                      ],
                      "status": "active",
                      "listing_date": "2004-08-25",
                      "macro_sector": "Information Technology",
                      "sector": "Information Technology",
                      "industry": "IT - Software",
                      "basic_industry": "Computers - Software & Consulting",
                      "face_value": 1,
                      "has_derivatives": true,
                      "website": "https://tcs.com"
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listReferenceStocks",
                    "count": 1,
                    "limit": 500,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/reference/symbol-history/{symbol}": {
      "get": {
        "operationId": "getSymbolHistory",
        "summary": "Symbol and ISIN history",
        "description": "Every NSE symbol and ISIN a company has traded under, with the first and last trading day each was observed — use it to map old tickers (e.g. a renamed company) to today's symbol. Accepts a current or former symbol, a BSE code or an ISIN. A symbol always resolves to the company that holds it now (or held it last); if a ticker was ever reused by a different company, reach the earlier holder by its ISIN or BSE code (both are unique) and filter its spells by date. Coverage starts 2016-01-01 and is refreshed every trading day; companies listed only on BSE have no NSE symbol spells.",
        "tags": [
          "reference"
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Stock symbol, e.g. \"RELIANCE\". Percent-encode \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 64,
              "description": "Stock symbol, e.g. \"RELIANCE\". Percent-encode \"&\" (M%26M)."
            },
            "example": "RELIANCE"
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/SymbolHistory"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/SingleMeta"
                    }
                  }
                },
                "example": {
                  "data": {
                    "symbol": "ETERNAL",
                    "isin": "INE758T01015",
                    "coverage_from": "2016-01-01",
                    "coverage_through": "2026-10-14",
                    "identifiers": [
                      {
                        "type": "isin",
                        "value": "INE758T01015",
                        "first_seen": "2021-07-23",
                        "last_seen": "2026-10-14",
                        "observed_days": 1293,
                        "starts_before_coverage": false,
                        "current": true
                      },
                      {
                        "type": "nse_symbol",
                        "value": "ZOMATO",
                        "first_seen": "2021-07-23",
                        "last_seen": "2025-04-08",
                        "observed_days": 919,
                        "starts_before_coverage": false,
                        "current": false
                      },
                      {
                        "type": "nse_symbol",
                        "value": "ETERNAL",
                        "first_seen": "2025-04-09",
                        "last_seen": "2026-10-14",
                        "observed_days": 374,
                        "starts_before_coverage": false,
                        "current": true
                      }
                    ]
                  },
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "getSymbolHistory"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/stocks/{symbol}/prices/daily": {
      "get": {
        "operationId": "listStockDailyPrices",
        "summary": "Daily price bars",
        "description": "End-of-day OHLC, volume and delivery percent for one stock, back-adjusted for splits and bonuses (not dividends), from 1996 for the oldest listings. Includes special weekend and Muhurat sessions. Sessions with no verified bar are omitted: a stored bar that exactly repeats the previous session's OHLC and volume with no delivery figure is a copy, not a print (2,000+ stocks on 2025-07-16, smaller clusters through Feb 2026), and is not served. Defaults to the last 365 days; filter with `from`/`to` (at most 5 years per request), pages by date. A session's bars arrive in two passes: most NSE stocks the same evening (~19:00 IST), the rest by the next afternoon. Many BSE-only listings have no bars after March 2026. To rebuild as-printed prices, use /v1/stocks/{symbol}/corporate-adjustments.",
        "tags": [
          "prices"
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Stock symbol, e.g. \"RELIANCE\". Percent-encode \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 64,
              "description": "Stock symbol, e.g. \"RELIANCE\". Percent-encode \"&\" (M%26M)."
            },
            "example": "RELIANCE"
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "Earliest date (inclusive). Default: 365 days before `to`.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "description": "Latest date (inclusive). Default: today (IST).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "order",
            "in": "query",
            "required": false,
            "description": "Sort direction by date.",
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ],
              "default": "asc"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 250, max 5000). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 5000,
              "default": 250
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/StockDailyPricesItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "date": "2026-10-14",
                      "open": 1167.1,
                      "high": 1178.9,
                      "low": 1162,
                      "close": 1175.4,
                      "volume": 9876543,
                      "delivery_pct": 52.31
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listStockDailyPrices",
                    "count": 1,
                    "limit": 250,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/stocks/{symbol}/prices/intraday": {
      "get": {
        "operationId": "listStockIntradayPrices",
        "summary": "Intraday price bars",
        "description": "1, 5 or 15-minute OHLCV bars for one stock during regular market hours (09:15-15:30 IST), from April 2017 for about 1,100 stocks, widening to 3,000+ by 2026. Prices are as printed, NOT adjusted for later splits or bonuses, so before an ex-date they differ in scale from daily bars. Pass `date` for one session or `from`/`to` for up to 7 calendar days. Timestamps are bar start times in UTC. Updated after each session closes; pages by timestamp.",
        "tags": [
          "prices"
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Stock symbol, e.g. \"RELIANCE\". Percent-encode \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 64,
              "description": "Stock symbol, e.g. \"RELIANCE\". Percent-encode \"&\" (M%26M)."
            },
            "example": "RELIANCE"
          },
          {
            "name": "date",
            "in": "query",
            "required": false,
            "description": "One trading session (IST date). Mutually exclusive with from/to.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "First session date (inclusive, IST).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "description": "Last session date (inclusive, IST). At most 7 calendar days after `from`.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "interval",
            "in": "query",
            "required": false,
            "description": "Bar size in minutes: 1, 5 or 15. 5 and 15-minute bars are aligned to 09:15 IST.",
            "schema": {
              "type": "string",
              "enum": [
                "1",
                "5",
                "15"
              ],
              "default": "1"
            }
          },
          {
            "name": "order",
            "in": "query",
            "required": false,
            "description": "Sort direction by timestamp.",
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ],
              "default": "asc"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 375, max 2000). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 2000,
              "default": 375
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/StockIntradayPricesItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "ts": "2026-10-15T03:45:00Z",
                      "open": 3020.5,
                      "high": 3031,
                      "low": 3018.2,
                      "close": 3027.9,
                      "volume": 48213
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listStockIntradayPrices",
                    "count": 1,
                    "limit": 375,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/stocks/{symbol}/market-cap": {
      "get": {
        "operationId": "listStockMarketCap",
        "summary": "Daily market capitalisation",
        "description": "Total market capitalisation at each session's close in INR crore (close x shares outstanding), from August 2015 for about 3,200 stocks, 5,500+ today. Updated daily. Each value is close(D) x shares outstanding on D, where the share count is the latest filed count on or before D (quarterly filed issued shares, or annual equity capital / face value) carried to the current share basis with the split and bonus factors in /v1/stocks/{symbol}/corporate-adjustments. The source market-cap series is used only as a cross-check, and as the count after a rights issue, buyback, merger or demerger the filing predates. A date is published as null, with `null_reason`, when there is no verified daily price bar, no filed count within 400 days before it, or the share count cannot be confirmed. Defaults to the last 365 days; filter with `from`/`to` (at most 5 years per request), pages by date.",
        "tags": [
          "prices"
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Stock symbol, e.g. \"RELIANCE\". Percent-encode \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 64,
              "description": "Stock symbol, e.g. \"RELIANCE\". Percent-encode \"&\" (M%26M)."
            },
            "example": "RELIANCE"
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "Earliest date (inclusive). Default: 365 days before `to`.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "description": "Latest date (inclusive). Default: today (IST).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "order",
            "in": "query",
            "required": false,
            "description": "Sort direction by date.",
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ],
              "default": "asc"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 250, max 5000). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 5000,
              "default": 250
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/StockMarketCapItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "date": "2026-10-15",
                      "market_cap_cr": 1589532,
                      "null_reason": null
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listStockMarketCap",
                    "count": 1,
                    "limit": 250,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/stocks/{symbol}/corporate-adjustments": {
      "get": {
        "operationId": "listStockCorporateAdjustments",
        "summary": "Split and bonus adjustment factors",
        "description": "Timeline of share-capital events that change the price scale: splits, consolidations and bonuses with their price factor and cumulative factor, plus rights issues and mergers/demergers listed with factor null (no reliable single factor exists; treat price gaps on those ex-dates with caution). Rights rows carry the filed `entitlement_ratio` when one was filed. Daily prices are back-adjusted with these factors, so as-printed close on date d = adjusted close / cumulative_factor of the earliest effective event with ex_date > d (1 when there is none); `meta.reconstruction` states the rule and `meta.unquantified_count` counts the events without a factor across the whole timeline. Not dividend adjusted. Coverage from the 1990s, most complete from 2016. Includes announced upcoming events. Some demergers are reflected in adjusted daily prices without appearing here (e.g. a 2023 spin-off), so a reconstruction across a demerger can be off by the spun-off value.",
        "tags": [
          "prices"
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Stock symbol, e.g. \"RELIANCE\". Percent-encode \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 64,
              "description": "Stock symbol, e.g. \"RELIANCE\". Percent-encode \"&\" (M%26M)."
            },
            "example": "RELIANCE"
          },
          {
            "name": "order",
            "in": "query",
            "required": false,
            "description": "Sort direction by ex-date.",
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ],
              "default": "asc"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 100, max 500). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 500,
              "default": 100
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/StockCorporateAdjustmentsItem"
                      }
                    },
                    "meta": {
                      "allOf": [
                        {
                          "$ref": "#/components/schemas/ListMeta"
                        },
                        {
                          "$ref": "#/components/schemas/StockCorporateAdjustmentsMeta"
                        }
                      ]
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "ex_date": "2024-10-28",
                      "type": "bonus",
                      "factor": 0.5,
                      "shares_before": 1,
                      "shares_after": 2,
                      "cumulative_factor": 0.5,
                      "upcoming": false,
                      "entitlement_ratio": null
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listStockCorporateAdjustments",
                    "count": 1,
                    "limit": 100,
                    "has_more": false,
                    "next_cursor": null,
                    "total": 4,
                    "unquantified_count": 1,
                    "upcoming_count": 0,
                    "dividend_adjusted": false,
                    "reconstruction": "as_printed_close(d) = adjusted_close(d) / cumulative_factor of the earliest non-upcoming event with a factor and ex_date > d; 1 when there is none (on and after the latest ex-date adjusted equals as printed). Rights and merger/demerger events have no factor and are not part of the product."
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/stocks/{symbol}/insider-trades": {
      "get": {
        "operationId": "listStockInsiderTrades",
        "summary": "Insider trades",
        "description": "Trades and pledges by company insiders (promoters, directors, key managerial personnel, designated employees and their relatives) disclosed under the insider-trading regulations, from 2015 onward. Newest disclosure first; filter by disclosure date with `from`/`to` (IST) and by `transaction_type`. Filed dates outside 1990-01-01..today+30 are typos in the original filings and are published as null. Updated daily.",
        "tags": [
          "ownership"
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Stock symbol, e.g. \"RELIANCE\". Percent-encode \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 64,
              "description": "Stock symbol, e.g. \"RELIANCE\". Percent-encode \"&\" (M%26M)."
            },
            "example": "RELIANCE"
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "Earliest disclosure date (inclusive, IST).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "description": "Latest disclosure date (inclusive, IST).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "transaction_type",
            "in": "query",
            "required": false,
            "description": "Only this transaction type.",
            "schema": {
              "type": "string",
              "enum": [
                "buy",
                "sell",
                "pledge",
                "pledge_release",
                "pledge_invocation",
                "esop"
              ]
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 50, max 200). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200,
              "default": 50
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/StockInsiderTradesItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "symbol": "TCS",
                      "person_name": "Damodar Padhi",
                      "person_category": "Employees/Designated Employees",
                      "transaction_type": "buy",
                      "mode": "Market Purchase",
                      "security_type": "Equity Shares",
                      "quantity": 685,
                      "value_inr": 2275672,
                      "price_inr": 3322.15,
                      "holding_before_shares": 3250,
                      "holding_before_pct": null,
                      "holding_after_shares": 3935,
                      "holding_after_pct": null,
                      "transaction_from": "2022-05-23",
                      "transaction_to": "2022-05-23",
                      "intimated_on": "2022-05-24",
                      "disclosed_at": "2022-05-25T12:15:00Z"
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listStockInsiderTrades",
                    "count": 1,
                    "limit": 50,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/stocks/{symbol}/bulk-block-deals": {
      "get": {
        "operationId": "listStockBulkBlockDeals",
        "summary": "Bulk and block deals",
        "description": "Exchange-disclosed bulk deals (a client trading more than 0.5% of listed shares in a session) and block deals (single negotiated trades in the block window), from 2010 onward. Newest first; filter by `type` and trade date with `from`/`to`. Updated daily after market close.",
        "tags": [
          "ownership"
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Stock symbol, e.g. \"RELIANCE\". Percent-encode \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 64,
              "description": "Stock symbol, e.g. \"RELIANCE\". Percent-encode \"&\" (M%26M)."
            },
            "example": "RELIANCE"
          },
          {
            "name": "type",
            "in": "query",
            "required": false,
            "description": "Only bulk or only block deals. Omit for both.",
            "schema": {
              "type": "string",
              "enum": [
                "bulk",
                "block"
              ]
            }
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "Earliest date (inclusive).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "description": "Latest date (inclusive).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 50, max 200). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200,
              "default": 50
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/StockBulkBlockDealsItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "symbol": "RELIANCE",
                      "date": "2026-01-27",
                      "deal_type": "block",
                      "client_name": "Goldman Sachs Bank Europe Se",
                      "side": "buy",
                      "quantity": 1151736,
                      "price_inr": 1384,
                      "value_inr": 1594002624
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listStockBulkBlockDeals",
                    "count": 1,
                    "limit": 50,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/stocks/{symbol}/sast-disclosures": {
      "get": {
        "operationId": "listStockSastDisclosures",
        "summary": "Substantial acquisition disclosures",
        "description": "Disclosures under the takeover code (Regulation 29) when a holder crosses 5% of a company or changes a 5%+ holding by 2% or more, from 2015 onward. Newest disclosure first; filter by disclosure date with `from`/`to` (IST). Updated daily.",
        "tags": [
          "ownership"
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Stock symbol, e.g. \"RELIANCE\". Percent-encode \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 64,
              "description": "Stock symbol, e.g. \"RELIANCE\". Percent-encode \"&\" (M%26M)."
            },
            "example": "RELIANCE"
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "Earliest disclosure date (inclusive, IST).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "description": "Latest disclosure date (inclusive, IST).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 50, max 200). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200,
              "default": 50
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/StockSastDisclosuresItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "symbol": "RELIANCE",
                      "acquirer_name": "Reliance Industrial Investments and Holdings Limited",
                      "is_promoter": true,
                      "regulation": "29(1)",
                      "transaction_type": "acquisition",
                      "mode": "Others",
                      "security_type": "Equity shares",
                      "shares_acquired": 240942006,
                      "shares_sold": null,
                      "shares_held_after": 240942006,
                      "pct_acquired": 3.56,
                      "pct_sold": null,
                      "pct_held_after": 3.56,
                      "pct_held_after_diluted": 3.56,
                      "transaction_from": "2023-08-19",
                      "transaction_to": "2023-08-19",
                      "disclosed_at": "2023-08-25T14:00:00Z"
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listStockSastDisclosures",
                    "count": 1,
                    "limit": 50,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/stocks/{symbol}/promoter-pledge": {
      "get": {
        "operationId": "listStockPromoterPledge",
        "summary": "Promoter pledge by quarter",
        "description": "Quarterly disclosure of promoter shares pledged, with the pledged share of the promoter holding and of all shares. Broad coverage starts with the March 2026 quarter (a handful of companies from 2012). Oldest quarter first by default (`order=desc` for newest first). Updated as companies file.",
        "tags": [
          "ownership"
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Stock symbol, e.g. \"RELIANCE\". Percent-encode \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 64,
              "description": "Stock symbol, e.g. \"RELIANCE\". Percent-encode \"&\" (M%26M)."
            },
            "example": "RELIANCE"
          },
          {
            "name": "order",
            "in": "query",
            "required": false,
            "description": "Sort direction by date.",
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ],
              "default": "asc"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 20, max 100). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/StockPromoterPledgeItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "symbol": "CHOLAHLDNG",
                      "quarter_end": "2026-09-30",
                      "disclosed_at": "2026-10-15T11:02:13Z",
                      "total_shares": 187777462,
                      "promoter_shares": 87110979,
                      "promoter_holding_pct": 46.39,
                      "promoter_shares_pledged": 13200,
                      "promoter_pledged_pct": 0.02,
                      "total_shares_pledged": 1723298,
                      "total_pledged_pct": 0.92
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listStockPromoterPledge",
                    "count": 1,
                    "limit": 20,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/stocks/{symbol}/promoter-pledge/events": {
      "get": {
        "operationId": "listStockPromoterPledgeEvents",
        "summary": "Promoter pledge events",
        "description": "Individual encumbrance events filed by promoters under the takeover code: pledge creation, release and invocation, with the lender as disclosed and holdings before/after. From 2015 onward; newest disclosure first; filter by disclosure date with `from`/`to` (IST) and `event_type`. Updated daily.",
        "tags": [
          "ownership"
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Stock symbol, e.g. \"RELIANCE\". Percent-encode \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 64,
              "description": "Stock symbol, e.g. \"RELIANCE\". Percent-encode \"&\" (M%26M)."
            },
            "example": "RELIANCE"
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "Earliest disclosure date (inclusive, IST).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "description": "Latest disclosure date (inclusive, IST).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "event_type",
            "in": "query",
            "required": false,
            "description": "Only this event type.",
            "schema": {
              "type": "string",
              "enum": [
                "creation",
                "release",
                "invocation"
              ]
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 50, max 200). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200,
              "default": 50
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/StockPromoterPledgeEventsItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "symbol": "JSWSTEEL",
                      "promoter_name": "JSL Overseas Limited",
                      "event_type": "release",
                      "encumbrance_type": "Pledge",
                      "lender_details": "Lender: Deutsche Bank AG, Singapore Branch",
                      "event_from": "2026-07-07",
                      "event_to": "2026-07-07",
                      "event_shares": 3500000,
                      "event_pct": 0.14,
                      "promoter_shares_before": 21026090,
                      "promoter_pct_before": 0.86,
                      "encumbered_shares_after": 12526090,
                      "encumbered_pct_after": 0.52,
                      "total_encumbered_shares": 16026090,
                      "total_encumbered_pct": 0.66,
                      "reported_on": "2026-07-15",
                      "disclosed_at": "2026-07-23T12:59:51Z"
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listStockPromoterPledgeEvents",
                    "count": 1,
                    "limit": 50,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/stocks/{symbol}/corporate-actions": {
      "get": {
        "operationId": "listStockCorporateActions",
        "summary": "Corporate actions",
        "description": "Dividends, bonus issues, splits, rights issues, buybacks, demergers and shareholder meetings with ex-date, record date and terms, from 2018 onward including announced future ex-dates. Oldest ex-date first by default (`order=desc` for newest first); filter by `type` and ex-date with `from`/`to`. Updated several times a day.",
        "tags": [
          "ownership"
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Stock symbol, e.g. \"RELIANCE\". Percent-encode \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 64,
              "description": "Stock symbol, e.g. \"RELIANCE\". Percent-encode \"&\" (M%26M)."
            },
            "example": "RELIANCE"
          },
          {
            "name": "type",
            "in": "query",
            "required": false,
            "description": "Only this action type.",
            "schema": {
              "type": "string",
              "enum": [
                "dividend",
                "bonus",
                "split",
                "rights",
                "buyback",
                "demerger",
                "merger",
                "agm",
                "egm",
                "other"
              ]
            }
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "Earliest ex-date (inclusive).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "description": "Latest ex-date (inclusive).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "order",
            "in": "query",
            "required": false,
            "description": "Sort direction by date.",
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ],
              "default": "asc"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 50, max 200). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200,
              "default": 50
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/StockCorporateActionsItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "symbol": "TCS",
                      "company_name": "Tata Consultancy Services Limited",
                      "isin": "INE467B01029",
                      "series": "EQ",
                      "action_type": "dividend",
                      "dividend_type": "interim",
                      "subject": "Interim Dividend - Rs 12 Per Share",
                      "ex_date": "2026-10-14",
                      "record_date": "2026-10-14",
                      "announced_on": "2026-10-08",
                      "book_closure_start": null,
                      "book_closure_end": null,
                      "dividend_per_share_inr": 12,
                      "ratio_numerator": null,
                      "ratio_denominator": null,
                      "face_value_inr": 1,
                      "buyback_price_inr": null
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listStockCorporateActions",
                    "count": 1,
                    "limit": 50,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/market/corporate-actions": {
      "get": {
        "operationId": "listMarketCorporateActions",
        "summary": "Corporate action calendar",
        "description": "Market-wide corporate actions by ex-date: the upcoming calendar by default (`from` = today IST, `to` = `from` + 30 days). The window may span at most 366 days. Ordered by ex-date ascending; filter by `type`. Coverage from 2018. Updated several times a day.",
        "tags": [
          "ownership"
        ],
        "parameters": [
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "Earliest ex-date (inclusive). Default: today (IST).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "description": "Latest ex-date (inclusive). Default: `from` + 30 days.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "type",
            "in": "query",
            "required": false,
            "description": "Only this action type.",
            "schema": {
              "type": "string",
              "enum": [
                "dividend",
                "bonus",
                "split",
                "rights",
                "buyback",
                "demerger",
                "merger",
                "agm",
                "egm",
                "other"
              ]
            }
          },
          {
            "name": "order",
            "in": "query",
            "required": false,
            "description": "Sort direction by date.",
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ],
              "default": "asc"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 100, max 500). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 500,
              "default": 100
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/MarketCorporateActionsItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "symbol": "TCS",
                      "company_name": "Tata Consultancy Services Limited",
                      "isin": "INE467B01029",
                      "series": "EQ",
                      "action_type": "dividend",
                      "dividend_type": "interim",
                      "subject": "Interim Dividend - Rs 12 Per Share",
                      "ex_date": "2026-10-14",
                      "record_date": "2026-10-14",
                      "announced_on": "2026-10-08",
                      "book_closure_start": null,
                      "book_closure_end": null,
                      "dividend_per_share_inr": 12,
                      "ratio_numerator": null,
                      "ratio_denominator": null,
                      "face_value_inr": 1,
                      "buyback_price_inr": null
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listMarketCorporateActions",
                    "count": 1,
                    "limit": 100,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/stocks/{symbol}/mutual-fund-holdings": {
      "get": {
        "operationId": "listStockMutualFundHoldings",
        "summary": "Mutual fund holdings",
        "description": "Mutual fund schemes (direct-growth plans) reporting a position in the stock in their monthly portfolio disclosure, largest position by shares first, with the previous month's position and the change. Defaults to the latest month available for the stock; pass `month` (YYYY-MM) for history back to March 2025. Coverage is a subset of schemes and varies month to month, and the latest one or two months fill in as fund houses publish portfolios (typically by the 10th of the following month): a scheme missing from a month means not reported, not necessarily sold. Zero-share rows are omitted by default, because a disclosure that is still filling in reports most positions as 0. Pass `include_exits=true` to add exit rows (`exited: true`, `shares_held: 0`): schemes that held the stock the previous month and reported 0 this month in a disclosure that still carries at least half of the previous month's positions and AUM. Exits in a month that is still filling in are therefore under-reported, not over-reported.",
        "tags": [
          "ownership"
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Stock symbol, e.g. \"RELIANCE\". Percent-encode \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 64,
              "description": "Stock symbol, e.g. \"RELIANCE\". Percent-encode \"&\" (M%26M)."
            },
            "example": "RELIANCE"
          },
          {
            "name": "month",
            "in": "query",
            "required": false,
            "description": "Portfolio month, YYYY-MM. Default: latest available for this stock.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-(0[1-9]|1[0-2])$"
            }
          },
          {
            "name": "include_exits",
            "in": "query",
            "required": false,
            "description": "Also list schemes that exited the stock this month (see description). Default false.",
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 50, max 200). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200,
              "default": 50
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/StockMutualFundHoldingsItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "symbol": "RELIANCE",
                      "month": "2026-09",
                      "scheme_name": "Parag Parikh Large Cap Fund Direct-Growth",
                      "scheme_isin": "INF879O01332",
                      "fund_house": "Parag Parikh",
                      "shares_held": 450887,
                      "pct_of_scheme_aum": 6.1784,
                      "previous_shares_held": 420887,
                      "shares_change": 30000,
                      "exited": false
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listStockMutualFundHoldings",
                    "count": 1,
                    "limit": 50,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/stocks/{symbol}/credit-ratings": {
      "get": {
        "operationId": "listStockCreditRatings",
        "summary": "Credit ratings",
        "description": "Credit rating actions on the company's debt instruments (debentures, commercial paper, bank facilities) as disclosed by the company: agency, rating, action and outlook. Matched by company and by the issuer prefix of each instrument ISIN. Coverage from 2015, dense from 2025. Newest rating first. Updated daily.",
        "tags": [
          "ownership"
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Stock symbol, e.g. \"RELIANCE\". Percent-encode \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 64,
              "description": "Stock symbol, e.g. \"RELIANCE\". Percent-encode \"&\" (M%26M)."
            },
            "example": "RELIANCE"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 50, max 200). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200,
              "default": 50
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/StockCreditRatingsItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "symbol": "RELIANCE",
                      "agency": "CRISIL Ratings Limited",
                      "rating": "CRISIL AAA",
                      "rating_action": "reaffirm",
                      "outlook": "Stable",
                      "previous_rating": "CRISIL AAA",
                      "instrument_isin": "INE002A08567",
                      "rated_on": "2026-09-25",
                      "disclosed_at": "2026-09-25T16:45:03Z"
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listStockCreditRatings",
                    "count": 1,
                    "limit": 50,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/stocks/{symbol}/filings": {
      "get": {
        "operationId": "listStockFilings",
        "summary": "Exchange filings",
        "description": "Regulatory announcements one company filed with the exchange from 2020 onward: results, board-meeting outcomes, earnings-call notices, orders, management changes, press releases and more, each with a typed `category` and the public PDF link. Updated through the trading day. Newest first; filter by `category`, `from`, `to`.",
        "tags": [
          "filings"
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Stock symbol, e.g. \"RELIANCE\". Percent-encode \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 64,
              "description": "Stock symbol, e.g. \"RELIANCE\". Percent-encode \"&\" (M%26M)."
            },
            "example": "RELIANCE"
          },
          {
            "name": "category",
            "in": "query",
            "required": false,
            "description": "Only filings in this category.",
            "schema": {
              "type": "string",
              "enum": [
                "financial_results",
                "board_meeting",
                "shareholder_meeting",
                "earnings_call",
                "investor_presentation",
                "press_release",
                "annual_report",
                "credit_rating",
                "dividend",
                "corporate_action",
                "capital_raise",
                "acquisition",
                "orders_contracts",
                "management_change",
                "insider_takeover",
                "trading_window",
                "insolvency",
                "compliance",
                "newspaper_publication",
                "clarification",
                "other"
              ]
            }
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "Earliest filing date (inclusive).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "description": "Latest filing date (inclusive).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 50, max 200). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200,
              "default": 50
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/StockFilingsItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "filing_id": 41150034,
                      "symbol": "TCS",
                      "filed_at": "2026-10-14",
                      "category": "earnings_call",
                      "subject": "Earnings Call Transcript",
                      "title": "Announcement under Regulation 30 (LODR)-Earnings Call Transcript",
                      "description": "Transcript of earnings conference call for the quarter and half year ended September 30, 2026.",
                      "document_url": "https://www.bseindia.com/stockinfo/AnnPdfOpen.aspx?Pname=7dc14216-f892-46f1-bf82-5c7b387a8e4d.pdf",
                      "document_id": 23262437
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listStockFilings",
                    "count": 1,
                    "limit": 50,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/stocks/{symbol}/news": {
      "get": {
        "operationId": "listStockNews",
        "summary": "Company news",
        "description": "News articles about one company. Coverage starts June 2025; updated continuously. Newest first. Each item carries a sentiment label, a topic `category` and the related stock symbols.",
        "tags": [
          "news"
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Stock symbol, e.g. \"RELIANCE\". Percent-encode \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 64,
              "description": "Stock symbol, e.g. \"RELIANCE\". Percent-encode \"&\" (M%26M)."
            },
            "example": "RELIANCE"
          },
          {
            "name": "category",
            "in": "query",
            "required": false,
            "description": "Only articles in this topic category.",
            "schema": {
              "type": "string",
              "enum": [
                "companies",
                "results",
                "markets",
                "economy",
                "policy",
                "global",
                "ipo",
                "commodities",
                "currencies",
                "crypto",
                "banking",
                "technology",
                "real_estate",
                "infrastructure",
                "funds",
                "personal_finance",
                "investment_ideas",
                "debt",
                "startups"
              ]
            }
          },
          {
            "name": "sentiment",
            "in": "query",
            "required": false,
            "description": "Only articles with this sentiment.",
            "schema": {
              "type": "string",
              "enum": [
                "positive",
                "negative",
                "neutral",
                "mixed"
              ]
            }
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "Earliest publication date (inclusive, IST).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "description": "Latest publication date (inclusive, IST).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 20, max 100). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/StockNewsItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "article_id": 6978999,
                      "published_at": "2026-10-16T08:30:22Z",
                      "headline": "TruAlt Bioenergy to host Q2 FY27 earnings call on Oct 26",
                      "summary": "TruAlt Bioenergy has scheduled its Q2 FY27 earnings call for 26 October 2026 to discuss quarterly results and the outlook for the ethanol business.",
                      "sentiment": "neutral",
                      "category": "results",
                      "symbols": [
                        "TRUALT"
                      ],
                      "url": null,
                      "related_filing": {
                        "document_url": "https://www.bseindia.com/stockinfo/AnnPdfOpen.aspx?Pname=0b1c2d3e-4f50-6172-8394-a5b6c7d8e9f0.pdf",
                        "filed_at": "2026-10-16T08:12:05Z",
                        "category": "earnings_call"
                      }
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listStockNews",
                    "count": 1,
                    "limit": 20,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/market/news/articles": {
      "get": {
        "operationId": "listMarketNewsArticles",
        "summary": "Market news",
        "description": "Market-wide news across companies, markets, economy, policy, global, IPOs, commodities and more. Coverage starts June 2025; updated continuously. Newest first. Each item carries a sentiment label, a topic `category` and the related stock symbols.",
        "tags": [
          "news"
        ],
        "parameters": [
          {
            "name": "category",
            "in": "query",
            "required": false,
            "description": "Only articles in this topic category.",
            "schema": {
              "type": "string",
              "enum": [
                "companies",
                "results",
                "markets",
                "economy",
                "policy",
                "global",
                "ipo",
                "commodities",
                "currencies",
                "crypto",
                "banking",
                "technology",
                "real_estate",
                "infrastructure",
                "funds",
                "personal_finance",
                "investment_ideas",
                "debt",
                "startups"
              ]
            }
          },
          {
            "name": "sentiment",
            "in": "query",
            "required": false,
            "description": "Only articles with this sentiment.",
            "schema": {
              "type": "string",
              "enum": [
                "positive",
                "negative",
                "neutral",
                "mixed"
              ]
            }
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "Earliest publication date (inclusive, IST).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "description": "Latest publication date (inclusive, IST).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 20, max 100). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/MarketNewsArticlesItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "article_id": 6978999,
                      "published_at": "2026-10-16T08:30:22Z",
                      "headline": "TruAlt Bioenergy to host Q2 FY27 earnings call on Oct 26",
                      "summary": "TruAlt Bioenergy has scheduled its Q2 FY27 earnings call for 26 October 2026 to discuss quarterly results and the outlook for the ethanol business.",
                      "sentiment": "neutral",
                      "category": "results",
                      "symbols": [
                        "TRUALT"
                      ],
                      "url": null,
                      "related_filing": {
                        "document_url": "https://www.bseindia.com/stockinfo/AnnPdfOpen.aspx?Pname=0b1c2d3e-4f50-6172-8394-a5b6c7d8e9f0.pdf",
                        "filed_at": "2026-10-16T08:12:05Z",
                        "category": "earnings_call"
                      }
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listMarketNewsArticles",
                    "count": 1,
                    "limit": 20,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/ipos": {
      "get": {
        "operationId": "listIpos",
        "summary": "IPOs",
        "description": "Initial public offerings on the main board and SME platforms from 2018 onward, including announced and upcoming issues: dates, price band, lot size, issue size, overall subscription and listing-day performance. Sorted by opening date, newest first (announced issues without dates come first when `status=announced`). Filter by `status` or `board`; `GET /v1/ipos/{ipo_slug}` has subscription by category and offer documents.",
        "tags": [
          "ipos"
        ],
        "parameters": [
          {
            "name": "status",
            "in": "query",
            "required": false,
            "description": "Only issues in this status.",
            "schema": {
              "type": "string",
              "enum": [
                "upcoming",
                "open",
                "closed",
                "listed",
                "announced"
              ]
            }
          },
          {
            "name": "board",
            "in": "query",
            "required": false,
            "description": "Only main-board or only SME issues.",
            "schema": {
              "type": "string",
              "enum": [
                "mainboard",
                "sme"
              ]
            }
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "Earliest opening date (inclusive).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "description": "Latest opening date (inclusive).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 50, max 200). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200,
              "default": 50
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/IposItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "slug": "tonbo-imaging-2026",
                      "company": "Tonbo Imaging",
                      "symbol": null,
                      "isin": "INE0LDG01026",
                      "status": "open",
                      "board": "mainboard",
                      "exchange": "NSE",
                      "open_date": "2026-10-15",
                      "close_date": "2026-10-19",
                      "allotment_date": "2026-10-21",
                      "listing_date": "2026-10-23",
                      "price_band_low": 665,
                      "price_band_high": 700,
                      "issue_price": null,
                      "lot_size": 21,
                      "issue_size_cr": 852.18,
                      "subscription_total": 6.74,
                      "listing_price": null,
                      "listing_gain_pct": null
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listIpos",
                    "count": 1,
                    "limit": 50,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/ipos/{ipo_slug}": {
      "get": {
        "operationId": "getIpo",
        "summary": "IPO detail",
        "description": "One IPO with its timetable, pricing, issue composition, latest subscription by investor category, listing-day performance, registrar, lead managers and public offer-document links.",
        "tags": [
          "ipos"
        ],
        "parameters": [
          {
            "name": "ipo_slug",
            "in": "path",
            "required": true,
            "description": "Slug from `/v1/ipos`, e.g. tonbo-imaging-2026.",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 120,
              "description": "Slug from `/v1/ipos`, e.g. tonbo-imaging-2026."
            },
            "example": "tata-capital-2025"
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/Ipo"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/SingleMeta"
                    }
                  }
                },
                "example": {
                  "data": {
                    "slug": "tonbo-imaging-2026",
                    "company": "Tonbo Imaging",
                    "symbol": null,
                    "isin": "INE0LDG01026",
                    "status": "open",
                    "board": "mainboard",
                    "exchange": "NSE",
                    "open_date": "2026-10-15",
                    "close_date": "2026-10-19",
                    "allotment_date": "2026-10-21",
                    "listing_date": "2026-10-23",
                    "price_band_low": 665,
                    "price_band_high": 700,
                    "issue_price": null,
                    "lot_size": 21,
                    "issue_size_cr": 852.18,
                    "subscription_total": 6.74,
                    "listing_price": null,
                    "listing_gain_pct": null,
                    "face_value": 2,
                    "fresh_issue_cr": null,
                    "offer_for_sale_cr": 852.18,
                    "listing_day_close": null,
                    "listing_day_close_gain_pct": null,
                    "about": "Tonbo Imaging India Limited is a defence electronics company designing imaging and sensor systems.",
                    "registrar": "Kfin Technologies Ltd.",
                    "lead_managers": [
                      "JM Financial Ltd."
                    ],
                    "draft_prospectus_url": "https://www.bseindia.com/corporates/download/303187/",
                    "prospectus_url": null,
                    "subscription": [
                      {
                        "category": "total",
                        "times": 6.74,
                        "as_of": "2026-10-16T07:50:00Z"
                      },
                      {
                        "category": "qib",
                        "times": 3.94,
                        "as_of": "2026-10-16T07:50:00Z"
                      }
                    ]
                  },
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "getIpo"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/scores": {
      "get": {
        "operationId": "listScores",
        "summary": "Tapetide Score ranking",
        "description": "Every stock scored in the latest complete daily run of the Tapetide Score, a deterministic 0-100 composite of six pillars (quality, valuation, growth, momentum, financial health, ownership) with a governance overlay. Filter by `band`, `size`, `sector` (each accepts several values), `min_score`/`max_score`, `min_confidence` and `q` (symbol or name). Sort by `band` (default; best band first, the same walk as `score`), `score`, `confidence`, `market_cap` or `name`. Default `min_confidence` is 75 and the default view includes all sizes: small and micro caps can be illiquid. `meta.counts` reports what the filters left out and `meta.applied_filters` echoes them. Paging is pinned to one run: `meta.next_cursor` carries the run date, so a walk that started before a newer run was published keeps reading its own run (`meta.snapshot.pinned_to_cursor_run` is then true) instead of mixing two runs. The band matters more than the exact number: the distribution is narrow (no stock has ever scored above 77) and a 1-3 point gap is within noise. A pillar of null means the data to score it is unavailable; it is not a zero. Decision-support only. The Tapetide Score is data analysis, not investment advice. Tapetide is not a SEBI-registered research analyst or investment adviser.",
        "tags": [
          "scores"
        ],
        "parameters": [
          {
            "name": "band",
            "in": "query",
            "required": false,
            "description": "Only these bands: strong, good, average, weak, poor (cutoffs 66/55/45/37). Repeat the parameter or separate with commas.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "strong",
                  "good",
                  "average",
                  "weak",
                  "poor"
                ]
              },
              "minItems": 1,
              "maxItems": 5
            }
          },
          {
            "name": "size",
            "in": "query",
            "required": false,
            "description": "Only these market-cap size buckets: large, mid, small, micro, or all (no size filter, the default). Repeat the parameter or separate with commas.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "large",
                  "mid",
                  "small",
                  "micro",
                  "all"
                ]
              },
              "minItems": 1,
              "maxItems": 5
            }
          },
          {
            "name": "sector",
            "in": "query",
            "required": false,
            "description": "Only these sectors, as returned in `sector` (case-insensitive). Repeat the parameter for several (`sector=A&sector=B`); commas are part of a name, as in \"Diamond, Gems and Jewellery\". An unknown sector is a 400.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "minLength": 1,
                "maxLength": 120
              },
              "minItems": 1,
              "maxItems": 20
            }
          },
          {
            "name": "min_score",
            "in": "query",
            "required": false,
            "description": "Minimum score (inclusive).",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            }
          },
          {
            "name": "max_score",
            "in": "query",
            "required": false,
            "description": "Maximum score (inclusive).",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100
            }
          },
          {
            "name": "min_confidence",
            "in": "query",
            "required": false,
            "description": "Minimum data confidence (inclusive). Default 75.",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 100,
              "default": 75
            }
          },
          {
            "name": "q",
            "in": "query",
            "required": false,
            "description": "Case-insensitive substring of the symbol or company name.",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 100
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "description": "Sort key. `band` (default) and `score` order alike: by score, then confidence. `market_cap` and `name` put rows without a value last in both directions.",
            "schema": {
              "type": "string",
              "enum": [
                "band",
                "score",
                "confidence",
                "market_cap",
                "name"
              ],
              "default": "band"
            }
          },
          {
            "name": "order",
            "in": "query",
            "required": false,
            "description": "Sort direction (default desc).",
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ],
              "default": "desc"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 50, max 200). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200,
              "default": 50
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/ScoresItem"
                      }
                    },
                    "meta": {
                      "allOf": [
                        {
                          "$ref": "#/components/schemas/ListMeta"
                        },
                        {
                          "$ref": "#/components/schemas/ScoresMeta"
                        }
                      ]
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "symbol": "CHENNPETRO",
                      "name": "Chennai Petroleum Corporation",
                      "sector": "Petroleum Products",
                      "industry": "Refineries & Marketing",
                      "size": "mid",
                      "market_cap_cr": 15230.5,
                      "pe": 6.4,
                      "industry_pe": 17.2,
                      "score_date": "2026-10-14",
                      "score": 76,
                      "band": "strong",
                      "confidence": 100,
                      "pillars": {
                        "quality": 81.2,
                        "valuation": 88.4,
                        "growth": 70.1,
                        "momentum": 92.3,
                        "financial_health": 64.9,
                        "ownership": 58.7
                      },
                      "caps": [],
                      "red_flags": []
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listScores",
                    "count": 1,
                    "limit": 50,
                    "has_more": false,
                    "next_cursor": null,
                    "snapshot": {
                      "score_date": "2026-10-14",
                      "latest_complete_score_date": "2026-10-14",
                      "pinned_to_cursor_run": false
                    },
                    "counts": {
                      "matched": 141,
                      "scored": 4550,
                      "eligible": 4492,
                      "below_confidence_threshold": 214
                    },
                    "applied_filters": {
                      "bands": [
                        "strong"
                      ],
                      "sizes": [],
                      "sectors": [],
                      "min_score": null,
                      "max_score": null,
                      "min_confidence": 75,
                      "q": null,
                      "sort": "band",
                      "order": "desc"
                    }
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/stocks/{symbol}/score": {
      "get": {
        "operationId": "getStockScore",
        "summary": "Tapetide Score",
        "description": "The latest Tapetide Score for one stock with its six pillar sub-scores and weights, band, percentile within the run, governance caps and red flags, coverage and confidence. The band matters more than the exact number: the distribution is narrow (no stock has ever scored above 77) and a 1-3 point gap is within noise. A pillar of null means the data to score it is unavailable; it is not a zero. Decision-support only. The Tapetide Score is data analysis, not investment advice. Tapetide is not a SEBI-registered research analyst or investment adviser.",
        "tags": [
          "scores"
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Stock symbol, e.g. \"RELIANCE\". Percent-encode \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 64,
              "description": "Stock symbol, e.g. \"RELIANCE\". Percent-encode \"&\" (M%26M)."
            },
            "example": "RELIANCE"
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/StockScore"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/SingleMeta"
                    }
                  }
                },
                "example": {
                  "data": {
                    "symbol": "CHENNPETRO",
                    "score_date": "2026-10-14",
                    "status": "scored",
                    "score": 76,
                    "band": "strong",
                    "percentile": 99.9,
                    "universe": 4492,
                    "pillars": {
                      "quality": 81.2,
                      "valuation": 88.4,
                      "growth": 70.1,
                      "momentum": 92.3,
                      "financial_health": 64.9,
                      "ownership": 58.7
                    },
                    "pillar_weights": {
                      "quality": 22,
                      "valuation": 24,
                      "growth": 9,
                      "momentum": 12,
                      "financial_health": 9,
                      "ownership": 24
                    },
                    "governance_multiplier": 1,
                    "caps": [],
                    "red_flags": [],
                    "coverage_pct": 96,
                    "confidence": 100
                  },
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "getStockScore"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/stocks/{symbol}/score/history": {
      "get": {
        "operationId": "listStockScoreHistory",
        "summary": "Tapetide Score history",
        "description": "Daily Tapetide Score for one stock, one point per scoring run, from late June 2026 onward. Newest first by default; `from`/`to` bound the window. Decision-support only. The Tapetide Score is data analysis, not investment advice. Tapetide is not a SEBI-registered research analyst or investment adviser.",
        "tags": [
          "scores"
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Stock symbol, e.g. \"RELIANCE\". Percent-encode \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 64,
              "description": "Stock symbol, e.g. \"RELIANCE\". Percent-encode \"&\" (M%26M)."
            },
            "example": "RELIANCE"
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "Earliest run date (inclusive).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "description": "Latest run date (inclusive).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "order",
            "in": "query",
            "required": false,
            "description": "Sort direction by date.",
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ],
              "default": "desc"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 90, max 500). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 500,
              "default": 90
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/StockScoreHistoryItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "score_date": "2026-10-14",
                      "score": 76,
                      "band": "strong",
                      "confidence": 100
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listStockScoreHistory",
                    "count": 1,
                    "limit": 90,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/stocks/{symbol}/earnings-calls/digests": {
      "get": {
        "operationId": "listStockEarningsCallDigests",
        "summary": "Earnings-call digests",
        "description": "Digests of one company's earnings-call transcripts, newest first: a Markdown summary, highlights, risks, guidance and the headline metrics quoted, generated from the transcript the company filed with the exchange. `document_id` links to the full transcript via the documents endpoints. Pass `summary=false` for the structured fields only.",
        "tags": [
          "filings"
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Stock symbol, e.g. \"RELIANCE\". Percent-encode \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 64,
              "description": "Stock symbol, e.g. \"RELIANCE\". Percent-encode \"&\" (M%26M)."
            },
            "example": "RELIANCE"
          },
          {
            "name": "summary",
            "in": "query",
            "required": false,
            "description": "Include the Markdown summary (default true).",
            "schema": {
              "type": "boolean",
              "default": true
            }
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "Earliest filing date (inclusive).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "description": "Latest filing date (inclusive).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 4, max 20). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 20,
              "default": 4
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/StockEarningsCallDigestsItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "symbol": "TCS",
                      "document_id": 23262437,
                      "call_date": "2026-07-01",
                      "period": "Jul 2026",
                      "pages": 25,
                      "summary": "# Q1 FY2027 Earnings Summary\n\n## Revenue and Profitability\n\nRevenue of ₹72,275 crore grew 2.2% sequentially and 13.9% year on year in rupee terms…",
                      "summary_truncated": true,
                      "highlights": [
                        "Revenue growth of 13.9% YoY (₹72,275 crore) and 2.2% QoQ, the fourth consecutive quarter of growth"
                      ],
                      "risks": [
                        "Geopolitical uncertainty continuing to cause client project deferrals"
                      ],
                      "guidance": [
                        "No specific revenue or earnings guidance provided, per company policy"
                      ],
                      "key_metrics": [
                        {
                          "metric": "Revenue",
                          "value": "₹72,275 crore",
                          "period": "Q1 FY2027"
                        }
                      ],
                      "transcript_url": "https://www.bseindia.com/stockinfo/AnnPdfOpen.aspx?Pname=27523cab-de62-4f78-939a-6d9853bbd060.pdf"
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listStockEarningsCallDigests",
                    "count": 1,
                    "limit": 4,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/market/surveillance": {
      "get": {
        "operationId": "listMarketSurveillance",
        "summary": "Surveillance lists",
        "description": "Stocks currently under exchange surveillance frameworks (ASM, ESM, GSM) as per the latest published list, with the specific measure and stage. Updated each trading day; returns an empty list if the latest list is more than a week old rather than a stale one. Filter by `framework`; sorted by framework then symbol.",
        "tags": [
          "reference"
        ],
        "parameters": [
          {
            "name": "framework",
            "in": "query",
            "required": false,
            "description": "Only this framework.",
            "schema": {
              "type": "string",
              "enum": [
                "asm",
                "esm",
                "gsm"
              ]
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 100, max 1000). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000,
              "default": 100
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/MarketSurveillanceItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "symbol": "PAISALO",
                      "name": "Paisalo Digital",
                      "framework": "asm",
                      "measure": "long_term_asm",
                      "stage": 1,
                      "description": "Long Term Additional Surveillance Measure (LTASM) - Stage I",
                      "as_of": "2026-10-15",
                      "first_seen": "2026-09-23"
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listMarketSurveillance",
                    "count": 1,
                    "limit": 100,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/reference/indices": {
      "get": {
        "operationId": "listIndices",
        "summary": "Index catalogue",
        "description": "Every index: ~140 NSE indices plus SENSEX and BANKEX. `first_date`/`last_date` give the daily-level coverage (null when no levels are held, currently SENSEX and BANKEX) and `has_constituents` says whether point-in-time membership is available. Use `slug` in `/v1/indices/{slug}/levels` and `/v1/indices/{slug}/constituents`. Pages by slug.",
        "tags": [
          "indices"
        ],
        "parameters": [
          {
            "name": "category",
            "in": "query",
            "required": false,
            "description": "Only indices in this family.",
            "schema": {
              "type": "string",
              "enum": [
                "broad",
                "sectoral",
                "thematic",
                "strategy",
                "volatility"
              ]
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 200, max 200). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200,
              "default": 200
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/IndicesItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "slug": "nifty-50",
                      "name": "Nifty 50",
                      "exchange": "NSE",
                      "category": "broad",
                      "first_date": "1996-01-01",
                      "last_date": "2026-10-14",
                      "has_constituents": true
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listIndices",
                    "count": 1,
                    "limit": 200,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/indices/{slug}/levels": {
      "get": {
        "operationId": "listIndexLevels",
        "summary": "Index daily levels",
        "description": "Daily open/high/low/close for one index, with traded volume, turnover and index PE, PB and dividend yield. History from 1996 for the oldest indices; valuation ratios and volume from 2016. Defaults to the last 365 days; widen with `from`/`to`. Pages by date.",
        "tags": [
          "indices"
        ],
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "Index slug from `/v1/reference/indices`, e.g. \"nifty-50\", \"nifty-bank\", \"india-vix\".",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 80,
              "pattern": "^[a-z0-9-]+$",
              "description": "Index slug from `/v1/reference/indices`, e.g. \"nifty-50\", \"nifty-bank\", \"india-vix\"."
            },
            "example": "nifty-50"
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "Earliest date (inclusive). Default: 365 days before `to`.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "description": "Latest date (inclusive). Default: latest available.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "order",
            "in": "query",
            "required": false,
            "description": "Sort direction by date.",
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ],
              "default": "asc"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 250, max 1000). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000,
              "default": 250
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/IndexLevelsItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "date": "2026-10-14",
                      "open": 22715.75,
                      "high": 22757.95,
                      "low": 22558.95,
                      "close": 22622.7,
                      "volume": 333248082,
                      "turnover_cr": 30396.7,
                      "pe": 19.33,
                      "pb": 2.78,
                      "dividend_yield": 1.52
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listIndexLevels",
                    "count": 1,
                    "limit": 250,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/indices/{slug}/constituents": {
      "get": {
        "operationId": "listIndexConstituents",
        "summary": "Index constituents on a date",
        "description": "Stocks proven to be members of the index on `date` (default: the latest answerable date for this index), with `state: present`. Membership is observed from daily snapshots, so a join or exit is known only to within a bracket: the stock was last seen outside the index on `last_absent_before` and first seen inside on `member_since` (and the same for an exit, `member_through` / `first_absent_after`). A date inside such a bracket is not guessed: by default those stocks are left out; pass `include_uncertain=true` to also list them with `state: uncertain`. Membership history is observed from March 2026 for 38 NSE and BSE indices (check `has_constituents` in the catalogue). `meta` states this index's observed window and `answerable_through`; a date outside it is out of coverage and rejected with a 400 (`details.reason: out_of_coverage`) that states the window, because no observation exists to answer it. Pages by symbol.",
        "tags": [
          "indices"
        ],
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "Index slug from `/v1/reference/indices`, e.g. \"nifty-50\", \"nifty-bank\", \"india-vix\".",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 80,
              "pattern": "^[a-z0-9-]+$",
              "description": "Index slug from `/v1/reference/indices`, e.g. \"nifty-50\", \"nifty-bank\", \"india-vix\"."
            },
            "example": "nifty-50"
          },
          {
            "name": "date",
            "in": "query",
            "required": false,
            "description": "As-of date. Default: the latest date this index's membership is answerable through.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "include_uncertain",
            "in": "query",
            "required": false,
            "description": "Also list stocks whose join or exit bracket contains `date` (state uncertain). Default false: proven members only.",
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 100, max 1000). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000,
              "default": 100
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/IndexConstituentsItem"
                      }
                    },
                    "meta": {
                      "allOf": [
                        {
                          "$ref": "#/components/schemas/ListMeta"
                        },
                        {
                          "$ref": "#/components/schemas/IndexConstituentsMeta"
                        }
                      ]
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "symbol": "TCS",
                      "name": "Tata Consultancy Services Ltd",
                      "isin": "INE467B01029",
                      "state": "present",
                      "member_since": "2026-03-15",
                      "member_through": "2026-10-15",
                      "joined_before_coverage": true,
                      "last_absent_before": null,
                      "first_absent_after": null
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listIndexConstituents",
                    "count": 1,
                    "limit": 100,
                    "has_more": false,
                    "next_cursor": null,
                    "date": "2026-10-15",
                    "coverage_from": "2026-03-15",
                    "observed_through": "2026-10-15",
                    "answerable_through": "2026-10-15",
                    "lag_days": 0
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/stocks/{symbol}/index-memberships": {
      "get": {
        "operationId": "listStockIndexMemberships",
        "summary": "Index memberships of a stock",
        "description": "Observed membership spells of one stock across the 38 tracked indices since March 2026: when each spell was first and last observed, the observed absences that bracket its join and exit (`last_absent_before`, `first_absent_after`), and whether it is current. Pass `date` to keep only spells containing that date (`state: present`); add `include_uncertain=true` to also keep spells whose join or exit bracket contains it (`state: uncertain`). With `date`, `meta.date_status` says whether the date is inside the observed window at all: an empty result is proven non-membership only when it is `in_coverage`, and never for the indices listed in `meta.out_of_coverage_indices`. Pages by index slug.",
        "tags": [
          "indices"
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Stock symbol, e.g. \"RELIANCE\". Percent-encode \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 64,
              "description": "Stock symbol, e.g. \"RELIANCE\". Percent-encode \"&\" (M%26M)."
            },
            "example": "RELIANCE"
          },
          {
            "name": "date",
            "in": "query",
            "required": false,
            "description": "Only spells that contain this date.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "include_uncertain",
            "in": "query",
            "required": false,
            "description": "With `date`: also keep spells whose unobserved join or exit bracket contains the date (state uncertain). Default false.",
            "schema": {
              "type": "boolean",
              "default": false
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 100, max 500). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 500,
              "default": 100
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/StockIndexMembershipsItem"
                      }
                    },
                    "meta": {
                      "allOf": [
                        {
                          "$ref": "#/components/schemas/ListMeta"
                        },
                        {
                          "$ref": "#/components/schemas/StockIndexMembershipsMeta"
                        }
                      ]
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "index_slug": "nifty-50",
                      "index_name": "Nifty 50",
                      "state": "present",
                      "member_since": "2026-03-15",
                      "member_through": "2026-10-15",
                      "current": true,
                      "joined_before_coverage": true,
                      "last_absent_before": null,
                      "first_absent_after": null
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listStockIndexMemberships",
                    "count": 1,
                    "limit": 100,
                    "has_more": false,
                    "next_cursor": null,
                    "date": "2026-06-01",
                    "coverage_from": "2026-03-15",
                    "answerable_through": "2026-10-15",
                    "date_status": "in_coverage",
                    "out_of_coverage_indices": []
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/market/vix/history": {
      "get": {
        "operationId": "listVixHistory",
        "summary": "India VIX daily history",
        "description": "Daily India VIX (expected 30-day Nifty 50 volatility, percent) from July 2010, one row per NSE trading session (weekend/holiday rows that only repeat the previous session are omitted; special weekend sessions such as Muhurat are kept). Defaults to the last 365 days. Pages by date.",
        "tags": [
          "market"
        ],
        "parameters": [
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "Earliest date (inclusive). Default: 365 days before `to`.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "description": "Latest date (inclusive).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "order",
            "in": "query",
            "required": false,
            "description": "Sort direction by date.",
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ],
              "default": "asc"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 250, max 1000). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000,
              "default": 250
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/VixHistoryItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "date": "2026-10-15",
                      "open": 14.625,
                      "high": 14.9475,
                      "low": 13.9075,
                      "close": 14.03,
                      "previous_close": 14.625,
                      "change": -0.6,
                      "change_pct": -4.07
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listVixHistory",
                    "count": 1,
                    "limit": 250,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/market/institutional-flows": {
      "get": {
        "operationId": "listInstitutionalFlows",
        "summary": "FII/DII cash-market flows",
        "description": "Daily gross buy, gross sell and net cash-market activity of foreign (FII) and domestic (DII) institutional investors, INR crore, from January 2014. Provisional same-day figures. Defaults to the last 90 days. Pages by date.",
        "tags": [
          "market"
        ],
        "parameters": [
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "Earliest date (inclusive). Default: 90 days before `to`.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "description": "Latest date (inclusive).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "order",
            "in": "query",
            "required": false,
            "description": "Sort direction by date.",
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ],
              "default": "asc"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 100, max 1000). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000,
              "default": 100
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/InstitutionalFlowsItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "date": "2026-10-15",
                      "fii_buy_cr": 12735.59,
                      "fii_sell_cr": 18020.96,
                      "fii_net_cr": -5285.37,
                      "dii_buy_cr": 19438.65,
                      "dii_sell_cr": 16119.26,
                      "dii_net_cr": 3319.39
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listInstitutionalFlows",
                    "count": 1,
                    "limit": 100,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/market/institutional-flows/derivatives": {
      "get": {
        "operationId": "listParticipantOpenInterest",
        "summary": "Participant-wise F&O open interest",
        "description": "End-of-day open interest in exchange-traded equity derivatives by participant category (FII, DII, proprietary, client), in contracts, long and short, from January 2012. One row per date and participant. Defaults to the last 30 days. Pages by (date, participant).",
        "tags": [
          "market"
        ],
        "parameters": [
          {
            "name": "participant",
            "in": "query",
            "required": false,
            "description": "Only this participant category.",
            "schema": {
              "type": "string",
              "enum": [
                "fii",
                "dii",
                "pro",
                "client"
              ]
            }
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "Earliest date (inclusive). Default: 30 days before `to`.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "description": "Latest date (inclusive).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "order",
            "in": "query",
            "required": false,
            "description": "Sort direction by date.",
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ],
              "default": "asc"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 100, max 1000). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000,
              "default": 100
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/ParticipantOpenInterestItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "date": "2026-10-15",
                      "participant": "fii",
                      "index_futures_long": 38549,
                      "index_futures_short": 318376,
                      "stock_futures_long": 3607402,
                      "stock_futures_short": 2820841,
                      "index_calls_long": 684021,
                      "index_calls_short": 891902,
                      "index_puts_long": 1256369,
                      "index_puts_short": 809342,
                      "stock_calls_long": 293057,
                      "stock_calls_short": 442647,
                      "stock_puts_long": 388838,
                      "stock_puts_short": 269467,
                      "total_long": 6268236,
                      "total_short": 5552575
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listParticipantOpenInterest",
                    "count": 1,
                    "limit": 100,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/market/fpi-flows": {
      "get": {
        "operationId": "listFpiFlows",
        "summary": "FPI daily investment flows",
        "description": "Daily foreign portfolio investor (FPI) gross purchases, gross sales and net investment by asset class and channel, INR crore and USD million. Equity and debt from January 1999 (single total line until November 2009, split by channel after); hybrid from 2017, VRR debt from 2020, AIF and mutual-fund detail from September 2024. A 0 is a reported zero. Defaults to the last 30 days. Pages by (date, asset_class, channel).",
        "tags": [
          "market"
        ],
        "parameters": [
          {
            "name": "asset_class",
            "in": "query",
            "required": false,
            "description": "Only this asset class.",
            "schema": {
              "type": "string",
              "enum": [
                "equity",
                "debt",
                "debt_general_limit",
                "debt_vrr",
                "debt_far",
                "hybrid",
                "aifs",
                "mutual_funds"
              ]
            }
          },
          {
            "name": "channel",
            "in": "query",
            "required": false,
            "description": "Only this channel, e.g. total, stock_exchange, primary_market.",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 40,
              "pattern": "^[a-z_]+$"
            }
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "Earliest date (inclusive). Default: 30 days before `to`.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "description": "Latest date (inclusive).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "order",
            "in": "query",
            "required": false,
            "description": "Sort direction by date.",
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ],
              "default": "asc"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 200, max 1000). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000,
              "default": 200
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/FpiFlowsItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "date": "2026-10-14",
                      "asset_class": "equity",
                      "channel": "total",
                      "gross_purchases_cr": 13687.01,
                      "gross_sales_cr": 15123.42,
                      "net_investment_cr": -1436.41,
                      "net_investment_usd_mn": -150.8,
                      "usd_inr_rate": null
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listFpiFlows",
                    "count": 1,
                    "limit": 200,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/market/fpi-flows/derivatives": {
      "get": {
        "operationId": "listFpiDerivatives",
        "summary": "FPI daily derivatives activity",
        "description": "Daily FPI activity in exchange-traded derivatives by product: contracts and value bought and sold, and end-of-day open interest. Index, stock and interest-rate products from September 2003; currency and commodity products from September 2024. Defaults to the last 30 days. Pages by (date, product).",
        "tags": [
          "market"
        ],
        "parameters": [
          {
            "name": "product",
            "in": "query",
            "required": false,
            "description": "Only this product.",
            "schema": {
              "type": "string",
              "enum": [
                "index_futures",
                "index_options",
                "stock_futures",
                "stock_options",
                "interest_rate_futures",
                "currency_futures",
                "currency_options",
                "commodity_futures",
                "commodity_options"
              ]
            }
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "Earliest date (inclusive). Default: 30 days before `to`.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "description": "Latest date (inclusive).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "order",
            "in": "query",
            "required": false,
            "description": "Sort direction by date.",
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ],
              "default": "asc"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 100, max 1000). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000,
              "default": 100
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/FpiDerivativesItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "date": "2026-10-15",
                      "product": "index_futures",
                      "buy_contracts": 9771,
                      "buy_value_cr": 1481.78,
                      "sell_contracts": 16996,
                      "sell_value_cr": 2586.25,
                      "open_interest_contracts": 368476,
                      "open_interest_value_cr": 55878.1
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listFpiDerivatives",
                    "count": 1,
                    "limit": 100,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/market/fpi-flows/sectors": {
      "get": {
        "operationId": "listFpiSectorHoldings",
        "summary": "FPI holdings and flows by sector",
        "description": "Fortnightly FPI assets under custody and net investment by sector, INR crore, from April 2012. The sector classification changed in May 2022. Defaults to the last 180 days. Pages by (date, measure, sector).",
        "tags": [
          "market"
        ],
        "parameters": [
          {
            "name": "measure",
            "in": "query",
            "required": false,
            "description": "Only this measure.",
            "schema": {
              "type": "string",
              "enum": [
                "assets_under_custody",
                "net_investment"
              ]
            }
          },
          {
            "name": "sector",
            "in": "query",
            "required": false,
            "description": "Exact sector name, e.g. Financial Services.",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 120
            }
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "Earliest fortnight-end date (inclusive). Default: 180 days before `to`.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "description": "Latest fortnight-end date (inclusive).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "order",
            "in": "query",
            "required": false,
            "description": "Sort direction by date.",
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ],
              "default": "asc"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 100, max 1000). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000,
              "default": 100
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/FpiSectorHoldingsItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "date": "2026-09-30",
                      "period_start": "2026-09-16",
                      "measure": "assets_under_custody",
                      "sector": "Capital Goods",
                      "parent_sector": null,
                      "equity_cr": 487700,
                      "debt_cr": 67,
                      "debt_vrr_cr": 11,
                      "debt_far_cr": null,
                      "hybrid_cr": null,
                      "total_cr": 487778
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listFpiSectorHoldings",
                    "count": 1,
                    "limit": 100,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/funds/category-flows": {
      "get": {
        "operationId": "listFundCategoryFlows",
        "summary": "Mutual fund category flows",
        "description": "Monthly industry-wide mutual fund data per scheme category: schemes, folios, gross inflows, redemptions, net flow and AUM, INR crore, from April 2019. Defaults to the last 12 months. Pages by (month, scheme_type, category).",
        "tags": [
          "funds"
        ],
        "parameters": [
          {
            "name": "group",
            "in": "query",
            "required": false,
            "description": "Only this category group.",
            "schema": {
              "type": "string",
              "enum": [
                "debt",
                "equity",
                "hybrid",
                "solution_oriented",
                "other",
                "index_funds",
                "etfs",
                "overseas_fund_of_funds"
              ]
            }
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "Earliest month (inclusive); any day in the month. Default: 12 months before `to`.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "description": "Latest month (inclusive); any day in the month.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "order",
            "in": "query",
            "required": false,
            "description": "Sort direction by date.",
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ],
              "default": "asc"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 100, max 1000). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000,
              "default": 100
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/FundCategoryFlowsItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "month": "2026-09-01",
                      "scheme_type": "open_ended",
                      "group": "equity",
                      "category": "Flexi Cap Fund",
                      "schemes": 47,
                      "folios": 25035055,
                      "funds_mobilized_cr": 12368.09,
                      "redemptions_cr": 5666.29,
                      "net_flow_cr": 6701.8,
                      "net_aum_cr": 588389.52,
                      "average_aum_cr": 601342.66
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listFundCategoryFlows",
                    "count": 1,
                    "limit": 100,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/macro/series": {
      "get": {
        "operationId": "listMacroSeries",
        "summary": "Macro series catalogue",
        "description": "Every macro-economic time series available at `/v1/macro/series/{series_id}/observations`: policy rates and reserve ratios, foreign exchange reserves, bank deposits and credit, CPI, WPI, GDP and INR reference rates, with unit, frequency and coverage. Pages by id.",
        "tags": [
          "macro"
        ],
        "parameters": [
          {
            "name": "frequency",
            "in": "query",
            "required": false,
            "description": "Only series with this frequency.",
            "schema": {
              "type": "string",
              "enum": [
                "daily",
                "weekly",
                "fortnightly",
                "monthly",
                "quarterly"
              ]
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 100, max 100). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 100
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/MacroSeriesItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "id": "repo_rate",
                      "name": "Policy repo rate",
                      "description": "Rate at which the central bank lends to banks overnight against government securities; the headline policy rate. Weekly observation from December 2011.",
                      "frequency": "weekly",
                      "unit": "percent",
                      "publisher": "Reserve Bank of India",
                      "first_date": "2011-12-30",
                      "last_date": "2026-10-02"
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listMacroSeries",
                    "count": 1,
                    "limit": 100,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/macro/series/{series_id}/observations": {
      "get": {
        "operationId": "listMacroObservations",
        "summary": "Macro series observations",
        "description": "Dated observations of one macro series (ids from `/v1/macro/series`). Missing periods are omitted rather than returned as zero. Defaults to the last 10 years; widen with `from`/`to`. Pages by date.",
        "tags": [
          "macro"
        ],
        "parameters": [
          {
            "name": "series_id",
            "in": "path",
            "required": true,
            "description": "Series id, e.g. \"repo_rate\", \"cpi_combined_yoy\", \"usd_inr\".",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 64,
              "pattern": "^[a-z0-9_]+$",
              "description": "Series id, e.g. \"repo_rate\", \"cpi_combined_yoy\", \"usd_inr\"."
            },
            "example": "repo_rate"
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "Earliest date (inclusive). Default: 10 years before `to`.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "description": "Latest date (inclusive).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "order",
            "in": "query",
            "required": false,
            "description": "Sort direction by date.",
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ],
              "default": "asc"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 500, max 5000). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 5000,
              "default": 500
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/MacroObservationsItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "date": "2026-10-02",
                      "value": 5.25
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listMacroObservations",
                    "count": 1,
                    "limit": 500,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/macro/commodities": {
      "get": {
        "operationId": "listCommodityPrices",
        "summary": "Commodity prices",
        "description": "Daily prices for 11 commodities: international benchmark price in USD, computed India landed cost including import duty, and the domestic exchange price. From April 2026 (lead and nickel from July 2026). A stalled international feed (unchanged for more than 5 calendar days, currently zinc) is flagged with `international_stale` and its international, landed and change fields are null. Defaults to the last 30 days. Pages by (date, commodity).",
        "tags": [
          "macro"
        ],
        "parameters": [
          {
            "name": "commodity",
            "in": "query",
            "required": false,
            "description": "Only this commodity.",
            "schema": {
              "type": "string",
              "enum": [
                "gold",
                "silver",
                "platinum",
                "crudeoil",
                "brentcrude",
                "naturalgas",
                "copper",
                "aluminium",
                "zinc",
                "lead",
                "nickel"
              ]
            }
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "Earliest date (inclusive). Default: 30 days before `to`.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "description": "Latest date (inclusive).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "order",
            "in": "query",
            "required": false,
            "description": "Sort direction by date.",
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ],
              "default": "asc"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 100, max 1000). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000,
              "default": 100
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/CommodityPricesItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "date": "2026-10-16",
                      "commodity": "gold",
                      "category": "precious",
                      "international_price_usd": 4197,
                      "international_unit": "troy_oz",
                      "usd_inr": 95.10014,
                      "import_duty_pct": 6,
                      "import_duty": "BCD 5% + AIDC 1% = 6%",
                      "india_landed_price_inr": 13602.44,
                      "india_unit": "g",
                      "india_market_price_inr": 14824,
                      "india_market_unit": "g",
                      "change_pct": 0.645,
                      "india_market_change_pct": 0.51,
                      "international_last_updated": "2026-10-16",
                      "international_stale": false
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listCommodityPrices",
                    "count": 1,
                    "limit": 100,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/derivatives/contracts": {
      "get": {
        "operationId": "listDerivativeContracts",
        "summary": "Derivative contracts",
        "description": "Listed futures and option contracts for one underlying from 2001 onward (NSE) and 2024 onward (BSE), including expired contracts. Defaults to contracts expiring from today onward. Filter by `expiry` (exact) or `from_expiry`/`to_expiry` (historical windows at most 2 years apart). Pages by expiry, instrument, strike, option type.",
        "tags": [
          "derivatives"
        ],
        "parameters": [
          {
            "name": "underlying",
            "in": "query",
            "required": true,
            "description": "Underlying symbol as listed for derivatives, e.g. \"NIFTY\", \"BANKNIFTY\", \"SENSEX\", \"RELIANCE\". Percent-encode \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 24
            }
          },
          {
            "name": "expiry",
            "in": "query",
            "required": false,
            "description": "Exact expiry date.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "from_expiry",
            "in": "query",
            "required": false,
            "description": "Earliest expiry (inclusive). Default today, or `to_expiry` minus 2 years.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "to_expiry",
            "in": "query",
            "required": false,
            "description": "Latest expiry (inclusive). Default: open-ended for upcoming windows, `from_expiry` plus 2 years for historical ones.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "instrument",
            "in": "query",
            "required": false,
            "description": "Restrict to futures or options.",
            "schema": {
              "type": "string",
              "enum": [
                "future",
                "option"
              ]
            }
          },
          {
            "name": "exchange",
            "in": "query",
            "required": false,
            "description": "Restrict to one exchange. Many stock underlyings trade on both, with different expiry dates.",
            "schema": {
              "type": "string",
              "enum": [
                "NSE",
                "BSE"
              ]
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 200, max 1000). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000,
              "default": 200
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/DerivativeContractsItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "underlying": "NIFTY",
                      "exchange": "NSE",
                      "kind": "index",
                      "instrument": "option",
                      "expiry": "2026-10-27",
                      "strike": 22600,
                      "option_type": "CE",
                      "lot_size": 65,
                      "trading_symbol": "NIFTY-Oct2026-22600-CE"
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listDerivativeContracts",
                    "count": 1,
                    "limit": 200,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/derivatives/{underlying}/expiries": {
      "get": {
        "operationId": "listDerivativeExpiries",
        "summary": "Derivative expiries",
        "description": "Expiry dates for one underlying, per exchange, with whether futures and/or options expire that day. Defaults to upcoming expiries (today onward). For history pass `from_expiry`/`to_expiry` (at most 2 years apart). Pages by expiry date.",
        "tags": [
          "derivatives"
        ],
        "parameters": [
          {
            "name": "underlying",
            "in": "path",
            "required": true,
            "description": "Underlying symbol as listed for derivatives, e.g. \"NIFTY\", \"BANKNIFTY\", \"SENSEX\", \"RELIANCE\". Percent-encode \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 24,
              "description": "Underlying symbol as listed for derivatives, e.g. \"NIFTY\", \"BANKNIFTY\", \"SENSEX\", \"RELIANCE\". Percent-encode \"&\" (M%26M)."
            },
            "example": "NIFTY"
          },
          {
            "name": "from_expiry",
            "in": "query",
            "required": false,
            "description": "Earliest expiry (inclusive). Default today, or `to_expiry` minus 1 year.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "to_expiry",
            "in": "query",
            "required": false,
            "description": "Latest expiry (inclusive). Default: open-ended when `from_expiry` is today or later.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "exchange",
            "in": "query",
            "required": false,
            "description": "Restrict to one exchange. Many stock underlyings trade on both, with different expiry dates.",
            "schema": {
              "type": "string",
              "enum": [
                "NSE",
                "BSE"
              ]
            }
          },
          {
            "name": "order",
            "in": "query",
            "required": false,
            "description": "Sort direction by date.",
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ],
              "default": "asc"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 50, max 500). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 500,
              "default": 50
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/DerivativeExpiriesItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "expiry": "2026-10-27",
                      "exchange": "NSE",
                      "has_futures": true,
                      "has_options": true,
                      "option_strikes": 241
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listDerivativeExpiries",
                    "count": 1,
                    "limit": 50,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/derivatives/{underlying}/bars/daily": {
      "get": {
        "operationId": "listDerivativeDailyBars",
        "summary": "Derivative daily bars",
        "description": "End-of-day OHLC, settlement, volume and open interest for every contract of one underlying and expiry. NSE history from 2001, BSE from 2024. `expiry` is required (see /expiries); narrow with `instrument`, `strike`, `option_type`, `exchange`. Window defaults to the 90 days before `to` (max 400 days). Untraded sessions publish null open/high/low/close with `traded: false`; use `settle_price` as the mark. Pages by date, then contract.",
        "tags": [
          "derivatives"
        ],
        "parameters": [
          {
            "name": "underlying",
            "in": "path",
            "required": true,
            "description": "Underlying symbol as listed for derivatives, e.g. \"NIFTY\", \"BANKNIFTY\", \"SENSEX\", \"RELIANCE\". Percent-encode \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 24,
              "description": "Underlying symbol as listed for derivatives, e.g. \"NIFTY\", \"BANKNIFTY\", \"SENSEX\", \"RELIANCE\". Percent-encode \"&\" (M%26M)."
            },
            "example": "NIFTY"
          },
          {
            "name": "expiry",
            "in": "query",
            "required": true,
            "description": "Contract expiry (required).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "instrument",
            "in": "query",
            "required": false,
            "description": "Restrict to futures or options.",
            "schema": {
              "type": "string",
              "enum": [
                "future",
                "option"
              ]
            }
          },
          {
            "name": "strike",
            "in": "query",
            "required": false,
            "description": "Option strike in INR / index points.",
            "schema": {
              "type": "number",
              "exclusiveMinimum": 0
            }
          },
          {
            "name": "option_type",
            "in": "query",
            "required": false,
            "description": "CE (call) or PE (put).",
            "schema": {
              "type": "string",
              "enum": [
                "CE",
                "PE"
              ]
            }
          },
          {
            "name": "exchange",
            "in": "query",
            "required": false,
            "description": "Restrict to one exchange. Many stock underlyings trade on both, with different expiry dates.",
            "schema": {
              "type": "string",
              "enum": [
                "NSE",
                "BSE"
              ]
            }
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "First session (inclusive).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "description": "Last session (inclusive). Default: the expiry date or today, whichever is earlier.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 200, max 1000). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000,
              "default": 200
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/DerivativeDailyBarsItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "date": "2026-10-14",
                      "exchange": "NSE",
                      "instrument": "option",
                      "expiry": "2026-10-27",
                      "strike": 22600,
                      "option_type": "CE",
                      "open": 240.1,
                      "high": 268.4,
                      "low": 228.15,
                      "close": 250.25,
                      "settle_price": 250.25,
                      "underlying_settlement_price": null,
                      "traded": true,
                      "volume_contracts": 99205,
                      "volume_units": 6448325,
                      "open_interest_units": 3041740,
                      "open_interest_contracts": 46796,
                      "change_in_open_interest_units": 412360,
                      "lot_size": 65
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listDerivativeDailyBars",
                    "count": 1,
                    "limit": 200,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/derivatives/{underlying}/option-analytics": {
      "get": {
        "operationId": "listDerivativeOptionAnalytics",
        "summary": "Option IV and Greeks by strike",
        "description": "Implied volatility and Greeks for every option strike of one underlying, expiry and session, computed end-of-day with Black-76 on the forward. History from 2001 (NSE) and 2024 (BSE). `date` and `expiry` are required. IV is in percent. Pages by exchange, strike, option type.",
        "tags": [
          "derivatives"
        ],
        "parameters": [
          {
            "name": "underlying",
            "in": "path",
            "required": true,
            "description": "Underlying symbol as listed for derivatives, e.g. \"NIFTY\", \"BANKNIFTY\", \"SENSEX\", \"RELIANCE\". Percent-encode \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 24,
              "description": "Underlying symbol as listed for derivatives, e.g. \"NIFTY\", \"BANKNIFTY\", \"SENSEX\", \"RELIANCE\". Percent-encode \"&\" (M%26M)."
            },
            "example": "NIFTY"
          },
          {
            "name": "date",
            "in": "query",
            "required": true,
            "description": "Trading session (required).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "expiry",
            "in": "query",
            "required": true,
            "description": "Option expiry (required).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "option_type",
            "in": "query",
            "required": false,
            "description": "CE (call) or PE (put).",
            "schema": {
              "type": "string",
              "enum": [
                "CE",
                "PE"
              ]
            }
          },
          {
            "name": "min_strike",
            "in": "query",
            "required": false,
            "description": "Lowest strike (inclusive).",
            "schema": {
              "type": "number",
              "minimum": 0
            }
          },
          {
            "name": "max_strike",
            "in": "query",
            "required": false,
            "description": "Highest strike (inclusive).",
            "schema": {
              "type": "number",
              "exclusiveMinimum": 0
            }
          },
          {
            "name": "exchange",
            "in": "query",
            "required": false,
            "description": "Restrict to one exchange. Many stock underlyings trade on both, with different expiry dates.",
            "schema": {
              "type": "string",
              "enum": [
                "NSE",
                "BSE"
              ]
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 200, max 1000). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000,
              "default": 200
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/DerivativeOptionAnalyticsItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "date": "2026-10-14",
                      "exchange": "NSE",
                      "expiry": "2026-10-27",
                      "strike": 22600,
                      "option_type": "CE",
                      "premium": 250.25,
                      "premium_basis": "traded_close",
                      "forward": 22646.1223,
                      "forward_basis": "put_call_parity",
                      "years_to_expiry": 0.035616,
                      "log_moneyness": 0.002039,
                      "iv_pct": 13.329,
                      "iv_status": "ok",
                      "delta": 0.536054,
                      "gamma": 0.00069564,
                      "vega": 16.936369,
                      "theta": -8.637898
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listDerivativeOptionAnalytics",
                    "count": 1,
                    "limit": 200,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/derivatives/{underlying}/volatility": {
      "get": {
        "operationId": "listDerivativeVolatility",
        "summary": "Option volatility summary by expiry",
        "description": "One row per session and listed option expiry: ATM implied volatility, IV rank and percentile, realised volatility (indices), risk reversal, butterfly, max pain and put-call ratios. History from 2001. Window defaults to the last 90 days (max 3 years); `expiry` restricts to one expiry. All volatility fields are percents. Realised-volatility fields are filled one session late, so the newest session can show them as null. Pages by date (newest first by default), then expiry.",
        "tags": [
          "derivatives"
        ],
        "parameters": [
          {
            "name": "underlying",
            "in": "path",
            "required": true,
            "description": "Underlying symbol as listed for derivatives, e.g. \"NIFTY\", \"BANKNIFTY\", \"SENSEX\", \"RELIANCE\". Percent-encode \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 24,
              "description": "Underlying symbol as listed for derivatives, e.g. \"NIFTY\", \"BANKNIFTY\", \"SENSEX\", \"RELIANCE\". Percent-encode \"&\" (M%26M)."
            },
            "example": "NIFTY"
          },
          {
            "name": "expiry",
            "in": "query",
            "required": false,
            "description": "Only this expiry.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "First session (inclusive).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "description": "Last session (inclusive). Default today.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "order",
            "in": "query",
            "required": false,
            "description": "Sort direction by date.",
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ],
              "default": "desc"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 100, max 1000). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000,
              "default": 100
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/DerivativeVolatilityItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "date": "2026-10-14",
                      "expiry": "2026-10-27",
                      "days_to_expiry": 13,
                      "forward": 22646.1223,
                      "forward_basis": "put_call_parity",
                      "atm_strike": 22650,
                      "atm_iv_pct": 13.2699,
                      "iv_rank_pct": 25.31,
                      "iv_percentile_pct": 66.01,
                      "realised_vol_20d_pct": 14.7519,
                      "realised_vol_30d_pct": 12.7489,
                      "iv_minus_rv_30d_pct": 0.521,
                      "risk_reversal_pct": 3.508,
                      "butterfly_pct": 4.9308,
                      "max_pain_strike": 23000,
                      "call_open_interest_units": 85689955,
                      "put_open_interest_units": 79783795,
                      "put_call_ratio_oi": 0.9311,
                      "put_call_ratio_volume": 0.9023,
                      "strikes": 228
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listDerivativeVolatility",
                    "count": 1,
                    "limit": 100,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/derivatives/{underlying}/bars/intraday": {
      "get": {
        "operationId": "listDerivativeIntradayBars",
        "summary": "Derivative 1-minute bars",
        "description": "One-minute OHLC, volume and open interest per contract for one underlying, expiry and session. Options from 2026-06-11, futures from 2025-07-18; earlier sessions return 400. Strike coverage is the actively traded part of the ladder, not every listed strike. Bars may extend past 15:30 IST to the end of the closing session. Minutes with no trade have no bar. Prices are as traded (not adjusted). `date` and `expiry` are required. Pages by time, then contract.",
        "tags": [
          "derivatives"
        ],
        "parameters": [
          {
            "name": "underlying",
            "in": "path",
            "required": true,
            "description": "Underlying symbol as listed for derivatives, e.g. \"NIFTY\", \"BANKNIFTY\", \"SENSEX\", \"RELIANCE\". Percent-encode \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 24,
              "description": "Underlying symbol as listed for derivatives, e.g. \"NIFTY\", \"BANKNIFTY\", \"SENSEX\", \"RELIANCE\". Percent-encode \"&\" (M%26M)."
            },
            "example": "NIFTY"
          },
          {
            "name": "date",
            "in": "query",
            "required": true,
            "description": "Trading session (required).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "expiry",
            "in": "query",
            "required": true,
            "description": "Contract expiry (required).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "instrument",
            "in": "query",
            "required": false,
            "description": "Restrict to futures or options.",
            "schema": {
              "type": "string",
              "enum": [
                "future",
                "option"
              ],
              "default": "option"
            }
          },
          {
            "name": "strike",
            "in": "query",
            "required": false,
            "description": "Option strike.",
            "schema": {
              "type": "number",
              "exclusiveMinimum": 0
            }
          },
          {
            "name": "option_type",
            "in": "query",
            "required": false,
            "description": "CE (call) or PE (put).",
            "schema": {
              "type": "string",
              "enum": [
                "CE",
                "PE"
              ]
            }
          },
          {
            "name": "exchange",
            "in": "query",
            "required": false,
            "description": "Restrict to one exchange. Many stock underlyings trade on both, with different expiry dates.",
            "schema": {
              "type": "string",
              "enum": [
                "NSE",
                "BSE"
              ]
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 500, max 1000). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000,
              "default": 500
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/DerivativeIntradayBarsItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "ts": "2026-10-14T09:58:00.000Z",
                      "exchange": "NSE",
                      "instrument": "option",
                      "expiry": "2026-10-27",
                      "strike": 22600,
                      "option_type": "CE",
                      "open": 251.2,
                      "high": 252,
                      "low": 249.8,
                      "close": 250.5,
                      "volume_units": 22815,
                      "volume_contracts": 351,
                      "open_interest_units": 3041740
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listDerivativeIntradayBars",
                    "count": 1,
                    "limit": 500,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/derivatives/{underlying}/position-limits": {
      "get": {
        "operationId": "listDerivativePositionLimits",
        "summary": "Market-wide position limit utilisation",
        "description": "Daily market-wide position limit, open interest, utilisation and next-session ban flag for one F&O stock, from 2010-02-01. Utilisation needs future-equivalent OI, published from 2025-10-01. Index underlyings have no market-wide limit (404). Window defaults to the last 90 days (max 5 years). Pages by date, newest first by default.",
        "tags": [
          "derivatives"
        ],
        "parameters": [
          {
            "name": "underlying",
            "in": "path",
            "required": true,
            "description": "Underlying symbol as listed for derivatives, e.g. \"NIFTY\", \"BANKNIFTY\", \"SENSEX\", \"RELIANCE\". Percent-encode \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 24,
              "description": "Underlying symbol as listed for derivatives, e.g. \"NIFTY\", \"BANKNIFTY\", \"SENSEX\", \"RELIANCE\". Percent-encode \"&\" (M%26M)."
            },
            "example": "NIFTY"
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "First session (inclusive).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "description": "Last session (inclusive). Default today.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "order",
            "in": "query",
            "required": false,
            "description": "Sort direction by date.",
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ],
              "default": "desc"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 100, max 1000). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000,
              "default": 100
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/DerivativePositionLimitsItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "date": "2026-10-15",
                      "symbol": "RELIANCE",
                      "isin": "INE002A01018",
                      "market_wide_limit_units": 658757301,
                      "open_interest_units": 344116500,
                      "future_equivalent_open_interest_units": 179202892,
                      "utilisation_pct": 27.2,
                      "headroom_next_session_units": 446616544,
                      "ban_next_session": false,
                      "applies_to_session": "2026-10-16",
                      "applies_to_session_basis": "calendar"
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listDerivativePositionLimits",
                    "count": 1,
                    "limit": 100,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/derivatives/ban-list": {
      "get": {
        "operationId": "listDerivativeBanList",
        "summary": "F&O ban list derived from position limits",
        "description": "Stocks barred from fresh F&O positions on one session, derived from the previous session's market-wide position-limit figures (a stock enters the ban period when future-equivalent OI exceeds 95% of its limit and leaves below 80%). History from 2010-02-02. `date` is the session the ban applies to and defaults to the next session after the latest published figures. Differs from /v1/market/fno-ban, which serves the exchange's published list with its own entry/exit dates; this one is reconstructed day by day from the limits and fills gaps in that history.",
        "tags": [
          "derivatives"
        ],
        "parameters": [
          {
            "name": "date",
            "in": "query",
            "required": false,
            "description": "Session the ban applies to. Default: the next session after the latest published figures.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 100, max 500). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 500,
              "default": 100
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/DerivativeBanListItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "session": "2026-10-16",
                      "symbol": "SAIL",
                      "isin": "INE114A01011",
                      "utilisation_pct": 94.6,
                      "determined_on": "2026-10-15"
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listDerivativeBanList",
                    "count": 1,
                    "limit": 100,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/derivatives/{underlying}/exchange-volatility": {
      "get": {
        "operationId": "listDerivativeExchangeVolatility",
        "summary": "Exchange-published daily volatility",
        "description": "The exchange's end-of-day volatility estimates for an F&O underlying (stocks and NSE indices), from 2002-01-02: daily and annualised volatility of the underlying and its near-month futures, and the applicable (higher) figure. Prices and log returns are published from 2011-03-28 only. All volatility fields are percents. Window defaults to the last 90 days (max 5 years). Pages by date, newest first by default.",
        "tags": [
          "derivatives"
        ],
        "parameters": [
          {
            "name": "underlying",
            "in": "path",
            "required": true,
            "description": "Underlying symbol as listed for derivatives, e.g. \"NIFTY\", \"BANKNIFTY\", \"SENSEX\", \"RELIANCE\". Percent-encode \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 24,
              "description": "Underlying symbol as listed for derivatives, e.g. \"NIFTY\", \"BANKNIFTY\", \"SENSEX\", \"RELIANCE\". Percent-encode \"&\" (M%26M)."
            },
            "example": "NIFTY"
          },
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "First session (inclusive).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "description": "Last session (inclusive). Default today.",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "order",
            "in": "query",
            "required": false,
            "description": "Sort direction by date.",
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ],
              "default": "desc"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 100, max 1000). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 1000,
              "default": 100
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/DerivativeExchangeVolatilityItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "date": "2026-10-15",
                      "symbol": "RELIANCE",
                      "underlying_close": 1218.47,
                      "underlying_previous_close": 1174.61,
                      "underlying_log_return": 0.0366598,
                      "underlying_daily_vol_pct": 1.3594,
                      "underlying_annual_vol_pct": 25.9719,
                      "futures_close": 1212.8,
                      "futures_previous_close": 1182.2,
                      "futures_log_return": 0.02555463,
                      "futures_daily_vol_pct": 1.3034,
                      "futures_annual_vol_pct": 24.9009,
                      "applicable_daily_vol_pct": 1.3594,
                      "applicable_annual_vol_pct": 25.9719
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listDerivativeExchangeVolatility",
                    "count": 1,
                    "limit": 100,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/quotes/live": {
      "get": {
        "operationId": "listLiveQuotes",
        "summary": "Live quotes for up to 50 stocks",
        "description": "Latest traded price, change, OHLC and volume for up to 50 symbols in one call. Rows are positional: one per requested symbol, in the order given, with `found: false` for unknown symbols. Prices refresh within ~15 seconds during the session; outside it they are the last session's close. Not paginated — the whole batch is one page.",
        "tags": [
          "live"
        ],
        "parameters": [
          {
            "name": "symbols",
            "in": "query",
            "required": true,
            "description": "Comma-separated symbols, e.g. `TCS,INFY,M%26M` (max 50).",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 50, max 50). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50,
              "default": 50
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/LiveQuotesItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "symbol": "TCS",
                      "requested": "tcs",
                      "found": true,
                      "name": "Tata Consultancy Services Ltd",
                      "ltp": 2433.1,
                      "change": 83.1,
                      "change_pct": 3.54,
                      "open": 2382,
                      "high": 2446,
                      "low": 2375.7,
                      "prev_close": 2350,
                      "volume": 4952652,
                      "last_trade_at": "2026-10-16T05:50:46Z",
                      "market_status": "open"
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listLiveQuotes",
                    "count": 1,
                    "limit": 50,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/stocks/{symbol}/quote/live": {
      "get": {
        "operationId": "getLiveQuote",
        "summary": "Live quote",
        "description": "Latest traded price for one stock with session OHLC, volume, 52-week range and price-derived market cap / P/E. Refreshes within ~15 seconds during the session; outside it, the last session's close.",
        "tags": [
          "live"
        ],
        "parameters": [
          {
            "name": "symbol",
            "in": "path",
            "required": true,
            "description": "Stock symbol, e.g. \"RELIANCE\". Percent-encode \"&\" (M%26M).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 64,
              "description": "Stock symbol, e.g. \"RELIANCE\". Percent-encode \"&\" (M%26M)."
            },
            "example": "RELIANCE"
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/LiveQuote"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/SingleMeta"
                    }
                  }
                },
                "example": {
                  "data": {
                    "symbol": "TCS",
                    "requested": "TCS",
                    "found": true,
                    "name": "Tata Consultancy Services Ltd",
                    "ltp": 2433.1,
                    "change": 83.1,
                    "change_pct": 3.54,
                    "open": 2382,
                    "high": 2446,
                    "low": 2375.7,
                    "prev_close": 2350,
                    "volume": 4952652,
                    "last_trade_at": "2026-10-16T05:50:46Z",
                    "market_status": "open",
                    "market_cap_cr": 880316.87,
                    "pe_ttm": 17.68,
                    "high_52w": 3350,
                    "low_52w": 1976.8
                  },
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "getLiveQuote"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/market/status": {
      "get": {
        "operationId": "getMarketStatus",
        "summary": "Market status",
        "description": "Whether the NSE equity market is open, in pre-open, closed for the day or on holiday, with today's session hours and the time of the next change. Derived from the official trading calendar.",
        "tags": [
          "live"
        ],
        "parameters": [],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 0,
        "responses": {
          "200": {
            "description": "OK. Free.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta"
                  ],
                  "properties": {
                    "data": {
                      "$ref": "#/components/schemas/MarketStatus"
                    },
                    "meta": {
                      "$ref": "#/components/schemas/SingleMeta"
                    }
                  }
                },
                "example": {
                  "data": {
                    "status": "open",
                    "date": "2026-10-16",
                    "is_trading_day": true,
                    "holiday_name": null,
                    "session": {
                      "type": "regular",
                      "pre_open": "09:00",
                      "open": "09:15",
                      "close": "15:30"
                    },
                    "next_status": "closed",
                    "next_transition_at": "2026-10-16T10:00:00Z",
                    "server_time": "2026-10-16T05:50:59Z"
                  },
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "getMarketStatus"
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/market/heatmap": {
      "get": {
        "operationId": "listHeatmapIndices",
        "summary": "Indices with constituent data",
        "description": "The indices whose constituents `/v1/market/heatmap/{index_slug}` serves. Static reference list.",
        "tags": [
          "live"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 50, max 50). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50,
              "default": 50
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 0,
        "responses": {
          "200": {
            "description": "OK. Free.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/HeatmapIndicesItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "slug": "nifty-50",
                      "name": "Nifty 50",
                      "group": "Broad Market",
                      "exchange": "NSE"
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listHeatmapIndices",
                    "count": 1,
                    "limit": 50,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/market/heatmap/{index_slug}": {
      "get": {
        "operationId": "getIndexHeatmap",
        "summary": "Index constituents with live returns",
        "description": "Every constituent of an index with its live price, returns over 1 day to 1 year, volume, market cap and P/E. Sorted by `sort` (default market cap, largest first); `rank` gives the position. Indices: nifty-50, sensex, nifty-next-50, nifty-100, nifty-200, nifty-500, nifty-total-market, nifty-midcap-50, nifty-midcap-100, nifty-midcap-150, nifty-midcap-select, nifty-midsmallcap-400, nifty-smallcap-50, nifty-smallcap-100, nifty-smallcap-250, nifty-microcap-250, nifty-auto, nifty-bank, nifty-financial, nifty-fmcg, nifty-healthcare, nifty-it, nifty-media, nifty-metal, nifty-pharma, nifty-private-bank, nifty-psu-bank, nifty-realty, nifty-consumer-durables, nifty-energy, nifty-infra, nifty-commodities, nifty-pse, nifty-cpse, nifty-mnc, nifty-services. Returns null, never 0, for a value the feed did not publish. A 5-year return is not published.",
        "tags": [
          "live"
        ],
        "parameters": [
          {
            "name": "index_slug",
            "in": "path",
            "required": true,
            "description": "Index slug, e.g. nifty-50. See /v1/market/heatmap.",
            "schema": {
              "type": "string",
              "description": "Index slug, e.g. nifty-50. See /v1/market/heatmap."
            },
            "example": "nifty-50"
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "description": "Field to order by.",
            "schema": {
              "type": "string",
              "enum": [
                "market_cap",
                "change_pct",
                "volume",
                "traded_value",
                "change_pct_1w",
                "change_pct_1m",
                "change_pct_1y"
              ],
              "default": "market_cap"
            }
          },
          {
            "name": "order",
            "in": "query",
            "required": false,
            "description": "Sort direction.",
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ],
              "default": "desc"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 50, max 500). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 500,
              "default": 50
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/IndexHeatmapItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "rank": 1,
                      "symbol": "RELIANCE",
                      "name": "Reliance Industries",
                      "isin": "INE002A01018",
                      "exchange": "NSE",
                      "sector": "Energy",
                      "ltp": 1208.4,
                      "change_pct": -0.54,
                      "change_pct_1w": 2.58,
                      "change_pct_1m": -2.18,
                      "change_pct_3m": -6.72,
                      "change_pct_6m": -10.1,
                      "change_pct_1y": -12.07,
                      "volume": 6708778,
                      "traded_value_cr": 810.69,
                      "market_cap_cr": 1635271.98,
                      "pe": 18.78,
                      "session_date": "2026-10-16"
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "getIndexHeatmap",
                    "count": 1,
                    "limit": 50,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/market/movers": {
      "get": {
        "operationId": "listMarketMovers",
        "summary": "Top gainers, losers and most active",
        "description": "Today's biggest movers within an index universe: a ranking of the index's constituents by price change or traded value, nothing more. `type=gainers` ranks by % change descending, `losers` ascending, `active` by traded value (volume x price) descending. Prices are live during the session; outside it, the last session's. Universe defaults to nifty-500. This is not a signal feed: it carries no pivot or short-term breakout labels. For end-of-day technical signals (52-week highs and lows, RSI, MACD, volume spikes, 200-day trend) use /v1/market/signals.",
        "tags": [
          "live"
        ],
        "parameters": [
          {
            "name": "type",
            "in": "query",
            "required": false,
            "description": "Ranking: gainers | losers | active (traded value).",
            "schema": {
              "type": "string",
              "enum": [
                "gainers",
                "losers",
                "active"
              ],
              "default": "gainers"
            }
          },
          {
            "name": "universe",
            "in": "query",
            "required": false,
            "description": "Index whose constituents are ranked: nifty-50, sensex, nifty-next-50, nifty-100, nifty-200, nifty-500, nifty-total-market, nifty-midcap-50, nifty-midcap-100, nifty-midcap-150, nifty-midcap-select, nifty-midsmallcap-400, nifty-smallcap-50, nifty-smallcap-100, nifty-smallcap-250, nifty-microcap-250, nifty-auto, nifty-bank, nifty-financial, nifty-fmcg, nifty-healthcare, nifty-it, nifty-media, nifty-metal, nifty-pharma, nifty-private-bank, nifty-psu-bank, nifty-realty, nifty-consumer-durables, nifty-energy, nifty-infra, nifty-commodities, nifty-pse, nifty-cpse, nifty-mnc, nifty-services.",
            "schema": {
              "type": "string",
              "default": "nifty-500"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 20, max 100). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/MarketMoversItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "rank": 1,
                      "symbol": "RELIANCE",
                      "name": "Reliance Industries",
                      "isin": "INE002A01018",
                      "exchange": "NSE",
                      "sector": "Energy",
                      "ltp": 1208.4,
                      "change_pct": 6.21,
                      "change_pct_1w": 2.58,
                      "change_pct_1m": -2.18,
                      "change_pct_3m": -6.72,
                      "change_pct_6m": -10.1,
                      "change_pct_1y": -12.07,
                      "volume": 6708778,
                      "traded_value_cr": 810.69,
                      "market_cap_cr": 1635271.98,
                      "pe": 18.78,
                      "session_date": "2026-10-16"
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listMarketMovers",
                    "count": 1,
                    "limit": 20,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/screens/fundamental": {
      "get": {
        "operationId": "screenFundamental",
        "summary": "Fundamental stock screen",
        "description": "Screen listed companies with a ratio expression over 325 fundamental ratios. Grammar: one or more conditions `{Ratio name} {> < = >= <=} {value}` joined with `AND` / `OR`; the value is a plain decimal (optionally with `%`) or another ratio name for a cross-field comparison (`Current price > DMA 200`). Ratio names come from `/v1/screens/fundamental/fields` (matched case-insensitively). A malformed expression or unknown ratio is a 400 naming the offending token and the closest valid names. Example: `Market Capitalization > 5000 AND Return on capital employed > 22`. Ranked by `sort` (a ratio name; default market capitalisation) in `order` (default desc); `rank` is continuous across pages. Set `latest=true` to keep only companies that have already published results for the latest quarter (useful mid results season, when quarterly ratios otherwise mix two quarters); omitted or `false` screens every company. A page can hold fewer than `limit` rows; follow `next_cursor` until it is null, keeping `query`, `sort`, `order` and `latest` unchanged. Data is end-of-day from the latest published results.",
        "tags": [
          "screens"
        ],
        "parameters": [
          {
            "name": "query",
            "in": "query",
            "required": true,
            "description": "Ratio expression (max 1500 chars).",
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 1500
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "description": "Ratio name to order by, e.g. `Return on equity`. Default: `Market Capitalization`.",
            "schema": {
              "type": "string",
              "maxLength": 80
            }
          },
          {
            "name": "order",
            "in": "query",
            "required": false,
            "description": "Sort direction by date.",
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ],
              "default": "desc"
            }
          },
          {
            "name": "latest",
            "in": "query",
            "required": false,
            "description": "`true` keeps only companies whose latest-quarter results are out. `true`/`false` (or `1`/`0`); any other value is a 400. Default: every company.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 25, max 50). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50,
              "default": 25
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/ScreenFundamentalItem"
                      }
                    },
                    "meta": {
                      "allOf": [
                        {
                          "$ref": "#/components/schemas/ListMeta"
                        },
                        {
                          "$ref": "#/components/schemas/ScreenFundamentalMeta"
                        }
                      ]
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "rank": 1,
                      "symbol": "TCS",
                      "name": "TCS",
                      "ltp": 2433.1,
                      "pe": 17.68,
                      "market_cap_cr": 880316.87,
                      "dividend_yield_pct": 4.1,
                      "net_profit_qtr_cr": 12760,
                      "profit_growth_qtr_pct": 1.4,
                      "sales_qtr_cr": 65799,
                      "sales_growth_qtr_pct": 2.4,
                      "roce_pct": 64.6,
                      "roe_pct": 52.4,
                      "sort_value": null,
                      "ratio_values": {
                        "Market Capitalization": 880316.87,
                        "Return on capital employed": 64.6
                      }
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "screenFundamental",
                    "count": 1,
                    "limit": 25,
                    "has_more": false,
                    "next_cursor": null,
                    "total_matches": 412
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/screens/fundamental/fields": {
      "get": {
        "operationId": "listFundamentalScreenFields",
        "summary": "Fundamental screen ratio catalogue",
        "description": "Every ratio name `/v1/screens/fundamental` accepts, with its unit and a one-line definition. Filter with `q`. Changes rarely; cache for a day.",
        "tags": [
          "screens"
        ],
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": false,
            "description": "Case-insensitive substring over name and definition, e.g. `debt`.",
            "schema": {
              "type": "string",
              "maxLength": 60
            }
          },
          {
            "name": "category",
            "in": "query",
            "required": false,
            "description": "Exact category, e.g. `Cash Flow`.",
            "schema": {
              "type": "string",
              "maxLength": 60
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 100, max 400). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 400,
              "default": 100
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 0,
        "responses": {
          "200": {
            "description": "OK. Free.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/FundamentalScreenFieldsItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "name": "Return on capital employed",
                      "unit": "%",
                      "category": "Returns",
                      "definition": "EBIT / capital employed for the latest financial year."
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listFundamentalScreenFields",
                    "count": 1,
                    "limit": 100,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/screens/technical": {
      "get": {
        "operationId": "screenTechnical",
        "summary": "Technical stock screen",
        "description": "Screen NSE stocks on live technical indicators. Pass one or more `filter` values of the form `field:op:value` (repeat the parameter or comma-separate): `op` is gt, lt, gte, lte, eq, between (value `min..max`), crosses_above or crosses_below; `value` is a number or another field name (`close:gt:sma_200`). Fields are listed at `/v1/screens/technical/fields`. Example: `filter=rsi_14:lt:30&filter=market_cap_cr:gt:5000`. Every row carries a fixed set of fields; name more with `fields` (any field from the catalogue, e.g. `fields=rating_overall,ema_20,high_52w`) and they are returned under `extra`. `rating_overall`, `rating_moving_averages` and `rating_oscillators` are indicator-consensus scores from -1 to 1, usable in filters, `sort` and `fields`; they summarise indicator readings and are not investment advice. Ranked by `sort` (default market cap). Covers NSE-listed stocks only (each company appears once, under its NSE symbol); BSE-only listings are not screened. Not paginated beyond the first `limit` rows: `meta.total_matches` says how many matched, narrow the filter to see the rest.",
        "tags": [
          "screens"
        ],
        "parameters": [
          {
            "name": "filter",
            "in": "query",
            "required": true,
            "description": "Conditions, all of which must hold (AND).",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "maxLength": 120
              },
              "minItems": 1,
              "maxItems": 20
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "description": "Field to rank by.",
            "schema": {
              "type": "string",
              "enum": [
                "close",
                "open",
                "high",
                "low",
                "volume",
                "change_pct",
                "change",
                "market_cap_cr",
                "sma_5",
                "sma_10",
                "sma_20",
                "sma_50",
                "sma_100",
                "sma_200",
                "ema_5",
                "ema_10",
                "ema_20",
                "ema_50",
                "ema_100",
                "ema_200",
                "rsi_14",
                "rsi_14_prev",
                "macd",
                "macd_signal",
                "stoch_k",
                "stoch_d",
                "cci_20",
                "adx",
                "awesome_oscillator",
                "momentum_10",
                "atr_14",
                "bb_upper",
                "bb_lower",
                "pivot_r1",
                "pivot_r2",
                "pivot_s1",
                "pivot_s2",
                "perf_1w_pct",
                "perf_1m_pct",
                "perf_3m_pct",
                "perf_6m_pct",
                "perf_1y_pct",
                "perf_ytd_pct",
                "avg_volume_10d",
                "avg_volume_30d",
                "relative_volume_10d",
                "pe_ttm",
                "pb",
                "dividend_yield_pct",
                "high_52w",
                "low_52w",
                "rating_overall",
                "rating_moving_averages",
                "rating_oscillators"
              ],
              "default": "market_cap_cr"
            }
          },
          {
            "name": "order",
            "in": "query",
            "required": false,
            "description": "Sort direction.",
            "schema": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ],
              "default": "desc"
            }
          },
          {
            "name": "fields",
            "in": "query",
            "required": false,
            "description": "Extra fields to return under `extra`, from `/v1/screens/technical/fields` (comma-separate or repeat). Fields already in every row are accepted and ignored.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "maxLength": 40
              },
              "minItems": 1,
              "maxItems": 40
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 20, max 100). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/ScreenTechnicalItem"
                      }
                    },
                    "meta": {
                      "allOf": [
                        {
                          "$ref": "#/components/schemas/ListMeta"
                        },
                        {
                          "$ref": "#/components/schemas/ScreenTechnicalMeta"
                        }
                      ]
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "rank": 1,
                      "symbol": "DMART",
                      "name": "Avenue Supermarts Ltd.",
                      "close": 3343.4,
                      "change_pct": -1.04,
                      "volume": 279431,
                      "market_cap_cr": 222460.38,
                      "rsi_14": 28.72,
                      "macd": -117.09,
                      "macd_signal": -86.6,
                      "sma_50": 3774.39,
                      "sma_200": 3979.02,
                      "relative_volume_10d": 0.28,
                      "perf_1m_pct": -9.12,
                      "pe_ttm": 73.1,
                      "pb": 11.2,
                      "dividend_yield_pct": null,
                      "extra": {
                        "rating_overall": -0.4727,
                        "high_52w": 4950
                      }
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "screenTechnical",
                    "count": 1,
                    "limit": 20,
                    "has_more": false,
                    "next_cursor": null,
                    "total_matches": 37
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/screens/technical/fields": {
      "get": {
        "operationId": "listTechnicalScreenFields",
        "summary": "Technical screen field catalogue",
        "description": "Every field `/v1/screens/technical` accepts in a filter, as `sort`, or in `fields`, with its meaning. Static.",
        "tags": [
          "screens"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 100, max 100). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 100
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 0,
        "responses": {
          "200": {
            "description": "OK. Free.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/TechnicalScreenFieldsItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "name": "rsi_14",
                      "definition": "14-day RSI"
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listTechnicalScreenFields",
                    "count": 1,
                    "limit": 100,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/market/deals": {
      "get": {
        "operationId": "listMarketDeals",
        "summary": "Bulk and block deals, market-wide",
        "description": "Bulk and block deals reported by the exchanges, newest day first, largest value first within a day. Defaults to the last 7 calendar days; `from`/`to` widen it (max 366 days). Duplicate reports of one trade are collapsed. `meta` carries totals over the whole filtered window, the same on every page: `total_deals`, `deals_per_day`, `latest_date` and `exchanges_covered`. Coverage from March 2026.",
        "tags": [
          "market"
        ],
        "parameters": [
          {
            "name": "from",
            "in": "query",
            "required": false,
            "description": "Earliest deal date (inclusive).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": false,
            "description": "Latest deal date (inclusive). Default today (IST).",
            "schema": {
              "type": "string",
              "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
            }
          },
          {
            "name": "type",
            "in": "query",
            "required": false,
            "description": "Only this deal type.",
            "schema": {
              "type": "string",
              "enum": [
                "bulk",
                "block"
              ]
            }
          },
          {
            "name": "side",
            "in": "query",
            "required": false,
            "description": "Only this side.",
            "schema": {
              "type": "string",
              "enum": [
                "buy",
                "sell"
              ]
            }
          },
          {
            "name": "exchange",
            "in": "query",
            "required": false,
            "description": "Only this exchange.",
            "schema": {
              "type": "string",
              "enum": [
                "NSE",
                "BSE"
              ]
            }
          },
          {
            "name": "symbol",
            "in": "query",
            "required": false,
            "description": "Only deals in this stock.",
            "schema": {
              "type": "string",
              "maxLength": 32
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 100, max 500). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 500,
              "default": 100
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/MarketDealsItem"
                      }
                    },
                    "meta": {
                      "allOf": [
                        {
                          "$ref": "#/components/schemas/ListMeta"
                        },
                        {
                          "$ref": "#/components/schemas/MarketDealsMeta"
                        }
                      ]
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "date": "2026-10-15",
                      "deal_type": "block",
                      "exchange": "NSE",
                      "symbol": "ETERNAL",
                      "name": "Eternal Ltd",
                      "isin": "INE758T01015",
                      "client_name": "GOLDMAN SACHS BANK EUROPE SE ODI",
                      "side": "sell",
                      "quantity": 5337584,
                      "price": 316,
                      "value_cr": 168.67
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listMarketDeals",
                    "count": 1,
                    "limit": 100,
                    "has_more": false,
                    "next_cursor": null,
                    "from": "2026-10-09",
                    "to": "2026-10-16",
                    "total_deals": 1866,
                    "deals_per_day": {
                      "2026-10-16": 262,
                      "2026-10-15": 390
                    },
                    "latest_date": "2026-10-16",
                    "exchanges_covered": [
                      "BSE",
                      "NSE"
                    ]
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/market/fno-ban": {
      "get": {
        "operationId": "listFnoBan",
        "summary": "F&O securities in ban and near it",
        "description": "Securities on the exchange's published F&O ban list for the latest trading day, plus those approaching it (open interest at or above 80% of the market-wide position limit). Banned first, then by utilisation. A ban is only ever taken from the published list, never inferred from utilisation. When the newest published list is more than 4 days old or unavailable, `meta.ban_list_stale` is true and the endpoint still returns the securities at or above 80% of the limit, each with `status` null (unknown), never a guessed ban; the old list's symbols are in `meta.stale_ban_list`. A cursor keeps the dates of its first page, so a new trading day arriving mid-walk does not mix two days.",
        "tags": [
          "market"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 100, max 200). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200,
              "default": 100
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/FnoBanItem"
                      }
                    },
                    "meta": {
                      "allOf": [
                        {
                          "$ref": "#/components/schemas/ListMeta"
                        },
                        {
                          "$ref": "#/components/schemas/FnoBanMeta"
                        }
                      ]
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "symbol": "SAIL",
                      "name": "Steel Authority of India Ltd",
                      "isin": "INE114A01011",
                      "status": "in_ban",
                      "ban_since": "2026-10-15",
                      "mwpl_utilisation_pct": 94.6,
                      "prev_mwpl_utilisation_pct": 95.01,
                      "ltp": 170,
                      "change_pct": -1.6,
                      "high_52w": 156.5,
                      "low_52w": 99.15,
                      "ban_list_date": "2026-10-15",
                      "mwpl_date": "2026-10-15"
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listFnoBan",
                    "count": 1,
                    "limit": 100,
                    "has_more": false,
                    "next_cursor": null,
                    "mwpl_date": "2026-10-15",
                    "ban_list_date": "2026-10-15",
                    "ban_list_stale": false,
                    "stale_ban_list": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/market/deliveries": {
      "get": {
        "operationId": "listTopDeliveries",
        "summary": "Highest delivery-percentage stocks",
        "description": "Stocks whose delivered share of traded quantity was highest in the latest session with delivery data, highest first. Defaults to delivery >= 50% and traded value >= INR 1 crore; tune with `min_delivery_pct` and `min_traded_value_cr`. One row per NSE symbol. `meta.total_stocks` counts every matching stock (all pages).",
        "tags": [
          "market"
        ],
        "parameters": [
          {
            "name": "min_delivery_pct",
            "in": "query",
            "required": false,
            "description": "Minimum delivery percentage.",
            "schema": {
              "type": "number",
              "minimum": 0,
              "maximum": 100,
              "default": 50
            }
          },
          {
            "name": "min_traded_value_cr",
            "in": "query",
            "required": false,
            "description": "Minimum traded value, INR crore.",
            "schema": {
              "type": "number",
              "minimum": 0,
              "default": 1
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 50, max 200). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200,
              "default": 50
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/TopDeliveriesItem"
                      }
                    },
                    "meta": {
                      "allOf": [
                        {
                          "$ref": "#/components/schemas/ListMeta"
                        },
                        {
                          "$ref": "#/components/schemas/TopDeliveriesMeta"
                        }
                      ]
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "symbol": "NXT-INFRA",
                      "name": "Nxt-Infra Trust",
                      "isin": "INE0SF023016",
                      "sector": "Industrials",
                      "session_date": "2026-10-14",
                      "delivery_pct": 100,
                      "traded_qty": 1550000,
                      "delivered_qty": 1550000,
                      "traded_value_cr": 15.11,
                      "ltp": 97.5,
                      "change_pct": -0.51,
                      "high_52w": 104,
                      "low_52w": 95.2
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listTopDeliveries",
                    "count": 1,
                    "limit": 50,
                    "has_more": false,
                    "next_cursor": null,
                    "session_date": "2026-10-14",
                    "total_stocks": 412
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/market/mtf": {
      "get": {
        "operationId": "listMarginFunding",
        "summary": "Most-funded stocks under margin trading",
        "description": "The stocks with the largest margin-trading-facility funded positions for the latest session, largest funded value first, with the change versus the previous session. Only the top ~100 funded stocks are covered, so this is not the whole market book; `meta.top_funded` totals those stocks (the same on every page). Coverage from March 2026.",
        "tags": [
          "market"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 50, max 100). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 50
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/MarginFundingItem"
                      }
                    },
                    "meta": {
                      "allOf": [
                        {
                          "$ref": "#/components/schemas/ListMeta"
                        },
                        {
                          "$ref": "#/components/schemas/MarginFundingMeta"
                        }
                      ]
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "symbol": "HDFCBANK",
                      "name": "HDFC Bank Ltd",
                      "isin": "INE040A01034",
                      "session_date": "2026-10-15",
                      "previous_session_date": "2026-10-14",
                      "funded_qty": 39617737,
                      "funded_value_cr": 3047.89,
                      "funded_qty_change": -1157076,
                      "funded_value_change_cr": -82.53,
                      "ltp": 731.15,
                      "change_pct": 0.59
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listMarginFunding",
                    "count": 1,
                    "limit": 50,
                    "has_more": false,
                    "next_cursor": null,
                    "session_date": "2026-10-15",
                    "previous_session_date": "2026-10-14",
                    "total_stocks": 100,
                    "top_funded": {
                      "stocks": 100,
                      "funded_value_cr": 41250.36,
                      "funded_value_change_cr": -312.08
                    }
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/market/slbm": {
      "get": {
        "operationId": "listSecuritiesLending",
        "summary": "Securities lending and borrowing activity",
        "description": "Stocks that traded in the securities lending segment in the latest session, with the lending yield and quantity. Sorted by `sort` (yield or quantity), highest first. `meta.total_stocks` counts every stock lent on the session. Coverage from March 2026.",
        "tags": [
          "market"
        ],
        "parameters": [
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "description": "Order by lending yield or traded quantity.",
            "schema": {
              "type": "string",
              "enum": [
                "yield",
                "quantity"
              ],
              "default": "yield"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 100, max 500). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 500,
              "default": 100
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/SecuritiesLendingItem"
                      }
                    },
                    "meta": {
                      "allOf": [
                        {
                          "$ref": "#/components/schemas/ListMeta"
                        },
                        {
                          "$ref": "#/components/schemas/SecuritiesLendingMeta"
                        }
                      ]
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "symbol": "IREDA",
                      "name": "Indian Renewable Energy Development Agency Ltd",
                      "isin": "INE202E01016",
                      "session_date": "2026-10-15",
                      "lending_yield_pct": 0.2148,
                      "traded_qty": 2931587,
                      "ltp": 108.47
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listSecuritiesLending",
                    "count": 1,
                    "limit": 100,
                    "has_more": false,
                    "next_cursor": null,
                    "session_date": "2026-10-15",
                    "total_stocks": 19
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/market/signals": {
      "get": {
        "operationId": "listMarketSignals",
        "summary": "End-of-day technical signals",
        "description": "Stocks on which a technical signal fired on the latest completed session: 52-week highs and lows, RSI extremes, MACD, volume spikes and 200-day trend. Filter with `signal` and/or `category`; default is all. Largest market cap first; `min_market_cap_cr` (default 500) keeps out micro-caps. `meta.bucket_totals` gives the exact count per requested signal over the whole result. Each rule is stated at /v1/market/signals/definitions.",
        "tags": [
          "market"
        ],
        "parameters": [
          {
            "name": "signal",
            "in": "query",
            "required": false,
            "description": "Only these signal ids (comma-separated or repeated).",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "near_52w_high",
                  "near_52w_low",
                  "rsi_overbought",
                  "rsi_oversold",
                  "macd_bullish",
                  "volume_spike",
                  "above_200_sma",
                  "below_200_sma"
                ]
              }
            }
          },
          {
            "name": "category",
            "in": "query",
            "required": false,
            "description": "Only signals in these categories.",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "breakout",
                  "momentum",
                  "volume",
                  "trend"
                ]
              }
            }
          },
          {
            "name": "min_market_cap_cr",
            "in": "query",
            "required": false,
            "description": "Minimum market cap, INR crore.",
            "schema": {
              "type": "number",
              "minimum": 0,
              "default": 500
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 50, max 500). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 500,
              "default": 50
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 1,
        "responses": {
          "200": {
            "description": "OK. Costs one request unit.",
            "headers": {
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/MarketSignalsItem"
                      }
                    },
                    "meta": {
                      "allOf": [
                        {
                          "$ref": "#/components/schemas/ListMeta"
                        },
                        {
                          "$ref": "#/components/schemas/MarketSignalsMeta"
                        }
                      ]
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "symbol": "MARUTI",
                      "name": "Maruti Suzuki India Ltd",
                      "sector": "Consumer Discretionary",
                      "session_date": "2026-10-14",
                      "signals": [
                        "rsi_oversold"
                      ],
                      "ltp": 11178,
                      "change_1w_pct": -0.45,
                      "volume": 463850,
                      "relative_volume": 1.07,
                      "rsi_14": 27.76,
                      "high_52w": 17370,
                      "low_52w": 11125,
                      "market_cap_cr": 351439.2
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listMarketSignals",
                    "count": 1,
                    "limit": 50,
                    "has_more": false,
                    "next_cursor": null,
                    "session_date": "2026-10-14",
                    "total_stocks": 1203,
                    "bucket_totals": {
                      "near_52w_high": 21,
                      "near_52w_low": 34,
                      "rsi_overbought": 18,
                      "rsi_oversold": 97,
                      "macd_bullish": 140,
                      "volume_spike": 66,
                      "above_200_sma": 402,
                      "below_200_sma": 611
                    }
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/v1/market/signals/definitions": {
      "get": {
        "operationId": "listSignalDefinitions",
        "summary": "Signal definitions",
        "description": "The rule behind each signal id served by /v1/market/signals.",
        "tags": [
          "market"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page (default 20, max 20). Values over the max are rejected, never clamped.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 20,
              "default": 20
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque cursor from `meta.next_cursor` of the previous page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearer": []
          }
        ],
        "x-cost": 0,
        "responses": {
          "200": {
            "description": "OK. Free.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "meta",
                    "links"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/SignalDefinitionsItem"
                      }
                    },
                    "meta": {
                      "$ref": "#/components/schemas/ListMeta"
                    },
                    "links": {
                      "$ref": "#/components/schemas/Links"
                    }
                  }
                },
                "example": {
                  "data": [
                    {
                      "id": "rsi_oversold",
                      "label": "RSI oversold",
                      "category": "momentum",
                      "rule": "14-day RSI at or below 30."
                    }
                  ],
                  "meta": {
                    "as_of": "2026-10-16T09:30:00.000Z",
                    "route": "listSignalDefinitions",
                    "count": 1,
                    "limit": 20,
                    "has_more": false,
                    "next_cursor": null
                  },
                  "links": {
                    "next": null
                  }
                }
              }
            }
          },
          "400": {
            "description": "Malformed or out-of-range parameter. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "401": {
            "description": "Missing or invalid bearer token.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Per-minute burst cap (`rate_limited`) or plan quota (`quota_exhausted`) reached.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Request cap of the binding quota window (daily, or monthly when that leaves less headroom). Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the binding window after this one; 0 on a quota_exhausted 429. Omitted on unlimited plans.",
                "schema": {
                  "type": "integer"
                }
              },
              "X-RateLimit-Reset": {
                "description": "Unix seconds when the binding quota window resets (IST boundaries).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "A data dependency was unavailable. Not charged.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Authentication or quota service temporarily unavailable (`service_unavailable`). Not charged; retry after `Retry-After` seconds.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying (currently 5).",
                "schema": {
                  "type": "integer"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "bearer": {
        "type": "http",
        "scheme": "bearer",
        "description": "Tapetide personal token (tpt_rt_...) or access token (tpt....)."
      }
    },
    "schemas": {
      "ListMeta": {
        "type": "object",
        "required": [
          "as_of",
          "route",
          "count",
          "limit",
          "has_more",
          "next_cursor"
        ],
        "properties": {
          "as_of": {
            "type": "string",
            "format": "date-time",
            "description": "When this response was assembled (UTC)."
          },
          "route": {
            "type": "string",
            "description": "operationId that served the request."
          },
          "count": {
            "type": "integer",
            "description": "Items in this page."
          },
          "limit": {
            "type": "integer",
            "description": "Page size applied."
          },
          "has_more": {
            "type": "boolean",
            "description": "Whether another page exists."
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ],
            "description": "Pass as `cursor` to fetch the next page; null on the last page."
          }
        }
      },
      "SingleMeta": {
        "type": "object",
        "required": [
          "as_of",
          "route"
        ],
        "properties": {
          "as_of": {
            "type": "string",
            "format": "date-time"
          },
          "route": {
            "type": "string"
          }
        }
      },
      "Links": {
        "type": "object",
        "properties": {
          "next": {
            "type": [
              "string",
              "null"
            ],
            "description": "Relative URL of the next page, or null."
          }
        }
      },
      "MarketHolidaysItem": {
        "type": "object",
        "properties": {
          "date": {
            "type": "string",
            "description": "Holiday date (YYYY-MM-DD)."
          },
          "name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Holiday name"
          },
          "exchange": {
            "type": "string",
            "description": "Exchange the closure applies to, e.g. NSE."
          },
          "type": {
            "type": [
              "string",
              "null"
            ],
            "description": "FULL for a full-day closure; other values mark partial or special sessions."
          }
        },
        "required": [
          "date",
          "name",
          "exchange",
          "type"
        ],
        "additionalProperties": false,
        "example": {
          "date": "2026-10-20",
          "name": "Diwali Laxmi Pujan",
          "exchange": "NSE",
          "type": "FULL"
        }
      },
      "StockFundamentalsItem": {
        "type": "object",
        "properties": {
          "metric": {
            "type": "string",
            "enum": [
              "revenue",
              "operating_expenses",
              "operating_profit",
              "operating_margin_pct",
              "other_income",
              "interest_expense",
              "depreciation",
              "profit_before_tax",
              "tax_rate_pct",
              "net_profit",
              "eps",
              "dividend_payout_pct",
              "share_capital",
              "reserves",
              "borrowings",
              "other_liabilities",
              "total_liabilities",
              "fixed_assets",
              "capital_work_in_progress",
              "investments",
              "other_assets",
              "total_assets",
              "cash_from_operations",
              "cash_from_investing",
              "cash_from_financing",
              "net_cash_flow",
              "free_cash_flow",
              "cash_from_operations_to_operating_profit_pct",
              "roce_pct",
              "debtor_days",
              "inventory_days",
              "payable_days",
              "cash_conversion_cycle_days",
              "working_capital_days"
            ],
            "description": "Metric name; see GET /v1/fundamentals/metrics."
          },
          "period_type": {
            "type": "string",
            "enum": [
              "quarter",
              "annual"
            ],
            "description": "quarter = a three-month period; annual = a fiscal year."
          },
          "period_end": {
            "type": "string",
            "description": "Last day of the fiscal period (YYYY-MM-DD)."
          },
          "basis": {
            "type": "string",
            "enum": [
              "consolidated",
              "standalone"
            ],
            "description": "Statement basis the value comes from."
          },
          "value": {
            "type": [
              "number",
              "null"
            ],
            "description": "Reported value in `unit`. null for revenue that reads 0 while the same period shows non-zero operating expenses (not reported)."
          },
          "unit": {
            "type": "string",
            "enum": [
              "inr_crore",
              "inr_per_share",
              "percent",
              "days"
            ],
            "description": "inr_crore = INR crore (1 crore = 10 million); inr_per_share = INR per share; percent where 1.5 means 1.5%; days."
          },
          "available_from": {
            "type": "string",
            "description": "First date this value was publicly available (the result declaration date). Use it to avoid look-ahead bias (YYYY-MM-DD)."
          },
          "available_from_estimated": {
            "type": "boolean",
            "description": "true when the exact declaration date is unknown and `available_from` is a conservative estimate from the regulatory filing deadline."
          }
        },
        "required": [
          "metric",
          "period_type",
          "period_end",
          "basis",
          "value",
          "unit",
          "available_from",
          "available_from_estimated"
        ],
        "additionalProperties": false,
        "example": {
          "metric": "revenue",
          "period_type": "annual",
          "period_end": "2025-03-31",
          "basis": "consolidated",
          "value": 255324,
          "unit": "inr_crore",
          "available_from": "2025-04-10",
          "available_from_estimated": false
        }
      },
      "FundamentalMetricsItem": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Metric name, as accepted by the `metrics` parameter."
          },
          "statement": {
            "type": "string",
            "enum": [
              "income_statement",
              "balance_sheet",
              "cash_flow",
              "ratios"
            ],
            "description": "Statement the metric belongs to."
          },
          "unit": {
            "type": "string",
            "enum": [
              "inr_crore",
              "inr_per_share",
              "percent",
              "days"
            ],
            "description": "Unit of `value`."
          },
          "period_types": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "quarter",
                "annual"
              ]
            },
            "description": "Period types the metric is published for."
          },
          "description": {
            "type": "string",
            "description": "What the metric measures."
          }
        },
        "required": [
          "name",
          "statement",
          "unit",
          "period_types",
          "description"
        ],
        "additionalProperties": false,
        "example": {
          "name": "revenue",
          "statement": "income_statement",
          "unit": "inr_crore",
          "period_types": [
            "quarter",
            "annual"
          ],
          "description": "Revenue from operations. For banks and lenders this is total interest and operating income."
        }
      },
      "ReferenceStocksItem": {
        "type": "object",
        "properties": {
          "symbol": {
            "type": "string",
            "description": "Identifier to use in /v1/stocks/{symbol} paths: the NSE symbol, or the BSE scrip code for BSE-only companies."
          },
          "name": {
            "type": "string",
            "description": "Company name."
          },
          "isin": {
            "type": [
              "string",
              "null"
            ],
            "description": "ISIN of the equity share."
          },
          "nse_symbol": {
            "type": [
              "string",
              "null"
            ],
            "description": "NSE trading symbol. null when the company is not listed on NSE."
          },
          "bse_code": {
            "type": [
              "string",
              "null"
            ],
            "description": "BSE scrip code. null when the company is not listed on BSE."
          },
          "listed_on": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "NSE",
                "BSE"
              ]
            },
            "description": "Exchanges the equity is (or was last) listed on."
          },
          "status": {
            "type": "string",
            "enum": [
              "active",
              "delisted",
              "inactive"
            ],
            "description": "active = currently traded; delisted = delisted, merged or amalgamated; inactive = suspended or not currently traded."
          },
          "listing_date": {
            "type": [
              "string",
              "null"
            ],
            "description": "Date the equity was first listed (YYYY-MM-DD), when known."
          },
          "macro_sector": {
            "type": [
              "string",
              "null"
            ],
            "description": "Top level of the industry classification, e.g. Information Technology."
          },
          "sector": {
            "type": [
              "string",
              "null"
            ],
            "description": "Second level of the industry classification."
          },
          "industry": {
            "type": [
              "string",
              "null"
            ],
            "description": "Third level of the industry classification."
          },
          "basic_industry": {
            "type": [
              "string",
              "null"
            ],
            "description": "Most granular level of the industry classification."
          },
          "face_value": {
            "type": [
              "number",
              "null"
            ],
            "description": "Face value per share in INR."
          },
          "has_derivatives": {
            "type": "boolean",
            "description": "true when stock futures and options trade on the company."
          },
          "website": {
            "type": [
              "string",
              "null"
            ],
            "description": "Company website."
          }
        },
        "required": [
          "symbol",
          "name",
          "isin",
          "nse_symbol",
          "bse_code",
          "listed_on",
          "status",
          "listing_date",
          "macro_sector",
          "sector",
          "industry",
          "basic_industry",
          "face_value",
          "has_derivatives",
          "website"
        ],
        "additionalProperties": false,
        "example": {
          "symbol": "TCS",
          "name": "Tata Consultancy Services Ltd",
          "isin": "INE467B01029",
          "nse_symbol": "TCS",
          "bse_code": "532540",
          "listed_on": [
            "NSE",
            "BSE"
          ],
          "status": "active",
          "listing_date": "2004-08-25",
          "macro_sector": "Information Technology",
          "sector": "Information Technology",
          "industry": "IT - Software",
          "basic_industry": "Computers - Software & Consulting",
          "face_value": 1,
          "has_derivatives": true,
          "website": "https://tcs.com"
        }
      },
      "SymbolHistory": {
        "type": "object",
        "properties": {
          "symbol": {
            "type": "string",
            "description": "Current symbol of the company."
          },
          "isin": {
            "type": [
              "string",
              "null"
            ],
            "description": "Current ISIN."
          },
          "coverage_from": {
            "type": [
              "string",
              "null"
            ],
            "description": "Earliest date covered by identifier observations (YYYY-MM-DD)."
          },
          "coverage_through": {
            "type": [
              "string",
              "null"
            ],
            "description": "Latest date covered by identifier observations (YYYY-MM-DD)."
          },
          "identifiers": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "type": {
                  "type": "string",
                  "enum": [
                    "nse_symbol",
                    "isin"
                  ],
                  "description": "Identifier kind."
                },
                "value": {
                  "type": "string",
                  "description": "Identifier value held during this spell."
                },
                "first_seen": {
                  "type": "string",
                  "description": "First trading date the identifier was observed for this company (YYYY-MM-DD)."
                },
                "last_seen": {
                  "type": "string",
                  "description": "Last trading date the identifier was observed for this company (YYYY-MM-DD)."
                },
                "observed_days": {
                  "type": "integer",
                  "description": "Number of trading days the identifier was observed."
                },
                "starts_before_coverage": {
                  "type": "boolean",
                  "description": "true when the identifier was already in use at the start of coverage, so the real start date is earlier than `first_seen`."
                },
                "current": {
                  "type": "boolean",
                  "description": "true when the identifier was still in use at the end of coverage."
                }
              },
              "required": [
                "type",
                "value",
                "first_seen",
                "last_seen",
                "observed_days",
                "starts_before_coverage",
                "current"
              ],
              "additionalProperties": false
            },
            "description": "Every symbol and ISIN spell, oldest first per type. A gap between one spell's last_seen and the next spell's first_seen is a window where the change happened but its exact day is not proven."
          }
        },
        "required": [
          "symbol",
          "isin",
          "coverage_from",
          "coverage_through",
          "identifiers"
        ],
        "additionalProperties": false,
        "example": {
          "symbol": "ETERNAL",
          "isin": "INE758T01015",
          "coverage_from": "2016-01-01",
          "coverage_through": "2026-10-14",
          "identifiers": [
            {
              "type": "isin",
              "value": "INE758T01015",
              "first_seen": "2021-07-23",
              "last_seen": "2026-10-14",
              "observed_days": 1293,
              "starts_before_coverage": false,
              "current": true
            },
            {
              "type": "nse_symbol",
              "value": "ZOMATO",
              "first_seen": "2021-07-23",
              "last_seen": "2025-04-08",
              "observed_days": 919,
              "starts_before_coverage": false,
              "current": false
            },
            {
              "type": "nse_symbol",
              "value": "ETERNAL",
              "first_seen": "2025-04-09",
              "last_seen": "2026-10-14",
              "observed_days": 374,
              "starts_before_coverage": false,
              "current": true
            }
          ]
        }
      },
      "StockDailyPricesItem": {
        "type": "object",
        "properties": {
          "date": {
            "type": "string",
            "description": "Trading date (IST) (YYYY-MM-DD)."
          },
          "open": {
            "type": [
              "number",
              "null"
            ],
            "description": "Opening price, INR, split/bonus adjusted."
          },
          "high": {
            "type": [
              "number",
              "null"
            ],
            "description": "Session high, INR, split/bonus adjusted."
          },
          "low": {
            "type": [
              "number",
              "null"
            ],
            "description": "Session low, INR, split/bonus adjusted."
          },
          "close": {
            "type": [
              "number",
              "null"
            ],
            "description": "Closing price, INR, split/bonus adjusted (not dividend adjusted)."
          },
          "volume": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Shares traded, as printed (NOT adjusted for later splits/bonuses). 0 means no trades that session (the price is the last traded price carried forward); null means volume was not recorded."
          },
          "delivery_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "Delivered quantity as a percent of traded quantity (45.6 = 45.6%). null where not published (ETFs, many BSE-only listings, some sessions)."
          }
        },
        "required": [
          "date",
          "open",
          "high",
          "low",
          "close",
          "volume",
          "delivery_pct"
        ],
        "additionalProperties": false,
        "example": {
          "date": "2026-10-14",
          "open": 1167.1,
          "high": 1178.9,
          "low": 1162,
          "close": 1175.4,
          "volume": 9876543,
          "delivery_pct": 52.31
        }
      },
      "StockIntradayPricesItem": {
        "type": "object",
        "properties": {
          "ts": {
            "type": "string",
            "description": "Bar START time, ISO-8601 UTC (e.g. 2026-10-15T03:45:00Z = 09:15 IST). The bar covers [ts, ts + interval)."
          },
          "open": {
            "type": [
              "number",
              "null"
            ],
            "description": "First traded price in the bar, INR, as printed (not split/bonus adjusted)."
          },
          "high": {
            "type": [
              "number",
              "null"
            ],
            "description": "Highest price in the bar, INR."
          },
          "low": {
            "type": [
              "number",
              "null"
            ],
            "description": "Lowest price in the bar, INR."
          },
          "close": {
            "type": [
              "number",
              "null"
            ],
            "description": "Last traded price in the bar, INR."
          },
          "volume": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Shares traded in the bar. 0 means no trades (price carried forward from the previous bar)."
          }
        },
        "required": [
          "ts",
          "open",
          "high",
          "low",
          "close",
          "volume"
        ],
        "additionalProperties": false,
        "example": {
          "ts": "2026-10-15T03:45:00Z",
          "open": 3020.5,
          "high": 3031,
          "low": 3018.2,
          "close": 3027.9,
          "volume": 48213
        }
      },
      "StockMarketCapItem": {
        "type": "object",
        "properties": {
          "date": {
            "type": "string",
            "description": "Trading date (IST) (YYYY-MM-DD)."
          },
          "market_cap_cr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Total market capitalisation at that session's close, INR crore (1 crore = 10 million). null where it cannot be verified for that date; `null_reason` says why."
          },
          "null_reason": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "no_price_bar",
                  "no_recent_share_filing",
                  "share_count_unverified",
                  "share_count_disagrees"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "Why market_cap_cr is null (null when it is published): no_price_bar (no verified daily bar that session); no_recent_share_filing (no filed share count within 400 days before the date); share_count_unverified (the day's share count could not be confirmed and the filed count cannot stand in for it); share_count_disagrees (the day's share count contradicts the filed count by more than 5% and the filing cannot stand in)."
          }
        },
        "required": [
          "date",
          "market_cap_cr",
          "null_reason"
        ],
        "additionalProperties": false,
        "example": {
          "date": "2026-10-15",
          "market_cap_cr": 1589532,
          "null_reason": null
        }
      },
      "StockCorporateAdjustmentsItem": {
        "type": "object",
        "properties": {
          "ex_date": {
            "type": "string",
            "description": "Ex-date: the first session that trades on the post-event basis (YYYY-MM-DD)."
          },
          "type": {
            "type": "string",
            "enum": [
              "split",
              "consolidation",
              "bonus",
              "rights",
              "merger_or_demerger"
            ],
            "description": "split (more shares), consolidation (reverse split, fewer shares), bonus, rights, merger_or_demerger."
          },
          "factor": {
            "type": [
              "number",
              "null"
            ],
            "description": "Price factor for the event: a pre-ex price multiplied by this lands on the post-ex scale (1:1 bonus = 0.5, 1-to-10 split = 0.1, 10-to-1 consolidation = 10). null for rights and merger/demerger events, which have no reliable single factor."
          },
          "shares_before": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Shares held before the event in the reduced share ratio (a 1:1 bonus is 1 -> 2). null when the event has no factor."
          },
          "shares_after": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Shares held after the event in the reduced share ratio. null when the event has no factor."
          },
          "cumulative_factor": {
            "type": [
              "number",
              "null"
            ],
            "description": "Product of this event's factor and every LATER effective event's factor. Divide an adjusted price dated before this ex-date (and on/after the previous one) by the earliest later event's cumulative_factor to recover the as-printed price. null for upcoming events and events without a factor."
          },
          "upcoming": {
            "type": "boolean",
            "description": "true when the ex-date is after today (IST): announced but not yet reflected in prices."
          },
          "entitlement_ratio": {
            "type": [
              "string",
              "null"
            ],
            "description": "Rights issues only: the filed entitlement in exchange notation, shares offered : shares held (e.g. \"2:25\" = 2 new shares for every 25 held). It does not give a price factor, which also needs the issue price. null when not filed and for every other type."
          }
        },
        "required": [
          "ex_date",
          "type",
          "factor",
          "shares_before",
          "shares_after",
          "cumulative_factor",
          "upcoming",
          "entitlement_ratio"
        ],
        "additionalProperties": false,
        "example": {
          "ex_date": "2024-10-28",
          "type": "bonus",
          "factor": 0.5,
          "shares_before": 1,
          "shares_after": 2,
          "cumulative_factor": 0.5,
          "upcoming": false,
          "entitlement_ratio": null
        }
      },
      "StockCorporateAdjustmentsMeta": {
        "type": "object",
        "properties": {
          "total": {
            "type": "integer",
            "description": "Events in the whole timeline (all pages)."
          },
          "unquantified_count": {
            "type": "integer",
            "description": "Events in the timeline with no reliable factor (rights issues, mergers/demergers). Their ex-dates can carry a price gap that is not a return; exclude or treat them with caution."
          },
          "upcoming_count": {
            "type": "integer",
            "description": "Announced events with an ex-date after today (IST), excluded from every cumulative_factor."
          },
          "dividend_adjusted": {
            "type": "boolean",
            "description": "Always false: factors cover splits, consolidations and bonuses only, so the adjusted series is price return, not total return."
          },
          "reconstruction": {
            "type": "string",
            "description": "How to rebuild as-printed prices from adjusted daily prices with these factors."
          }
        },
        "required": [
          "total",
          "unquantified_count",
          "upcoming_count",
          "dividend_adjusted",
          "reconstruction"
        ],
        "additionalProperties": false
      },
      "StockInsiderTradesItem": {
        "type": "object",
        "properties": {
          "symbol": {
            "type": "string",
            "description": "Stock symbol."
          },
          "person_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Name of the insider (director, promoter, employee, relative or connected person)."
          },
          "person_category": {
            "type": [
              "string",
              "null"
            ],
            "description": "Insider category as disclosed, e.g. \"Promoters\", \"Director\", \"Key Managerial Personnel\", \"Employees/Designated Employees\"."
          },
          "transaction_type": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "buy",
                  "sell",
                  "pledge",
                  "pledge_release",
                  "pledge_invocation",
                  "esop"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "buy, sell, pledge (creation), pledge_release, pledge_invocation or esop. Null when the filing leaves it blank."
          },
          "mode": {
            "type": [
              "string",
              "null"
            ],
            "description": "How the securities were acquired or disposed, e.g. \"Market Purchase\", \"Market Sale\", \"ESOP\", \"Off Market\", \"Gift\"."
          },
          "security_type": {
            "type": [
              "string",
              "null"
            ],
            "description": "Security traded, e.g. \"Equity Shares\"."
          },
          "quantity": {
            "type": [
              "number",
              "null"
            ],
            "description": "Number of securities in this transaction."
          },
          "value_inr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Reported consideration in INR. Null when not reported or reported as zero (e.g. gifts, ESOP allotments filed without value), or when misfiled (see price_inr)."
          },
          "price_inr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Implied average price per security in INR (value_inr / quantity), rounded to 2 decimals. Null when either is missing, or when it is above 1 lakh and more than 10x away from the stock's close around the trade date (a misfiled value or quantity; value_inr is then null too)."
          },
          "holding_before_shares": {
            "type": [
              "number",
              "null"
            ],
            "description": "Securities held by the person before the transaction."
          },
          "holding_before_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "Holding before the transaction, % of total shares as filed. 0 only when holding_before_shares is 0; null where the filing gave 0 % for a non-zero holding (filings use 0 for uncomputed values, and very small holdings round to 0) or gave nothing."
          },
          "holding_after_shares": {
            "type": [
              "number",
              "null"
            ],
            "description": "Securities held by the person after the transaction."
          },
          "holding_after_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "Holding after the transaction, % of total shares as filed. 0 only when holding_after_shares is 0; null where the filing gave 0 % for a non-zero holding or gave nothing."
          },
          "transaction_from": {
            "type": [
              "string",
              "null"
            ],
            "description": "First day of the transaction window (YYYY-MM-DD), null when not reported."
          },
          "transaction_to": {
            "type": [
              "string",
              "null"
            ],
            "description": "Last day of the transaction window (YYYY-MM-DD), null when not reported."
          },
          "intimated_on": {
            "type": [
              "string",
              "null"
            ],
            "description": "Date the insider informed the company (YYYY-MM-DD), null when not reported."
          },
          "disclosed_at": {
            "type": "string",
            "description": "When the company disclosed the trade to the exchange (ISO-8601 UTC). Results are ordered by this."
          }
        },
        "required": [
          "symbol",
          "person_name",
          "person_category",
          "transaction_type",
          "mode",
          "security_type",
          "quantity",
          "value_inr",
          "price_inr",
          "holding_before_shares",
          "holding_before_pct",
          "holding_after_shares",
          "holding_after_pct",
          "transaction_from",
          "transaction_to",
          "intimated_on",
          "disclosed_at"
        ],
        "additionalProperties": false,
        "example": {
          "symbol": "TCS",
          "person_name": "Damodar Padhi",
          "person_category": "Employees/Designated Employees",
          "transaction_type": "buy",
          "mode": "Market Purchase",
          "security_type": "Equity Shares",
          "quantity": 685,
          "value_inr": 2275672,
          "price_inr": 3322.15,
          "holding_before_shares": 3250,
          "holding_before_pct": null,
          "holding_after_shares": 3935,
          "holding_after_pct": null,
          "transaction_from": "2022-05-23",
          "transaction_to": "2022-05-23",
          "intimated_on": "2022-05-24",
          "disclosed_at": "2022-05-25T12:15:00Z"
        }
      },
      "StockBulkBlockDealsItem": {
        "type": "object",
        "properties": {
          "symbol": {
            "type": "string",
            "description": "Stock symbol."
          },
          "date": {
            "type": "string",
            "description": "Trade date (YYYY-MM-DD)."
          },
          "deal_type": {
            "type": "string",
            "enum": [
              "bulk",
              "block"
            ],
            "description": "bulk: a client traded more than 0.5% of listed shares in a session; block: a single negotiated trade in the block-deal window."
          },
          "client_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Counterparty as disclosed by the exchange."
          },
          "side": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "buy",
                  "sell"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "Whether the client bought or sold. Null when not disclosed."
          },
          "quantity": {
            "type": [
              "number",
              "null"
            ],
            "description": "Shares traded."
          },
          "price_inr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Trade (or weighted average) price per share, INR."
          },
          "value_inr": {
            "type": [
              "number",
              "null"
            ],
            "description": "quantity × price_inr, INR."
          }
        },
        "required": [
          "symbol",
          "date",
          "deal_type",
          "client_name",
          "side",
          "quantity",
          "price_inr",
          "value_inr"
        ],
        "additionalProperties": false,
        "example": {
          "symbol": "RELIANCE",
          "date": "2026-01-27",
          "deal_type": "block",
          "client_name": "Goldman Sachs Bank Europe Se",
          "side": "buy",
          "quantity": 1151736,
          "price_inr": 1384,
          "value_inr": 1594002624
        }
      },
      "StockSastDisclosuresItem": {
        "type": "object",
        "properties": {
          "symbol": {
            "type": "string",
            "description": "Stock symbol."
          },
          "acquirer_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Acquirer or seller named in the disclosure."
          },
          "is_promoter": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Whether the acquirer belongs to the promoter group."
          },
          "regulation": {
            "type": [
              "string",
              "null"
            ],
            "description": "Takeover-code regulation the disclosure is made under: \"29(1)\" (crossing 5%) or \"29(2)\" (a 2% change by a holder above 5%)."
          },
          "transaction_type": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "acquisition",
                  "sale",
                  "both",
                  "other"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "acquisition, sale, both or other."
          },
          "mode": {
            "type": [
              "string",
              "null"
            ],
            "description": "Mode of acquisition or sale, e.g. \"Market Purchase\", \"Off Market\", \"Others\"."
          },
          "security_type": {
            "type": [
              "string",
              "null"
            ],
            "description": "Security type, e.g. \"Equity shares\"."
          },
          "shares_acquired": {
            "type": [
              "number",
              "null"
            ],
            "description": "Shares acquired in this transaction."
          },
          "shares_sold": {
            "type": [
              "number",
              "null"
            ],
            "description": "Shares sold in this transaction."
          },
          "shares_held_after": {
            "type": [
              "number",
              "null"
            ],
            "description": "Shares held by the acquirer after the transaction."
          },
          "pct_acquired": {
            "type": [
              "number",
              "null"
            ],
            "description": "Shares acquired, % of total share capital."
          },
          "pct_sold": {
            "type": [
              "number",
              "null"
            ],
            "description": "Shares sold, % of total share capital."
          },
          "pct_held_after": {
            "type": [
              "number",
              "null"
            ],
            "description": "Holding after the transaction, % of total share capital."
          },
          "pct_held_after_diluted": {
            "type": [
              "number",
              "null"
            ],
            "description": "Holding after the transaction, % of diluted share capital."
          },
          "transaction_from": {
            "type": [
              "string",
              "null"
            ],
            "description": "First day of the transaction window (YYYY-MM-DD), null when not reported."
          },
          "transaction_to": {
            "type": [
              "string",
              "null"
            ],
            "description": "Last day of the transaction window (YYYY-MM-DD), null when not reported."
          },
          "disclosed_at": {
            "type": "string",
            "description": "When the disclosure was published (ISO-8601 UTC). Results are ordered by this."
          }
        },
        "required": [
          "symbol",
          "acquirer_name",
          "is_promoter",
          "regulation",
          "transaction_type",
          "mode",
          "security_type",
          "shares_acquired",
          "shares_sold",
          "shares_held_after",
          "pct_acquired",
          "pct_sold",
          "pct_held_after",
          "pct_held_after_diluted",
          "transaction_from",
          "transaction_to",
          "disclosed_at"
        ],
        "additionalProperties": false,
        "example": {
          "symbol": "RELIANCE",
          "acquirer_name": "Reliance Industrial Investments and Holdings Limited",
          "is_promoter": true,
          "regulation": "29(1)",
          "transaction_type": "acquisition",
          "mode": "Others",
          "security_type": "Equity shares",
          "shares_acquired": 240942006,
          "shares_sold": null,
          "shares_held_after": 240942006,
          "pct_acquired": 3.56,
          "pct_sold": null,
          "pct_held_after": 3.56,
          "pct_held_after_diluted": 3.56,
          "transaction_from": "2023-08-19",
          "transaction_to": "2023-08-19",
          "disclosed_at": "2023-08-25T14:00:00Z"
        }
      },
      "StockPromoterPledgeItem": {
        "type": "object",
        "properties": {
          "symbol": {
            "type": "string",
            "description": "Stock symbol."
          },
          "quarter_end": {
            "type": "string",
            "description": "Quarter-end date of the pledge disclosure (YYYY-MM-DD)."
          },
          "disclosed_at": {
            "type": [
              "string",
              "null"
            ],
            "description": "When the quarterly pledge data was published (ISO-8601 UTC)."
          },
          "total_shares": {
            "type": [
              "number",
              "null"
            ],
            "description": "Total issued shares."
          },
          "promoter_shares": {
            "type": [
              "number",
              "null"
            ],
            "description": "Shares held by the promoter group."
          },
          "promoter_holding_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "Promoter-group holding, % of total shares."
          },
          "promoter_shares_pledged": {
            "type": [
              "number",
              "null"
            ],
            "description": "Promoter-group shares pledged."
          },
          "promoter_pledged_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "Promoter shares pledged, % of the promoter group's own holding. The usual governance red-flag measure."
          },
          "total_shares_pledged": {
            "type": [
              "number",
              "null"
            ],
            "description": "All pledged shares in the depository (promoter and non-promoter)."
          },
          "total_pledged_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "All pledged shares, % of dematerialised shares."
          }
        },
        "required": [
          "symbol",
          "quarter_end",
          "disclosed_at",
          "total_shares",
          "promoter_shares",
          "promoter_holding_pct",
          "promoter_shares_pledged",
          "promoter_pledged_pct",
          "total_shares_pledged",
          "total_pledged_pct"
        ],
        "additionalProperties": false,
        "example": {
          "symbol": "CHOLAHLDNG",
          "quarter_end": "2026-09-30",
          "disclosed_at": "2026-10-15T11:02:13Z",
          "total_shares": 187777462,
          "promoter_shares": 87110979,
          "promoter_holding_pct": 46.39,
          "promoter_shares_pledged": 13200,
          "promoter_pledged_pct": 0.02,
          "total_shares_pledged": 1723298,
          "total_pledged_pct": 0.92
        }
      },
      "StockPromoterPledgeEventsItem": {
        "type": "object",
        "properties": {
          "symbol": {
            "type": "string",
            "description": "Stock symbol."
          },
          "promoter_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Promoter entity creating, releasing or losing (invocation) the encumbrance."
          },
          "event_type": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "creation",
                  "release",
                  "invocation"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "creation (new pledge), release, or invocation (lender enforced the pledge)."
          },
          "encumbrance_type": {
            "type": [
              "string",
              "null"
            ],
            "description": "Kind of encumbrance, e.g. \"Pledge\", \"Non-disposal undertaking\", \"Lien\", \"Others\"."
          },
          "lender_details": {
            "type": [
              "string",
              "null"
            ],
            "description": "Lender / trustee text exactly as disclosed by the company."
          },
          "event_from": {
            "type": [
              "string",
              "null"
            ],
            "description": "Date the encumbrance event started (YYYY-MM-DD), null when not reported."
          },
          "event_to": {
            "type": [
              "string",
              "null"
            ],
            "description": "Date the encumbrance event ended (YYYY-MM-DD), null when not reported."
          },
          "event_shares": {
            "type": [
              "number",
              "null"
            ],
            "description": "Shares covered by this event."
          },
          "event_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "Shares covered by this event, % of total share capital."
          },
          "promoter_shares_before": {
            "type": [
              "number",
              "null"
            ],
            "description": "Shares held by this promoter before the event."
          },
          "promoter_pct_before": {
            "type": [
              "number",
              "null"
            ],
            "description": "This promoter's holding before the event, % of total share capital."
          },
          "encumbered_shares_after": {
            "type": [
              "number",
              "null"
            ],
            "description": "This promoter's shares encumbered after the event."
          },
          "encumbered_pct_after": {
            "type": [
              "number",
              "null"
            ],
            "description": "This promoter's encumbered shares after the event, % of total share capital."
          },
          "total_encumbered_shares": {
            "type": [
              "number",
              "null"
            ],
            "description": "All promoter-group shares encumbered after the event."
          },
          "total_encumbered_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "All promoter-group encumbered shares after the event, % of total share capital."
          },
          "reported_on": {
            "type": [
              "string",
              "null"
            ],
            "description": "Date of the company's report (YYYY-MM-DD), null when not reported."
          },
          "disclosed_at": {
            "type": "string",
            "description": "When the event was published (ISO-8601 UTC). Results are ordered by this."
          }
        },
        "required": [
          "symbol",
          "promoter_name",
          "event_type",
          "encumbrance_type",
          "lender_details",
          "event_from",
          "event_to",
          "event_shares",
          "event_pct",
          "promoter_shares_before",
          "promoter_pct_before",
          "encumbered_shares_after",
          "encumbered_pct_after",
          "total_encumbered_shares",
          "total_encumbered_pct",
          "reported_on",
          "disclosed_at"
        ],
        "additionalProperties": false,
        "example": {
          "symbol": "JSWSTEEL",
          "promoter_name": "JSL Overseas Limited",
          "event_type": "release",
          "encumbrance_type": "Pledge",
          "lender_details": "Lender: Deutsche Bank AG, Singapore Branch",
          "event_from": "2026-07-07",
          "event_to": "2026-07-07",
          "event_shares": 3500000,
          "event_pct": 0.14,
          "promoter_shares_before": 21026090,
          "promoter_pct_before": 0.86,
          "encumbered_shares_after": 12526090,
          "encumbered_pct_after": 0.52,
          "total_encumbered_shares": 16026090,
          "total_encumbered_pct": 0.66,
          "reported_on": "2026-07-15",
          "disclosed_at": "2026-07-23T12:59:51Z"
        }
      },
      "StockCorporateActionsItem": {
        "type": "object",
        "properties": {
          "symbol": {
            "type": [
              "string",
              "null"
            ],
            "description": "Stock symbol. Null for a few listed debt/unit series without an equity symbol."
          },
          "company_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Company name."
          },
          "isin": {
            "type": [
              "string",
              "null"
            ],
            "description": "ISIN of the security the action applies to."
          },
          "series": {
            "type": [
              "string",
              "null"
            ],
            "description": "Trading series, e.g. \"EQ\" (equity), \"SM\" (SME), \"RR\" (REIT), \"IV\" (InvIT), \"GS\" (government securities)."
          },
          "action_type": {
            "type": "string",
            "enum": [
              "dividend",
              "bonus",
              "split",
              "rights",
              "buyback",
              "demerger",
              "merger",
              "agm",
              "egm",
              "other"
            ],
            "description": "dividend, bonus, split, rights, buyback, demerger, merger, agm (annual general meeting), egm (extraordinary general meeting) or other (redemptions, interest payments, consolidations, ...)."
          },
          "dividend_type": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "final",
                  "interim",
                  "special"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "For dividends: final, interim or special. Null for other actions or when not stated."
          },
          "subject": {
            "type": [
              "string",
              "null"
            ],
            "description": "Announcement text, e.g. \"Interim Dividend - Rs 12 Per Share\". Null when only the action type is known."
          },
          "ex_date": {
            "type": "string",
            "description": "Ex-date: the first session the stock trades without the entitlement (YYYY-MM-DD)."
          },
          "record_date": {
            "type": [
              "string",
              "null"
            ],
            "description": "Record date (YYYY-MM-DD), null when not reported."
          },
          "announced_on": {
            "type": [
              "string",
              "null"
            ],
            "description": "Announcement date (YYYY-MM-DD), null when not reported."
          },
          "book_closure_start": {
            "type": [
              "string",
              "null"
            ],
            "description": "Book-closure start date (YYYY-MM-DD), null when not reported."
          },
          "book_closure_end": {
            "type": [
              "string",
              "null"
            ],
            "description": "Book-closure end date (YYYY-MM-DD), null when not reported."
          },
          "dividend_per_share_inr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Dividend per share in INR (dividends only)."
          },
          "ratio_numerator": {
            "type": [
              "number",
              "null"
            ],
            "description": "Bonus: bonus shares issued per `ratio_denominator` shares held. Split: new shares for every `ratio_denominator` old share(s). Rights: rights shares offered per `ratio_denominator` held. Null for other actions."
          },
          "ratio_denominator": {
            "type": [
              "number",
              "null"
            ],
            "description": "See `ratio_numerator`."
          },
          "face_value_inr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Face value per share in INR (after the action, for splits)."
          },
          "buyback_price_inr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Buyback offer price per share in INR (buybacks only)."
          }
        },
        "required": [
          "symbol",
          "company_name",
          "isin",
          "series",
          "action_type",
          "dividend_type",
          "subject",
          "ex_date",
          "record_date",
          "announced_on",
          "book_closure_start",
          "book_closure_end",
          "dividend_per_share_inr",
          "ratio_numerator",
          "ratio_denominator",
          "face_value_inr",
          "buyback_price_inr"
        ],
        "additionalProperties": false,
        "example": {
          "symbol": "TCS",
          "company_name": "Tata Consultancy Services Limited",
          "isin": "INE467B01029",
          "series": "EQ",
          "action_type": "dividend",
          "dividend_type": "interim",
          "subject": "Interim Dividend - Rs 12 Per Share",
          "ex_date": "2026-10-14",
          "record_date": "2026-10-14",
          "announced_on": "2026-10-08",
          "book_closure_start": null,
          "book_closure_end": null,
          "dividend_per_share_inr": 12,
          "ratio_numerator": null,
          "ratio_denominator": null,
          "face_value_inr": 1,
          "buyback_price_inr": null
        }
      },
      "MarketCorporateActionsItem": {
        "type": "object",
        "properties": {
          "symbol": {
            "type": [
              "string",
              "null"
            ],
            "description": "Stock symbol. Null for a few listed debt/unit series without an equity symbol."
          },
          "company_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Company name."
          },
          "isin": {
            "type": [
              "string",
              "null"
            ],
            "description": "ISIN of the security the action applies to."
          },
          "series": {
            "type": [
              "string",
              "null"
            ],
            "description": "Trading series, e.g. \"EQ\" (equity), \"SM\" (SME), \"RR\" (REIT), \"IV\" (InvIT), \"GS\" (government securities)."
          },
          "action_type": {
            "type": "string",
            "enum": [
              "dividend",
              "bonus",
              "split",
              "rights",
              "buyback",
              "demerger",
              "merger",
              "agm",
              "egm",
              "other"
            ],
            "description": "dividend, bonus, split, rights, buyback, demerger, merger, agm (annual general meeting), egm (extraordinary general meeting) or other (redemptions, interest payments, consolidations, ...)."
          },
          "dividend_type": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "final",
                  "interim",
                  "special"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "For dividends: final, interim or special. Null for other actions or when not stated."
          },
          "subject": {
            "type": [
              "string",
              "null"
            ],
            "description": "Announcement text, e.g. \"Interim Dividend - Rs 12 Per Share\". Null when only the action type is known."
          },
          "ex_date": {
            "type": "string",
            "description": "Ex-date: the first session the stock trades without the entitlement (YYYY-MM-DD)."
          },
          "record_date": {
            "type": [
              "string",
              "null"
            ],
            "description": "Record date (YYYY-MM-DD), null when not reported."
          },
          "announced_on": {
            "type": [
              "string",
              "null"
            ],
            "description": "Announcement date (YYYY-MM-DD), null when not reported."
          },
          "book_closure_start": {
            "type": [
              "string",
              "null"
            ],
            "description": "Book-closure start date (YYYY-MM-DD), null when not reported."
          },
          "book_closure_end": {
            "type": [
              "string",
              "null"
            ],
            "description": "Book-closure end date (YYYY-MM-DD), null when not reported."
          },
          "dividend_per_share_inr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Dividend per share in INR (dividends only)."
          },
          "ratio_numerator": {
            "type": [
              "number",
              "null"
            ],
            "description": "Bonus: bonus shares issued per `ratio_denominator` shares held. Split: new shares for every `ratio_denominator` old share(s). Rights: rights shares offered per `ratio_denominator` held. Null for other actions."
          },
          "ratio_denominator": {
            "type": [
              "number",
              "null"
            ],
            "description": "See `ratio_numerator`."
          },
          "face_value_inr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Face value per share in INR (after the action, for splits)."
          },
          "buyback_price_inr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Buyback offer price per share in INR (buybacks only)."
          }
        },
        "required": [
          "symbol",
          "company_name",
          "isin",
          "series",
          "action_type",
          "dividend_type",
          "subject",
          "ex_date",
          "record_date",
          "announced_on",
          "book_closure_start",
          "book_closure_end",
          "dividend_per_share_inr",
          "ratio_numerator",
          "ratio_denominator",
          "face_value_inr",
          "buyback_price_inr"
        ],
        "additionalProperties": false,
        "example": {
          "symbol": "TCS",
          "company_name": "Tata Consultancy Services Limited",
          "isin": "INE467B01029",
          "series": "EQ",
          "action_type": "dividend",
          "dividend_type": "interim",
          "subject": "Interim Dividend - Rs 12 Per Share",
          "ex_date": "2026-10-14",
          "record_date": "2026-10-14",
          "announced_on": "2026-10-08",
          "book_closure_start": null,
          "book_closure_end": null,
          "dividend_per_share_inr": 12,
          "ratio_numerator": null,
          "ratio_denominator": null,
          "face_value_inr": 1,
          "buyback_price_inr": null
        }
      },
      "StockMutualFundHoldingsItem": {
        "type": "object",
        "properties": {
          "symbol": {
            "type": "string",
            "description": "Stock symbol."
          },
          "month": {
            "type": "string",
            "description": "Portfolio month (YYYY-MM)."
          },
          "scheme_name": {
            "type": "string",
            "description": "Mutual fund scheme and plan, e.g. \"Parag Parikh Flexi Cap Fund Direct-Growth\"."
          },
          "scheme_isin": {
            "type": [
              "string",
              "null"
            ],
            "description": "ISIN of the scheme's units (INF...), the public scheme identifier. null when it is not known or not unique for the scheme."
          },
          "fund_house": {
            "type": [
              "string",
              "null"
            ],
            "description": "Asset management company, e.g. \"HDFC\", \"ICICI Prudential\"."
          },
          "shares_held": {
            "type": [
              "number",
              "null"
            ],
            "description": "Shares of this stock held by the scheme at month end. 0 on an exit row (`exited`)."
          },
          "pct_of_scheme_aum": {
            "type": [
              "number",
              "null"
            ],
            "description": "Value of the position, % of the scheme's assets under management."
          },
          "previous_shares_held": {
            "type": [
              "number",
              "null"
            ],
            "description": "Shares the scheme reported holding at the end of the previous month. null when the scheme reported no position in the stock that month (not reported, or not held)."
          },
          "shares_change": {
            "type": [
              "number",
              "null"
            ],
            "description": "shares_held minus previous_shares_held. null when previous_shares_held is null."
          },
          "exited": {
            "type": "boolean",
            "description": "true on an exit row (only with `include_exits=true`): the scheme held the stock the previous month and reported 0 shares this month in an otherwise complete disclosure."
          }
        },
        "required": [
          "symbol",
          "month",
          "scheme_name",
          "scheme_isin",
          "fund_house",
          "shares_held",
          "pct_of_scheme_aum",
          "previous_shares_held",
          "shares_change",
          "exited"
        ],
        "additionalProperties": false,
        "example": {
          "symbol": "RELIANCE",
          "month": "2026-09",
          "scheme_name": "Parag Parikh Large Cap Fund Direct-Growth",
          "scheme_isin": "INF879O01332",
          "fund_house": "Parag Parikh",
          "shares_held": 450887,
          "pct_of_scheme_aum": 6.1784,
          "previous_shares_held": 420887,
          "shares_change": 30000,
          "exited": false
        }
      },
      "StockCreditRatingsItem": {
        "type": "object",
        "properties": {
          "symbol": {
            "type": "string",
            "description": "Stock symbol of the issuer."
          },
          "agency": {
            "type": [
              "string",
              "null"
            ],
            "description": "Credit rating agency, e.g. \"CRISIL Ratings Limited\", \"ICRA Limited\", \"CARE Ratings Limited\"."
          },
          "rating": {
            "type": [
              "string",
              "null"
            ],
            "description": "Rating assigned, e.g. \"CRISIL AAA\", \"[ICRA]A1+\"."
          },
          "rating_action": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "new",
                  "upgrade",
                  "downgrade",
                  "reaffirm",
                  "other"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "new, upgrade, downgrade, reaffirm or other."
          },
          "outlook": {
            "type": [
              "string",
              "null"
            ],
            "description": "Outlook, e.g. \"Stable\", \"Positive\", \"Negative\"."
          },
          "previous_rating": {
            "type": [
              "string",
              "null"
            ],
            "description": "Rating before this action, as disclosed (may be from a different agency)."
          },
          "instrument_isin": {
            "type": [
              "string",
              "null"
            ],
            "description": "ISIN of the rated instrument (debenture, commercial paper, ...), when disclosed. Differs from the equity ISIN."
          },
          "rated_on": {
            "type": [
              "string",
              "null"
            ],
            "description": "Date of the rating action (YYYY-MM-DD), null when not reported."
          },
          "disclosed_at": {
            "type": [
              "string",
              "null"
            ],
            "description": "When the company disclosed the rating (ISO-8601 UTC)."
          }
        },
        "required": [
          "symbol",
          "agency",
          "rating",
          "rating_action",
          "outlook",
          "previous_rating",
          "instrument_isin",
          "rated_on",
          "disclosed_at"
        ],
        "additionalProperties": false,
        "example": {
          "symbol": "RELIANCE",
          "agency": "CRISIL Ratings Limited",
          "rating": "CRISIL AAA",
          "rating_action": "reaffirm",
          "outlook": "Stable",
          "previous_rating": "CRISIL AAA",
          "instrument_isin": "INE002A08567",
          "rated_on": "2026-09-25",
          "disclosed_at": "2026-09-25T16:45:03Z"
        }
      },
      "StockFilingsItem": {
        "type": "object",
        "properties": {
          "filing_id": {
            "type": "integer",
            "description": "Stable identifier of this announcement."
          },
          "symbol": {
            "type": "string",
            "description": "Stock symbol."
          },
          "filed_at": {
            "type": "string",
            "description": "Date the exchange received the announcement (YYYY-MM-DD)."
          },
          "category": {
            "type": "string",
            "enum": [
              "financial_results",
              "board_meeting",
              "shareholder_meeting",
              "earnings_call",
              "investor_presentation",
              "press_release",
              "annual_report",
              "credit_rating",
              "dividend",
              "corporate_action",
              "capital_raise",
              "acquisition",
              "orders_contracts",
              "management_change",
              "insider_takeover",
              "trading_window",
              "insolvency",
              "compliance",
              "newspaper_publication",
              "clarification",
              "other"
            ],
            "description": "Typed category derived from the exchange subject and title; `other` when no rule matches."
          },
          "subject": {
            "type": [
              "string",
              "null"
            ],
            "description": "Exchange subject line, e.g. \"Outcome of Board Meeting\". Null when the exchange filed it under a generic heading."
          },
          "title": {
            "type": [
              "string",
              "null"
            ],
            "description": "Announcement title as filed."
          },
          "description": {
            "type": [
              "string",
              "null"
            ],
            "description": "Exchange-provided description of the announcement, when one was published."
          },
          "document_url": {
            "type": [
              "string",
              "null"
            ],
            "description": "Public URL of the filed PDF on the exchange or issuer site. Null when the exchange published no attachment."
          },
          "document_id": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Identifier usable with `/v1/stocks/{symbol}/documents/summary` and `/documents/read` when this filing's PDF has been parsed to text; otherwise null."
          }
        },
        "required": [
          "filing_id",
          "symbol",
          "filed_at",
          "category",
          "subject",
          "title",
          "description",
          "document_url",
          "document_id"
        ],
        "additionalProperties": false,
        "example": {
          "filing_id": 41150034,
          "symbol": "TCS",
          "filed_at": "2026-10-14",
          "category": "earnings_call",
          "subject": "Earnings Call Transcript",
          "title": "Announcement under Regulation 30 (LODR)-Earnings Call Transcript",
          "description": "Transcript of earnings conference call for the quarter and half year ended September 30, 2026.",
          "document_url": "https://www.bseindia.com/stockinfo/AnnPdfOpen.aspx?Pname=7dc14216-f892-46f1-bf82-5c7b387a8e4d.pdf",
          "document_id": 23262437
        }
      },
      "StockNewsItem": {
        "type": "object",
        "properties": {
          "article_id": {
            "type": "integer",
            "description": "Stable identifier of this article."
          },
          "published_at": {
            "type": "string",
            "description": "Publication time (ISO-8601, UTC)."
          },
          "headline": {
            "type": "string",
            "description": "Article headline."
          },
          "summary": {
            "type": [
              "string",
              "null"
            ],
            "description": "One-paragraph summary. Null when none is publishable."
          },
          "sentiment": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "positive",
                  "negative",
                  "neutral",
                  "mixed"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "Sentiment classification of the article for the related companies; null when not classified."
          },
          "category": {
            "type": "string",
            "enum": [
              "companies",
              "results",
              "markets",
              "economy",
              "policy",
              "global",
              "ipo",
              "commodities",
              "currencies",
              "crypto",
              "banking",
              "technology",
              "real_estate",
              "infrastructure",
              "funds",
              "personal_finance",
              "investment_ideas",
              "debt",
              "startups",
              "other"
            ],
            "description": "Topic category."
          },
          "symbols": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Listed companies the article is about (stock symbols). Empty for macro or market-wide pieces."
          },
          "url": {
            "type": [
              "string",
              "null"
            ],
            "description": "Publisher's article URL when the publisher is a news organisation; null otherwise."
          },
          "related_filing": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "document_url": {
                    "type": "string",
                    "description": "Public URL of the filed document on the exchange site."
                  },
                  "filed_at": {
                    "type": "string",
                    "description": "Time the exchange received the announcement (ISO-8601, UTC)."
                  },
                  "category": {
                    "type": "string",
                    "enum": [
                      "financial_results",
                      "board_meeting",
                      "shareholder_meeting",
                      "earnings_call",
                      "investor_presentation",
                      "press_release",
                      "annual_report",
                      "credit_rating",
                      "dividend",
                      "corporate_action",
                      "capital_raise",
                      "acquisition",
                      "orders_contracts",
                      "management_change",
                      "insider_takeover",
                      "trading_window",
                      "insolvency",
                      "compliance",
                      "newspaper_publication",
                      "clarification",
                      "other"
                    ],
                    "description": "Typed filing category, same values as `/v1/stocks/{symbol}/filings`."
                  }
                },
                "required": [
                  "document_url",
                  "filed_at",
                  "category"
                ],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ],
            "description": "The exchange announcement this article reports, when it is one company's filing and exactly one announcement matches: same company, received from 60 minutes before to 2 minutes after publication (exchange and publisher clocks differ slightly). The same filing made on both NSE and BSE within 10 minutes counts as one match. Null otherwise."
          }
        },
        "required": [
          "article_id",
          "published_at",
          "headline",
          "summary",
          "sentiment",
          "category",
          "symbols",
          "url",
          "related_filing"
        ],
        "additionalProperties": false,
        "example": {
          "article_id": 6978999,
          "published_at": "2026-10-16T08:30:22Z",
          "headline": "TruAlt Bioenergy to host Q2 FY27 earnings call on Oct 26",
          "summary": "TruAlt Bioenergy has scheduled its Q2 FY27 earnings call for 26 October 2026 to discuss quarterly results and the outlook for the ethanol business.",
          "sentiment": "neutral",
          "category": "results",
          "symbols": [
            "TRUALT"
          ],
          "url": null,
          "related_filing": {
            "document_url": "https://www.bseindia.com/stockinfo/AnnPdfOpen.aspx?Pname=0b1c2d3e-4f50-6172-8394-a5b6c7d8e9f0.pdf",
            "filed_at": "2026-10-16T08:12:05Z",
            "category": "earnings_call"
          }
        }
      },
      "MarketNewsArticlesItem": {
        "type": "object",
        "properties": {
          "article_id": {
            "type": "integer",
            "description": "Stable identifier of this article."
          },
          "published_at": {
            "type": "string",
            "description": "Publication time (ISO-8601, UTC)."
          },
          "headline": {
            "type": "string",
            "description": "Article headline."
          },
          "summary": {
            "type": [
              "string",
              "null"
            ],
            "description": "One-paragraph summary. Null when none is publishable."
          },
          "sentiment": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "positive",
                  "negative",
                  "neutral",
                  "mixed"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "Sentiment classification of the article for the related companies; null when not classified."
          },
          "category": {
            "type": "string",
            "enum": [
              "companies",
              "results",
              "markets",
              "economy",
              "policy",
              "global",
              "ipo",
              "commodities",
              "currencies",
              "crypto",
              "banking",
              "technology",
              "real_estate",
              "infrastructure",
              "funds",
              "personal_finance",
              "investment_ideas",
              "debt",
              "startups",
              "other"
            ],
            "description": "Topic category."
          },
          "symbols": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Listed companies the article is about (stock symbols). Empty for macro or market-wide pieces."
          },
          "url": {
            "type": [
              "string",
              "null"
            ],
            "description": "Publisher's article URL when the publisher is a news organisation; null otherwise."
          },
          "related_filing": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "document_url": {
                    "type": "string",
                    "description": "Public URL of the filed document on the exchange site."
                  },
                  "filed_at": {
                    "type": "string",
                    "description": "Time the exchange received the announcement (ISO-8601, UTC)."
                  },
                  "category": {
                    "type": "string",
                    "enum": [
                      "financial_results",
                      "board_meeting",
                      "shareholder_meeting",
                      "earnings_call",
                      "investor_presentation",
                      "press_release",
                      "annual_report",
                      "credit_rating",
                      "dividend",
                      "corporate_action",
                      "capital_raise",
                      "acquisition",
                      "orders_contracts",
                      "management_change",
                      "insider_takeover",
                      "trading_window",
                      "insolvency",
                      "compliance",
                      "newspaper_publication",
                      "clarification",
                      "other"
                    ],
                    "description": "Typed filing category, same values as `/v1/stocks/{symbol}/filings`."
                  }
                },
                "required": [
                  "document_url",
                  "filed_at",
                  "category"
                ],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ],
            "description": "The exchange announcement this article reports, when it is one company's filing and exactly one announcement matches: same company, received from 60 minutes before to 2 minutes after publication (exchange and publisher clocks differ slightly). The same filing made on both NSE and BSE within 10 minutes counts as one match. Null otherwise."
          }
        },
        "required": [
          "article_id",
          "published_at",
          "headline",
          "summary",
          "sentiment",
          "category",
          "symbols",
          "url",
          "related_filing"
        ],
        "additionalProperties": false,
        "example": {
          "article_id": 6978999,
          "published_at": "2026-10-16T08:30:22Z",
          "headline": "TruAlt Bioenergy to host Q2 FY27 earnings call on Oct 26",
          "summary": "TruAlt Bioenergy has scheduled its Q2 FY27 earnings call for 26 October 2026 to discuss quarterly results and the outlook for the ethanol business.",
          "sentiment": "neutral",
          "category": "results",
          "symbols": [
            "TRUALT"
          ],
          "url": null,
          "related_filing": {
            "document_url": "https://www.bseindia.com/stockinfo/AnnPdfOpen.aspx?Pname=0b1c2d3e-4f50-6172-8394-a5b6c7d8e9f0.pdf",
            "filed_at": "2026-10-16T08:12:05Z",
            "category": "earnings_call"
          }
        }
      },
      "IposItem": {
        "type": "object",
        "properties": {
          "slug": {
            "type": "string",
            "description": "URL identifier for `/v1/ipos/{ipo_slug}`, derived from the company name and the year bidding opened."
          },
          "company": {
            "type": "string",
            "description": "Issuer name."
          },
          "symbol": {
            "type": [
              "string",
              "null"
            ],
            "description": "Stock symbol once listed; null before listing."
          },
          "isin": {
            "type": [
              "string",
              "null"
            ],
            "description": "ISIN when published."
          },
          "status": {
            "type": "string",
            "enum": [
              "upcoming",
              "open",
              "closed",
              "listed",
              "announced"
            ],
            "description": "announced (no dates yet), upcoming, open, closed (bidding over, not yet listed), listed."
          },
          "board": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "mainboard",
                  "sme"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "mainboard or sme (small and medium enterprise platform)."
          },
          "exchange": {
            "type": [
              "string",
              "null"
            ],
            "description": "Listing exchange when published, e.g. NSE or BSE."
          },
          "open_date": {
            "type": [
              "string",
              "null"
            ],
            "description": "First bidding day (YYYY-MM-DD)."
          },
          "close_date": {
            "type": [
              "string",
              "null"
            ],
            "description": "Last bidding day (YYYY-MM-DD)."
          },
          "allotment_date": {
            "type": [
              "string",
              "null"
            ],
            "description": "Basis-of-allotment date (YYYY-MM-DD)."
          },
          "listing_date": {
            "type": [
              "string",
              "null"
            ],
            "description": "Listing date (YYYY-MM-DD); scheduled when not yet listed."
          },
          "price_band_low": {
            "type": [
              "number",
              "null"
            ],
            "description": "Lower end of the price band, INR per share."
          },
          "price_band_high": {
            "type": [
              "number",
              "null"
            ],
            "description": "Upper end of the price band, INR per share."
          },
          "issue_price": {
            "type": [
              "number",
              "null"
            ],
            "description": "Final issue price, INR per share; null until fixed."
          },
          "lot_size": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Shares per bid lot."
          },
          "issue_size_cr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Total issue size in INR crore."
          },
          "subscription_total": {
            "type": [
              "number",
              "null"
            ],
            "description": "Overall subscription, times (e.g. 4.97 = 4.97x). Null until bidding data is published."
          },
          "listing_price": {
            "type": [
              "number",
              "null"
            ],
            "description": "Listing-day open price, INR; null until listed."
          },
          "listing_gain_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "Listing-day open vs issue price, percent (1.5 = 1.5%)."
          }
        },
        "required": [
          "slug",
          "company",
          "symbol",
          "isin",
          "status",
          "board",
          "exchange",
          "open_date",
          "close_date",
          "allotment_date",
          "listing_date",
          "price_band_low",
          "price_band_high",
          "issue_price",
          "lot_size",
          "issue_size_cr",
          "subscription_total",
          "listing_price",
          "listing_gain_pct"
        ],
        "additionalProperties": false,
        "example": {
          "slug": "tonbo-imaging-2026",
          "company": "Tonbo Imaging",
          "symbol": null,
          "isin": "INE0LDG01026",
          "status": "open",
          "board": "mainboard",
          "exchange": "NSE",
          "open_date": "2026-10-15",
          "close_date": "2026-10-19",
          "allotment_date": "2026-10-21",
          "listing_date": "2026-10-23",
          "price_band_low": 665,
          "price_band_high": 700,
          "issue_price": null,
          "lot_size": 21,
          "issue_size_cr": 852.18,
          "subscription_total": 6.74,
          "listing_price": null,
          "listing_gain_pct": null
        }
      },
      "Ipo": {
        "type": "object",
        "properties": {
          "slug": {
            "type": "string",
            "description": "URL identifier for `/v1/ipos/{ipo_slug}`, derived from the company name and the year bidding opened."
          },
          "company": {
            "type": "string",
            "description": "Issuer name."
          },
          "symbol": {
            "type": [
              "string",
              "null"
            ],
            "description": "Stock symbol once listed; null before listing."
          },
          "isin": {
            "type": [
              "string",
              "null"
            ],
            "description": "ISIN when published."
          },
          "status": {
            "type": "string",
            "enum": [
              "upcoming",
              "open",
              "closed",
              "listed",
              "announced"
            ],
            "description": "announced (no dates yet), upcoming, open, closed (bidding over, not yet listed), listed."
          },
          "board": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "mainboard",
                  "sme"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "mainboard or sme (small and medium enterprise platform)."
          },
          "exchange": {
            "type": [
              "string",
              "null"
            ],
            "description": "Listing exchange when published, e.g. NSE or BSE."
          },
          "open_date": {
            "type": [
              "string",
              "null"
            ],
            "description": "First bidding day (YYYY-MM-DD)."
          },
          "close_date": {
            "type": [
              "string",
              "null"
            ],
            "description": "Last bidding day (YYYY-MM-DD)."
          },
          "allotment_date": {
            "type": [
              "string",
              "null"
            ],
            "description": "Basis-of-allotment date (YYYY-MM-DD)."
          },
          "listing_date": {
            "type": [
              "string",
              "null"
            ],
            "description": "Listing date (YYYY-MM-DD); scheduled when not yet listed."
          },
          "price_band_low": {
            "type": [
              "number",
              "null"
            ],
            "description": "Lower end of the price band, INR per share."
          },
          "price_band_high": {
            "type": [
              "number",
              "null"
            ],
            "description": "Upper end of the price band, INR per share."
          },
          "issue_price": {
            "type": [
              "number",
              "null"
            ],
            "description": "Final issue price, INR per share; null until fixed."
          },
          "lot_size": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Shares per bid lot."
          },
          "issue_size_cr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Total issue size in INR crore."
          },
          "subscription_total": {
            "type": [
              "number",
              "null"
            ],
            "description": "Overall subscription, times (e.g. 4.97 = 4.97x). Null until bidding data is published."
          },
          "listing_price": {
            "type": [
              "number",
              "null"
            ],
            "description": "Listing-day open price, INR; null until listed."
          },
          "listing_gain_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "Listing-day open vs issue price, percent (1.5 = 1.5%)."
          },
          "face_value": {
            "type": [
              "number",
              "null"
            ],
            "description": "Face value per share, INR."
          },
          "fresh_issue_cr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Fresh-issue component in INR crore."
          },
          "offer_for_sale_cr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Offer-for-sale component in INR crore."
          },
          "listing_day_close": {
            "type": [
              "number",
              "null"
            ],
            "description": "Listing-day closing price, INR."
          },
          "listing_day_close_gain_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "Listing-day close vs issue price, percent."
          },
          "about": {
            "type": [
              "string",
              "null"
            ],
            "description": "Issuer business description from the offer document."
          },
          "registrar": {
            "type": [
              "string",
              "null"
            ],
            "description": "Registrar to the issue."
          },
          "lead_managers": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Book-running lead managers."
          },
          "draft_prospectus_url": {
            "type": [
              "string",
              "null"
            ],
            "description": "Public URL of the draft red herring prospectus (regulator or exchange site)."
          },
          "prospectus_url": {
            "type": [
              "string",
              "null"
            ],
            "description": "Public URL of the red herring prospectus or final prospectus."
          },
          "subscription": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "category": {
                  "type": "string",
                  "enum": [
                    "qib",
                    "nii",
                    "bhni",
                    "shni",
                    "retail",
                    "employee",
                    "shareholder",
                    "total"
                  ],
                  "description": "Investor category: qib (qualified institutional buyers), nii (all non-institutional), bhni/shni (big / small high-net-worth, the two NII sub-buckets), retail, employee, shareholder, total."
                },
                "times": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "Times subscribed (bids / shares offered), e.g. 6.17 = 6.17x."
                },
                "as_of": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "When this figure was last updated (ISO-8601, UTC)."
                }
              },
              "required": [
                "category",
                "times",
                "as_of"
              ],
              "additionalProperties": false
            },
            "description": "Latest subscription by investor category."
          }
        },
        "required": [
          "slug",
          "company",
          "symbol",
          "isin",
          "status",
          "board",
          "exchange",
          "open_date",
          "close_date",
          "allotment_date",
          "listing_date",
          "price_band_low",
          "price_band_high",
          "issue_price",
          "lot_size",
          "issue_size_cr",
          "subscription_total",
          "listing_price",
          "listing_gain_pct",
          "face_value",
          "fresh_issue_cr",
          "offer_for_sale_cr",
          "listing_day_close",
          "listing_day_close_gain_pct",
          "about",
          "registrar",
          "lead_managers",
          "draft_prospectus_url",
          "prospectus_url",
          "subscription"
        ],
        "additionalProperties": false,
        "example": {
          "slug": "tonbo-imaging-2026",
          "company": "Tonbo Imaging",
          "symbol": null,
          "isin": "INE0LDG01026",
          "status": "open",
          "board": "mainboard",
          "exchange": "NSE",
          "open_date": "2026-10-15",
          "close_date": "2026-10-19",
          "allotment_date": "2026-10-21",
          "listing_date": "2026-10-23",
          "price_band_low": 665,
          "price_band_high": 700,
          "issue_price": null,
          "lot_size": 21,
          "issue_size_cr": 852.18,
          "subscription_total": 6.74,
          "listing_price": null,
          "listing_gain_pct": null,
          "face_value": 2,
          "fresh_issue_cr": null,
          "offer_for_sale_cr": 852.18,
          "listing_day_close": null,
          "listing_day_close_gain_pct": null,
          "about": "Tonbo Imaging India Limited is a defence electronics company designing imaging and sensor systems.",
          "registrar": "Kfin Technologies Ltd.",
          "lead_managers": [
            "JM Financial Ltd."
          ],
          "draft_prospectus_url": "https://www.bseindia.com/corporates/download/303187/",
          "prospectus_url": null,
          "subscription": [
            {
              "category": "total",
              "times": 6.74,
              "as_of": "2026-10-16T07:50:00Z"
            },
            {
              "category": "qib",
              "times": 3.94,
              "as_of": "2026-10-16T07:50:00Z"
            }
          ]
        }
      },
      "ScoresItem": {
        "type": "object",
        "properties": {
          "symbol": {
            "type": "string",
            "description": "Stock symbol."
          },
          "name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Company name."
          },
          "sector": {
            "type": [
              "string",
              "null"
            ],
            "description": "Sector."
          },
          "industry": {
            "type": [
              "string",
              "null"
            ],
            "description": "Industry."
          },
          "size": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "large",
                  "mid",
                  "small",
                  "micro"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "Market-cap size bucket on the score date."
          },
          "market_cap_cr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Market capitalisation in INR crore."
          },
          "pe": {
            "type": [
              "number",
              "null"
            ],
            "description": "Price to earnings, trailing twelve months; null when not meaningful (e.g. losses)."
          },
          "industry_pe": {
            "type": [
              "number",
              "null"
            ],
            "description": "Median P/E of the stock's industry; null when the industry is too thin."
          },
          "score_date": {
            "type": "string",
            "description": "Scoring run date (YYYY-MM-DD)."
          },
          "score": {
            "type": "integer",
            "description": "Tapetide Score, 0-100."
          },
          "band": {
            "type": "string",
            "enum": [
              "strong",
              "good",
              "average",
              "weak",
              "poor"
            ],
            "description": "Coarse band: strong (66+), good (55-65), average (45-54), weak (37-44), poor (below 37)."
          },
          "confidence": {
            "type": "integer",
            "description": "Data confidence, 0-100: how much of the inputs behind the score were available and recent."
          },
          "pillars": {
            "type": "object",
            "properties": {
              "quality": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "quality pillar, 0-100; null when unavailable."
              },
              "valuation": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "valuation pillar, 0-100; null when unavailable."
              },
              "growth": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "growth pillar, 0-100; null when unavailable."
              },
              "momentum": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "momentum pillar, 0-100; null when unavailable."
              },
              "financial_health": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "financial health pillar, 0-100; null when unavailable."
              },
              "ownership": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "ownership pillar, 0-100; null when unavailable."
              }
            },
            "required": [
              "quality",
              "valuation",
              "growth",
              "momentum",
              "financial_health",
              "ownership"
            ],
            "additionalProperties": false,
            "description": "The six pillar sub-scores."
          },
          "caps": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "rule": {
                  "type": "string",
                  "description": "Governance rule that capped the score, e.g. surveillance:GSM, pledge>75%."
                },
                "cap": {
                  "type": "number",
                  "description": "Maximum score allowed under the rule."
                }
              },
              "required": [
                "rule",
                "cap"
              ],
              "additionalProperties": false
            },
            "description": "Score caps applied by the governance overlay."
          },
          "red_flags": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Governance flags observed: `surveillance:{measure}`, `pledge:{pct}%`, `insider_selling`, `credit_downgrade`."
          }
        },
        "required": [
          "symbol",
          "name",
          "sector",
          "industry",
          "size",
          "market_cap_cr",
          "pe",
          "industry_pe",
          "score_date",
          "score",
          "band",
          "confidence",
          "pillars",
          "caps",
          "red_flags"
        ],
        "additionalProperties": false,
        "example": {
          "symbol": "CHENNPETRO",
          "name": "Chennai Petroleum Corporation",
          "sector": "Petroleum Products",
          "industry": "Refineries & Marketing",
          "size": "mid",
          "market_cap_cr": 15230.5,
          "pe": 6.4,
          "industry_pe": 17.2,
          "score_date": "2026-10-14",
          "score": 76,
          "band": "strong",
          "confidence": 100,
          "pillars": {
            "quality": 81.2,
            "valuation": 88.4,
            "growth": 70.1,
            "momentum": 92.3,
            "financial_health": 64.9,
            "ownership": 58.7
          },
          "caps": [],
          "red_flags": []
        }
      },
      "ScoresMeta": {
        "type": "object",
        "properties": {
          "snapshot": {
            "type": "object",
            "properties": {
              "score_date": {
                "type": "string",
                "description": "Scoring run every row on this page comes from (YYYY-MM-DD)."
              },
              "latest_complete_score_date": {
                "type": "string",
                "description": "Newest complete scoring run. Differs from `score_date` only while a cursor keeps a walk on an older run (YYYY-MM-DD)."
              },
              "pinned_to_cursor_run": {
                "type": "boolean",
                "description": "True when a cursor kept this page on an older run after a newer one was published. Drop the cursor to read the newest run."
              }
            },
            "required": [
              "score_date",
              "latest_complete_score_date",
              "pinned_to_cursor_run"
            ],
            "additionalProperties": false,
            "description": "Which scoring run this list reads."
          },
          "counts": {
            "type": "object",
            "properties": {
              "matched": {
                "type": "integer",
                "description": "Rows matching every filter, across all pages."
              },
              "scored": {
                "type": "integer",
                "description": "Stocks the run scored, before eligibility and confidence."
              },
              "eligible": {
                "type": "integer",
                "description": "Scored stocks with enough data to publish a score."
              },
              "below_confidence_threshold": {
                "type": "integer",
                "description": "Eligible stocks left out by `min_confidence`."
              }
            },
            "required": [
              "matched",
              "scored",
              "eligible",
              "below_confidence_threshold"
            ],
            "additionalProperties": false,
            "description": "How the run narrows down to this result, so a ranking can say what its filters excluded."
          },
          "applied_filters": {
            "type": "object",
            "properties": {
              "bands": {
                "type": "array",
                "items": {
                  "type": "string",
                  "enum": [
                    "strong",
                    "good",
                    "average",
                    "weak",
                    "poor"
                  ]
                },
                "description": "Bands filtered on; empty means every band."
              },
              "sizes": {
                "type": "array",
                "items": {
                  "type": "string",
                  "enum": [
                    "large",
                    "mid",
                    "small",
                    "micro"
                  ]
                },
                "description": "Size buckets filtered on; empty means every size."
              },
              "sectors": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Sectors filtered on; empty means every sector."
              },
              "min_score": {
                "anyOf": [
                  {
                    "type": "integer"
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "Minimum score applied, or null."
              },
              "max_score": {
                "anyOf": [
                  {
                    "type": "integer"
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "Maximum score applied, or null."
              },
              "min_confidence": {
                "type": "integer",
                "description": "Minimum data confidence applied."
              },
              "q": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Symbol/name search applied, or null."
              },
              "sort": {
                "type": "string",
                "enum": [
                  "band",
                  "score",
                  "confidence",
                  "market_cap",
                  "name"
                ],
                "description": "Sort key applied."
              },
              "order": {
                "type": "string",
                "enum": [
                  "asc",
                  "desc"
                ],
                "description": "Sort direction applied."
              }
            },
            "required": [
              "bands",
              "sizes",
              "sectors",
              "min_score",
              "max_score",
              "min_confidence",
              "q",
              "sort",
              "order"
            ],
            "additionalProperties": false,
            "description": "The filters and ordering this response applied, defaults included."
          }
        },
        "required": [
          "snapshot",
          "counts",
          "applied_filters"
        ],
        "additionalProperties": false
      },
      "StockScore": {
        "type": "object",
        "properties": {
          "symbol": {
            "type": "string",
            "description": "Stock symbol."
          },
          "score_date": {
            "type": "string",
            "description": "Date of the run this score comes from (YYYY-MM-DD)."
          },
          "status": {
            "type": "string",
            "enum": [
              "scored",
              "insufficient_data"
            ],
            "description": "insufficient_data: too little numeric coverage to publish a score; `score` and `band` are then null."
          },
          "score": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Tapetide Score, 0-100; null when not publishable."
          },
          "band": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "strong",
                  "good",
                  "average",
                  "weak",
                  "poor"
                ],
                "description": "Coarse band: strong (66+), good (55-65), average (45-54), weak (37-44), poor (below 37)."
              },
              {
                "type": "null"
              }
            ],
            "description": "Coarse band: strong (66+), good (55-65), average (45-54), weak (37-44), poor (below 37)."
          },
          "percentile": {
            "type": [
              "number",
              "null"
            ],
            "description": "Share of eligible stocks in the same run scoring below this one (mid-rank), 0-100."
          },
          "universe": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Number of eligible stocks in that run (the percentile base)."
          },
          "pillars": {
            "type": "object",
            "properties": {
              "quality": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "quality pillar, 0-100; null when unavailable."
              },
              "valuation": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "valuation pillar, 0-100; null when unavailable."
              },
              "growth": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "growth pillar, 0-100; null when unavailable."
              },
              "momentum": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "momentum pillar, 0-100; null when unavailable."
              },
              "financial_health": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "financial health pillar, 0-100; null when unavailable."
              },
              "ownership": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "ownership pillar, 0-100; null when unavailable."
              }
            },
            "required": [
              "quality",
              "valuation",
              "growth",
              "momentum",
              "financial_health",
              "ownership"
            ],
            "additionalProperties": false,
            "description": "The six pillar sub-scores."
          },
          "pillar_weights": {
            "type": "object",
            "properties": {
              "quality": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "quality pillar, 0-100; null when unavailable."
              },
              "valuation": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "valuation pillar, 0-100; null when unavailable."
              },
              "growth": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "growth pillar, 0-100; null when unavailable."
              },
              "momentum": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "momentum pillar, 0-100; null when unavailable."
              },
              "financial_health": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "financial health pillar, 0-100; null when unavailable."
              },
              "ownership": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "ownership pillar, 0-100; null when unavailable."
              }
            },
            "required": [
              "quality",
              "valuation",
              "growth",
              "momentum",
              "financial_health",
              "ownership"
            ],
            "additionalProperties": false,
            "description": "Weight of each pillar in the composite, percent."
          },
          "governance_multiplier": {
            "type": [
              "number",
              "null"
            ],
            "description": "Multiplier applied for governance red flags (1 = none)."
          },
          "caps": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "rule": {
                  "type": "string",
                  "description": "Governance rule that capped the score, e.g. surveillance:GSM, pledge>75%."
                },
                "cap": {
                  "type": "number",
                  "description": "Maximum score allowed under the rule."
                }
              },
              "required": [
                "rule",
                "cap"
              ],
              "additionalProperties": false
            },
            "description": "Score caps applied by the governance overlay."
          },
          "red_flags": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Governance flags observed: `surveillance:{measure}`, `pledge:{pct}%`, `insider_selling`, `credit_downgrade`."
          },
          "coverage_pct": {
            "type": "integer",
            "description": "Share of the required inputs that were available, percent."
          },
          "confidence": {
            "type": "integer",
            "description": "Data confidence, 0-100."
          }
        },
        "required": [
          "symbol",
          "score_date",
          "status",
          "score",
          "band",
          "percentile",
          "universe",
          "pillars",
          "pillar_weights",
          "governance_multiplier",
          "caps",
          "red_flags",
          "coverage_pct",
          "confidence"
        ],
        "additionalProperties": false,
        "example": {
          "symbol": "CHENNPETRO",
          "score_date": "2026-10-14",
          "status": "scored",
          "score": 76,
          "band": "strong",
          "percentile": 99.9,
          "universe": 4492,
          "pillars": {
            "quality": 81.2,
            "valuation": 88.4,
            "growth": 70.1,
            "momentum": 92.3,
            "financial_health": 64.9,
            "ownership": 58.7
          },
          "pillar_weights": {
            "quality": 22,
            "valuation": 24,
            "growth": 9,
            "momentum": 12,
            "financial_health": 9,
            "ownership": 24
          },
          "governance_multiplier": 1,
          "caps": [],
          "red_flags": [],
          "coverage_pct": 96,
          "confidence": 100
        }
      },
      "StockScoreHistoryItem": {
        "type": "object",
        "properties": {
          "score_date": {
            "type": "string",
            "description": "Run date (YYYY-MM-DD)."
          },
          "score": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Tapetide Score that day; null when the stock was not scoreable."
          },
          "band": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "strong",
                  "good",
                  "average",
                  "weak",
                  "poor"
                ],
                "description": "Coarse band: strong (66+), good (55-65), average (45-54), weak (37-44), poor (below 37)."
              },
              {
                "type": "null"
              }
            ],
            "description": "Coarse band: strong (66+), good (55-65), average (45-54), weak (37-44), poor (below 37)."
          },
          "confidence": {
            "type": "integer",
            "description": "Data confidence that day, 0-100."
          }
        },
        "required": [
          "score_date",
          "score",
          "band",
          "confidence"
        ],
        "additionalProperties": false,
        "example": {
          "score_date": "2026-10-14",
          "score": 76,
          "band": "strong",
          "confidence": 100
        }
      },
      "StockEarningsCallDigestsItem": {
        "type": "object",
        "properties": {
          "symbol": {
            "type": "string",
            "description": "Stock symbol."
          },
          "document_id": {
            "type": "integer",
            "description": "Identifier usable with `/v1/stocks/{symbol}/documents/summary` and `/documents/read` for the full transcript."
          },
          "call_date": {
            "type": [
              "string",
              "null"
            ],
            "description": "Date the transcript was filed (YYYY-MM-DD)."
          },
          "period": {
            "type": [
              "string",
              "null"
            ],
            "description": "Month of the call, e.g. \"Jul 2026\"."
          },
          "pages": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Transcript page count."
          },
          "summary": {
            "type": [
              "string",
              "null"
            ],
            "description": "Investor digest of the call in Markdown; `summary_truncated` is true when cut to length."
          },
          "summary_truncated": {
            "type": "boolean"
          },
          "highlights": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Key points management made."
          },
          "risks": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Risks and headwinds discussed."
          },
          "guidance": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Forward-looking statements and guidance."
          },
          "key_metrics": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "metric": {
                  "type": "string",
                  "description": "Metric name as stated on the call, e.g. \"Revenue\"."
                },
                "value": {
                  "type": "string",
                  "description": "Value as stated, with its unit, e.g. \"₹72,275 crore\" or \"24%\"."
                },
                "period": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Period the value refers to, e.g. \"Q1 FY2027\"."
                }
              },
              "required": [
                "metric",
                "value",
                "period"
              ],
              "additionalProperties": false
            },
            "description": "Headline numbers quoted on the call."
          },
          "transcript_url": {
            "type": [
              "string",
              "null"
            ],
            "description": "Public URL of the filed transcript PDF."
          }
        },
        "required": [
          "symbol",
          "document_id",
          "call_date",
          "period",
          "pages",
          "summary",
          "summary_truncated",
          "highlights",
          "risks",
          "guidance",
          "key_metrics",
          "transcript_url"
        ],
        "additionalProperties": false,
        "example": {
          "symbol": "TCS",
          "document_id": 23262437,
          "call_date": "2026-07-01",
          "period": "Jul 2026",
          "pages": 25,
          "summary": "# Q1 FY2027 Earnings Summary\n\n## Revenue and Profitability\n\nRevenue of ₹72,275 crore grew 2.2% sequentially and 13.9% year on year in rupee terms…",
          "summary_truncated": true,
          "highlights": [
            "Revenue growth of 13.9% YoY (₹72,275 crore) and 2.2% QoQ, the fourth consecutive quarter of growth"
          ],
          "risks": [
            "Geopolitical uncertainty continuing to cause client project deferrals"
          ],
          "guidance": [
            "No specific revenue or earnings guidance provided, per company policy"
          ],
          "key_metrics": [
            {
              "metric": "Revenue",
              "value": "₹72,275 crore",
              "period": "Q1 FY2027"
            }
          ],
          "transcript_url": "https://www.bseindia.com/stockinfo/AnnPdfOpen.aspx?Pname=27523cab-de62-4f78-939a-6d9853bbd060.pdf"
        }
      },
      "MarketSurveillanceItem": {
        "type": "object",
        "properties": {
          "symbol": {
            "type": "string",
            "description": "Stock symbol."
          },
          "name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Company name."
          },
          "framework": {
            "type": "string",
            "enum": [
              "asm",
              "esm",
              "gsm"
            ],
            "description": "asm (additional surveillance measure), esm (enhanced surveillance measure, SME platform), gsm (graded surveillance measure)."
          },
          "measure": {
            "type": "string",
            "description": "Specific measure: long_term_asm, short_term_asm, esm, gsm, or ibc (insolvency-linked)."
          },
          "stage": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Stage within the framework (GSM stage 0 = shortlisted); null when the framework has no stage."
          },
          "description": {
            "type": [
              "string",
              "null"
            ],
            "description": "Exchange description of the measure."
          },
          "as_of": {
            "type": "string",
            "description": "Date of the list this entry comes from (YYYY-MM-DD)."
          },
          "first_seen": {
            "type": "string",
            "description": "Earliest date in our coverage (from 2026-06-26) this stock appeared under this framework; a stock that exited and re-entered keeps its first date (YYYY-MM-DD)."
          }
        },
        "required": [
          "symbol",
          "name",
          "framework",
          "measure",
          "stage",
          "description",
          "as_of",
          "first_seen"
        ],
        "additionalProperties": false,
        "example": {
          "symbol": "PAISALO",
          "name": "Paisalo Digital",
          "framework": "asm",
          "measure": "long_term_asm",
          "stage": 1,
          "description": "Long Term Additional Surveillance Measure (LTASM) - Stage I",
          "as_of": "2026-10-15",
          "first_seen": "2026-09-23"
        }
      },
      "IndicesItem": {
        "type": "object",
        "properties": {
          "slug": {
            "type": "string",
            "description": "Stable identifier used in `/v1/indices/{slug}/...` paths."
          },
          "name": {
            "type": "string",
            "description": "Index name, e.g. Nifty 50."
          },
          "exchange": {
            "type": "string",
            "description": "Exchange that computes the index: NSE or BSE."
          },
          "category": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "broad",
                  "sectoral",
                  "thematic",
                  "strategy",
                  "volatility"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "Index family: broad (market-cap based), sectoral, thematic, strategy (factor/smart-beta) or volatility."
          },
          "first_date": {
            "type": [
              "string",
              "null"
            ],
            "description": "Earliest date with a daily level (YYYY-MM-DD); null when no levels are held."
          },
          "last_date": {
            "type": [
              "string",
              "null"
            ],
            "description": "Latest date with a daily level (YYYY-MM-DD)."
          },
          "has_constituents": {
            "type": "boolean",
            "description": "Whether point-in-time constituents are available at `/v1/indices/{slug}/constituents`."
          }
        },
        "required": [
          "slug",
          "name",
          "exchange",
          "category",
          "first_date",
          "last_date",
          "has_constituents"
        ],
        "additionalProperties": false,
        "example": {
          "slug": "nifty-50",
          "name": "Nifty 50",
          "exchange": "NSE",
          "category": "broad",
          "first_date": "1996-01-01",
          "last_date": "2026-10-14",
          "has_constituents": true
        }
      },
      "IndexLevelsItem": {
        "type": "object",
        "properties": {
          "date": {
            "type": "string",
            "description": "Trading date (YYYY-MM-DD)."
          },
          "open": {
            "type": [
              "number",
              "null"
            ],
            "description": "Opening level. Null where the opening level was not published (common before 2000)."
          },
          "high": {
            "type": [
              "number",
              "null"
            ],
            "description": "Intraday high."
          },
          "low": {
            "type": [
              "number",
              "null"
            ],
            "description": "Intraday low."
          },
          "close": {
            "type": [
              "number",
              "null"
            ],
            "description": "Closing level."
          },
          "volume": {
            "type": [
              "number",
              "null"
            ],
            "description": "Shares traded across constituents. Null before 2016 and for indices with no traded volume (e.g. India VIX)."
          },
          "turnover_cr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Traded value across constituents in INR crore. Null where not published."
          },
          "pe": {
            "type": [
              "number",
              "null"
            ],
            "description": "Index price-to-earnings ratio. Published from 2016."
          },
          "pb": {
            "type": [
              "number",
              "null"
            ],
            "description": "Index price-to-book ratio. Published from 2016."
          },
          "dividend_yield": {
            "type": [
              "number",
              "null"
            ],
            "description": "Index dividend yield in percent (1.5 = 1.5%). Published from 2016."
          }
        },
        "required": [
          "date",
          "open",
          "high",
          "low",
          "close",
          "volume",
          "turnover_cr",
          "pe",
          "pb",
          "dividend_yield"
        ],
        "additionalProperties": false,
        "example": {
          "date": "2026-10-14",
          "open": 22715.75,
          "high": 22757.95,
          "low": 22558.95,
          "close": 22622.7,
          "volume": 333248082,
          "turnover_cr": 30396.7,
          "pe": 19.33,
          "pb": 2.78,
          "dividend_yield": 1.52
        }
      },
      "IndexConstituentsItem": {
        "type": "object",
        "properties": {
          "symbol": {
            "type": "string",
            "description": "Stock symbol."
          },
          "name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Company name."
          },
          "isin": {
            "type": [
              "string",
              "null"
            ],
            "description": "ISIN of the equity share."
          },
          "state": {
            "type": "string",
            "enum": [
              "present",
              "uncertain"
            ],
            "description": "present: `date` falls inside the observed spell. uncertain (only with `include_uncertain=true`): `date` falls in the unobserved bracket around this spell's join or exit, so membership on that day is plausible but not proven."
          },
          "member_since": {
            "type": "string",
            "description": "First observed date of the membership spell containing (or bracketing) the requested date. Membership may predate it when `joined_before_coverage` is true (YYYY-MM-DD)."
          },
          "member_through": {
            "type": "string",
            "description": "Last observed date of that spell. Equals the latest answerable date for current members (YYYY-MM-DD)."
          },
          "joined_before_coverage": {
            "type": "boolean",
            "description": "True when the stock was already a member on the first observed date, so the real joining date is earlier than `member_since`."
          },
          "last_absent_before": {
            "type": [
              "string",
              "null"
            ],
            "description": "Last observed date the stock was NOT a member before this spell (YYYY-MM-DD). The real join day is after it and on or before `member_since`. null when the spell starts at the beginning of observation (`joined_before_coverage`)."
          },
          "first_absent_after": {
            "type": [
              "string",
              "null"
            ],
            "description": "First observed date the stock was no longer a member after this spell (YYYY-MM-DD). The real exit day is after `member_through` and on or before it. null while the spell is current."
          }
        },
        "required": [
          "symbol",
          "name",
          "isin",
          "state",
          "member_since",
          "member_through",
          "joined_before_coverage",
          "last_absent_before",
          "first_absent_after"
        ],
        "additionalProperties": false,
        "example": {
          "symbol": "TCS",
          "name": "Tata Consultancy Services Ltd",
          "isin": "INE467B01029",
          "state": "present",
          "member_since": "2026-03-15",
          "member_through": "2026-10-15",
          "joined_before_coverage": true,
          "last_absent_before": null,
          "first_absent_after": null
        }
      },
      "IndexConstituentsMeta": {
        "type": "object",
        "properties": {
          "date": {
            "type": "string",
            "description": "As-of date answered (YYYY-MM-DD)."
          },
          "coverage_from": {
            "type": [
              "string",
              "null"
            ],
            "description": "First date this membership history observes (YYYY-MM-DD)."
          },
          "observed_through": {
            "type": [
              "string",
              "null"
            ],
            "description": "Latest observed snapshot date (YYYY-MM-DD)."
          },
          "answerable_through": {
            "type": [
              "string",
              "null"
            ],
            "description": "Latest date membership answers are complete through (YYYY-MM-DD): the earlier of the latest observation and the latest date folded into the membership history. Dates after it are out of coverage, not absent."
          },
          "lag_days": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Days the folded membership history trails the latest observation. 0 when current; null when unknown."
          }
        },
        "required": [
          "date",
          "coverage_from",
          "observed_through",
          "answerable_through",
          "lag_days"
        ],
        "additionalProperties": false
      },
      "StockIndexMembershipsItem": {
        "type": "object",
        "properties": {
          "index_slug": {
            "type": "string",
            "description": "Index slug."
          },
          "index_name": {
            "type": "string",
            "description": "Index name."
          },
          "state": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "present",
                  "uncertain"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "With `date`: present when `date` is inside the observed spell, uncertain when it falls only in the unobserved bracket around the join or exit. null without `date`."
          },
          "member_since": {
            "type": "string",
            "description": "First observed date of this membership spell (YYYY-MM-DD)."
          },
          "member_through": {
            "type": "string",
            "description": "Last observed date of this membership spell (YYYY-MM-DD)."
          },
          "current": {
            "type": "boolean",
            "description": "True when the stock was still a member on the latest observed date."
          },
          "joined_before_coverage": {
            "type": "boolean",
            "description": "True when the stock was already a member when observation began, so it joined before `member_since`."
          },
          "last_absent_before": {
            "type": [
              "string",
              "null"
            ],
            "description": "Last observed date the stock was NOT a member before this spell (YYYY-MM-DD). The real join day is after it and on or before `member_since`. null when the spell starts at the beginning of observation (`joined_before_coverage`)."
          },
          "first_absent_after": {
            "type": [
              "string",
              "null"
            ],
            "description": "First observed date the stock was no longer a member after this spell (YYYY-MM-DD). The real exit day is after `member_through` and on or before it. null while the spell is current."
          }
        },
        "required": [
          "index_slug",
          "index_name",
          "state",
          "member_since",
          "member_through",
          "current",
          "joined_before_coverage",
          "last_absent_before",
          "first_absent_after"
        ],
        "additionalProperties": false,
        "example": {
          "index_slug": "nifty-50",
          "index_name": "Nifty 50",
          "state": "present",
          "member_since": "2026-03-15",
          "member_through": "2026-10-15",
          "current": true,
          "joined_before_coverage": true,
          "last_absent_before": null,
          "first_absent_after": null
        }
      },
      "StockIndexMembershipsMeta": {
        "type": "object",
        "properties": {
          "date": {
            "type": [
              "string",
              "null"
            ],
            "description": "The `date` filter, or null."
          },
          "coverage_from": {
            "type": [
              "string",
              "null"
            ],
            "description": "First date this membership history observes (YYYY-MM-DD)."
          },
          "answerable_through": {
            "type": [
              "string",
              "null"
            ],
            "description": "Latest date membership answers are complete through, across tracked indices (YYYY-MM-DD)."
          },
          "date_status": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "in_coverage",
                  "out_of_coverage"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "With `date`: out_of_coverage when the date is before observation began or after `answerable_through`, so an empty result says nothing about membership; in_coverage when an index without a row is a proven non-member on that date (unless the stock itself is outside per-index coverage listed in `out_of_coverage_indices`). null without `date`."
          },
          "out_of_coverage_indices": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "With `date`: slugs of tracked indices whose own observed window does not cover the date (e.g. a stalled index), so a missing row there is not evidence of non-membership. Empty otherwise."
          }
        },
        "required": [
          "date",
          "coverage_from",
          "answerable_through",
          "date_status",
          "out_of_coverage_indices"
        ],
        "additionalProperties": false
      },
      "VixHistoryItem": {
        "type": "object",
        "properties": {
          "date": {
            "type": "string",
            "description": "Trading date (YYYY-MM-DD)."
          },
          "open": {
            "type": [
              "number",
              "null"
            ],
            "description": "Opening value. Null where not published."
          },
          "high": {
            "type": [
              "number",
              "null"
            ],
            "description": "Intraday high."
          },
          "low": {
            "type": [
              "number",
              "null"
            ],
            "description": "Intraday low."
          },
          "close": {
            "type": [
              "number",
              "null"
            ],
            "description": "Closing value: annualised expected volatility of the Nifty 50 over the next 30 days, in percent."
          },
          "previous_close": {
            "type": [
              "number",
              "null"
            ],
            "description": "Previous session's close."
          },
          "change": {
            "type": [
              "number",
              "null"
            ],
            "description": "Change in points versus the previous close."
          },
          "change_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "Change in percent versus the previous close (1.5 = 1.5%)."
          }
        },
        "required": [
          "date",
          "open",
          "high",
          "low",
          "close",
          "previous_close",
          "change",
          "change_pct"
        ],
        "additionalProperties": false,
        "example": {
          "date": "2026-10-15",
          "open": 14.625,
          "high": 14.9475,
          "low": 13.9075,
          "close": 14.03,
          "previous_close": 14.625,
          "change": -0.6,
          "change_pct": -4.07
        }
      },
      "InstitutionalFlowsItem": {
        "type": "object",
        "properties": {
          "date": {
            "type": "string",
            "description": "Trading date (YYYY-MM-DD)."
          },
          "fii_buy_cr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Gross purchases by foreign institutional investors in the cash market, INR crore."
          },
          "fii_sell_cr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Gross sales by foreign institutional investors, INR crore."
          },
          "fii_net_cr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Net purchases (buy minus sell) by foreign institutional investors, INR crore. Negative = net selling."
          },
          "dii_buy_cr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Gross purchases by domestic institutional investors, INR crore."
          },
          "dii_sell_cr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Gross sales by domestic institutional investors, INR crore."
          },
          "dii_net_cr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Net purchases by domestic institutional investors, INR crore."
          }
        },
        "required": [
          "date",
          "fii_buy_cr",
          "fii_sell_cr",
          "fii_net_cr",
          "dii_buy_cr",
          "dii_sell_cr",
          "dii_net_cr"
        ],
        "additionalProperties": false,
        "example": {
          "date": "2026-10-15",
          "fii_buy_cr": 12735.59,
          "fii_sell_cr": 18020.96,
          "fii_net_cr": -5285.37,
          "dii_buy_cr": 19438.65,
          "dii_sell_cr": 16119.26,
          "dii_net_cr": 3319.39
        }
      },
      "ParticipantOpenInterestItem": {
        "type": "object",
        "properties": {
          "date": {
            "type": "string",
            "description": "Trading date (YYYY-MM-DD)."
          },
          "participant": {
            "type": "string",
            "enum": [
              "fii",
              "dii",
              "pro",
              "client"
            ],
            "description": "Participant category: fii (foreign institutional), dii (domestic institutional), pro (proprietary traders), client (all other clients incl. retail)."
          },
          "index_futures_long": {
            "type": [
              "number",
              "null"
            ],
            "description": "Open long index-futures contracts at end of day."
          },
          "index_futures_short": {
            "type": [
              "number",
              "null"
            ],
            "description": "Open short index-futures contracts."
          },
          "stock_futures_long": {
            "type": [
              "number",
              "null"
            ],
            "description": "Open long stock-futures contracts."
          },
          "stock_futures_short": {
            "type": [
              "number",
              "null"
            ],
            "description": "Open short stock-futures contracts."
          },
          "index_calls_long": {
            "type": [
              "number",
              "null"
            ],
            "description": "Open long index call option contracts."
          },
          "index_calls_short": {
            "type": [
              "number",
              "null"
            ],
            "description": "Open short index call option contracts."
          },
          "index_puts_long": {
            "type": [
              "number",
              "null"
            ],
            "description": "Open long index put option contracts."
          },
          "index_puts_short": {
            "type": [
              "number",
              "null"
            ],
            "description": "Open short index put option contracts."
          },
          "stock_calls_long": {
            "type": [
              "number",
              "null"
            ],
            "description": "Open long stock call option contracts."
          },
          "stock_calls_short": {
            "type": [
              "number",
              "null"
            ],
            "description": "Open short stock call option contracts."
          },
          "stock_puts_long": {
            "type": [
              "number",
              "null"
            ],
            "description": "Open long stock put option contracts."
          },
          "stock_puts_short": {
            "type": [
              "number",
              "null"
            ],
            "description": "Open short stock put option contracts."
          },
          "total_long": {
            "type": [
              "number",
              "null"
            ],
            "description": "Total open long contracts across all of the above."
          },
          "total_short": {
            "type": [
              "number",
              "null"
            ],
            "description": "Total open short contracts across all of the above."
          }
        },
        "required": [
          "date",
          "participant",
          "index_futures_long",
          "index_futures_short",
          "stock_futures_long",
          "stock_futures_short",
          "index_calls_long",
          "index_calls_short",
          "index_puts_long",
          "index_puts_short",
          "stock_calls_long",
          "stock_calls_short",
          "stock_puts_long",
          "stock_puts_short",
          "total_long",
          "total_short"
        ],
        "additionalProperties": false,
        "example": {
          "date": "2026-10-15",
          "participant": "fii",
          "index_futures_long": 38549,
          "index_futures_short": 318376,
          "stock_futures_long": 3607402,
          "stock_futures_short": 2820841,
          "index_calls_long": 684021,
          "index_calls_short": 891902,
          "index_puts_long": 1256369,
          "index_puts_short": 809342,
          "stock_calls_long": 293057,
          "stock_calls_short": 442647,
          "stock_puts_long": 388838,
          "stock_puts_short": 269467,
          "total_long": 6268236,
          "total_short": 5552575
        }
      },
      "FpiFlowsItem": {
        "type": "object",
        "properties": {
          "date": {
            "type": "string",
            "description": "Reporting date (YYYY-MM-DD)."
          },
          "asset_class": {
            "type": "string",
            "description": "Instrument class: equity, debt (until Aug 2024), debt_general_limit, debt_vrr (voluntary retention route), debt_far (fully accessible route), hybrid, aifs (alternative investment funds), mutual_funds."
          },
          "channel": {
            "type": "string",
            "description": "How the investment was made: stock_exchange, primary_market (primary issues and others), or total. For mutual_funds the channel is the scheme type: equity_schemes, debt_schemes, hybrid_schemes, solution_oriented_schemes, other_schemes, or total."
          },
          "gross_purchases_cr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Gross purchases, INR crore."
          },
          "gross_sales_cr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Gross sales, INR crore."
          },
          "net_investment_cr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Net investment (purchases minus sales), INR crore. Negative = net outflow."
          },
          "net_investment_usd_mn": {
            "type": [
              "number",
              "null"
            ],
            "description": "Net investment in USD million."
          },
          "usd_inr_rate": {
            "type": [
              "number",
              "null"
            ],
            "description": "USD/INR rate used to convert the net investment."
          }
        },
        "required": [
          "date",
          "asset_class",
          "channel",
          "gross_purchases_cr",
          "gross_sales_cr",
          "net_investment_cr",
          "net_investment_usd_mn",
          "usd_inr_rate"
        ],
        "additionalProperties": false,
        "example": {
          "date": "2026-10-14",
          "asset_class": "equity",
          "channel": "total",
          "gross_purchases_cr": 13687.01,
          "gross_sales_cr": 15123.42,
          "net_investment_cr": -1436.41,
          "net_investment_usd_mn": -150.8,
          "usd_inr_rate": null
        }
      },
      "FpiDerivativesItem": {
        "type": "object",
        "properties": {
          "date": {
            "type": "string",
            "description": "Reporting date (YYYY-MM-DD)."
          },
          "product": {
            "type": "string",
            "enum": [
              "index_futures",
              "index_options",
              "stock_futures",
              "stock_options",
              "interest_rate_futures",
              "currency_futures",
              "currency_options",
              "commodity_futures",
              "commodity_options"
            ],
            "description": "Derivative product. Index, stock and interest-rate products from Sep 2003; currency and commodity products from Sep 2024."
          },
          "buy_contracts": {
            "type": [
              "number",
              "null"
            ],
            "description": "Contracts bought by FPIs during the day."
          },
          "buy_value_cr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Value bought, INR crore."
          },
          "sell_contracts": {
            "type": [
              "number",
              "null"
            ],
            "description": "Contracts sold by FPIs during the day."
          },
          "sell_value_cr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Value sold, INR crore."
          },
          "open_interest_contracts": {
            "type": [
              "number",
              "null"
            ],
            "description": "FPI open interest at end of day, contracts."
          },
          "open_interest_value_cr": {
            "type": [
              "number",
              "null"
            ],
            "description": "FPI open interest at end of day, INR crore."
          }
        },
        "required": [
          "date",
          "product",
          "buy_contracts",
          "buy_value_cr",
          "sell_contracts",
          "sell_value_cr",
          "open_interest_contracts",
          "open_interest_value_cr"
        ],
        "additionalProperties": false,
        "example": {
          "date": "2026-10-15",
          "product": "index_futures",
          "buy_contracts": 9771,
          "buy_value_cr": 1481.78,
          "sell_contracts": 16996,
          "sell_value_cr": 2586.25,
          "open_interest_contracts": 368476,
          "open_interest_value_cr": 55878.1
        }
      },
      "FpiSectorHoldingsItem": {
        "type": "object",
        "properties": {
          "date": {
            "type": "string",
            "description": "End of the fortnight the row reports (YYYY-MM-DD)."
          },
          "period_start": {
            "type": [
              "string",
              "null"
            ],
            "description": "First day of the fortnight (YYYY-MM-DD)."
          },
          "measure": {
            "type": "string",
            "enum": [
              "assets_under_custody",
              "net_investment"
            ],
            "description": "assets_under_custody: FPI holdings at fortnight end; net_investment: net FPI investment during the fortnight."
          },
          "sector": {
            "type": "string",
            "description": "Sector name. The sector classification changed in May 2022; earlier names differ."
          },
          "parent_sector": {
            "type": [
              "string",
              "null"
            ],
            "description": "Parent group for sub-sectors (until Apr 2022), else null."
          },
          "equity_cr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Equity, INR crore."
          },
          "debt_cr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Debt under the general limit, INR crore."
          },
          "debt_vrr_cr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Debt under the voluntary retention route, INR crore."
          },
          "debt_far_cr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Debt under the fully accessible route, INR crore."
          },
          "hybrid_cr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Hybrid instruments, INR crore."
          },
          "total_cr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Total across instrument classes, INR crore."
          }
        },
        "required": [
          "date",
          "period_start",
          "measure",
          "sector",
          "parent_sector",
          "equity_cr",
          "debt_cr",
          "debt_vrr_cr",
          "debt_far_cr",
          "hybrid_cr",
          "total_cr"
        ],
        "additionalProperties": false,
        "example": {
          "date": "2026-09-30",
          "period_start": "2026-09-16",
          "measure": "assets_under_custody",
          "sector": "Capital Goods",
          "parent_sector": null,
          "equity_cr": 487700,
          "debt_cr": 67,
          "debt_vrr_cr": 11,
          "debt_far_cr": null,
          "hybrid_cr": null,
          "total_cr": 487778
        }
      },
      "FundCategoryFlowsItem": {
        "type": "object",
        "properties": {
          "month": {
            "type": "string",
            "description": "First day of the reporting month (YYYY-MM-DD)."
          },
          "scheme_type": {
            "type": "string",
            "enum": [
              "open_ended",
              "close_ended",
              "interval"
            ],
            "description": "Open-ended, close-ended or interval schemes."
          },
          "group": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "debt",
                  "equity",
                  "hybrid",
                  "solution_oriented",
                  "other",
                  "index_funds",
                  "etfs",
                  "overseas_fund_of_funds"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "Category group. From Aug 2026 index funds, ETFs and overseas fund-of-funds are reported as their own groups; before that they sit under `other`."
          },
          "category": {
            "type": "string",
            "description": "Fund category, e.g. Flexi Cap Fund, Liquid Fund. Names follow the monthly industry report and occasionally change."
          },
          "schemes": {
            "type": [
              "number",
              "null"
            ],
            "description": "Number of schemes in the category."
          },
          "folios": {
            "type": [
              "number",
              "null"
            ],
            "description": "Number of investor folios at month end."
          },
          "funds_mobilized_cr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Gross inflows during the month, INR crore."
          },
          "redemptions_cr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Redemptions and repurchases during the month, INR crore."
          },
          "net_flow_cr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Net inflow (mobilised minus redeemed), INR crore. Negative = net outflow."
          },
          "net_aum_cr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Net assets under management at month end, INR crore."
          },
          "average_aum_cr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Average assets under management for the month, INR crore."
          }
        },
        "required": [
          "month",
          "scheme_type",
          "group",
          "category",
          "schemes",
          "folios",
          "funds_mobilized_cr",
          "redemptions_cr",
          "net_flow_cr",
          "net_aum_cr",
          "average_aum_cr"
        ],
        "additionalProperties": false,
        "example": {
          "month": "2026-09-01",
          "scheme_type": "open_ended",
          "group": "equity",
          "category": "Flexi Cap Fund",
          "schemes": 47,
          "folios": 25035055,
          "funds_mobilized_cr": 12368.09,
          "redemptions_cr": 5666.29,
          "net_flow_cr": 6701.8,
          "net_aum_cr": 588389.52,
          "average_aum_cr": 601342.66
        }
      },
      "MacroSeriesItem": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Series identifier for `/v1/macro/series/{series_id}/observations`."
          },
          "name": {
            "type": "string",
            "description": "Human-readable series name."
          },
          "description": {
            "type": "string",
            "description": "What the series measures, coverage and caveats."
          },
          "frequency": {
            "type": "string",
            "enum": [
              "daily",
              "weekly",
              "fortnightly",
              "monthly",
              "quarterly"
            ],
            "description": "Observation frequency."
          },
          "unit": {
            "type": "string",
            "description": "Unit of `value`: percent (1.5 = 1.5%), index, inr_crore, usd_million or inr (rupees per unit of foreign currency)."
          },
          "publisher": {
            "type": [
              "string",
              "null"
            ],
            "description": "Official body that issues the statistic, where applicable."
          },
          "first_date": {
            "type": [
              "string",
              "null"
            ],
            "description": "Earliest observation date (YYYY-MM-DD)."
          },
          "last_date": {
            "type": [
              "string",
              "null"
            ],
            "description": "Latest observation date (YYYY-MM-DD)."
          }
        },
        "required": [
          "id",
          "name",
          "description",
          "frequency",
          "unit",
          "publisher",
          "first_date",
          "last_date"
        ],
        "additionalProperties": false,
        "example": {
          "id": "repo_rate",
          "name": "Policy repo rate",
          "description": "Rate at which the central bank lends to banks overnight against government securities; the headline policy rate. Weekly observation from December 2011.",
          "frequency": "weekly",
          "unit": "percent",
          "publisher": "Reserve Bank of India",
          "first_date": "2011-12-30",
          "last_date": "2026-10-02"
        }
      },
      "MacroObservationsItem": {
        "type": "object",
        "properties": {
          "date": {
            "type": "string",
            "description": "Observation date: week-ending Friday for weekly series, reporting Friday for fortnightly, first day of the month for monthly, quarter-end for quarterly (YYYY-MM-DD)."
          },
          "value": {
            "type": "number",
            "description": "Observed value in the series' unit."
          }
        },
        "required": [
          "date",
          "value"
        ],
        "additionalProperties": false,
        "example": {
          "date": "2026-10-02",
          "value": 5.25
        }
      },
      "CommodityPricesItem": {
        "type": "object",
        "properties": {
          "date": {
            "type": "string",
            "description": "Price date (YYYY-MM-DD)."
          },
          "commodity": {
            "type": "string",
            "description": "Commodity: gold, silver, platinum, crudeoil (WTI), brentcrude, naturalgas, copper, aluminium, zinc, lead, nickel."
          },
          "category": {
            "type": [
              "string",
              "null"
            ],
            "description": "precious, energy or industrial."
          },
          "international_price_usd": {
            "type": [
              "number",
              "null"
            ],
            "description": "International benchmark price in USD per `international_unit`. Null where no international price is available (lead and nickel)."
          },
          "international_unit": {
            "type": [
              "string",
              "null"
            ],
            "description": "Unit of the international price: troy_oz, barrel, mmbtu, pound, metric_ton."
          },
          "usd_inr": {
            "type": [
              "number",
              "null"
            ],
            "description": "USD/INR rate used for the landed-price conversion."
          },
          "import_duty_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "Effective import duty applied, percent (6 = 6%)."
          },
          "import_duty": {
            "type": [
              "string",
              "null"
            ],
            "description": "Import duty components, e.g. \"BCD 5% + AIDC 1% = 6%\"."
          },
          "india_landed_price_inr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Computed landed cost in India: international price converted to INR per `india_unit`, plus import duty. Null where no international price is available."
          },
          "india_unit": {
            "type": [
              "string",
              "null"
            ],
            "description": "Unit of the landed and domestic prices: g, kg, barrel, mmbtu."
          },
          "india_market_price_inr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Domestic commodity-exchange price in INR per `india_market_unit`. Published from July 2026 for exchange-traded commodities; null otherwise."
          },
          "india_market_unit": {
            "type": [
              "string",
              "null"
            ],
            "description": "Unit of the domestic exchange price."
          },
          "change_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "Day-on-day change in the international price, percent."
          },
          "india_market_change_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "Day-on-day change in the domestic exchange price, percent."
          },
          "international_last_updated": {
            "type": [
              "string",
              "null"
            ],
            "description": "Date (YYYY-MM-DD) the international price and its day change last changed. Equal to `date` on a fresh print; earlier when the value is carried forward over weekends, holidays or a stalled feed. Null when there is no international price."
          },
          "international_stale": {
            "type": "boolean",
            "description": "true when the international price and day change have been identical for more than 5 calendar days (longer than any weekend plus holiday). The feed has stalled: international_price_usd, change_pct and india_landed_price_inr are then null. The domestic exchange price is unaffected."
          }
        },
        "required": [
          "date",
          "commodity",
          "category",
          "international_price_usd",
          "international_unit",
          "usd_inr",
          "import_duty_pct",
          "import_duty",
          "india_landed_price_inr",
          "india_unit",
          "india_market_price_inr",
          "india_market_unit",
          "change_pct",
          "india_market_change_pct",
          "international_last_updated",
          "international_stale"
        ],
        "additionalProperties": false,
        "example": {
          "date": "2026-10-16",
          "commodity": "gold",
          "category": "precious",
          "international_price_usd": 4197,
          "international_unit": "troy_oz",
          "usd_inr": 95.10014,
          "import_duty_pct": 6,
          "import_duty": "BCD 5% + AIDC 1% = 6%",
          "india_landed_price_inr": 13602.44,
          "india_unit": "g",
          "india_market_price_inr": 14824,
          "india_market_unit": "g",
          "change_pct": 0.645,
          "india_market_change_pct": 0.51,
          "international_last_updated": "2026-10-16",
          "international_stale": false
        }
      },
      "DerivativeContractsItem": {
        "type": "object",
        "properties": {
          "underlying": {
            "type": "string",
            "description": "Underlying symbol."
          },
          "exchange": {
            "type": "string",
            "enum": [
              "NSE",
              "BSE"
            ],
            "description": "Listing exchange."
          },
          "kind": {
            "type": "string",
            "enum": [
              "index",
              "stock"
            ],
            "description": "Index or single-stock derivative."
          },
          "instrument": {
            "type": "string",
            "enum": [
              "future",
              "option"
            ],
            "description": "future or option."
          },
          "expiry": {
            "type": "string",
            "description": "Expiry date (YYYY-MM-DD)."
          },
          "strike": {
            "type": [
              "number",
              "null"
            ],
            "description": "Strike price in INR (index points for index options); null for futures."
          },
          "option_type": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "CE",
                  "PE"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "CE (call) or PE (put); null for futures."
          },
          "lot_size": {
            "type": [
              "number",
              "null"
            ],
            "description": "Contract lot size in units of the underlying, as first listed. Not adjusted for later splits/bonuses; null before 2024 where not published."
          },
          "trading_symbol": {
            "type": [
              "string",
              "null"
            ],
            "description": "Exchange trading symbol, e.g. NIFTY-Oct2026-22600-CE."
          }
        },
        "required": [
          "underlying",
          "exchange",
          "kind",
          "instrument",
          "expiry",
          "strike",
          "option_type",
          "lot_size",
          "trading_symbol"
        ],
        "additionalProperties": false,
        "example": {
          "underlying": "NIFTY",
          "exchange": "NSE",
          "kind": "index",
          "instrument": "option",
          "expiry": "2026-10-27",
          "strike": 22600,
          "option_type": "CE",
          "lot_size": 65,
          "trading_symbol": "NIFTY-Oct2026-22600-CE"
        }
      },
      "DerivativeExpiriesItem": {
        "type": "object",
        "properties": {
          "expiry": {
            "type": "string",
            "description": "Expiry date (YYYY-MM-DD)."
          },
          "exchange": {
            "type": "string",
            "enum": [
              "NSE",
              "BSE"
            ],
            "description": "Listing exchange."
          },
          "has_futures": {
            "type": "boolean",
            "description": "A futures contract expires on this date."
          },
          "has_options": {
            "type": "boolean",
            "description": "Option contracts expire on this date."
          },
          "option_strikes": {
            "type": "integer",
            "description": "Number of distinct option strikes listed for this expiry (0 when futures only)."
          }
        },
        "required": [
          "expiry",
          "exchange",
          "has_futures",
          "has_options",
          "option_strikes"
        ],
        "additionalProperties": false,
        "example": {
          "expiry": "2026-10-27",
          "exchange": "NSE",
          "has_futures": true,
          "has_options": true,
          "option_strikes": 241
        }
      },
      "DerivativeDailyBarsItem": {
        "type": "object",
        "properties": {
          "date": {
            "type": "string",
            "description": "Trading session (YYYY-MM-DD)."
          },
          "exchange": {
            "type": "string",
            "enum": [
              "NSE",
              "BSE"
            ],
            "description": "Listing exchange."
          },
          "instrument": {
            "type": "string",
            "enum": [
              "future",
              "option"
            ],
            "description": "future or option."
          },
          "expiry": {
            "type": "string",
            "description": "Contract expiry (YYYY-MM-DD)."
          },
          "strike": {
            "type": [
              "number",
              "null"
            ],
            "description": "Strike price in INR (index points for index options); null for futures."
          },
          "option_type": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "CE",
                  "PE"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "CE (call) or PE (put); null for futures."
          },
          "open": {
            "type": [
              "number",
              "null"
            ],
            "description": "Open price in INR. Null when the contract did not trade that session."
          },
          "high": {
            "type": [
              "number",
              "null"
            ],
            "description": "High price in INR. Null when untraded."
          },
          "low": {
            "type": [
              "number",
              "null"
            ],
            "description": "Low price in INR. Null when untraded."
          },
          "close": {
            "type": [
              "number",
              "null"
            ],
            "description": "Last traded price in INR. Null when untraded (no stale carried-forward close is published)."
          },
          "settle_price": {
            "type": [
              "number",
              "null"
            ],
            "description": "Exchange daily settlement price in INR, the session's mark for untraded contracts. On an option's own expiry day this is the option's final settlement value, derived as intrinsic value at `underlying_settlement_price`. Null when not published."
          },
          "underlying_settlement_price": {
            "type": [
              "number",
              "null"
            ],
            "description": "Only on the contract's expiry date: the underlying's final settlement price used to settle it. Null on all other days, and on expiry days before Feb 2020 where it was not published."
          },
          "traded": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "True when at least one contract traded that session."
          },
          "volume_contracts": {
            "type": [
              "number",
              "null"
            ],
            "description": "Contracts traded. Normalised across exchanges; null when it cannot be derived (BSE without a known lot size)."
          },
          "volume_units": {
            "type": [
              "number",
              "null"
            ],
            "description": "Volume in units of the underlying (shares, or index units for index derivatives). Null before 2024 for NSE where the lot size is not known."
          },
          "open_interest_units": {
            "type": [
              "number",
              "null"
            ],
            "description": "Open interest at session end, in units of the underlying."
          },
          "open_interest_contracts": {
            "type": [
              "number",
              "null"
            ],
            "description": "Open interest in contracts (units / lot size). Null when the lot size is unknown."
          },
          "change_in_open_interest_units": {
            "type": [
              "number",
              "null"
            ],
            "description": "Change in open interest versus the previous session, in units of the underlying."
          },
          "lot_size": {
            "type": [
              "number",
              "null"
            ],
            "description": "Lot size in force that session, in units of the underlying. Null before 2024 where not published."
          }
        },
        "required": [
          "date",
          "exchange",
          "instrument",
          "expiry",
          "strike",
          "option_type",
          "open",
          "high",
          "low",
          "close",
          "settle_price",
          "underlying_settlement_price",
          "traded",
          "volume_contracts",
          "volume_units",
          "open_interest_units",
          "open_interest_contracts",
          "change_in_open_interest_units",
          "lot_size"
        ],
        "additionalProperties": false,
        "example": {
          "date": "2026-10-14",
          "exchange": "NSE",
          "instrument": "option",
          "expiry": "2026-10-27",
          "strike": 22600,
          "option_type": "CE",
          "open": 240.1,
          "high": 268.4,
          "low": 228.15,
          "close": 250.25,
          "settle_price": 250.25,
          "underlying_settlement_price": null,
          "traded": true,
          "volume_contracts": 99205,
          "volume_units": 6448325,
          "open_interest_units": 3041740,
          "open_interest_contracts": 46796,
          "change_in_open_interest_units": 412360,
          "lot_size": 65
        }
      },
      "DerivativeOptionAnalyticsItem": {
        "type": "object",
        "properties": {
          "date": {
            "type": "string",
            "description": "Trading session (YYYY-MM-DD)."
          },
          "exchange": {
            "type": "string",
            "enum": [
              "NSE",
              "BSE"
            ],
            "description": "Listing exchange."
          },
          "expiry": {
            "type": "string",
            "description": "Option expiry (YYYY-MM-DD)."
          },
          "strike": {
            "type": "number",
            "description": "Strike price in INR / index points."
          },
          "option_type": {
            "type": "string",
            "enum": [
              "CE",
              "PE"
            ],
            "description": "CE (call) or PE (put)."
          },
          "premium": {
            "type": [
              "number",
              "null"
            ],
            "description": "Option price in INR the analytics were computed from; see `premium_basis`."
          },
          "premium_basis": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "traded_close",
                  "settlement",
                  "stale_close"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "traded_close: the session's closing trade. settlement: the exchange settlement price of an untraded session. stale_close: an untraded session priced off an older carried-forward close (mostly older history); treat its IV and Greeks with caution."
          },
          "forward": {
            "type": [
              "number",
              "null"
            ],
            "description": "Forward price of the underlying for this expiry, in INR / index points."
          },
          "forward_basis": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "futures",
                  "put_call_parity",
                  "spot_carry"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "How the forward was estimated: the same-expiry futures price, put-call parity on the most-traded near-the-money strike pair, or spot carried at the risk-free rate."
          },
          "years_to_expiry": {
            "type": [
              "number",
              "null"
            ],
            "description": "Calendar days to expiry / 365."
          },
          "log_moneyness": {
            "type": [
              "number",
              "null"
            ],
            "description": "ln(forward / strike): 0 at the money, positive when the forward is above the strike."
          },
          "iv_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "Implied volatility, annualised percent (13.33 = 13.33%). Black-76 on the forward at a 6.5% rate. Null unless `iv_status` is ok."
          },
          "iv_status": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "ok",
                  "below_intrinsic",
                  "above_limit",
                  "expiry_day",
                  "no_price"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "ok: IV solved. below_intrinsic: premium at or below intrinsic value (no time value to solve). above_limit: premium above the no-arbitrage bound. expiry_day: not computed on expiry day. no_price: no usable premium."
          },
          "delta": {
            "type": [
              "number",
              "null"
            ],
            "description": "Delta per 1 unit move in the forward (calls 0..1, puts -1..0)."
          },
          "gamma": {
            "type": [
              "number",
              "null"
            ],
            "description": "Gamma: change in delta per 1 unit move in the forward."
          },
          "vega": {
            "type": [
              "number",
              "null"
            ],
            "description": "Vega in INR per 1 percentage-point change in implied volatility."
          },
          "theta": {
            "type": [
              "number",
              "null"
            ],
            "description": "Theta in INR per calendar day (negative for a long option)."
          }
        },
        "required": [
          "date",
          "exchange",
          "expiry",
          "strike",
          "option_type",
          "premium",
          "premium_basis",
          "forward",
          "forward_basis",
          "years_to_expiry",
          "log_moneyness",
          "iv_pct",
          "iv_status",
          "delta",
          "gamma",
          "vega",
          "theta"
        ],
        "additionalProperties": false,
        "example": {
          "date": "2026-10-14",
          "exchange": "NSE",
          "expiry": "2026-10-27",
          "strike": 22600,
          "option_type": "CE",
          "premium": 250.25,
          "premium_basis": "traded_close",
          "forward": 22646.1223,
          "forward_basis": "put_call_parity",
          "years_to_expiry": 0.035616,
          "log_moneyness": 0.002039,
          "iv_pct": 13.329,
          "iv_status": "ok",
          "delta": 0.536054,
          "gamma": 0.00069564,
          "vega": 16.936369,
          "theta": -8.637898
        }
      },
      "DerivativeVolatilityItem": {
        "type": "object",
        "properties": {
          "date": {
            "type": "string",
            "description": "Trading session (YYYY-MM-DD)."
          },
          "expiry": {
            "type": "string",
            "description": "Option expiry this row summarises (YYYY-MM-DD)."
          },
          "days_to_expiry": {
            "type": [
              "number",
              "null"
            ],
            "description": "Calendar days from `date` to `expiry`."
          },
          "forward": {
            "type": [
              "number",
              "null"
            ],
            "description": "Forward price of the underlying for this expiry."
          },
          "forward_basis": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "futures",
                  "put_call_parity",
                  "spot_carry"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "How the forward was estimated (see option-analytics)."
          },
          "atm_strike": {
            "type": [
              "number",
              "null"
            ],
            "description": "Listed strike nearest the forward."
          },
          "atm_iv_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "At-the-money implied volatility, annualised percent (average of call and put IV at `atm_strike`)."
          },
          "iv_rank_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "Where today's front-expiry ATM IV sits in its trailing 252-session high-low range, 0-100. Same value on every expiry row of a session."
          },
          "iv_percentile_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "Share of the trailing 252 sessions with a lower front-expiry ATM IV, 0-100. Same value on every expiry row of a session."
          },
          "realised_vol_20d_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "20-session close-to-close realised volatility of the underlying, annualised percent. Index underlyings only; null for stocks."
          },
          "realised_vol_30d_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "30-session realised volatility, annualised percent. Index underlyings only."
          },
          "iv_minus_rv_30d_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "`atm_iv_pct` minus `realised_vol_30d_pct`, percentage points. Index underlyings only."
          },
          "risk_reversal_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "OTM put IV minus OTM call IV, percentage points, using the listed strikes nearest 93% and 107% of the forward (a fixed-moneyness wing, not a delta-matched one). Positive = puts richer."
          },
          "butterfly_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "Average of those two wing IVs minus ATM IV, percentage points (smile curvature)."
          },
          "max_pain_strike": {
            "type": [
              "number",
              "null"
            ],
            "description": "Strike at which the total intrinsic value owed to option holders at expiry is smallest, from session-end open interest."
          },
          "call_open_interest_units": {
            "type": [
              "number",
              "null"
            ],
            "description": "Total call open interest across strikes, in units of the underlying."
          },
          "put_open_interest_units": {
            "type": [
              "number",
              "null"
            ],
            "description": "Total put open interest across strikes, in units of the underlying."
          },
          "put_call_ratio_oi": {
            "type": [
              "number",
              "null"
            ],
            "description": "Put open interest / call open interest. Null when call OI is 0."
          },
          "put_call_ratio_volume": {
            "type": [
              "number",
              "null"
            ],
            "description": "Put volume / call volume. Null when call volume is 0."
          },
          "strikes": {
            "type": [
              "number",
              "null"
            ],
            "description": "Number of strikes that contributed to this summary."
          }
        },
        "required": [
          "date",
          "expiry",
          "days_to_expiry",
          "forward",
          "forward_basis",
          "atm_strike",
          "atm_iv_pct",
          "iv_rank_pct",
          "iv_percentile_pct",
          "realised_vol_20d_pct",
          "realised_vol_30d_pct",
          "iv_minus_rv_30d_pct",
          "risk_reversal_pct",
          "butterfly_pct",
          "max_pain_strike",
          "call_open_interest_units",
          "put_open_interest_units",
          "put_call_ratio_oi",
          "put_call_ratio_volume",
          "strikes"
        ],
        "additionalProperties": false,
        "example": {
          "date": "2026-10-14",
          "expiry": "2026-10-27",
          "days_to_expiry": 13,
          "forward": 22646.1223,
          "forward_basis": "put_call_parity",
          "atm_strike": 22650,
          "atm_iv_pct": 13.2699,
          "iv_rank_pct": 25.31,
          "iv_percentile_pct": 66.01,
          "realised_vol_20d_pct": 14.7519,
          "realised_vol_30d_pct": 12.7489,
          "iv_minus_rv_30d_pct": 0.521,
          "risk_reversal_pct": 3.508,
          "butterfly_pct": 4.9308,
          "max_pain_strike": 23000,
          "call_open_interest_units": 85689955,
          "put_open_interest_units": 79783795,
          "put_call_ratio_oi": 0.9311,
          "put_call_ratio_volume": 0.9023,
          "strikes": 228
        }
      },
      "DerivativeIntradayBarsItem": {
        "type": "object",
        "properties": {
          "ts": {
            "type": "string",
            "description": "Bar start, ISO-8601 UTC (09:15 IST = 03:45Z). Bars cover one minute."
          },
          "exchange": {
            "type": "string",
            "enum": [
              "NSE",
              "BSE"
            ],
            "description": "Listing exchange."
          },
          "instrument": {
            "type": "string",
            "enum": [
              "future",
              "option"
            ],
            "description": "future or option."
          },
          "expiry": {
            "type": "string",
            "description": "Contract expiry (YYYY-MM-DD)."
          },
          "strike": {
            "type": [
              "number",
              "null"
            ],
            "description": "Strike price in INR (index points for index options); null for futures."
          },
          "option_type": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "CE",
                  "PE"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "CE (call) or PE (put); null for futures."
          },
          "open": {
            "type": [
              "number",
              "null"
            ],
            "description": "Open price in INR."
          },
          "high": {
            "type": [
              "number",
              "null"
            ],
            "description": "High price in INR."
          },
          "low": {
            "type": [
              "number",
              "null"
            ],
            "description": "Low price in INR."
          },
          "close": {
            "type": [
              "number",
              "null"
            ],
            "description": "Close price in INR."
          },
          "volume_units": {
            "type": [
              "number",
              "null"
            ],
            "description": "Volume in the minute, in units of the underlying."
          },
          "volume_contracts": {
            "type": [
              "number",
              "null"
            ],
            "description": "Volume in contracts (units / lot size). Null when it does not divide evenly or the lot size is unknown."
          },
          "open_interest_units": {
            "type": [
              "number",
              "null"
            ],
            "description": "Open interest at the end of the minute, in units of the underlying."
          }
        },
        "required": [
          "ts",
          "exchange",
          "instrument",
          "expiry",
          "strike",
          "option_type",
          "open",
          "high",
          "low",
          "close",
          "volume_units",
          "volume_contracts",
          "open_interest_units"
        ],
        "additionalProperties": false,
        "example": {
          "ts": "2026-10-14T09:58:00.000Z",
          "exchange": "NSE",
          "instrument": "option",
          "expiry": "2026-10-27",
          "strike": 22600,
          "option_type": "CE",
          "open": 251.2,
          "high": 252,
          "low": 249.8,
          "close": 250.5,
          "volume_units": 22815,
          "volume_contracts": 351,
          "open_interest_units": 3041740
        }
      },
      "DerivativePositionLimitsItem": {
        "type": "object",
        "properties": {
          "date": {
            "type": "string",
            "description": "Session the figures were computed after (end of day) (YYYY-MM-DD)."
          },
          "symbol": {
            "type": "string",
            "description": "Underlying stock symbol."
          },
          "isin": {
            "type": [
              "string",
              "null"
            ],
            "description": "ISIN of the underlying stock."
          },
          "market_wide_limit_units": {
            "type": [
              "number",
              "null"
            ],
            "description": "Market-wide position limit, in shares."
          },
          "open_interest_units": {
            "type": [
              "number",
              "null"
            ],
            "description": "Combined open interest across all futures and options of the stock, in shares (gross, not delta-adjusted)."
          },
          "future_equivalent_open_interest_units": {
            "type": [
              "number",
              "null"
            ],
            "description": "Delta-weighted (future-equivalent) open interest, in shares; the figure the ban test uses. From 2025-10-01; null earlier."
          },
          "utilisation_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "future_equivalent_open_interest_units / market_wide_limit_units x 100. A stock enters the ban period above 95%. From 2025-10-01; null earlier."
          },
          "headroom_next_session_units": {
            "type": [
              "number",
              "null"
            ],
            "description": "Shares of new future-equivalent positions the market may still add on the next session before the 95% threshold. Null when the stock is in the ban period."
          },
          "ban_next_session": {
            "type": "boolean",
            "description": "True when fresh positions are barred on the NEXT trading session (only position-reducing trades allowed)."
          },
          "applies_to_session": {
            "type": "string",
            "description": "The trading session `ban_next_session` and the headroom apply to (YYYY-MM-DD)."
          },
          "applies_to_session_basis": {
            "type": "string",
            "enum": [
              "published",
              "calendar"
            ],
            "description": "published: the next session for which limits were published. calendar: the newest row, whose next session is projected as the next weekday that is not a full exchange holiday (special weekend sessions are not projected)."
          }
        },
        "required": [
          "date",
          "symbol",
          "isin",
          "market_wide_limit_units",
          "open_interest_units",
          "future_equivalent_open_interest_units",
          "utilisation_pct",
          "headroom_next_session_units",
          "ban_next_session",
          "applies_to_session",
          "applies_to_session_basis"
        ],
        "additionalProperties": false,
        "example": {
          "date": "2026-10-15",
          "symbol": "RELIANCE",
          "isin": "INE002A01018",
          "market_wide_limit_units": 658757301,
          "open_interest_units": 344116500,
          "future_equivalent_open_interest_units": 179202892,
          "utilisation_pct": 27.2,
          "headroom_next_session_units": 446616544,
          "ban_next_session": false,
          "applies_to_session": "2026-10-16",
          "applies_to_session_basis": "calendar"
        }
      },
      "DerivativeBanListItem": {
        "type": "object",
        "properties": {
          "session": {
            "type": "string",
            "description": "Trading session on which fresh positions are barred (YYYY-MM-DD)."
          },
          "symbol": {
            "type": "string",
            "description": "Underlying stock symbol."
          },
          "isin": {
            "type": [
              "string",
              "null"
            ],
            "description": "ISIN of the underlying stock."
          },
          "utilisation_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "Future-equivalent open interest as a percent of the market-wide limit at the previous session's close. From 2025-10-01; null earlier."
          },
          "determined_on": {
            "type": "string",
            "description": "Session whose end-of-day open interest put the stock in the ban period (YYYY-MM-DD)."
          }
        },
        "required": [
          "session",
          "symbol",
          "isin",
          "utilisation_pct",
          "determined_on"
        ],
        "additionalProperties": false,
        "example": {
          "session": "2026-10-16",
          "symbol": "SAIL",
          "isin": "INE114A01011",
          "utilisation_pct": 94.6,
          "determined_on": "2026-10-15"
        }
      },
      "DerivativeExchangeVolatilityItem": {
        "type": "object",
        "properties": {
          "date": {
            "type": "string",
            "description": "Trading session (YYYY-MM-DD)."
          },
          "symbol": {
            "type": "string",
            "description": "Underlying symbol (stock or index)."
          },
          "underlying_close": {
            "type": [
              "number",
              "null"
            ],
            "description": "Underlying closing price in INR / index points. From 2011-03-28; null earlier."
          },
          "underlying_previous_close": {
            "type": [
              "number",
              "null"
            ],
            "description": "Underlying previous closing price. From 2011-03-28; null earlier."
          },
          "underlying_log_return": {
            "type": [
              "number",
              "null"
            ],
            "description": "ln(close / previous close) of the underlying, as a decimal (0.0367 = 3.67%). From 2011-03-28."
          },
          "underlying_daily_vol_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "Exchange daily volatility estimate for the underlying, percent per day. From 2002-03-27."
          },
          "underlying_annual_vol_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "Underlying volatility annualised, percent. From 2002-03-27."
          },
          "futures_close": {
            "type": [
              "number",
              "null"
            ],
            "description": "Near-month futures closing price. From 2011-03-28; null earlier."
          },
          "futures_previous_close": {
            "type": [
              "number",
              "null"
            ],
            "description": "Near-month futures previous close. From 2011-03-28."
          },
          "futures_log_return": {
            "type": [
              "number",
              "null"
            ],
            "description": "ln(close / previous close) of the futures, as a decimal. From 2011-03-28."
          },
          "futures_daily_vol_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "Daily volatility estimate for the futures, percent per day. From 2002-03-27."
          },
          "futures_annual_vol_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "Futures volatility annualised, percent. From 2002-03-27."
          },
          "applicable_daily_vol_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "The exchange's applicable daily volatility (the higher of underlying and futures), percent per day. Available on every row from 2002."
          },
          "applicable_annual_vol_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "Applicable volatility annualised, percent."
          }
        },
        "required": [
          "date",
          "symbol",
          "underlying_close",
          "underlying_previous_close",
          "underlying_log_return",
          "underlying_daily_vol_pct",
          "underlying_annual_vol_pct",
          "futures_close",
          "futures_previous_close",
          "futures_log_return",
          "futures_daily_vol_pct",
          "futures_annual_vol_pct",
          "applicable_daily_vol_pct",
          "applicable_annual_vol_pct"
        ],
        "additionalProperties": false,
        "example": {
          "date": "2026-10-15",
          "symbol": "RELIANCE",
          "underlying_close": 1218.47,
          "underlying_previous_close": 1174.61,
          "underlying_log_return": 0.0366598,
          "underlying_daily_vol_pct": 1.3594,
          "underlying_annual_vol_pct": 25.9719,
          "futures_close": 1212.8,
          "futures_previous_close": 1182.2,
          "futures_log_return": 0.02555463,
          "futures_daily_vol_pct": 1.3034,
          "futures_annual_vol_pct": 24.9009,
          "applicable_daily_vol_pct": 1.3594,
          "applicable_annual_vol_pct": 25.9719
        }
      },
      "LiveQuotesItem": {
        "type": "object",
        "properties": {
          "symbol": {
            "type": "string",
            "description": "Resolved stock symbol."
          },
          "requested": {
            "type": "string",
            "description": "The symbol as you passed it (batch rows are positional and 1:1 with `symbols`)."
          },
          "found": {
            "type": "boolean",
            "description": "false when the symbol is not a listed stock; every price field is then null."
          },
          "name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Company name."
          },
          "ltp": {
            "type": [
              "number",
              "null"
            ],
            "description": "Last traded price, INR."
          },
          "change": {
            "type": [
              "number",
              "null"
            ],
            "description": "Change versus the previous close, INR."
          },
          "change_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "Change versus the previous close, percent (1.5 = 1.5%)."
          },
          "open": {
            "type": [
              "number",
              "null"
            ],
            "description": "Session open, INR."
          },
          "high": {
            "type": [
              "number",
              "null"
            ],
            "description": "Session high, INR."
          },
          "low": {
            "type": [
              "number",
              "null"
            ],
            "description": "Session low, INR."
          },
          "prev_close": {
            "type": [
              "number",
              "null"
            ],
            "description": "Previous session close, INR."
          },
          "volume": {
            "type": [
              "number",
              "null"
            ],
            "description": "Shares traded so far this session."
          },
          "last_trade_at": {
            "type": [
              "string",
              "null"
            ],
            "description": "Time of the last trade behind this quote (ISO-8601 UTC); null when the feed did not stamp it."
          },
          "market_status": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "open",
                  "pre_open",
                  "closed",
                  "holiday"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "Exchange status when the quote was served. `closed`/`holiday` quotes are the last session's close."
          }
        },
        "required": [
          "symbol",
          "requested",
          "found",
          "name",
          "ltp",
          "change",
          "change_pct",
          "open",
          "high",
          "low",
          "prev_close",
          "volume",
          "last_trade_at",
          "market_status"
        ],
        "additionalProperties": false,
        "example": {
          "symbol": "TCS",
          "requested": "tcs",
          "found": true,
          "name": "Tata Consultancy Services Ltd",
          "ltp": 2433.1,
          "change": 83.1,
          "change_pct": 3.54,
          "open": 2382,
          "high": 2446,
          "low": 2375.7,
          "prev_close": 2350,
          "volume": 4952652,
          "last_trade_at": "2026-10-16T05:50:46Z",
          "market_status": "open"
        }
      },
      "LiveQuote": {
        "type": "object",
        "properties": {
          "symbol": {
            "type": "string",
            "description": "Resolved stock symbol."
          },
          "requested": {
            "type": "string",
            "description": "The symbol as you passed it (batch rows are positional and 1:1 with `symbols`)."
          },
          "found": {
            "type": "boolean",
            "description": "false when the symbol is not a listed stock; every price field is then null."
          },
          "name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Company name."
          },
          "ltp": {
            "type": [
              "number",
              "null"
            ],
            "description": "Last traded price, INR."
          },
          "change": {
            "type": [
              "number",
              "null"
            ],
            "description": "Change versus the previous close, INR."
          },
          "change_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "Change versus the previous close, percent (1.5 = 1.5%)."
          },
          "open": {
            "type": [
              "number",
              "null"
            ],
            "description": "Session open, INR."
          },
          "high": {
            "type": [
              "number",
              "null"
            ],
            "description": "Session high, INR."
          },
          "low": {
            "type": [
              "number",
              "null"
            ],
            "description": "Session low, INR."
          },
          "prev_close": {
            "type": [
              "number",
              "null"
            ],
            "description": "Previous session close, INR."
          },
          "volume": {
            "type": [
              "number",
              "null"
            ],
            "description": "Shares traded so far this session."
          },
          "last_trade_at": {
            "type": [
              "string",
              "null"
            ],
            "description": "Time of the last trade behind this quote (ISO-8601 UTC); null when the feed did not stamp it."
          },
          "market_status": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "open",
                  "pre_open",
                  "closed",
                  "holiday"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "Exchange status when the quote was served. `closed`/`holiday` quotes are the last session's close."
          },
          "market_cap_cr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Market capitalisation at this price, INR crore."
          },
          "pe_ttm": {
            "type": [
              "number",
              "null"
            ],
            "description": "Price to trailing-twelve-month earnings."
          },
          "high_52w": {
            "type": [
              "number",
              "null"
            ],
            "description": "52-week high, INR."
          },
          "low_52w": {
            "type": [
              "number",
              "null"
            ],
            "description": "52-week low, INR."
          }
        },
        "required": [
          "symbol",
          "requested",
          "found",
          "name",
          "ltp",
          "change",
          "change_pct",
          "open",
          "high",
          "low",
          "prev_close",
          "volume",
          "last_trade_at",
          "market_status",
          "market_cap_cr",
          "pe_ttm",
          "high_52w",
          "low_52w"
        ],
        "additionalProperties": false,
        "example": {
          "symbol": "TCS",
          "requested": "TCS",
          "found": true,
          "name": "Tata Consultancy Services Ltd",
          "ltp": 2433.1,
          "change": 83.1,
          "change_pct": 3.54,
          "open": 2382,
          "high": 2446,
          "low": 2375.7,
          "prev_close": 2350,
          "volume": 4952652,
          "last_trade_at": "2026-10-16T05:50:46Z",
          "market_status": "open",
          "market_cap_cr": 880316.87,
          "pe_ttm": 17.68,
          "high_52w": 3350,
          "low_52w": 1976.8
        }
      },
      "MarketStatus": {
        "type": "object",
        "properties": {
          "status": {
            "type": "string",
            "enum": [
              "open",
              "pre_open",
              "closed",
              "holiday"
            ],
            "description": "Current NSE equity session state."
          },
          "date": {
            "type": "string",
            "description": "Today's trading date (IST) (YYYY-MM-DD)."
          },
          "is_trading_day": {
            "type": "boolean",
            "description": "Whether the exchange holds a session today."
          },
          "holiday_name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Name of today's holiday when `status` is `holiday`."
          },
          "session": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "type": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "regular, muhurat or special."
                  },
                  "pre_open": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Pre-open start, HH:MM IST."
                  },
                  "open": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Session open, HH:MM IST."
                  },
                  "close": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Session close, HH:MM IST."
                  }
                },
                "required": [
                  "type",
                  "pre_open",
                  "open",
                  "close"
                ],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ],
            "description": "Today's session hours; null on a non-trading day."
          },
          "next_status": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "open",
                  "pre_open",
                  "closed",
                  "holiday"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "The state the market enters next."
          },
          "next_transition_at": {
            "type": [
              "string",
              "null"
            ],
            "description": "When `next_status` begins (ISO-8601 UTC). Re-fetch then rather than deriving the state from a clock."
          },
          "server_time": {
            "type": "string",
            "description": "Server time the status was computed at (ISO-8601 UTC)."
          }
        },
        "required": [
          "status",
          "date",
          "is_trading_day",
          "holiday_name",
          "session",
          "next_status",
          "next_transition_at",
          "server_time"
        ],
        "additionalProperties": false,
        "example": {
          "status": "open",
          "date": "2026-10-16",
          "is_trading_day": true,
          "holiday_name": null,
          "session": {
            "type": "regular",
            "pre_open": "09:00",
            "open": "09:15",
            "close": "15:30"
          },
          "next_status": "closed",
          "next_transition_at": "2026-10-16T10:00:00Z",
          "server_time": "2026-10-16T05:50:59Z"
        }
      },
      "HeatmapIndicesItem": {
        "type": "object",
        "properties": {
          "slug": {
            "type": "string",
            "description": "Path value for `/v1/market/heatmap/{index_slug}` and `universe` on movers."
          },
          "name": {
            "type": "string",
            "description": "Index name."
          },
          "group": {
            "type": "string",
            "description": "Broad Market, Midcap, Smallcap, Sectoral or Thematic."
          },
          "exchange": {
            "type": "string",
            "enum": [
              "NSE",
              "BSE"
            ],
            "description": "Exchange that computes the index; constituent prices are from it."
          }
        },
        "required": [
          "slug",
          "name",
          "group",
          "exchange"
        ],
        "additionalProperties": false,
        "example": {
          "slug": "nifty-50",
          "name": "Nifty 50",
          "group": "Broad Market",
          "exchange": "NSE"
        }
      },
      "IndexHeatmapItem": {
        "type": "object",
        "properties": {
          "rank": {
            "type": "integer",
            "description": "Position in the requested sort order (1 = first)."
          },
          "symbol": {
            "type": "string",
            "description": "Stock symbol."
          },
          "name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Company name."
          },
          "isin": {
            "type": [
              "string",
              "null"
            ],
            "description": "ISIN."
          },
          "exchange": {
            "type": "string",
            "enum": [
              "NSE",
              "BSE"
            ],
            "description": "Exchange the price and returns are from: the exchange that computes the index (BSE for Sensex, NSE otherwise)."
          },
          "sector": {
            "type": [
              "string",
              "null"
            ],
            "description": "Sector classification."
          },
          "ltp": {
            "type": [
              "number",
              "null"
            ],
            "description": "Last traded price, INR."
          },
          "change_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "Change today, percent."
          },
          "change_pct_1w": {
            "type": [
              "number",
              "null"
            ],
            "description": "Change over 1 week, percent."
          },
          "change_pct_1m": {
            "type": [
              "number",
              "null"
            ],
            "description": "Change over 1 month, percent."
          },
          "change_pct_3m": {
            "type": [
              "number",
              "null"
            ],
            "description": "Change over 3 months, percent."
          },
          "change_pct_6m": {
            "type": [
              "number",
              "null"
            ],
            "description": "Change over 6 months, percent."
          },
          "change_pct_1y": {
            "type": [
              "number",
              "null"
            ],
            "description": "Change over 1 year, percent."
          },
          "volume": {
            "type": [
              "number",
              "null"
            ],
            "description": "Shares traded today."
          },
          "traded_value_cr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Approximate traded value today (volume x last price), INR crore."
          },
          "market_cap_cr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Market capitalisation, INR crore."
          },
          "pe": {
            "type": [
              "number",
              "null"
            ],
            "description": "Price to earnings; null when not published or not meaningful."
          },
          "session_date": {
            "type": [
              "string",
              "null"
            ],
            "description": "Trading date the prices describe (YYYY-MM-DD, IST)."
          }
        },
        "required": [
          "rank",
          "symbol",
          "name",
          "isin",
          "exchange",
          "sector",
          "ltp",
          "change_pct",
          "change_pct_1w",
          "change_pct_1m",
          "change_pct_3m",
          "change_pct_6m",
          "change_pct_1y",
          "volume",
          "traded_value_cr",
          "market_cap_cr",
          "pe",
          "session_date"
        ],
        "additionalProperties": false,
        "example": {
          "rank": 1,
          "symbol": "RELIANCE",
          "name": "Reliance Industries",
          "isin": "INE002A01018",
          "exchange": "NSE",
          "sector": "Energy",
          "ltp": 1208.4,
          "change_pct": -0.54,
          "change_pct_1w": 2.58,
          "change_pct_1m": -2.18,
          "change_pct_3m": -6.72,
          "change_pct_6m": -10.1,
          "change_pct_1y": -12.07,
          "volume": 6708778,
          "traded_value_cr": 810.69,
          "market_cap_cr": 1635271.98,
          "pe": 18.78,
          "session_date": "2026-10-16"
        }
      },
      "MarketMoversItem": {
        "type": "object",
        "properties": {
          "rank": {
            "type": "integer",
            "description": "Position in the requested sort order (1 = first)."
          },
          "symbol": {
            "type": "string",
            "description": "Stock symbol."
          },
          "name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Company name."
          },
          "isin": {
            "type": [
              "string",
              "null"
            ],
            "description": "ISIN."
          },
          "exchange": {
            "type": "string",
            "enum": [
              "NSE",
              "BSE"
            ],
            "description": "Exchange the price and returns are from: the exchange that computes the index (BSE for Sensex, NSE otherwise)."
          },
          "sector": {
            "type": [
              "string",
              "null"
            ],
            "description": "Sector classification."
          },
          "ltp": {
            "type": [
              "number",
              "null"
            ],
            "description": "Last traded price, INR."
          },
          "change_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "Change today, percent."
          },
          "change_pct_1w": {
            "type": [
              "number",
              "null"
            ],
            "description": "Change over 1 week, percent."
          },
          "change_pct_1m": {
            "type": [
              "number",
              "null"
            ],
            "description": "Change over 1 month, percent."
          },
          "change_pct_3m": {
            "type": [
              "number",
              "null"
            ],
            "description": "Change over 3 months, percent."
          },
          "change_pct_6m": {
            "type": [
              "number",
              "null"
            ],
            "description": "Change over 6 months, percent."
          },
          "change_pct_1y": {
            "type": [
              "number",
              "null"
            ],
            "description": "Change over 1 year, percent."
          },
          "volume": {
            "type": [
              "number",
              "null"
            ],
            "description": "Shares traded today."
          },
          "traded_value_cr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Approximate traded value today (volume x last price), INR crore."
          },
          "market_cap_cr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Market capitalisation, INR crore."
          },
          "pe": {
            "type": [
              "number",
              "null"
            ],
            "description": "Price to earnings; null when not published or not meaningful."
          },
          "session_date": {
            "type": [
              "string",
              "null"
            ],
            "description": "Trading date the prices describe (YYYY-MM-DD, IST)."
          }
        },
        "required": [
          "rank",
          "symbol",
          "name",
          "isin",
          "exchange",
          "sector",
          "ltp",
          "change_pct",
          "change_pct_1w",
          "change_pct_1m",
          "change_pct_3m",
          "change_pct_6m",
          "change_pct_1y",
          "volume",
          "traded_value_cr",
          "market_cap_cr",
          "pe",
          "session_date"
        ],
        "additionalProperties": false,
        "example": {
          "rank": 1,
          "symbol": "RELIANCE",
          "name": "Reliance Industries",
          "isin": "INE002A01018",
          "exchange": "NSE",
          "sector": "Energy",
          "ltp": 1208.4,
          "change_pct": 6.21,
          "change_pct_1w": 2.58,
          "change_pct_1m": -2.18,
          "change_pct_3m": -6.72,
          "change_pct_6m": -10.1,
          "change_pct_1y": -12.07,
          "volume": 6708778,
          "traded_value_cr": 810.69,
          "market_cap_cr": 1635271.98,
          "pe": 18.78,
          "session_date": "2026-10-16"
        }
      },
      "ScreenFundamentalItem": {
        "type": "object",
        "properties": {
          "rank": {
            "type": "integer",
            "description": "Position in the result set, continuous across pages."
          },
          "symbol": {
            "type": "string",
            "description": "Stock symbol."
          },
          "name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Company name."
          },
          "ltp": {
            "type": [
              "number",
              "null"
            ],
            "description": "Current price, INR."
          },
          "pe": {
            "type": [
              "number",
              "null"
            ],
            "description": "Price to earnings."
          },
          "market_cap_cr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Market capitalisation, INR crore."
          },
          "dividend_yield_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "Dividend yield, percent."
          },
          "net_profit_qtr_cr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Latest quarter net profit, INR crore."
          },
          "profit_growth_qtr_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "Latest quarter net profit change year on year, percent."
          },
          "sales_qtr_cr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Latest quarter sales, INR crore."
          },
          "sales_growth_qtr_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "Latest quarter sales change year on year, percent."
          },
          "roce_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "Return on capital employed, percent."
          },
          "roe_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "Return on equity, percent."
          },
          "sort_value": {
            "type": [
              "number",
              "null"
            ],
            "description": "Value of the `sort` ratio for this row when a sort was given; otherwise null."
          },
          "ratio_values": {
            "type": "object",
            "additionalProperties": {
              "type": [
                "number",
                "null"
              ]
            },
            "description": "Value of every ratio named in the query or as `sort`, keyed by its catalogue name (e.g. `Pledged percentage`). Null when the value is not published for this company, or when the column holding the ratio cannot be identified for this query."
          }
        },
        "required": [
          "rank",
          "symbol",
          "name",
          "ltp",
          "pe",
          "market_cap_cr",
          "dividend_yield_pct",
          "net_profit_qtr_cr",
          "profit_growth_qtr_pct",
          "sales_qtr_cr",
          "sales_growth_qtr_pct",
          "roce_pct",
          "roe_pct",
          "sort_value",
          "ratio_values"
        ],
        "additionalProperties": false,
        "example": {
          "rank": 1,
          "symbol": "TCS",
          "name": "TCS",
          "ltp": 2433.1,
          "pe": 17.68,
          "market_cap_cr": 880316.87,
          "dividend_yield_pct": 4.1,
          "net_profit_qtr_cr": 12760,
          "profit_growth_qtr_pct": 1.4,
          "sales_qtr_cr": 65799,
          "sales_growth_qtr_pct": 2.4,
          "roce_pct": 64.6,
          "roe_pct": 52.4,
          "sort_value": null,
          "ratio_values": {
            "Market Capitalization": 880316.87,
            "Return on capital employed": 64.6
          }
        }
      },
      "ScreenFundamentalMeta": {
        "type": "object",
        "properties": {
          "total_matches": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Companies matching the query across every page, or null when the count is not available. A company with no public symbol is left out of the pages, so walking every page can return a few fewer rows than this."
          }
        },
        "required": [
          "total_matches"
        ],
        "additionalProperties": false
      },
      "FundamentalScreenFieldsItem": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Exact ratio name to use in a screen query."
          },
          "unit": {
            "type": [
              "string",
              "null"
            ],
            "description": "Unit: `INR crore`, `INR`, `%`, `crore` (counts) or null for a ratio/score."
          },
          "category": {
            "type": [
              "string",
              "null"
            ],
            "description": "Grouping such as Price & Valuation, Profitability, Growth, Shareholding."
          },
          "definition": {
            "type": [
              "string",
              "null"
            ],
            "description": "What the ratio measures."
          }
        },
        "required": [
          "name",
          "unit",
          "category",
          "definition"
        ],
        "additionalProperties": false,
        "example": {
          "name": "Return on capital employed",
          "unit": "%",
          "category": "Returns",
          "definition": "EBIT / capital employed for the latest financial year."
        }
      },
      "ScreenTechnicalItem": {
        "type": "object",
        "properties": {
          "rank": {
            "type": "integer",
            "description": "Position in the ranked result set."
          },
          "symbol": {
            "type": "string",
            "description": "NSE symbol."
          },
          "name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Company name."
          },
          "close": {
            "type": [
              "number",
              "null"
            ],
            "description": "Last price, INR."
          },
          "change_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "Change today, percent."
          },
          "volume": {
            "type": [
              "number",
              "null"
            ],
            "description": "Shares traded today."
          },
          "market_cap_cr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Market capitalisation, INR crore."
          },
          "rsi_14": {
            "type": [
              "number",
              "null"
            ],
            "description": "14-day RSI."
          },
          "macd": {
            "type": [
              "number",
              "null"
            ],
            "description": "MACD line."
          },
          "macd_signal": {
            "type": [
              "number",
              "null"
            ],
            "description": "MACD signal line."
          },
          "sma_50": {
            "type": [
              "number",
              "null"
            ],
            "description": "50-day simple moving average, INR."
          },
          "sma_200": {
            "type": [
              "number",
              "null"
            ],
            "description": "200-day simple moving average, INR."
          },
          "relative_volume_10d": {
            "type": [
              "number",
              "null"
            ],
            "description": "Today's volume as a multiple of the 10-day average."
          },
          "perf_1m_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "1-month return, percent."
          },
          "pe_ttm": {
            "type": [
              "number",
              "null"
            ],
            "description": "Price to trailing twelve-month earnings."
          },
          "pb": {
            "type": [
              "number",
              "null"
            ],
            "description": "Price to book value."
          },
          "dividend_yield_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "Trailing dividend yield, percent."
          },
          "extra": {
            "type": "object",
            "additionalProperties": {
              "type": [
                "number",
                "null"
              ]
            },
            "description": "Values of the fields requested with `fields` (beyond the fixed ones above), keyed by field name. Empty when `fields` was not given. Null when the value is not published for this stock."
          }
        },
        "required": [
          "rank",
          "symbol",
          "name",
          "close",
          "change_pct",
          "volume",
          "market_cap_cr",
          "rsi_14",
          "macd",
          "macd_signal",
          "sma_50",
          "sma_200",
          "relative_volume_10d",
          "perf_1m_pct",
          "pe_ttm",
          "pb",
          "dividend_yield_pct",
          "extra"
        ],
        "additionalProperties": false,
        "example": {
          "rank": 1,
          "symbol": "DMART",
          "name": "Avenue Supermarts Ltd.",
          "close": 3343.4,
          "change_pct": -1.04,
          "volume": 279431,
          "market_cap_cr": 222460.38,
          "rsi_14": 28.72,
          "macd": -117.09,
          "macd_signal": -86.6,
          "sma_50": 3774.39,
          "sma_200": 3979.02,
          "relative_volume_10d": 0.28,
          "perf_1m_pct": -9.12,
          "pe_ttm": 73.1,
          "pb": 11.2,
          "dividend_yield_pct": null,
          "extra": {
            "rating_overall": -0.4727,
            "high_52w": 4950
          }
        }
      },
      "ScreenTechnicalMeta": {
        "type": "object",
        "properties": {
          "total_matches": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Stocks matching every filter, or null when the count is not available. Only the first `limit` are returned."
          }
        },
        "required": [
          "total_matches"
        ],
        "additionalProperties": false
      },
      "TechnicalScreenFieldsItem": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Field name for filter, sort and fields."
          },
          "definition": {
            "type": "string",
            "description": "What it measures and its unit."
          }
        },
        "required": [
          "name",
          "definition"
        ],
        "additionalProperties": false,
        "example": {
          "name": "rsi_14",
          "definition": "14-day RSI"
        }
      },
      "MarketDealsItem": {
        "type": "object",
        "properties": {
          "date": {
            "type": "string",
            "description": "Trading day of the deal (IST) (YYYY-MM-DD)."
          },
          "deal_type": {
            "type": "string",
            "enum": [
              "bulk",
              "block"
            ],
            "description": "bulk = reported bulk deal; block = block-window trade."
          },
          "exchange": {
            "type": [
              "string",
              "null"
            ],
            "description": "NSE or BSE."
          },
          "symbol": {
            "type": "string",
            "description": "Stock symbol."
          },
          "name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Company name."
          },
          "isin": {
            "type": [
              "string",
              "null"
            ],
            "description": "ISIN."
          },
          "client_name": {
            "type": "string",
            "description": "Counterparty as published by the exchange."
          },
          "side": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "buy",
                  "sell"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "buy or sell from the client's view."
          },
          "quantity": {
            "type": "number",
            "description": "Shares traded."
          },
          "price": {
            "type": [
              "number",
              "null"
            ],
            "description": "Average trade price, INR per share."
          },
          "value_cr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Trade value (quantity x price), INR crore."
          }
        },
        "required": [
          "date",
          "deal_type",
          "exchange",
          "symbol",
          "name",
          "isin",
          "client_name",
          "side",
          "quantity",
          "price",
          "value_cr"
        ],
        "additionalProperties": false,
        "example": {
          "date": "2026-10-15",
          "deal_type": "block",
          "exchange": "NSE",
          "symbol": "ETERNAL",
          "name": "Eternal Ltd",
          "isin": "INE758T01015",
          "client_name": "GOLDMAN SACHS BANK EUROPE SE ODI",
          "side": "sell",
          "quantity": 5337584,
          "price": 316,
          "value_cr": 168.67
        }
      },
      "MarketDealsMeta": {
        "type": "object",
        "properties": {
          "from": {
            "type": "string",
            "description": "First day of the window served (YYYY-MM-DD)."
          },
          "to": {
            "type": "string",
            "description": "Last day of the window served (YYYY-MM-DD)."
          },
          "total_deals": {
            "type": "integer",
            "description": "Deals matching every filter over the whole window (all pages), after duplicate reports are collapsed."
          },
          "deals_per_day": {
            "type": "object",
            "additionalProperties": {
              "type": "integer"
            },
            "description": "Matching deals per trading day (YYYY-MM-DD -> count), newest first; days with none are absent."
          },
          "latest_date": {
            "type": [
              "string",
              "null"
            ],
            "description": "Newest day in the window with any reported deal (any type, side or exchange); null when the window has none."
          },
          "exchanges_covered": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "NSE",
                "BSE"
              ]
            },
            "description": "Exchanges with at least one reported deal in the window (any type or side)."
          }
        },
        "required": [
          "from",
          "to",
          "total_deals",
          "deals_per_day",
          "latest_date",
          "exchanges_covered"
        ],
        "additionalProperties": false
      },
      "FnoBanItem": {
        "type": "object",
        "properties": {
          "symbol": {
            "type": "string",
            "description": "Stock symbol."
          },
          "name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Company name."
          },
          "isin": {
            "type": [
              "string",
              "null"
            ],
            "description": "ISIN."
          },
          "status": {
            "anyOf": [
              {
                "type": "string",
                "enum": [
                  "in_ban",
                  "near_ban"
                ]
              },
              {
                "type": "null"
              }
            ],
            "description": "in_ban = on the exchange's published ban list for `ban_list_date`; near_ban = not banned but open interest is at or above 80% of the market-wide position limit. null = unknown: the published list is stale or unavailable (`meta.ban_list_stale`), so a ban can be neither confirmed nor ruled out."
          },
          "ban_since": {
            "type": [
              "string",
              "null"
            ],
            "description": "First trading day of the current consecutive ban (in_ban rows only)."
          },
          "mwpl_utilisation_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "Futures-equivalent open interest as % of the market-wide position limit on `mwpl_date`."
          },
          "prev_mwpl_utilisation_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "The same figure for the previous trading day."
          },
          "ltp": {
            "type": [
              "number",
              "null"
            ],
            "description": "Last close, INR."
          },
          "change_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "Day change at that close, percent."
          },
          "high_52w": {
            "type": [
              "number",
              "null"
            ],
            "description": "52-week high, INR."
          },
          "low_52w": {
            "type": [
              "number",
              "null"
            ],
            "description": "52-week low, INR."
          },
          "ban_list_date": {
            "type": [
              "string",
              "null"
            ],
            "description": "Trading day the published ban list is for; null when the list is stale or unavailable (then `status` is null too)."
          },
          "mwpl_date": {
            "type": [
              "string",
              "null"
            ],
            "description": "Trading day the position-limit figures are for."
          }
        },
        "required": [
          "symbol",
          "name",
          "isin",
          "status",
          "ban_since",
          "mwpl_utilisation_pct",
          "prev_mwpl_utilisation_pct",
          "ltp",
          "change_pct",
          "high_52w",
          "low_52w",
          "ban_list_date",
          "mwpl_date"
        ],
        "additionalProperties": false,
        "example": {
          "symbol": "SAIL",
          "name": "Steel Authority of India Ltd",
          "isin": "INE114A01011",
          "status": "in_ban",
          "ban_since": "2026-10-15",
          "mwpl_utilisation_pct": 94.6,
          "prev_mwpl_utilisation_pct": 95.01,
          "ltp": 170,
          "change_pct": -1.6,
          "high_52w": 156.5,
          "low_52w": 99.15,
          "ban_list_date": "2026-10-15",
          "mwpl_date": "2026-10-15"
        }
      },
      "FnoBanMeta": {
        "type": "object",
        "properties": {
          "mwpl_date": {
            "type": [
              "string",
              "null"
            ],
            "description": "Trading day the position-limit figures are for; null when none is published."
          },
          "ban_list_date": {
            "type": [
              "string",
              "null"
            ],
            "description": "Trading day of the newest published ban list, even when it is stale; null when none is available."
          },
          "ban_list_stale": {
            "type": "boolean",
            "description": "true when the newest published ban list is older than 4 days or unavailable. Rows are then only the securities at or above 80% of the position limit, all with status null; no ban is inferred from utilisation."
          },
          "stale_ban_list": {
            "anyOf": [
              {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              {
                "type": "null"
              }
            ],
            "description": "When `ban_list_stale` is true: the symbols on that old list, for reference only (not a current ban). null otherwise."
          }
        },
        "required": [
          "mwpl_date",
          "ban_list_date",
          "ban_list_stale",
          "stale_ban_list"
        ],
        "additionalProperties": false
      },
      "TopDeliveriesItem": {
        "type": "object",
        "properties": {
          "symbol": {
            "type": "string",
            "description": "NSE symbol."
          },
          "name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Company name."
          },
          "isin": {
            "type": [
              "string",
              "null"
            ],
            "description": "ISIN."
          },
          "sector": {
            "type": [
              "string",
              "null"
            ],
            "description": "Sector."
          },
          "session_date": {
            "type": "string",
            "description": "Trading day the delivery figures are for (YYYY-MM-DD)."
          },
          "delivery_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "Shares delivered as % of shares traded."
          },
          "traded_qty": {
            "type": [
              "number",
              "null"
            ],
            "description": "Shares traded."
          },
          "delivered_qty": {
            "type": [
              "number",
              "null"
            ],
            "description": "Shares delivered (traded_qty x delivery_pct)."
          },
          "traded_value_cr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Traded value (volume x close), INR crore."
          },
          "ltp": {
            "type": [
              "number",
              "null"
            ],
            "description": "Close, INR."
          },
          "change_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "Day change at that close, percent."
          },
          "high_52w": {
            "type": [
              "number",
              "null"
            ],
            "description": "52-week high, INR."
          },
          "low_52w": {
            "type": [
              "number",
              "null"
            ],
            "description": "52-week low, INR."
          }
        },
        "required": [
          "symbol",
          "name",
          "isin",
          "sector",
          "session_date",
          "delivery_pct",
          "traded_qty",
          "delivered_qty",
          "traded_value_cr",
          "ltp",
          "change_pct",
          "high_52w",
          "low_52w"
        ],
        "additionalProperties": false,
        "example": {
          "symbol": "NXT-INFRA",
          "name": "Nxt-Infra Trust",
          "isin": "INE0SF023016",
          "sector": "Industrials",
          "session_date": "2026-10-14",
          "delivery_pct": 100,
          "traded_qty": 1550000,
          "delivered_qty": 1550000,
          "traded_value_cr": 15.11,
          "ltp": 97.5,
          "change_pct": -0.51,
          "high_52w": 104,
          "low_52w": 95.2
        }
      },
      "TopDeliveriesMeta": {
        "type": "object",
        "properties": {
          "session_date": {
            "type": [
              "string",
              "null"
            ],
            "description": "Trading day the delivery figures are for; null when no recent session has delivery data."
          },
          "total_stocks": {
            "type": "integer",
            "description": "Stocks matching the filters on that session (all pages)."
          }
        },
        "required": [
          "session_date",
          "total_stocks"
        ],
        "additionalProperties": false
      },
      "MarginFundingItem": {
        "type": "object",
        "properties": {
          "symbol": {
            "type": "string",
            "description": "Stock symbol."
          },
          "name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Company name."
          },
          "isin": {
            "type": "string",
            "description": "ISIN."
          },
          "session_date": {
            "type": "string",
            "description": "Session the funded book is for (YYYY-MM-DD)."
          },
          "previous_session_date": {
            "type": [
              "string",
              "null"
            ],
            "description": "Session the `*_change` fields compare against."
          },
          "funded_qty": {
            "type": [
              "number",
              "null"
            ],
            "description": "Shares funded under margin trading."
          },
          "funded_value_cr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Funded amount, INR crore."
          },
          "funded_qty_change": {
            "type": [
              "number",
              "null"
            ],
            "description": "Change in funded shares versus the previous session."
          },
          "funded_value_change_cr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Change in funded amount versus the previous session, INR crore."
          },
          "ltp": {
            "type": [
              "number",
              "null"
            ],
            "description": "Close on the session, INR."
          },
          "change_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "Day change at that close, percent."
          }
        },
        "required": [
          "symbol",
          "name",
          "isin",
          "session_date",
          "previous_session_date",
          "funded_qty",
          "funded_value_cr",
          "funded_qty_change",
          "funded_value_change_cr",
          "ltp",
          "change_pct"
        ],
        "additionalProperties": false,
        "example": {
          "symbol": "HDFCBANK",
          "name": "HDFC Bank Ltd",
          "isin": "INE040A01034",
          "session_date": "2026-10-15",
          "previous_session_date": "2026-10-14",
          "funded_qty": 39617737,
          "funded_value_cr": 3047.89,
          "funded_qty_change": -1157076,
          "funded_value_change_cr": -82.53,
          "ltp": 731.15,
          "change_pct": 0.59
        }
      },
      "MarginFundingMeta": {
        "type": "object",
        "properties": {
          "session_date": {
            "type": [
              "string",
              "null"
            ],
            "description": "Session the funded book is for; null when none is published."
          },
          "previous_session_date": {
            "type": [
              "string",
              "null"
            ],
            "description": "Session the `*_change` figures compare against."
          },
          "total_stocks": {
            "type": "integer",
            "description": "Stocks covered on the session (all pages)."
          },
          "top_funded": {
            "type": "object",
            "properties": {
              "stocks": {
                "type": "integer",
                "description": "Stocks the totals cover (the most-funded stocks only, not the whole market book)."
              },
              "funded_value_cr": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Total funded amount over those stocks, INR crore."
              },
              "funded_value_change_cr": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Change in that total versus the previous session's covered stocks, INR crore."
              }
            },
            "required": [
              "stocks",
              "funded_value_cr",
              "funded_value_change_cr"
            ],
            "additionalProperties": false,
            "description": "Totals over the covered most-funded stocks."
          }
        },
        "required": [
          "session_date",
          "previous_session_date",
          "total_stocks",
          "top_funded"
        ],
        "additionalProperties": false
      },
      "SecuritiesLendingItem": {
        "type": "object",
        "properties": {
          "symbol": {
            "type": "string",
            "description": "Stock symbol."
          },
          "name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Company name."
          },
          "isin": {
            "type": "string",
            "description": "ISIN."
          },
          "session_date": {
            "type": "string",
            "description": "Session the lending activity is for (YYYY-MM-DD)."
          },
          "lending_yield_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "Lending fee at the last trade as % of the stock price. Higher = stronger borrowing (short-selling) demand."
          },
          "traded_qty": {
            "type": [
              "number",
              "null"
            ],
            "description": "Shares traded in the lending segment."
          },
          "ltp": {
            "type": [
              "number",
              "null"
            ],
            "description": "Stock close, INR."
          }
        },
        "required": [
          "symbol",
          "name",
          "isin",
          "session_date",
          "lending_yield_pct",
          "traded_qty",
          "ltp"
        ],
        "additionalProperties": false,
        "example": {
          "symbol": "IREDA",
          "name": "Indian Renewable Energy Development Agency Ltd",
          "isin": "INE202E01016",
          "session_date": "2026-10-15",
          "lending_yield_pct": 0.2148,
          "traded_qty": 2931587,
          "ltp": 108.47
        }
      },
      "SecuritiesLendingMeta": {
        "type": "object",
        "properties": {
          "session_date": {
            "type": [
              "string",
              "null"
            ],
            "description": "Session the lending activity is for; null when none is published."
          },
          "total_stocks": {
            "type": "integer",
            "description": "Stocks that traded in the lending segment on the session (all pages)."
          }
        },
        "required": [
          "session_date",
          "total_stocks"
        ],
        "additionalProperties": false
      },
      "MarketSignalsItem": {
        "type": "object",
        "properties": {
          "symbol": {
            "type": "string",
            "description": "NSE symbol."
          },
          "name": {
            "type": [
              "string",
              "null"
            ],
            "description": "Company name."
          },
          "sector": {
            "type": [
              "string",
              "null"
            ],
            "description": "Sector."
          },
          "session_date": {
            "type": "string",
            "description": "Session the indicators were computed on (YYYY-MM-DD)."
          },
          "signals": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "near_52w_high",
                "near_52w_low",
                "rsi_overbought",
                "rsi_oversold",
                "macd_bullish",
                "volume_spike",
                "above_200_sma",
                "below_200_sma"
              ]
            },
            "description": "Every signal firing for this stock (among those requested). See /v1/market/signals/definitions."
          },
          "ltp": {
            "type": [
              "number",
              "null"
            ],
            "description": "Close, INR."
          },
          "change_1w_pct": {
            "type": [
              "number",
              "null"
            ],
            "description": "1-week change, percent."
          },
          "volume": {
            "type": [
              "number",
              "null"
            ],
            "description": "Session volume, shares."
          },
          "relative_volume": {
            "type": [
              "number",
              "null"
            ],
            "description": "Session volume / 1-month average."
          },
          "rsi_14": {
            "type": [
              "number",
              "null"
            ],
            "description": "14-day RSI."
          },
          "high_52w": {
            "type": [
              "number",
              "null"
            ],
            "description": "52-week high, INR."
          },
          "low_52w": {
            "type": [
              "number",
              "null"
            ],
            "description": "52-week low, INR."
          },
          "market_cap_cr": {
            "type": [
              "number",
              "null"
            ],
            "description": "Market capitalisation, INR crore."
          }
        },
        "required": [
          "symbol",
          "name",
          "sector",
          "session_date",
          "signals",
          "ltp",
          "change_1w_pct",
          "volume",
          "relative_volume",
          "rsi_14",
          "high_52w",
          "low_52w",
          "market_cap_cr"
        ],
        "additionalProperties": false,
        "example": {
          "symbol": "MARUTI",
          "name": "Maruti Suzuki India Ltd",
          "sector": "Consumer Discretionary",
          "session_date": "2026-10-14",
          "signals": [
            "rsi_oversold"
          ],
          "ltp": 11178,
          "change_1w_pct": -0.45,
          "volume": 463850,
          "relative_volume": 1.07,
          "rsi_14": 27.76,
          "high_52w": 17370,
          "low_52w": 11125,
          "market_cap_cr": 351439.2
        }
      },
      "MarketSignalsMeta": {
        "type": "object",
        "properties": {
          "session_date": {
            "type": [
              "string",
              "null"
            ],
            "description": "Session the indicators were computed on; null when none is available."
          },
          "total_stocks": {
            "type": "integer",
            "description": "Stocks with at least one requested signal firing (all pages)."
          },
          "bucket_totals": {
            "type": "object",
            "additionalProperties": {
              "type": "integer"
            },
            "propertyNames": {
              "enum": [
                "near_52w_high",
                "near_52w_low",
                "rsi_overbought",
                "rsi_oversold",
                "macd_bullish",
                "volume_spike",
                "above_200_sma",
                "below_200_sma"
              ]
            },
            "description": "Per requested signal id: how many stocks it fired on (all pages, after `min_market_cap_cr`). A stock with several signals counts in each."
          }
        },
        "required": [
          "session_date",
          "total_stocks",
          "bucket_totals"
        ],
        "additionalProperties": false
      },
      "SignalDefinitionsItem": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "enum": [
              "near_52w_high",
              "near_52w_low",
              "rsi_overbought",
              "rsi_oversold",
              "macd_bullish",
              "volume_spike",
              "above_200_sma",
              "below_200_sma"
            ],
            "description": "Signal id."
          },
          "label": {
            "type": "string",
            "description": "Short label."
          },
          "category": {
            "type": "string",
            "enum": [
              "breakout",
              "momentum",
              "volume",
              "trend"
            ],
            "description": "breakout, momentum, volume or trend."
          },
          "rule": {
            "type": "string",
            "description": "The deterministic rule over end-of-day indicators."
          }
        },
        "required": [
          "id",
          "label",
          "category",
          "rule"
        ],
        "additionalProperties": false,
        "example": {
          "id": "rsi_oversold",
          "label": "RSI oversold",
          "category": "momentum",
          "rule": "14-day RSI at or below 30."
        }
      },
      "Envelope": {
        "type": "object",
        "required": [
          "data",
          "meta"
        ],
        "properties": {
          "data": {
            "description": "The document. Shape is route-specific and never truncated."
          },
          "meta": {
            "type": "object",
            "properties": {
              "as_of": {
                "type": "string",
                "format": "date-time",
                "description": "When this response was assembled (UTC)."
              },
              "route": {
                "type": "string",
                "description": "The operationId that served it."
              }
            },
            "additionalProperties": true,
            "description": "Paging and window information where the route pages (e.g. `window.next_cursor` on price history)."
          }
        }
      },
      "Error": {
        "type": "object",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "object",
            "required": [
              "code",
              "message"
            ],
            "properties": {
              "code": {
                "type": "string",
                "enum": [
                  "authentication_required",
                  "invalid_token",
                  "invalid_request",
                  "route_not_found",
                  "not_found",
                  "method_not_allowed",
                  "rate_limited",
                  "quota_exhausted",
                  "upstream_unavailable",
                  "service_unavailable",
                  "tool_error",
                  "internal_error"
                ]
              },
              "message": {
                "type": "string"
              },
              "details": {
                "type": "object",
                "additionalProperties": true
              }
            }
          }
        }
      },
      "QuotaWindow": {
        "type": "object",
        "properties": {
          "period": {
            "type": "string",
            "description": "IST day (YYYY-MM-DD) or month (YYYY-MM)."
          },
          "used": {
            "type": "integer"
          },
          "limit": {
            "type": [
              "integer",
              "null"
            ],
            "description": "null means unlimited."
          },
          "remaining": {
            "type": [
              "integer",
              "null"
            ]
          },
          "resets_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      }
    }
  }
}