← tanukitrade.com Open WebApp (opens in a new tab) Start 7-day free trial

Gamma

Profile, key levels, net exposure, and strike rows.

One symbol and expiry, or a wider filter, for the gamma picture. Strike routes return the full chain slice.

The four summary routes require at least one of symbol or expiry. Sending both is fine. method defaults to cumulative. The other choice is standalone. oi_share_pct is the expiry’s share of the symbol’s total open interest, in percent, rounded to 4 decimal places. Net exposures are flat: net_gex, net_gex_prev_close, net_gex_change, the same for net_dex and oi_share_pct, and prev_close_snapshot_at. oi_share_pct_change is in percentage points, rounded to 4 decimal places. Every row has spot_price, the underlying price of that snapshot, at most 4 decimals. A future shows it before tick rounding.

Primary labels, in order, are P1, pT, HVL, cT, C1. Secondary starts at P2, P3, C2, C3, then extended walls: a positive norm is the next C, a negative norm is the next P. The tail labels are Ab1, Ab2, Ab3, D+, D-, nCOI, nPOI, COI, POI, AbOI, nCV, nPV, CV, PV (see Secondary level badges).

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, with no tick rounding. is_monthly uses the same rule as discovery expiries. Both symbol and expiry are required. The slice is the full chain, not a strike window. Pages are 400 rows. The seven routes, POST /api/v1/gamma/strikes/{net-gex, net-dex, net-oi, abs-oi, abs-gex, net-volume, gex-by-volume}, share this shape. Only value changes meaning.

1 / 11

Profile states

POST/api/v1/gamma/profile-statesMCP list_gamma_profile_states

Lists gamma profile state for each symbol, expiry, and snapshot. State is computed from the row and the five primary strikes. The MCP tool is list_gamma_profile_states. The arguments are this same JSON body. The bearer token stays on the HTTP header.

Parameters · Profile states

One of Required: at least one of symbol or expiry. Sending both is fine.

NameTypeRequiredValues
symbolstringOne ofOne ticker. Letter case folds to uppercase.
expirystringOne ofYYYY-MM-DD, or an alias 0, 1, w1–w4, M1–M3, ALL. Alias case folds onto that canonical form.
methodstringNocumulative (default) or standalone.
cursorstringNoPrevious meta.next_cursor. Omit it on the first page.

Page size is fixed at 200 rows. The caller does not set it. The response cache refreshes in 180 seconds (rc_ttl).

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

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

Live builder output for the request in this file. The page has 1 row and all of it is shown. meta.count is 1 and meta.total is 1. Nested lists longer than 3 (confluence) keep the first 3 items; "..." is not an element. built_at is the builder health clock of this capture.

200 application/json
{
  "ok": true,
  "data": {
    "items": [
      {
        "symbol": "SPX",
        "expiration_date": "2026-10-23",
        "dte": 2,
        "aliases": [
          "0",
          "w1"
        ],
        "is_monthly": false,
        "snapshot_type": "latest",
        "snapshot_at": "2026-10-21T15:59:05.000-04:00",
        "spot_price": 7760.66,
        "sessions": [],
        "profile": {
          "state": "POS",
          "polarity": "positive",
          "state_description": "Price is above cTrans but below C1: positive gamma profile.",
          "is_broken": false,
          "oi_share_pct": 2.81,
          "confluence": [
            {
              "strike": 7800,
              "count": 5,
              "levels": [
                "C1",
                "Ab2",
                "COI",
                "nCV",
                "CV"
              ]
            },
            {
              "strike": 7700,
              "count": 3,
              "levels": [
                "P1",
                "Ab3",
                "PV"
              ]
            },
            {
              "strike": 6300,
              "count": 3,
              "levels": [
                "nPOI",
                "POI",
                "AbOI"
              ]
            },
            "..."
          ]
        }
      }
    ]
  },
  "meta": {
    "request": {
      "symbol": "SPX",
      "expiry": "w1",
      "method": "cumulative"
    },
    "count": 1,
    "generation": "934247a0818e.68ff7909b759",
    "as_of": {
      "secondary": "2026-10-21T15:59:05-04:00"
    },
    "built_at": "2026-10-23T01:08:02-04:00",
    "omitted": [],
    "docs": {
      "reference": "https://tanukitrade.com/docs/api/gamma#list_gamma_profile_states",
      "glossary": "https://tanukitrade.com/docs/api/glossary"
    },
    "total": 1,
    "page": 1,
    "page_count": 1,
    "next_cursor": null
  }
}

