TanukiTradeDocs

Exposure by strike

Strike-by-strike exposure for one symbol and expiry.

Nine routes under POST /api/v1/gamma/strikes/. Each returns the full chain slice, one row per strike, with the same header. Only the meaning of value changes.

Both symbol and expiry are required. method defaults to cumulative, every expiry through the selected date. Choose standalone to isolate one expiration. The slice is the full chain, not a strike window. Pages are 400 rows. Strikes stay on the level grid. The summary routes, profile state, key levels, and net exposures, are on Gamma profile & levels. These routes belong to the gamma group: a token limited to an explicit group list needs gamma to call them.

The strike header is symbol, expiration_date, dte, aliases, is_monthly, snapshot_type, snapshot_at, spot_price, levels_snapshot_at, items, and unmatched_levels. spot_price is the chain snapshot’s price; for a future it is the base price times today’s conversion factor, then rounded to the contract tick. XSP is not tick-rounded. is_monthly uses the same rule as discovery expiries.

Net vanna and net charm are dollar delta, call minus put, with the net GEX dealer convention (dealers long the calls, short the puts). Net vanna is the delta change for a 1 volatility point rise in IV: a positive value means falling IV makes dealers buy the underlying. Net charm is the delta change over one calendar day, through expiry on the expiry day: a positive value means time passing makes dealers sell. These two routes add value_total to the header, the sum over the whole slice, not only the page. They are live only.

Live strike refresh: the strike routes publish a new snapshot about once a minute on NYSE weekdays from 06:40 through 16:00 ET. For your own private, non-commercial intraday strike history or alert, call the strike route you need once per minute in that window and store or evaluate each response subject to the retention and deletion rules in Section 19 of the Terms.

History scope: the history API stores high-level gamma profile state, key levels, and net exposures at named sessions. It does not provide strike-by-strike history, and no strike-history route is planned.

Support window: the live routes on this page are supported on NYSE trading days from 06:40 through 16:00 ET. Outside that window, on weekends, on holidays, and during maintenance, they still answer with the last snapshot, but that answer is not meant for trading decisions, and we do not investigate differences from the webapp outside the window. The history routes are supported at any time. Details: data clock.

1 / 9

Strike net GEX

POST/api/v1/gamma/strikes/net-gexMCP list_gamma_strikes_net_gex

Lists strike-level net GEX for one symbol and expiry. The header includes is_monthly. spot_price and is_spot use the most common positive underlying price in the chain snapshot. A tie does not build the slice. meta.as_of.price is that snapshot's publish time, ET with an offset. Rows do not include spot_price or is_spot. The MCP tool is list_gamma_strikes_net_gex. The arguments are this same JSON body. The bearer token stays on the HTTP header.

Parameters · Strike net GEX

NameTypeRequiredValues
symbolstringYesOne ticker. Letter case folds to uppercase.
expirystringYesYYYY-MM-DD, or an alias 0, 1, w1–w4, M1–M3, ALL. Alias case folds.
methodstringNocumulative (default) or standalone.
cursorstringNoPrevious meta.next_cursor. Omit it on the first page.

Page size is fixed at 400 rows. The caller does not set it.

Valid bodies, from the minimal to the one the sample answers:

  • {"symbol":"SPX","expiry":"w1"}
  • {"symbol":"SPX","expiry":"w1","method":"standalone"}
curl
curl --compressed \
  --request POST \
  --url "${TANUKI_BASE_URL}/api/v1/gamma/strikes/net-gex" \
  --header "Authorization: Bearer 12345.YOUR_API_KEY" \
  --header "Content-Type: application/json" \
  --header "Accept: application/json" \
  --data '{"symbol":"SPX","expiry":"w1","method":"standalone"}'

Live builder output for the request in this file. The first 3 rows of the page are shown; "..." is not a row. meta.count is the untrimmed page length (238) and meta.total is the filtered total (238). built_at is the builder health clock of this capture.

200 application/json
{
  "ok": true,
  "data": {
    "symbol": "SPX",
    "expiration_date": "2026-11-06",
    "dte": 1,
    "aliases": [
      "1",
      "w1"
    ],
    "is_monthly": false,
    "snapshot_type": "latest",
    "snapshot_at": "2026-10-28T16:01:49.356-04:00",
    "spot_price": 7744.59,
    "levels_snapshot_at": "2026-10-28T15:59:05.000-04:00",
    "items": [
      {
        "strike": 8325,
        "value": 1858.7016,
        "levels": []
      },
      {
        "strike": 8300,
        "value": 22149.5274,
        "levels": []
      },
      {
        "strike": 8275,
        "value": 12778.5735,
        "levels": []
      },
      "..."
    ],
    "unmatched_levels": {
      "nCOI": 8800,
      "nPOI": 6350,
      "COI": 8800,
      "POI": 6350,
      "AbOI": 6350
    }
  },
  "meta": {
    "request": {
      "symbol": "SPX",
      "expiry": "w1",
      "method": "standalone"
    },
    "count": 238,
    "total": 238,
    "page": 1,
    "page_count": 1,
    "next_cursor": null,
    "generation": "508c3caeef44.2ae9b2b3a5fb",
    "as_of": {
      "price": "2026-10-28T16:01:49.356-04:00"
    },
    "built_at": "2026-11-05T19:34:02-05:00",
    "omitted": [],
    "docs": {
      "reference": "https://tanukitrade.com/docs/api/gamma#list_gamma_strikes_net_gex",
      "glossary": "https://tanukitrade.com/docs/api/glossary"
    }
  }
}

Response fields · Strike net GEX

FieldTypeMeaning
symbolstringCanonical ticker. Copy it from list_symbols. Letter case folds to uppercase.
expiration_datedateCalendar expiry, YYYY-MM-DD, ET.
dteintegerDays to that expiry, as stored for the row.
aliasesarray of stringsExpiry aliases. is_monthly sits beside them on the header.
is_monthlybooleanTrue on the monthly expiry date, same rule as discovery expiries.
snapshot_typestringlatest on a current row. history on a stored day.
snapshot_atdatetime ET or nullWhen the source row was captured. ISO 8601 with an ET offset, to milliseconds.
spot_pricenumber or nullUnderlying price of the chain snapshot, at most 4 decimal places. A future is the base price times today's conversion factor, then rounded to the contract tick. XSP is not tick-rounded. Null when the slice has no price.
levels_snapshot_atdatetime ET or nullTime of the key-level row. Null when that row is missing. This is not the chain snapshot_at.
strikenumberStrike in the chain slice, descending. Rounded to 4 decimal places.
valuenumbernet GEX at this strike, rounded to 4 decimal places.
levelsarray of stringsWebapp labels on this strike, or an empty array. This is not the key-level object.
unmatched_levelsobjectLabel to strike when that strike is not in the slice. Empty object when every label matched.

