Skip to content

Options Toolkit

This section covers the option chain endpoint, which returns the full strike ladder for an underlying along with Greeks and implied volatility in the same response.

Request Type Path Description Status
GET /market/option-chain Get the option chain for an underlying, including Greeks and IV Live

Option Chain

Retrieves the option chain for one underlying and one expiry. Each strike returns both the call (ce) and put (pe) leg with live price, open interest, volume, top-of-book bid/ask, implied volatility and Greeks — so a single call is enough to build a chain view or drive a strategy.

Endpoint

Text Only
GET /market/option-chain

Query Parameters

Parameter Required Description
exchange Yes The exchange of the option contracts.
Enum: NSE, BSE
segment Yes The segment of the underlying, which determines where its underlying-scrip comes from.
Enum: INDEX, EQUITY
underlying-scrip Yes The SECURITY_ID of the underlying — not of an option contract. See Finding underlying-scrip.
expiry Yes Contract expiry in YYYY-MM-DD format (e.g. 2026-08-18).
strike_count No Number of strikes to return on each side of the at-the-money strike. Defaults to 10.

Example Request

Bash
curl --location 'https://api.indstocks.com/market/option-chain?exchange=NSE&segment=INDEX&underlying-scrip=40000001&expiry=2026-08-18&strike_count=10' \
--header 'Authorization: YOUR_ACCESS_TOKEN'

Response Payload (Success)

JSON
{
  "status": "success",
  "data": {
    "underlying_ltp": 24471.7,
    "expiry": "2026-08-18",
    "strikes": {
      "24450": {
        "ce": {
          "security_id": "45108",
          "trading_symbol": "NIFTY-Aug2026-24450-CE",
          "last_price": 167.9,
          "previous_close_price": 274.95,
          "oi": 1608490,
          "previous_oi": 1606988,
          "volume": 9079330,
          "top_bid_price": 166.05,
          "top_bid_quantity": 195,
          "top_ask_price": 167.5,
          "top_ask_quantity": 130,
          "iv": 10.5,
          "greeks": {
            "delta": 0.56,
            "gamma": 0.0011,
            "theta": -10.04,
            "vega": 13.39
          }
        },
        "pe": {
          "security_id": "45109",
          "trading_symbol": "NIFTY-Aug2026-24450-PE",
          "last_price": 117.65,
          "previous_close_price": 88.9,
          "oi": 1579370,
          "previous_oi": 1579129,
          "volume": 11974495,
          "top_bid_price": 117.65,
          "top_bid_quantity": 195,
          "top_ask_price": 119.4,
          "top_ask_quantity": 195,
          "iv": 10.4,
          "greeks": {
            "delta": -0.44,
            "gamma": 0.0011,
            "theta": -9.95,
            "vega": 13.39
          }
        }
      },
      "24500": { "ce": { /* ... */ }, "pe": { /* ... */ } }
    }
  }
}

Response Fields

Field Description
underlying_ltp Last traded price of the underlying.
expiry The expiry the returned chain belongs to, YYYY-MM-DD.
strikes An object keyed by strike price, each holding a ce and a pe leg.

Each ce / pe leg contains:

Field Description
security_id The contract's SECURITY_ID. Pass this straight to Place Order as security_id.
trading_symbol The contract's exchange trading symbol, matching TRADING_SYMBOL in the Instruments file.
last_price Last traded price of the contract.
previous_close_price Previous close of the contract.
oi Current open interest.
previous_oi Previous day's open interest — subtract to get the OI change.
volume Day's traded volume.
top_bid_price / top_bid_quantity Best bid and its quantity.
top_ask_price / top_ask_quantity Best ask and its quantity.
iv Implied volatility, as a percentage (e.g. 10.5 means 10.5%).
greeks Object containing delta, gamma, theta and vega.

Response Notes

  • strikes is a JSON object keyed by strike price, not an array. JSON object key order is not guaranteed, so sort the keys numerically if you need an ordered ladder.
  • strike_count is the number of strikes per side of the at-the-money strike, so the response contains (2 × strike_count) + 1 strikes. strike_count=3 returns 7 strikes; the default of 10 returns 21.
  • iv is a percentage and is a sibling of greeks, not a member of it.
  • greeks contains exactly delta, gamma, theta and vega. There is no rho.
  • The response does not include an OI-change field, a put-call ratio, the list of other expiries, or lot_size/tick_size. Compute OI change from oi and previous_oi; take lot and tick size from the Instruments file.
  • Market depth is top-of-book only (one bid and one ask). For 5-level depth on a specific contract, use Market Depth.

Finding underlying-scrip

underlying-scrip is the SECURITY_ID of the underlying, which you look up in the Instruments file. Which file depends on the segment you are querying:

segment Instruments source Example
INDEX /market/instruments?source=index 40000001 — NIFTY 50
EQUITY /market/instruments?source=equity 2885 — RELIANCE on NSE

Use the underlying's ID, not a contract's

A common mistake is passing the SECURITY_ID of an option or futures contract from source=fno. That is the contract's ID, not the underlying's, and it will be rejected. For a stock underlying use its cash-market row from source=equity.

Example — RELIANCE option chain

Bash
curl --location 'https://api.indstocks.com/market/option-chain?exchange=NSE&segment=EQUITY&underlying-scrip=2885&expiry=2026-08-25&strike_count=5' \
--header 'Authorization: YOUR_ACCESS_TOKEN'

Errors

Condition HTTP Response
Any of exchange, segment, underlying-scrip or expiry is missing or invalid 400 {"message": "Bad Request", "debug_info": "Invalid exchange, segment, underlying-scrip or expiry passed"}
Authorization header not sent 400 {"message": "authorization not sent in request. Please try again.", "success": false}
Rate limit exceeded 429 {"error": "Rate limit exceeded", "success": false}

Error shapes on this endpoint differ from the standard envelope

This endpoint does not use the {"status": "error", "error_type": "..."} envelope described in the Error Bucket. Check the HTTP status code first, then read whichever of debug_info, message or error is present. Note also that an invalid expiry format (for example 20260818 instead of 2026-08-18) produces the same 400 as an unknown underlying, so validate the format on your side before calling.


See Also