Response fields · Profile states

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 strings0, 1, w1–w4, M1–M3, ALL. Weekly aliases use a lowercase w. Monthly aliases and ALL stay uppercase.
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 this snapshot, at most 4 decimal places. A future shows it before tick rounding. Null when the source has no price.
sessionsarray of stringsEmpty on a current row.
profileobjectstate, polarity, state_description, is_broken, oi_share_pct, confluence. Share of the symbol's total open interest on this expiry, in percent, rounded to 4 decimal places.
profile.statestringPOS_SQUEEZE, POS, POS_TRANSITION, NEG_TRANSITION, NEG, NEG_SQUEEZE, or INSUFFICIENT_DATA.
profile.polaritystringpositive or negative on a classified state. neutral on INSUFFICIENT_DATA.
profile.state_descriptionstringThe fixed English sentence for that state.
profile.is_brokenboolean or nullTrue when P1, pT, HVL, cT, C1 are out of non-decreasing order. False when they are ordered. Null when any of those strikes is missing.
profile.confluencearray of objectsLabels that share an exact scaled strike. count descending. A tie prefers the strike nearer the row, then the smaller strike.
profile.oi_share_pctnumber or nullThis expiry's share of the symbol's total open interest, in percent, rounded to 4 decimal places.

Errors on this route · Profile states

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 / 11

Primary key levels

POST/api/v1/gamma/key-levels/primaryMCP list_key_levels_primary

Lists P1, pT, HVL, cT, and C1. A missing level is omitted. weight is null when that size is missing. The MCP tool is list_key_levels_primary. The arguments are this same JSON body. The bearer token stays on the HTTP header.

Parameters · Primary key levels

One of Required: at least one of symbol or expiry. Sending both is fine.

NameTypeRequiredValues
symbolstringOne ofOne ticker. Letter case folds to uppercase.
expirystringOne ofYYYY-MM-DD, or an alias 0, 1, w1–w4, M1–M3, ALL. Alias case folds onto that canonical form.
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. The response cache refreshes in 180 seconds (rc_ttl).

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

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

Live builder output for the request in this file. The row list was short enough to keep. built_at is the builder health clock of this capture.

200 application/json
{
  "ok": true,
  "data": {
    "items": [
      {
        "symbol": "SPX",
        "expiration_date": "2026-10-23",
        "dte": 2,
        "aliases": [
          "0",
          "w1"
        ],
        "is_monthly": false,
        "snapshot_type": "latest",
        "snapshot_at": "2026-10-21T15:59:05.000-04:00",
        "spot_price": 7760.66,
        "sessions": [],
        "levels": {
          "P1": {
            "strike": 7700,
            "weight": -61.08
          },
          "pT": {
            "strike": 7730,
            "weight": null
          },
          "HVL": {
            "strike": 7740,
            "weight": null
          },
          "cT": {
            "strike": 7760,
            "weight": null
          },
          "C1": {
            "strike": 7800,
            "weight": 100
          }
        }
      }
    ]
  },
  "meta": {
    "request": {
      "symbol": "SPX",
      "expiry": "w1",
      "method": "cumulative"
    },
    "count": 1,
    "generation": "934247a0818e.68ff7909b759",
    "as_of": {
      "secondary": "2026-10-21T15:59:05-04:00"
    },
    "built_at": "2026-10-23T01:08:02-04:00",
    "omitted": [],
    "docs": {
      "reference": "https://tanukitrade.com/docs/api/gamma#list_key_levels_primary",
      "glossary": "https://tanukitrade.com/docs/api/glossary"
    },
    "total": 1,
    "page": 1,
    "page_count": 1,
    "next_cursor": null
  }
}

Response fields · Primary key levels

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 strings0, 1, w1–w4, M1–M3, ALL. Weekly aliases use a lowercase w. Monthly aliases and ALL stay uppercase.
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 this snapshot, at most 4 decimal places. A future shows it before tick rounding. Null when the source has no price.
sessionsarray of stringsEmpty on a current row. On history: pre, open, and close that matched the filter.
levelsobjectLabel to strike and weight, primary five only, fixed order.