Errors on this route · Strike net GEX

HTTPCodeWhen
422VALIDATION_ERRORUnknown field, nested value, repeated key, bad JSON, a bad alias, or a cursor that does not match this request.
413PAYLOAD_TOO_LARGEThe JSON body is larger than 4 KiB.
503DATA_WARMINGThe datapoint is not built yet. Wait Retry-After seconds (1).
422RESULT_TOO_LARGEThe uncompressed JSON would exceed 512 KiB. Narrow the filter.
422UNKNOWN_SYMBOLRequired symbol is not in the universe.
422UNKNOWN_EXPIRYExpiry does not resolve for that symbol. details lists up to 20 available dates. Expiry alone, with no symbol, is an empty 200 instead.

Auth, rate limit, and the other shared failures are on Errors.

2 / 9

Strike net DEX

POST/api/v1/gamma/strikes/net-dexMCP list_gamma_strikes_net_dex

Lists strike-level net DEX for one symbol and expiry. The header includes is_monthly. spot_price and is_spot use the most common positive underlying price in the chain snapshot. A tie does not build the slice. meta.as_of.price is that snapshot's publish time, ET with an offset. Rows do not include spot_price or is_spot. The MCP tool is list_gamma_strikes_net_dex. The arguments are this same JSON body. The bearer token stays on the HTTP header.

For the concept, calculation, and interpretation, read Delta exposure in Learn.

Parameters · Strike net DEX

NameTypeRequiredValues
symbolstringYesOne ticker. Letter case folds to uppercase.
expirystringYesYYYY-MM-DD, or an alias 0, 1, w1–w4, M1–M3, ALL. Alias case folds.
methodstringNocumulative (default) or standalone.
cursorstringNoPrevious meta.next_cursor. Omit it on the first page.

Page size is fixed at 400 rows. The caller does not set it.

Valid bodies, from the minimal to the one the sample answers:

  • {"symbol":"SPX","expiry":"w1"}
  • {"symbol":"SPX","expiry":"w1","method":"standalone"}
curl
curl --compressed \
  --request POST \
  --url "${TANUKI_BASE_URL}/api/v1/gamma/strikes/net-dex" \
  --header "Authorization: Bearer 12345.YOUR_API_KEY" \
  --header "Content-Type: application/json" \
  --header "Accept: application/json" \
  --data '{"symbol":"SPX","expiry":"w1","method":"standalone"}'

Live builder output for the request in this file. The first 3 rows of the page are shown; "..." is not a row. meta.count is the untrimmed page length (238) and meta.total is the filtered total (238). built_at is the builder health clock of this capture.

200 application/json
{
  "ok": true,
  "data": {
    "symbol": "SPX",
    "expiration_date": "2026-11-06",
    "dte": 1,
    "aliases": [
      "1",
      "w1"
    ],
    "is_monthly": false,
    "snapshot_type": "latest",
    "snapshot_at": "2026-10-28T16:01:49.356-04:00",
    "spot_price": 7744.59,
    "levels_snapshot_at": "2026-10-28T15:59:05.000-04:00",
    "items": [
      {
        "strike": 8325,
        "value": 65054.556,
        "levels": []
      },
      {
        "strike": 8300,
        "value": -1460784.5658,
        "levels": []
      },
      {
        "strike": 8275,
        "value": 523921.5135,
        "levels": []
      },
      "..."
    ],
    "unmatched_levels": {
      "nCOI": 8800,
      "nPOI": 6350,
      "COI": 8800,
      "POI": 6350,
      "AbOI": 6350
    }
  },
  "meta": {
    "request": {
      "symbol": "SPX",
      "expiry": "w1",
      "method": "standalone"
    },
    "count": 238,
    "total": 238,
    "page": 1,
    "page_count": 1,
    "next_cursor": null,
    "generation": "508c3caeef44.2ae9b2b3a5fb",
    "as_of": {
      "price": "2026-10-28T16:01:49.356-04:00"
    },
    "built_at": "2026-11-05T19:34:02-05:00",
    "omitted": [],
    "docs": {
      "reference": "https://tanukitrade.com/docs/api/gamma#list_gamma_strikes_net_dex",
      "glossary": "https://tanukitrade.com/docs/api/glossary"
    }
  }
}

Response fields · Strike net DEX

FieldTypeMeaning
symbolstringCanonical ticker. Copy it from list_symbols. Letter case folds to uppercase.
expiration_datedateCalendar expiry, YYYY-MM-DD, ET.
dteintegerDays to that expiry, as stored for the row.
aliasesarray of stringsExpiry aliases. is_monthly sits beside them on the header.
is_monthlybooleanTrue on the monthly expiry date, same rule as discovery expiries.
snapshot_typestringlatest on a current row. history on a stored day.
snapshot_atdatetime ET or nullWhen the source row was captured. ISO 8601 with an ET offset, to milliseconds.
spot_pricenumber or nullUnderlying price of the chain snapshot, at most 4 decimal places. A future is the base price times today's conversion factor, then rounded to the contract tick. XSP is not tick-rounded. Null when the slice has no price.
levels_snapshot_atdatetime ET or nullTime of the key-level row. Null when that row is missing. This is not the chain snapshot_at.
strikenumberStrike in the chain slice, descending. Rounded to 4 decimal places.
valuenumbernet DEX at this strike, rounded to 4 decimal places.
levelsarray of stringsWebapp labels on this strike, or an empty array. This is not the key-level object.
unmatched_levelsobjectLabel to strike when that strike is not in the slice. Empty object when every label matched.

Errors on this route · Strike net DEX

HTTPCodeWhen
422VALIDATION_ERRORUnknown field, nested value, repeated key, bad JSON, a bad alias, or a cursor that does not match this request.
413PAYLOAD_TOO_LARGEThe JSON body is larger than 4 KiB.
503DATA_WARMINGThe datapoint is not built yet. Wait Retry-After seconds (1).
422RESULT_TOO_LARGEThe uncompressed JSON would exceed 512 KiB. Narrow the filter.
422UNKNOWN_SYMBOLRequired symbol is not in the universe.
422UNKNOWN_EXPIRYExpiry does not resolve for that symbol. details lists up to 20 available dates. Expiry alone, with no symbol, is an empty 200 instead.