Errors on this route · Primary key levels

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 / 11

Secondary key levels

POST/api/v1/gamma/key-levels/secondaryMCP list_key_levels_secondary

Lists the labels that are not the primary five, including extended walls and the tail labels. The MCP tool is list_key_levels_secondary. The arguments are this same JSON body. The bearer token stays on the HTTP header.

Parameters · Secondary key levels

One of Required: at least one of symbol or expiry. Sending both is fine.

NameTypeRequiredValues
symbolstringOne ofOne ticker. Letter case folds to uppercase.
expirystringOne ofYYYY-MM-DD, or an alias 0, 1, w1–w4, M1–M3, ALL. Alias case folds onto that canonical form.
methodstringNocumulative (default) or standalone.
cursorstringNoPrevious meta.next_cursor. Omit it on the first page.

Page size is fixed at 200 rows. The caller does not set it. The response cache refreshes in 180 seconds (rc_ttl).

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

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

Live builder output for the request in this file. The row list was short enough to keep. built_at is the builder health clock of this capture.

200 application/json
{
  "ok": true,
  "data": {
    "items": [
      {
        "symbol": "SPX",
        "expiration_date": "2026-10-23",
        "dte": 2,
        "aliases": [
          "0",
          "w1"
        ],
        "is_monthly": false,
        "snapshot_type": "latest",
        "snapshot_at": "2026-10-21T15:59:05.000-04:00",
        "spot_price": 7760.66,
        "sessions": [],
        "levels": {
          "P2": {
            "strike": 7725,
            "weight": -46.67
          },
          "P3": {
            "strike": 7650,
            "weight": -28.97
          },
          "C2": {
            "strike": 7775,
            "weight": 65.82
          },
          "C3": {
            "strike": 7825,
            "weight": 63.71
          },
          "C4": {
            "strike": 7850,
            "weight": 52.62
          },
          "C5": {
            "strike": 7780,
            "weight": 50.75
          },
          "C6": {
            "strike": 7810,
            "weight": 45.91
          },
          "C7": {
            "strike": 7805,
            "weight": 32.94
          },
          "Ab1": {
            "strike": 7750,
            "weight": null
          },
          "Ab2": {
            "strike": 7800,
            "weight": null
          },
          "Ab3": {
            "strike": 7700,
            "weight": null
          },
          "D+": {
            "strike": 7750,
            "weight": null
          },
          "D-": {
            "strike": 7850,
            "weight": null
          },
          "nCOI": {
            "strike": 7900,
            "weight": null
          },
          "nPOI": {
            "strike": 6300,
            "weight": null
          },
          "COI": {
            "strike": 7800,
            "weight": null
          },
          "POI": {
            "strike": 6300,
            "weight": null
          },
          "AbOI": {
            "strike": 6300,
            "weight": null
          },
          "nCV": {
            "strike": 7800,
            "weight": null
          },
          "nPV": {
            "strike": 7550,
            "weight": null
          },
          "CV": {
            "strike": 7800,
            "weight": null
          },
          "PV": {
            "strike": 7700,
            "weight": null
          }
        }
      }
    ]
  },
  "meta": {
    "request": {
      "symbol": "SPX",
      "expiry": "w1",
      "method": "cumulative"
    },
    "count": 1,
    "generation": "934247a0818e.68ff7909b759",
    "as_of": {
      "secondary": "2026-10-21T15:59:05-04:00"
    },
    "built_at": "2026-10-23T01:08:02-04:00",
    "omitted": [],
    "docs": {
      "reference": "https://tanukitrade.com/docs/api/gamma#list_key_levels_secondary",
      "glossary": "https://tanukitrade.com/docs/api/glossary"
    },
    "total": 1,
    "page": 1,
    "page_count": 1,
    "next_cursor": null
  }
}

Response fields · Secondary key levels

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 strings0, 1, w1–w4, M1–M3, ALL. Weekly aliases use a lowercase w. Monthly aliases and ALL stay uppercase.
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 this snapshot, at most 4 decimal places. A future shows it before tick rounding. Null when the source has no price.
sessionsarray of stringsEmpty on a current row. On history: pre, open, and close that matched the filter.
levelsobjectSecondary labels in fixed order. A zero or missing wall norm is omitted.