Auth, rate limit, and the other shared failures are on Errors.

3 / 9

Strike net OI

POST/api/v1/gamma/strikes/net-oiMCP list_gamma_strikes_net_oi

Lists strike-level net open interest for one symbol and expiry. The header includes is_monthly. spot_price and is_spot use the most common positive underlying price in the chain snapshot. A tie does not build the slice. meta.as_of.price is that snapshot's publish time, ET with an offset. Rows do not include spot_price or is_spot. The MCP tool is list_gamma_strikes_net_oi. The arguments are this same JSON body. The bearer token stays on the HTTP header.

Parameters · Strike net OI

NameTypeRequiredValues
symbolstringYesOne ticker. Letter case folds to uppercase.
expirystringYesYYYY-MM-DD, or an alias 0, 1, w1–w4, M1–M3, ALL. Alias case folds.
methodstringNocumulative (default) or standalone.
cursorstringNoPrevious meta.next_cursor. Omit it on the first page.

Page size is fixed at 400 rows. The caller does not set it.

Valid bodies, from the minimal to the one the sample answers:

  • {"symbol":"SPX","expiry":"w1"}
  • {"symbol":"SPX","expiry":"w1","method":"standalone"}
curl
curl --compressed \
  --request POST \
  --url "${TANUKI_BASE_URL}/api/v1/gamma/strikes/net-oi" \
  --header "Authorization: Bearer 12345.YOUR_API_KEY" \
  --header "Content-Type: application/json" \
  --header "Accept: application/json" \
  --data '{"symbol":"SPX","expiry":"w1","method":"standalone"}'

Live builder output for the request in this file. The first 3 rows of the page are shown; "..." is not a row. meta.count is the untrimmed page length (238) and meta.total is the filtered total (238). built_at is the builder health clock of this capture.

200 application/json
{
  "ok": true,
  "data": {
    "symbol": "SPX",
    "expiration_date": "2026-11-06",
    "dte": 1,
    "aliases": [
      "1",
      "w1"
    ],
    "is_monthly": false,
    "snapshot_type": "latest",
    "snapshot_at": "2026-10-28T16:01:49.356-04:00",
    "spot_price": 7744.59,
    "levels_snapshot_at": "2026-10-28T15:59:05.000-04:00",
    "items": [
      {
        "strike": 8325,
        "value": 24,
        "levels": []
      },
      {
        "strike": 8300,
        "value": 286,
        "levels": []
      },
      {
        "strike": 8275,
        "value": 165,
        "levels": []
      },
      "..."
    ],
    "unmatched_levels": {
      "nCOI": 8800,
      "nPOI": 6350,
      "COI": 8800,
      "POI": 6350,
      "AbOI": 6350
    }
  },
  "meta": {
    "request": {
      "symbol": "SPX",
      "expiry": "w1",
      "method": "standalone"
    },
    "count": 238,
    "total": 238,
    "page": 1,
    "page_count": 1,
    "next_cursor": null,
    "generation": "508c3caeef44.2ae9b2b3a5fb",
    "as_of": {
      "price": "2026-10-28T16:01:49.356-04:00"
    },
    "built_at": "2026-11-05T19:34:02-05:00",
    "omitted": [],
    "docs": {
      "reference": "https://tanukitrade.com/docs/api/gamma#list_gamma_strikes_net_oi",
      "glossary": "https://tanukitrade.com/docs/api/glossary"
    }
  }
}

Response fields · Strike net OI

FieldTypeMeaning
symbolstringCanonical ticker. Copy it from list_symbols. Letter case folds to uppercase.
expiration_datedateCalendar expiry, YYYY-MM-DD, ET.
dteintegerDays to that expiry, as stored for the row.
aliasesarray of stringsExpiry aliases. is_monthly sits beside them on the header.
is_monthlybooleanTrue on the monthly expiry date, same rule as discovery expiries.
snapshot_typestringlatest on a current row. history on a stored day.
snapshot_atdatetime ET or nullWhen the source row was captured. ISO 8601 with an ET offset, to milliseconds.
spot_pricenumber or nullUnderlying price of the chain snapshot, at most 4 decimal places. A future is the base price times today's conversion factor, then rounded to the contract tick. XSP is not tick-rounded. Null when the slice has no price.
levels_snapshot_atdatetime ET or nullTime of the key-level row. Null when that row is missing. This is not the chain snapshot_at.
strikenumberStrike in the chain slice, descending. Rounded to 4 decimal places.
valuenumbernet open interest at this strike.
levelsarray of stringsWebapp labels on this strike, or an empty array. This is not the key-level object.
unmatched_levelsobjectLabel to strike when that strike is not in the slice. Empty object when every label matched.

Errors on this route · Strike net OI

HTTPCodeWhen
422VALIDATION_ERRORUnknown field, nested value, repeated key, bad JSON, a bad alias, or a cursor that does not match this request.
413PAYLOAD_TOO_LARGEThe JSON body is larger than 4 KiB.
503DATA_WARMINGThe datapoint is not built yet. Wait Retry-After seconds (1).
422RESULT_TOO_LARGEThe uncompressed JSON would exceed 512 KiB. Narrow the filter.
422UNKNOWN_SYMBOLRequired symbol is not in the universe.
422UNKNOWN_EXPIRYExpiry does not resolve for that symbol. details lists up to 20 available dates. Expiry alone, with no symbol, is an empty 200 instead.

Auth, rate limit, and the other shared failures are on Errors.

4 / 9

Strike abs OI

POST/api/v1/gamma/strikes/abs-oiMCP list_gamma_strikes_abs_oi

Lists strike-level absolute open interest for one symbol and expiry. The header includes is_monthly. spot_price and is_spot use the most common positive underlying price in the chain snapshot. A tie does not build the slice. meta.as_of.price is that snapshot's publish time, ET with an offset. Rows do not include spot_price or is_spot. The MCP tool is list_gamma_strikes_abs_oi. The arguments are this same JSON body. The bearer token stays on the HTTP header.

Parameters · Strike abs OI

NameTypeRequiredValues
symbolstringYesOne ticker. Letter case folds to uppercase.
expirystringYesYYYY-MM-DD, or an alias 0, 1, w1–w4, M1–M3, ALL. Alias case folds.
methodstringNocumulative (default) or standalone.
cursorstringNoPrevious meta.next_cursor. Omit it on the first page.

Page size is fixed at 400 rows. The caller does not set it.