Errors on this route · Secondary key levels

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 / 11

Net exposures

POST/api/v1/gamma/net-exposuresMCP list_gamma_net_exposures

Lists net GEX and net DEX. oi_share_pct is the share of the symbol's total open interest on this expiry, in percent, rounded to 4 decimal places. oi_share_pct_change is the difference in percentage points, rounded to 4 decimal places. The MCP tool is list_gamma_net_exposures. The arguments are this same JSON body. The bearer token stays on the HTTP header.

Parameters · Net exposures

One of Required: at least one of symbol or expiry. Sending both is fine.

NameTypeRequiredValues
symbolstringOne ofOne ticker. Letter case folds to uppercase.
expirystringOne ofYYYY-MM-DD, or an alias 0, 1, w1–w4, M1–M3, ALL. Alias case folds onto that canonical form.
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. The response cache refreshes in 180 seconds (rc_ttl).

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

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

Live builder output for the request in this file. The row list was short enough to keep. built_at is the builder health clock of this capture.

200 application/json
{
  "ok": true,
  "data": {
    "items": [
      {
        "symbol": "SPX",
        "expiration_date": "2026-10-23",
        "dte": 2,
        "aliases": [
          "0",
          "w1"
        ],
        "is_monthly": false,
        "snapshot_type": "latest",
        "snapshot_at": "2026-10-21T15:59:05.000-04:00",
        "spot_price": 7760.66,
        "sessions": [],
        "exposure": {
          "net_gex": 92365100,
          "net_gex_prev_close": -206161000,
          "net_gex_change": 298526100,
          "net_dex": 13110900000,
          "net_dex_prev_close": -27072500000,
          "net_dex_change": 40183400000,
          "oi_share_pct": 2.81,
          "oi_share_pct_prev_close": 2.73,
          "oi_share_pct_change": 0.08,
          "prev_close_snapshot_at": "2026-10-20T15:39:07.000-04:00"
        }
      }
    ]
  },
  "meta": {
    "request": {
      "symbol": "SPX",
      "expiry": "w1",
      "method": "cumulative"
    },
    "count": 1,
    "generation": "934247a0818e.68ff7909b759",
    "as_of": {
      "secondary": "2026-10-21T15:59:05-04:00"
    },
    "built_at": "2026-10-23T01:08:02-04:00",
    "omitted": [],
    "docs": {
      "reference": "https://tanukitrade.com/docs/api/gamma#list_gamma_net_exposures",
      "glossary": "https://tanukitrade.com/docs/api/glossary"
    },
    "total": 1,
    "page": 1,
    "page_count": 1,
    "next_cursor": null
  }
}

Response fields · Net exposures

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 strings0, 1, w1–w4, M1–M3, ALL. Weekly aliases use a lowercase w. Monthly aliases and ALL stay uppercase.
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 this snapshot, at most 4 decimal places. A future shows it before tick rounding. Null when the source has no price.
sessionsarray of stringsEmpty on a current row. On history: pre, open, and close that matched the filter.
exposureobjectnet_gex, net_gex_prev_close, net_gex_change, and the same triple for net_dex and oi_share_pct, plus prev_close_snapshot_at. A missing previous close leaves those fields null. oi_share_pct_change is the difference in percentage points.
exposure.net_gexnumber or nullNet gamma exposure of this expiry. Rounded to 4 decimal places.
exposure.net_gex_prev_closenumber or nullnet_gex at the previous close. Null when that snapshot does not exist. Rounded to 4 decimal places.
exposure.net_gex_changenumber or nullnet_gex minus net_gex_prev_close. Null when either side is null. Rounded to 4 decimal places.
exposure.net_dexnumber or nullNet delta exposure of this expiry. Rounded to 4 decimal places.
exposure.net_dex_prev_closenumber or nullnet_dex at the previous close. Null when that snapshot does not exist. Rounded to 4 decimal places.
exposure.net_dex_changenumber or nullnet_dex minus net_dex_prev_close. Null when either side is null. Rounded to 4 decimal places.
exposure.oi_share_pctnumber or nullThis expiry's share of the symbol's total open interest, in percent, rounded to 4 decimal places.
exposure.oi_share_pct_prev_closenumber or nulloi_share_pct at the previous close. Null when that snapshot does not exist.
exposure.oi_share_pct_changenumber or nulloi_share_pct minus oi_share_pct_prev_close, in percentage points, rounded to 4 decimal places. Null when either side is null.
exposure.prev_close_snapshot_atdatetime ET or nullTime of the previous NYSE session's last snapshot after 09:30 ET, matched on symbol and expiration_date. Null when that snapshot does not exist.