Valid bodies, from the minimal to the one the sample answers:

  • {"symbol":"SPX","expiry":"w1"}
  • {"symbol":"SPX","expiry":"w1","method":"standalone"}
curl
curl --compressed \
  --request POST \
  --url "${TANUKI_BASE_URL}/api/v1/gamma/strikes/abs-oi" \
  --header "Authorization: Bearer 12345.YOUR_API_KEY" \
  --header "Content-Type: application/json" \
  --header "Accept: application/json" \
  --data '{"symbol":"SPX","expiry":"w1","method":"standalone"}'

Live builder output for the request in this file. The first 3 rows of the page are shown; "..." is not a row. meta.count is the untrimmed page length (238) and meta.total is the filtered total (238). built_at is the builder health clock of this capture.

200 application/json
{
  "ok": true,
  "data": {
    "symbol": "SPX",
    "expiration_date": "2026-11-06",
    "dte": 1,
    "aliases": [
      "1",
      "w1"
    ],
    "is_monthly": false,
    "snapshot_type": "latest",
    "snapshot_at": "2026-10-28T16:01:49.356-04:00",
    "spot_price": 7744.59,
    "levels_snapshot_at": "2026-10-28T15:59:05.000-04:00",
    "items": [
      {
        "strike": 8325,
        "value": 24,
        "levels": []
      },
      {
        "strike": 8300,
        "value": 292,
        "levels": []
      },
      {
        "strike": 8275,
        "value": 165,
        "levels": []
      },
      "..."
    ],
    "unmatched_levels": {
      "nCOI": 8800,
      "nPOI": 6350,
      "COI": 8800,
      "POI": 6350,
      "AbOI": 6350
    }
  },
  "meta": {
    "request": {
      "symbol": "SPX",
      "expiry": "w1",
      "method": "standalone"
    },
    "count": 238,
    "total": 238,
    "page": 1,
    "page_count": 1,
    "next_cursor": null,
    "generation": "508c3caeef44.2ae9b2b3a5fb",
    "as_of": {
      "price": "2026-10-28T16:01:49.356-04:00"
    },
    "built_at": "2026-11-05T19:34:02-05:00",
    "omitted": [],
    "docs": {
      "reference": "https://tanukitrade.com/docs/api/gamma#list_gamma_strikes_abs_oi",
      "glossary": "https://tanukitrade.com/docs/api/glossary"
    }
  }
}

Response fields · Strike abs OI

FieldTypeMeaning
symbolstringCanonical ticker. Copy it from list_symbols. Letter case folds to uppercase.
expiration_datedateCalendar expiry, YYYY-MM-DD, ET.
dteintegerDays to that expiry, as stored for the row.
aliasesarray of stringsExpiry aliases. is_monthly sits beside them on the header.
is_monthlybooleanTrue on the monthly expiry date, same rule as discovery expiries.
snapshot_typestringlatest on a current row. history on a stored day.
snapshot_atdatetime ET or nullWhen the source row was captured. ISO 8601 with an ET offset, to milliseconds.
spot_pricenumber or nullUnderlying price of the chain snapshot, at most 4 decimal places. A future is the base price times today's conversion factor, then rounded to the contract tick. XSP is not tick-rounded. Null when the slice has no price.
levels_snapshot_atdatetime ET or nullTime of the key-level row. Null when that row is missing. This is not the chain snapshot_at.
strikenumberStrike in the chain slice, descending. Rounded to 4 decimal places.
valuenumberabsolute open interest at this strike.
levelsarray of stringsWebapp labels on this strike, or an empty array. This is not the key-level object.
unmatched_levelsobjectLabel to strike when that strike is not in the slice. Empty object when every label matched.

Errors on this route · Strike abs OI

HTTPCodeWhen
422VALIDATION_ERRORUnknown field, nested value, repeated key, bad JSON, a bad alias, or a cursor that does not match this request.
413PAYLOAD_TOO_LARGEThe JSON body is larger than 4 KiB.
503DATA_WARMINGThe datapoint is not built yet. Wait Retry-After seconds (1).
422RESULT_TOO_LARGEThe uncompressed JSON would exceed 512 KiB. Narrow the filter.
422UNKNOWN_SYMBOLRequired symbol is not in the universe.
422UNKNOWN_EXPIRYExpiry does not resolve for that symbol. details lists up to 20 available dates. Expiry alone, with no symbol, is an empty 200 instead.

Auth, rate limit, and the other shared failures are on Errors.

5 / 9

Strike abs GEX

POST/api/v1/gamma/strikes/abs-gexMCP list_gamma_strikes_abs_gex

Lists strike-level absolute GEX for one symbol and expiry. The header includes is_monthly. spot_price and is_spot use the most common positive underlying price in the chain snapshot. A tie does not build the slice. meta.as_of.price is that snapshot's publish time, ET with an offset. Rows do not include spot_price or is_spot. The MCP tool is list_gamma_strikes_abs_gex. The arguments are this same JSON body. The bearer token stays on the HTTP header.

Parameters · Strike abs GEX

NameTypeRequiredValues
symbolstringYesOne ticker. Letter case folds to uppercase.
expirystringYesYYYY-MM-DD, or an alias 0, 1, w1–w4, M1–M3, ALL. Alias case folds.
methodstringNocumulative (default) or standalone.
cursorstringNoPrevious meta.next_cursor. Omit it on the first page.

Page size is fixed at 400 rows. The caller does not set it.

Valid bodies, from the minimal to the one the sample answers:

  • {"symbol":"SPX","expiry":"w1"}
  • {"symbol":"SPX","expiry":"w1","method":"standalone"}
curl
curl --compressed \
  --request POST \
  --url "${TANUKI_BASE_URL}/api/v1/gamma/strikes/abs-gex" \
  --header "Authorization: Bearer 12345.YOUR_API_KEY" \
  --header "Content-Type: application/json" \
  --header "Accept: application/json" \
  --data '{"symbol":"SPX","expiry":"w1","method":"standalone"}'

Live builder output for the request in this file. The first 3 rows of the page are shown; "..." is not a row. meta.count is the untrimmed page length (238) and meta.total is the filtered total (238). built_at is the builder health clock of this capture.

200 application/json
{
  "ok": true,
  "data": {
    "symbol": "SPX",
    "expiration_date": "2026-11-06",
    "dte": 1,
    "aliases": [
      "1",
      "w1"
    ],
    "is_monthly": false,
    "snapshot_type": "latest",
    "snapshot_at": "2026-10-28T16:01:49.356-04:00",
    "spot_price": 7744.59,
    "levels_snapshot_at": "2026-10-28T15:59:05.000-04:00",
    "items": [
      {
        "strike": 8325,
        "value": 1858.7016,
        "levels": []
      },
      {
        "strike": 8300,
        "value": 22614.2028,
        "levels": []
      },
      {
        "strike": 8275,
        "value": 12778.5735,
        "levels": []
      },
      "..."
    ],
    "unmatched_levels": {
      "nCOI": 8800,
      "nPOI": 6350,
      "COI": 8800,
      "POI": 6350,
      "AbOI": 6350
    }
  },
  "meta": {
    "request": {
      "symbol": "SPX",
      "expiry": "w1",
      "method": "standalone"
    },
    "count": 238,
    "total": 238,
    "page": 1,
    "page_count": 1,
    "next_cursor": null,
    "generation": "508c3caeef44.2ae9b2b3a5fb",
    "as_of": {
      "price": "2026-10-28T16:01:49.356-04:00"
    },
    "built_at": "2026-11-05T19:34:02-05:00",
    "omitted": [],
    "docs": {
      "reference": "https://tanukitrade.com/docs/api/gamma#list_gamma_strikes_abs_gex",
      "glossary": "https://tanukitrade.com/docs/api/glossary"
    }
  }
}

Response fields · Strike abs GEX

FieldTypeMeaning
symbolstringCanonical ticker. Copy it from list_symbols. Letter case folds to uppercase.
expiration_datedateCalendar expiry, YYYY-MM-DD, ET.
dteintegerDays to that expiry, as stored for the row.
aliasesarray of stringsExpiry aliases. is_monthly sits beside them on the header.
is_monthlybooleanTrue on the monthly expiry date, same rule as discovery expiries.
snapshot_typestringlatest on a current row. history on a stored day.
snapshot_atdatetime ET or nullWhen the source row was captured. ISO 8601 with an ET offset, to milliseconds.
spot_pricenumber or nullUnderlying price of the chain snapshot, at most 4 decimal places. A future is the base price times today's conversion factor, then rounded to the contract tick. XSP is not tick-rounded. Null when the slice has no price.
levels_snapshot_atdatetime ET or nullTime of the key-level row. Null when that row is missing. This is not the chain snapshot_at.
strikenumberStrike in the chain slice, descending. Rounded to 4 decimal places.
valuenumberabsolute GEX at this strike, rounded to 4 decimal places.
levelsarray of stringsWebapp labels on this strike, or an empty array. This is not the key-level object.
unmatched_levelsobjectLabel to strike when that strike is not in the slice. Empty object when every label matched.

Errors on this route · Strike abs GEX

HTTPCodeWhen
422VALIDATION_ERRORUnknown field, nested value, repeated key, bad JSON, a bad alias, or a cursor that does not match this request.
413PAYLOAD_TOO_LARGEThe JSON body is larger than 4 KiB.
503DATA_WARMINGThe datapoint is not built yet. Wait Retry-After seconds (1).
422RESULT_TOO_LARGEThe uncompressed JSON would exceed 512 KiB. Narrow the filter.
422UNKNOWN_SYMBOLRequired symbol is not in the universe.
422UNKNOWN_EXPIRYExpiry does not resolve for that symbol. details lists up to 20 available dates. Expiry alone, with no symbol, is an empty 200 instead.

Auth, rate limit, and the other shared failures are on Errors.

6 / 9

Strike net volume

POST/api/v1/gamma/strikes/net-volumeMCP list_gamma_strikes_net_volume

Lists strike-level net volume for one symbol and expiry. The header includes is_monthly. spot_price and is_spot use the most common positive underlying price in the chain snapshot. A tie does not build the slice. meta.as_of.price is that snapshot's publish time, ET with an offset. Rows do not include spot_price or is_spot. The MCP tool is list_gamma_strikes_net_volume. The arguments are this same JSON body. The bearer token stays on the HTTP header.

Parameters · Strike net volume

NameTypeRequiredValues
symbolstringYesOne ticker. Letter case folds to uppercase.
expirystringYesYYYY-MM-DD, or an alias 0, 1, w1–w4, M1–M3, ALL. Alias case folds.
methodstringNocumulative (default) or standalone.
cursorstringNoPrevious meta.next_cursor. Omit it on the first page.

Page size is fixed at 400 rows. The caller does not set it.

Valid bodies, from the minimal to the one the sample answers:

  • {"symbol":"SPX","expiry":"w1"}
  • {"symbol":"SPX","expiry":"w1","method":"standalone"}
curl
curl --compressed \
  --request POST \
  --url "${TANUKI_BASE_URL}/api/v1/gamma/strikes/net-volume" \
  --header "Authorization: Bearer 12345.YOUR_API_KEY" \
  --header "Content-Type: application/json" \
  --header "Accept: application/json" \
  --data '{"symbol":"SPX","expiry":"w1","method":"standalone"}'

Live builder output for the request in this file. The first 3 rows of the page are shown; "..." is not a row. meta.count is the untrimmed page length (238) and meta.total is the filtered total (238). built_at is the builder health clock of this capture.

200 application/json
{
  "ok": true,
  "data": {
    "symbol": "SPX",
    "expiration_date": "2026-11-06",
    "dte": 1,
    "aliases": [
      "1",
      "w1"
    ],
    "is_monthly": false,
    "snapshot_type": "latest",
    "snapshot_at": "2026-10-28T16:01:49.356-04:00",
    "spot_price": 7744.59,
    "levels_snapshot_at": "2026-10-28T15:59:05.000-04:00",
    "items": [
      {
        "strike": 8325,
        "value": 0,
        "levels": []
      },
      {
        "strike": 8300,
        "value": 13,
        "levels": []
      },
      {
        "strike": 8275,
        "value": 6,
        "levels": []
      },
      "..."
    ],
    "unmatched_levels": {
      "nCOI": 8800,
      "nPOI": 6350,
      "COI": 8800,
      "POI": 6350,
      "AbOI": 6350
    }
  },
  "meta": {
    "request": {
      "symbol": "SPX",
      "expiry": "w1",
      "method": "standalone"
    },
    "count": 238,
    "total": 238,
    "page": 1,
    "page_count": 1,
    "next_cursor": null,
    "generation": "508c3caeef44.2ae9b2b3a5fb",
    "as_of": {
      "price": "2026-10-28T16:01:49.356-04:00"
    },
    "built_at": "2026-11-05T19:34:02-05:00",
    "omitted": [],
    "docs": {
      "reference": "https://tanukitrade.com/docs/api/gamma#list_gamma_strikes_net_volume",
      "glossary": "https://tanukitrade.com/docs/api/glossary"
    }
  }
}