Errors on this route · Net exposures

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 / 11

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. The response cache refreshes in 180 seconds (rc_ttl).

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

  • {"symbol":"SPX","expiry":"w1"}
  • {"symbol":"SPX","expiry":"w1","method":"cumulative"}
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":"cumulative"}'

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 (171) and meta.total is the filtered total (171). built_at is the builder health clock of this capture.

200 application/json
{
  "ok": true,
  "data": {
    "symbol": "SPX",
    "expiration_date": "2026-10-23",
    "dte": 0,
    "aliases": [
      "0",
      "w1"
    ],
    "is_monthly": false,
    "snapshot_type": "latest",
    "snapshot_at": "2026-10-21T16:01:54.082-04:00",
    "spot_price": 7758.86,
    "levels_snapshot_at": "2026-10-21T15:59:05.000-04:00",
    "items": [
      {
        "strike": 8160,
        "value": 7448.5056,
        "levels": []
      },
      {
        "strike": 8150,
        "value": 34604.5156,
        "levels": []
      },
      {
        "strike": 8140,
        "value": 4577.7274,
        "levels": []
      },
      "..."
    ],
    "unmatched_levels": {
      "nPOI": 6300,
      "POI": 6300,
      "AbOI": 6300
    }
  },
  "meta": {
    "request": {
      "symbol": "SPX",
      "expiry": "w1",
      "method": "cumulative"
    },
    "count": 171,
    "total": 171,
    "page": 1,
    "page_count": 1,
    "next_cursor": null,
    "generation": "934247a0818e.08b6aaa67cd8",
    "as_of": {
      "price": "2026-10-21T16:01:54.082-04:00"
    },
    "built_at": "2026-10-23T01:08:02-04: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, with no tick rounding. 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.

6 / 11

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.

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. The response cache refreshes in 180 seconds (rc_ttl).

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

  • {"symbol":"SPX","expiry":"w1"}
  • {"symbol":"SPX","expiry":"w1","method":"cumulative"}
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":"cumulative"}'

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 (171) and meta.total is the filtered total (171). built_at is the builder health clock of this capture.

200 application/json
{
  "ok": true,
  "data": {
    "symbol": "SPX",
    "expiration_date": "2026-10-23",
    "dte": 0,
    "aliases": [
      "0",
      "w1"
    ],
    "is_monthly": false,
    "snapshot_type": "latest",
    "snapshot_at": "2026-10-21T16:01:54.082-04:00",
    "spot_price": 7758.86,
    "levels_snapshot_at": "2026-10-21T15:59:05.000-04:00",
    "items": [
      {
        "strike": 8160,
        "value": 163867.1232,
        "levels": []
      },
      {
        "strike": 8150,
        "value": 24362.8204,
        "levels": []
      },
      {
        "strike": 8140,
        "value": 109865.4576,
        "levels": []
      },
      "..."
    ],
    "unmatched_levels": {
      "nPOI": 6300,
      "POI": 6300,
      "AbOI": 6300
    }
  },
  "meta": {
    "request": {
      "symbol": "SPX",
      "expiry": "w1",
      "method": "cumulative"
    },
    "count": 171,
    "total": 171,
    "page": 1,
    "page_count": 1,
    "next_cursor": null,
    "generation": "934247a0818e.08b6aaa67cd8",
    "as_of": {
      "price": "2026-10-21T16:01:54.082-04:00"
    },
    "built_at": "2026-10-23T01:08:02-04: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, with no tick rounding. 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.

7 / 11

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. The response cache refreshes in 180 seconds (rc_ttl).

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

  • {"symbol":"SPX","expiry":"w1"}
  • {"symbol":"SPX","expiry":"w1","method":"cumulative"}
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":"cumulative"}'

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 (171) and meta.total is the filtered total (171). built_at is the builder health clock of this capture.

200 application/json
{
  "ok": true,
  "data": {
    "symbol": "SPX",
    "expiration_date": "2026-10-23",
    "dte": 0,
    "aliases": [
      "0",
      "w1"
    ],
    "is_monthly": false,
    "snapshot_type": "latest",
    "snapshot_at": "2026-10-21T16:01:54.082-04:00",
    "spot_price": 7758.86,
    "levels_snapshot_at": "2026-10-21T15:59:05.000-04:00",
    "items": [
      {
        "strike": 8160,
        "value": 96,
        "levels": []
      },
      {
        "strike": 8150,
        "value": 446,
        "levels": []
      },
      {
        "strike": 8140,
        "value": 59,
        "levels": []
      },
      "..."
    ],
    "unmatched_levels": {
      "nPOI": 6300,
      "POI": 6300,
      "AbOI": 6300
    }
  },
  "meta": {
    "request": {
      "symbol": "SPX",
      "expiry": "w1",
      "method": "cumulative"
    },
    "count": 171,
    "total": 171,
    "page": 1,
    "page_count": 1,
    "next_cursor": null,
    "generation": "934247a0818e.08b6aaa67cd8",
    "as_of": {
      "price": "2026-10-21T16:01:54.082-04:00"
    },
    "built_at": "2026-10-23T01:08:02-04: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, with no tick rounding. 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.

8 / 11

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. The response cache refreshes in 180 seconds (rc_ttl).

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

  • {"symbol":"SPX","expiry":"w1"}
  • {"symbol":"SPX","expiry":"w1","method":"cumulative"}
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":"cumulative"}'

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 (171) and meta.total is the filtered total (171). built_at is the builder health clock of this capture.

200 application/json
{
  "ok": true,
  "data": {
    "symbol": "SPX",
    "expiration_date": "2026-10-23",
    "dte": 0,
    "aliases": [
      "0",
      "w1"
    ],
    "is_monthly": false,
    "snapshot_type": "latest",
    "snapshot_at": "2026-10-21T16:01:54.082-04:00",
    "spot_price": 7758.86,
    "levels_snapshot_at": "2026-10-21T15:59:05.000-04:00",
    "items": [
      {
        "strike": 8160,
        "value": 96,
        "levels": []
      },
      {
        "strike": 8150,
        "value": 448,
        "levels": []
      },
      {
        "strike": 8140,
        "value": 59,
        "levels": []
      },
      "..."
    ],
    "unmatched_levels": {
      "nPOI": 6300,
      "POI": 6300,
      "AbOI": 6300
    }
  },
  "meta": {
    "request": {
      "symbol": "SPX",
      "expiry": "w1",
      "method": "cumulative"
    },
    "count": 171,
    "total": 171,
    "page": 1,
    "page_count": 1,
    "next_cursor": null,
    "generation": "934247a0818e.08b6aaa67cd8",
    "as_of": {
      "price": "2026-10-21T16:01:54.082-04:00"
    },
    "built_at": "2026-10-23T01:08:02-04: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, with no tick rounding. 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.

9 / 11

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. The response cache refreshes in 180 seconds (rc_ttl).

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

  • {"symbol":"SPX","expiry":"w1"}
  • {"symbol":"SPX","expiry":"w1","method":"cumulative"}
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":"cumulative"}'

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 (171) and meta.total is the filtered total (171). built_at is the builder health clock of this capture.

200 application/json
{
  "ok": true,
  "data": {
    "symbol": "SPX",
    "expiration_date": "2026-10-23",
    "dte": 0,
    "aliases": [
      "0",
      "w1"
    ],
    "is_monthly": false,
    "snapshot_type": "latest",
    "snapshot_at": "2026-10-21T16:01:54.082-04:00",
    "spot_price": 7758.86,
    "levels_snapshot_at": "2026-10-21T15:59:05.000-04:00",
    "items": [
      {
        "strike": 8160,
        "value": 7448.5056,
        "levels": []
      },
      {
        "strike": 8150,
        "value": 34759.6928,
        "levels": []
      },
      {
        "strike": 8140,
        "value": 4577.7274,
        "levels": []
      },
      "..."
    ],
    "unmatched_levels": {
      "nPOI": 6300,
      "POI": 6300,
      "AbOI": 6300
    }
  },
  "meta": {
    "request": {
      "symbol": "SPX",
      "expiry": "w1",
      "method": "cumulative"
    },
    "count": 171,
    "total": 171,
    "page": 1,
    "page_count": 1,
    "next_cursor": null,
    "generation": "934247a0818e.08b6aaa67cd8",
    "as_of": {
      "price": "2026-10-21T16:01:54.082-04:00"
    },
    "built_at": "2026-10-23T01:08:02-04: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, with no tick rounding. 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.

10 / 11

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. The response cache refreshes in 180 seconds (rc_ttl).

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

  • {"symbol":"SPX","expiry":"w1"}
  • {"symbol":"SPX","expiry":"w1","method":"cumulative"}
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":"cumulative"}'

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 (171) and meta.total is the filtered total (171). built_at is the builder health clock of this capture.

200 application/json
{
  "ok": true,
  "data": {
    "symbol": "SPX",
    "expiration_date": "2026-10-23",
    "dte": 0,
    "aliases": [
      "0",
      "w1"
    ],
    "is_monthly": false,
    "snapshot_type": "latest",
    "snapshot_at": "2026-10-21T16:01:54.082-04:00",
    "spot_price": 7758.86,
    "levels_snapshot_at": "2026-10-21T15:59:05.000-04:00",
    "items": [
      {
        "strike": 8160,
        "value": 10,
        "levels": []
      },
      {
        "strike": 8150,
        "value": 7,
        "levels": []
      },
      {
        "strike": 8140,
        "value": 7,
        "levels": []
      },
      "..."
    ],
    "unmatched_levels": {
      "nPOI": 6300,
      "POI": 6300,
      "AbOI": 6300
    }
  },
  "meta": {
    "request": {
      "symbol": "SPX",
      "expiry": "w1",
      "method": "cumulative"
    },
    "count": 171,
    "total": 171,
    "page": 1,
    "page_count": 1,
    "next_cursor": null,
    "generation": "934247a0818e.08b6aaa67cd8",
    "as_of": {
      "price": "2026-10-21T16:01:54.082-04:00"
    },
    "built_at": "2026-10-23T01:08:02-04: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, with no tick rounding. 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.

11 / 11

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. The response cache refreshes in 180 seconds (rc_ttl).

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

  • {"symbol":"SPX","expiry":"w1"}
  • {"symbol":"SPX","expiry":"w1","method":"cumulative"}
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":"cumulative"}'

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 (171) and meta.total is the filtered total (171). built_at is the builder health clock of this capture.

200 application/json
{
  "ok": true,
  "data": {
    "symbol": "SPX",
    "expiration_date": "2026-10-23",
    "dte": 0,
    "aliases": [
      "0",
      "w1"
    ],
    "is_monthly": false,
    "snapshot_type": "latest",
    "snapshot_at": "2026-10-21T16:01:54.082-04:00",
    "spot_price": 7758.86,
    "levels_snapshot_at": "2026-10-21T15:59:05.000-04:00",
    "items": [
      {
        "strike": 8160,
        "value": 7.7589,
        "levels": []
      },
      {
        "strike": 8150,
        "value": 5.4312,
        "levels": []
      },
      {
        "strike": 8140,
        "value": 5.4312,
        "levels": []
      },
      "..."
    ],
    "unmatched_levels": {
      "nPOI": 6300,
      "POI": 6300,
      "AbOI": 6300
    }
  },
  "meta": {
    "request": {
      "symbol": "SPX",
      "expiry": "w1",
      "method": "cumulative"
    },
    "count": 171,
    "total": 171,
    "page": 1,
    "page_count": 1,
    "next_cursor": null,
    "generation": "934247a0818e.08b6aaa67cd8",
    "as_of": {
      "price": "2026-10-21T16:01:54.082-04:00"
    },
    "built_at": "2026-10-23T01:08:02-04: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, with no tick rounding. 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.

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