Response fields · Strike net volume

FieldTypeMeaning
symbolstringCanonical ticker. Copy it from list_symbols. Letter case folds to uppercase.
expiration_datedateCalendar expiry, YYYY-MM-DD, ET.
dteintegerDays to that expiry, as stored for the row.
aliasesarray of stringsExpiry aliases. is_monthly sits beside them on the header.
is_monthlybooleanTrue on the monthly expiry date, same rule as discovery expiries.
snapshot_typestringlatest on a current row. history on a stored day.
snapshot_atdatetime ET or nullWhen the source row was captured. ISO 8601 with an ET offset, to milliseconds.
spot_pricenumber or nullUnderlying price of the chain snapshot, at most 4 decimal places. A future is the base price times today's conversion factor, then rounded to the contract tick. XSP is not tick-rounded. Null when the slice has no price.
levels_snapshot_atdatetime ET or nullTime of the key-level row. Null when that row is missing. This is not the chain snapshot_at.
strikenumberStrike in the chain slice, descending. Rounded to 4 decimal places.
valuenumbernet volume at this strike.
levelsarray of stringsWebapp labels on this strike, or an empty array. This is not the key-level object.
unmatched_levelsobjectLabel to strike when that strike is not in the slice. Empty object when every label matched.

Errors on this route · Strike net volume

HTTPCodeWhen
422VALIDATION_ERRORUnknown field, nested value, repeated key, bad JSON, a bad alias, or a cursor that does not match this request.
413PAYLOAD_TOO_LARGEThe JSON body is larger than 4 KiB.
503DATA_WARMINGThe datapoint is not built yet. Wait Retry-After seconds (1).
422RESULT_TOO_LARGEThe uncompressed JSON would exceed 512 KiB. Narrow the filter.
422UNKNOWN_SYMBOLRequired symbol is not in the universe.
422UNKNOWN_EXPIRYExpiry does not resolve for that symbol. details lists up to 20 available dates. Expiry alone, with no symbol, is an empty 200 instead.

Auth, rate limit, and the other shared failures are on Errors.

7 / 9

Strike GEX by volume

POST/api/v1/gamma/strikes/gex-by-volumeMCP list_gamma_strikes_gex_by_volume

Lists strike-level GEX by volume for one symbol and expiry. The header includes is_monthly. spot_price and is_spot use the most common positive underlying price in the chain snapshot. A tie does not build the slice. meta.as_of.price is that snapshot's publish time, ET with an offset. Rows do not include spot_price or is_spot. The MCP tool is list_gamma_strikes_gex_by_volume. The arguments are this same JSON body. The bearer token stays on the HTTP header.

Parameters · Strike GEX by volume

NameTypeRequiredValues
symbolstringYesOne ticker. Letter case folds to uppercase.
expirystringYesYYYY-MM-DD, or an alias 0, 1, w1–w4, M1–M3, ALL. Alias case folds.
methodstringNocumulative (default) or standalone.
cursorstringNoPrevious meta.next_cursor. Omit it on the first page.

Page size is fixed at 400 rows. The caller does not set it.

Valid bodies, from the minimal to the one the sample answers:

  • {"symbol":"SPX","expiry":"w1"}
  • {"symbol":"SPX","expiry":"w1","method":"standalone"}
curl
curl --compressed \
  --request POST \
  --url "${TANUKI_BASE_URL}/api/v1/gamma/strikes/gex-by-volume" \
  --header "Authorization: Bearer 12345.YOUR_API_KEY" \
  --header "Content-Type: application/json" \
  --header "Accept: application/json" \
  --data '{"symbol":"SPX","expiry":"w1","method":"standalone"}'

Live builder output for the request in this file. The first 3 rows of the page are shown; "..." is not a row. meta.count is the untrimmed page length (238) and meta.total is the filtered total (238). built_at is the builder health clock of this capture.

200 application/json
{
  "ok": true,
  "data": {
    "symbol": "SPX",
    "expiration_date": "2026-11-06",
    "dte": 1,
    "aliases": [
      "1",
      "w1"
    ],
    "is_monthly": false,
    "snapshot_type": "latest",
    "snapshot_at": "2026-10-28T16:01:49.356-04:00",
    "spot_price": 7744.59,
    "levels_snapshot_at": "2026-10-28T15:59:05.000-04:00",
    "items": [
      {
        "strike": 8325,
        "value": 0,
        "levels": []
      },
      {
        "strike": 8300,
        "value": 10.068,
        "levels": []
      },
      {
        "strike": 8275,
        "value": 4.6468,
        "levels": []
      },
      "..."
    ],
    "unmatched_levels": {
      "nCOI": 8800,
      "nPOI": 6350,
      "COI": 8800,
      "POI": 6350,
      "AbOI": 6350
    }
  },
  "meta": {
    "request": {
      "symbol": "SPX",
      "expiry": "w1",
      "method": "standalone"
    },
    "count": 238,
    "total": 238,
    "page": 1,
    "page_count": 1,
    "next_cursor": null,
    "generation": "508c3caeef44.2ae9b2b3a5fb",
    "as_of": {
      "price": "2026-10-28T16:01:49.356-04:00"
    },
    "built_at": "2026-11-05T19:34:02-05:00",
    "omitted": [],
    "docs": {
      "reference": "https://tanukitrade.com/docs/api/gamma#list_gamma_strikes_gex_by_volume",
      "glossary": "https://tanukitrade.com/docs/api/glossary"
    }
  }
}

Response fields · Strike GEX by volume

FieldTypeMeaning
symbolstringCanonical ticker. Copy it from list_symbols. Letter case folds to uppercase.
expiration_datedateCalendar expiry, YYYY-MM-DD, ET.
dteintegerDays to that expiry, as stored for the row.
aliasesarray of stringsExpiry aliases. is_monthly sits beside them on the header.
is_monthlybooleanTrue on the monthly expiry date, same rule as discovery expiries.
snapshot_typestringlatest on a current row. history on a stored day.
snapshot_atdatetime ET or nullWhen the source row was captured. ISO 8601 with an ET offset, to milliseconds.
spot_pricenumber or nullUnderlying price of the chain snapshot, at most 4 decimal places. A future is the base price times today's conversion factor, then rounded to the contract tick. XSP is not tick-rounded. Null when the slice has no price.
levels_snapshot_atdatetime ET or nullTime of the key-level row. Null when that row is missing. This is not the chain snapshot_at.
strikenumberStrike in the chain slice, descending. Rounded to 4 decimal places.
valuenumberGEX by volume at this strike, rounded to 4 decimal places.
levelsarray of stringsWebapp labels on this strike, or an empty array. This is not the key-level object.
unmatched_levelsobjectLabel to strike when that strike is not in the slice. Empty object when every label matched.

Errors on this route · Strike GEX by volume

HTTPCodeWhen
422VALIDATION_ERRORUnknown field, nested value, repeated key, bad JSON, a bad alias, or a cursor that does not match this request.
413PAYLOAD_TOO_LARGEThe JSON body is larger than 4 KiB.
503DATA_WARMINGThe datapoint is not built yet. Wait Retry-After seconds (1).
422RESULT_TOO_LARGEThe uncompressed JSON would exceed 512 KiB. Narrow the filter.
422UNKNOWN_SYMBOLRequired symbol is not in the universe.
422UNKNOWN_EXPIRYExpiry does not resolve for that symbol. details lists up to 20 available dates. Expiry alone, with no symbol, is an empty 200 instead.

Auth, rate limit, and the other shared failures are on Errors.

8 / 9

Strike net vanna

POST/api/v1/gamma/strikes/net-vannaMCP list_gamma_strikes_net_vanna

Lists strike-level net vanna for one symbol and expiry: the dollar delta change for a 1 volatility point rise in implied volatility. Call minus put, the dealer convention of net GEX. A positive value means falling IV makes dealers buy the underlying. value_total is the sum over the whole slice. Live only; there is no strike history. The MCP tool is list_gamma_strikes_net_vanna. The arguments are this same JSON body. The bearer token stays on the HTTP header.

For the concept, calculation, and interpretation, read Vanna exposure in Learn.

Parameters · Strike net vanna

NameTypeRequiredValues
symbolstringYesOne ticker. Letter case folds to uppercase.
expirystringYesYYYY-MM-DD, or an alias 0, 1, w1–w4, M1–M3, ALL. Alias case folds.
methodstringNocumulative (default) or standalone.
cursorstringNoPrevious meta.next_cursor. Omit it on the first page.

Page size is fixed at 400 rows. The caller does not set it.

Valid bodies, from the minimal to the one the sample answers:

  • {"symbol":"SPX","expiry":"w1"}
  • {"symbol":"SPX","expiry":"w1","method":"standalone"}
curl
curl --compressed \
  --request POST \
  --url "${TANUKI_BASE_URL}/api/v1/gamma/strikes/net-vanna" \
  --header "Authorization: Bearer 12345.YOUR_API_KEY" \
  --header "Content-Type: application/json" \
  --header "Accept: application/json" \
  --data '{"symbol":"SPX","expiry":"w1","method":"standalone"}'

Live builder output for the request in this file. The first 3 rows of the page are shown; "..." is not a row. meta.count is the untrimmed page length (238) and meta.total is the filtered total (238). built_at is the builder health clock of this capture.

200 application/json
{
  "ok": true,
  "data": {
    "symbol": "SPX",
    "expiration_date": "2026-11-06",
    "dte": 1,
    "aliases": [
      "1",
      "w1"
    ],
    "is_monthly": false,
    "snapshot_type": "latest",
    "snapshot_at": "2026-10-28T16:01:49.356-04:00",
    "spot_price": 7744.59,
    "levels_snapshot_at": "2026-10-28T15:59:05.000-04:00",
    "value_total": 1100598103.5221,
    "items": [
      {
        "strike": 8325,
        "value": 40408.7304,
        "levels": []
      },
      {
        "strike": 8300,
        "value": 529216.7685,
        "levels": []
      },
      {
        "strike": 8275,
        "value": 336330.7767,
        "levels": []
      },
      "..."
    ],
    "unmatched_levels": {
      "nCOI": 8800,
      "nPOI": 6350,
      "COI": 8800,
      "POI": 6350,
      "AbOI": 6350
    }
  },
  "meta": {
    "request": {
      "symbol": "SPX",
      "expiry": "w1",
      "method": "standalone"
    },
    "count": 238,
    "total": 238,
    "page": 1,
    "page_count": 1,
    "next_cursor": null,
    "generation": "508c3caeef44.2ae9b2b3a5fb",
    "as_of": {
      "price": "2026-10-28T16:01:49.356-04:00"
    },
    "built_at": "2026-11-05T19:34:02-05:00",
    "omitted": [],
    "docs": {
      "reference": "https://tanukitrade.com/docs/api/gamma#list_gamma_strikes_net_vanna",
      "glossary": "https://tanukitrade.com/docs/api/glossary"
    }
  }
}

Response fields · Strike net vanna

FieldTypeMeaning
symbolstringCanonical ticker. Copy it from list_symbols. Letter case folds to uppercase.
expiration_datedateCalendar expiry, YYYY-MM-DD, ET.
dteintegerDays to that expiry, as stored for the row.
aliasesarray of stringsExpiry aliases. is_monthly sits beside them on the header.
is_monthlybooleanTrue on the monthly expiry date, same rule as discovery expiries.
snapshot_typestringlatest on a current row. history on a stored day.
snapshot_atdatetime ET or nullWhen the source row was captured. ISO 8601 with an ET offset, to milliseconds.
spot_pricenumber or nullUnderlying price of the chain snapshot, at most 4 decimal places. A future is the base price times today's conversion factor, then rounded to the contract tick. XSP is not tick-rounded. Null when the slice has no price.
levels_snapshot_atdatetime ET or nullTime of the key-level row. Null when that row is missing. This is not the chain snapshot_at.
value_totalnumber or nullSum of value over every strike of the slice, not only this page. Null when the slice has no strikes.
strikenumberStrike in the chain slice, descending. Rounded to 4 decimal places.
valuenumber or nullDollar delta change for a 1 volatility point IV rise: vanna per point times open interest times 100 times the underlying price, call minus put. Positive: an IV drop makes dealers buy about this much of the underlying; an IV rise makes them sell.
levelsarray of stringsWebapp labels on this strike, or an empty array. This is not the key-level object.
unmatched_levelsobjectLabel to strike when that strike is not in the slice. Empty object when every label matched.

Errors on this route · Strike net vanna

HTTPCodeWhen
422VALIDATION_ERRORUnknown field, nested value, repeated key, bad JSON, a bad alias, or a cursor that does not match this request.
413PAYLOAD_TOO_LARGEThe JSON body is larger than 4 KiB.
503DATA_WARMINGThe datapoint is not built yet. Wait Retry-After seconds (1).
422RESULT_TOO_LARGEThe uncompressed JSON would exceed 512 KiB. Narrow the filter.
422UNKNOWN_SYMBOLRequired symbol is not in the universe.
422UNKNOWN_EXPIRYExpiry does not resolve for that symbol. details lists up to 20 available dates. Expiry alone, with no symbol, is an empty 200 instead.

Auth, rate limit, and the other shared failures are on Errors.

9 / 9

Strike net charm

POST/api/v1/gamma/strikes/net-charmMCP list_gamma_strikes_net_charm

Lists strike-level net charm for one symbol and expiry: the dollar delta change over one calendar day, through expiry on the expiry day. Call minus put, the dealer convention of net GEX. A positive value means time passing makes dealers sell the underlying. value_total is the sum over the whole slice. Live only; there is no strike history. The MCP tool is list_gamma_strikes_net_charm. The arguments are this same JSON body. The bearer token stays on the HTTP header.

For the concept, calculation, and interpretation, read Charm exposure in Learn.

Parameters · Strike net charm

NameTypeRequiredValues
symbolstringYesOne ticker. Letter case folds to uppercase.
expirystringYesYYYY-MM-DD, or an alias 0, 1, w1–w4, M1–M3, ALL. Alias case folds.
methodstringNocumulative (default) or standalone.
cursorstringNoPrevious meta.next_cursor. Omit it on the first page.

Page size is fixed at 400 rows. The caller does not set it.

Valid bodies, from the minimal to the one the sample answers:

  • {"symbol":"SPX","expiry":"w1"}
  • {"symbol":"SPX","expiry":"w1","method":"standalone"}
curl
curl --compressed \
  --request POST \
  --url "${TANUKI_BASE_URL}/api/v1/gamma/strikes/net-charm" \
  --header "Authorization: Bearer 12345.YOUR_API_KEY" \
  --header "Content-Type: application/json" \
  --header "Accept: application/json" \
  --data '{"symbol":"SPX","expiry":"w1","method":"standalone"}'

Live builder output for the request in this file. The first 3 rows of the page are shown; "..." is not a row. meta.count is the untrimmed page length (238) and meta.total is the filtered total (238). built_at is the builder health clock of this capture.

200 application/json
{
  "ok": true,
  "data": {
    "symbol": "SPX",
    "expiration_date": "2026-11-06",
    "dte": 1,
    "aliases": [
      "1",
      "w1"
    ],
    "is_monthly": false,
    "snapshot_type": "latest",
    "snapshot_at": "2026-10-28T16:01:49.356-04:00",
    "spot_price": 7744.59,
    "levels_snapshot_at": "2026-10-28T15:59:05.000-04:00",
    "value_total": -1035748925.7854,
    "items": [
      {
        "strike": 8325,
        "value": -36133.1591,
        "levels": []
      },
      {
        "strike": 8300,
        "value": -461856.3692,
        "levels": []
      },
      {
        "strike": 8275,
        "value": -285089.9748,
        "levels": []
      },
      "..."
    ],
    "unmatched_levels": {
      "nCOI": 8800,
      "nPOI": 6350,
      "COI": 8800,
      "POI": 6350,
      "AbOI": 6350
    }
  },
  "meta": {
    "request": {
      "symbol": "SPX",
      "expiry": "w1",
      "method": "standalone"
    },
    "count": 238,
    "total": 238,
    "page": 1,
    "page_count": 1,
    "next_cursor": null,
    "generation": "508c3caeef44.2ae9b2b3a5fb",
    "as_of": {
      "price": "2026-10-28T16:01:49.356-04:00"
    },
    "built_at": "2026-11-05T19:34:02-05:00",
    "omitted": [],
    "docs": {
      "reference": "https://tanukitrade.com/docs/api/gamma#list_gamma_strikes_net_charm",
      "glossary": "https://tanukitrade.com/docs/api/glossary"
    }
  }
}

Response fields · Strike net charm

FieldTypeMeaning
symbolstringCanonical ticker. Copy it from list_symbols. Letter case folds to uppercase.
expiration_datedateCalendar expiry, YYYY-MM-DD, ET.
dteintegerDays to that expiry, as stored for the row.
aliasesarray of stringsExpiry aliases. is_monthly sits beside them on the header.
is_monthlybooleanTrue on the monthly expiry date, same rule as discovery expiries.
snapshot_typestringlatest on a current row. history on a stored day.
snapshot_atdatetime ET or nullWhen the source row was captured. ISO 8601 with an ET offset, to milliseconds.
spot_pricenumber or nullUnderlying price of the chain snapshot, at most 4 decimal places. A future is the base price times today's conversion factor, then rounded to the contract tick. XSP is not tick-rounded. Null when the slice has no price.
levels_snapshot_atdatetime ET or nullTime of the key-level row. Null when that row is missing. This is not the chain snapshot_at.
value_totalnumber or nullSum of value over every strike of the slice, not only this page. Null when the slice has no strikes.
strikenumberStrike in the chain slice, descending. Rounded to 4 decimal places.
valuenumber or nullDollar delta change over one calendar day with spot and IV unchanged, through expiry on the expiry day: charm per day times open interest times 100 times the underlying price, call minus put. Positive: dealers sell about this much of the underlying as the day passes; negative: they buy.
levelsarray of stringsWebapp labels on this strike, or an empty array. This is not the key-level object.
unmatched_levelsobjectLabel to strike when that strike is not in the slice. Empty object when every label matched.

Errors on this route · Strike net charm

HTTPCodeWhen
422VALIDATION_ERRORUnknown field, nested value, repeated key, bad JSON, a bad alias, or a cursor that does not match this request.
413PAYLOAD_TOO_LARGEThe JSON body is larger than 4 KiB.
503DATA_WARMINGThe datapoint is not built yet. Wait Retry-After seconds (1).
422RESULT_TOO_LARGEThe uncompressed JSON would exceed 512 KiB. Narrow the filter.
422UNKNOWN_SYMBOLRequired symbol is not in the universe.
422UNKNOWN_EXPIRYExpiry does not resolve for that symbol. details lists up to 20 available dates. Expiry alone, with no symbol, is an empty 200 instead.

Auth, rate limit, and the other shared failures are on Errors.

TanukiTrade API and MCP. Derived options analytics for your code and for agents. Not investment advice. tanukitrade.com