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.
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.
| Name | Type | Required | Values |
|---|---|---|---|
symbol | string | One of | One ticker. Letter case folds to uppercase. |
expiry | string | One of | YYYY-MM-DD, or an alias 0, 1, w1–w4, M1–M3, ALL. Alias case folds onto that canonical form. |
method | string | No | cumulative (default) or standalone. |
cursor | string | No | Previous 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 --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.
{ "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
| Field | Type | Meaning |
|---|---|---|
symbol | string | Canonical ticker. Copy it from list_symbols. Letter case folds to uppercase. |
expiration_date | date | Calendar expiry, YYYY-MM-DD, ET. |
dte | integer | Days to that expiry, as stored for the row. |
aliases | array of strings | 0, 1, w1–w4, M1–M3, ALL. Weekly aliases use a lowercase w. Monthly aliases and ALL stay uppercase. |
is_monthly | boolean | True on the monthly expiry date. Same rule as discovery expiries. |
snapshot_type | string | latest on a current row. history on a stored day. |
snapshot_at | datetime ET or null | When the source row was captured. ISO 8601 with an ET offset, to milliseconds. |
spot_price | number or null | Underlying price of this snapshot, at most 4 decimal places. A future shows it before tick rounding. Null when the source has no price. |
sessions | array of strings | Empty on a current row. |
profile | object | state, 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.state | string | POS_SQUEEZE, POS, POS_TRANSITION, NEG_TRANSITION, NEG, NEG_SQUEEZE, or INSUFFICIENT_DATA. |
profile.polarity | string | positive or negative on a classified state. neutral on INSUFFICIENT_DATA. |
profile.state_description | string | The fixed English sentence for that state. |
profile.is_broken | boolean or null | True 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.confluence | array of objects | Labels that share an exact scaled strike. count descending. A tie prefers the strike nearer the row, then the smaller strike. |
profile.oi_share_pct | number or null | This expiry's share of the symbol's total open interest, in percent, rounded to 4 decimal places. |
Errors on this route · Profile states
| HTTP | Code | When |
|---|---|---|
422 | VALIDATION_ERROR | Unknown field, nested value, repeated key, bad JSON, a bad alias, or a cursor that does not match this request. |
413 | PAYLOAD_TOO_LARGE | The JSON body is larger than 4 KiB. |
503 | DATA_WARMING | The datapoint is not built yet. Wait Retry-After seconds (1). |
422 | RESULT_TOO_LARGE | The uncompressed JSON would exceed 512 KiB. Narrow the filter. |
422 | UNKNOWN_SYMBOL | Required symbol is not in the universe. |
422 | UNKNOWN_EXPIRY | Expiry 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.
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.
| Name | Type | Required | Values |
|---|---|---|---|
symbol | string | One of | One ticker. Letter case folds to uppercase. |
expiry | string | One of | YYYY-MM-DD, or an alias 0, 1, w1–w4, M1–M3, ALL. Alias case folds onto that canonical form. |
method | string | No | cumulative (default) or standalone. |
cursor | string | No | Previous 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 --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.
{ "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
| Field | Type | Meaning |
|---|---|---|
symbol | string | Canonical ticker. Copy it from list_symbols. Letter case folds to uppercase. |
expiration_date | date | Calendar expiry, YYYY-MM-DD, ET. |
dte | integer | Days to that expiry, as stored for the row. |
aliases | array of strings | 0, 1, w1–w4, M1–M3, ALL. Weekly aliases use a lowercase w. Monthly aliases and ALL stay uppercase. |
is_monthly | boolean | True on the monthly expiry date. Same rule as discovery expiries. |
snapshot_type | string | latest on a current row. history on a stored day. |
snapshot_at | datetime ET or null | When the source row was captured. ISO 8601 with an ET offset, to milliseconds. |
spot_price | number or null | Underlying price of this snapshot, at most 4 decimal places. A future shows it before tick rounding. Null when the source has no price. |
sessions | array of strings | Empty on a current row. On history: pre, open, and close that matched the filter. |
levels | object | Label to strike and weight, primary five only, fixed order. |
Errors on this route · Primary key levels
| HTTP | Code | When |
|---|---|---|
422 | VALIDATION_ERROR | Unknown field, nested value, repeated key, bad JSON, a bad alias, or a cursor that does not match this request. |
413 | PAYLOAD_TOO_LARGE | The JSON body is larger than 4 KiB. |
503 | DATA_WARMING | The datapoint is not built yet. Wait Retry-After seconds (1). |
422 | RESULT_TOO_LARGE | The uncompressed JSON would exceed 512 KiB. Narrow the filter. |
422 | UNKNOWN_SYMBOL | Required symbol is not in the universe. |
422 | UNKNOWN_EXPIRY | Expiry 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.
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.
| Name | Type | Required | Values |
|---|---|---|---|
symbol | string | One of | One ticker. Letter case folds to uppercase. |
expiry | string | One of | YYYY-MM-DD, or an alias 0, 1, w1–w4, M1–M3, ALL. Alias case folds onto that canonical form. |
method | string | No | cumulative (default) or standalone. |
cursor | string | No | Previous 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 --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.
{ "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
| Field | Type | Meaning |
|---|---|---|
symbol | string | Canonical ticker. Copy it from list_symbols. Letter case folds to uppercase. |
expiration_date | date | Calendar expiry, YYYY-MM-DD, ET. |
dte | integer | Days to that expiry, as stored for the row. |
aliases | array of strings | 0, 1, w1–w4, M1–M3, ALL. Weekly aliases use a lowercase w. Monthly aliases and ALL stay uppercase. |
is_monthly | boolean | True on the monthly expiry date. Same rule as discovery expiries. |
snapshot_type | string | latest on a current row. history on a stored day. |
snapshot_at | datetime ET or null | When the source row was captured. ISO 8601 with an ET offset, to milliseconds. |
spot_price | number or null | Underlying price of this snapshot, at most 4 decimal places. A future shows it before tick rounding. Null when the source has no price. |
sessions | array of strings | Empty on a current row. On history: pre, open, and close that matched the filter. |
levels | object | Secondary labels in fixed order. A zero or missing wall norm is omitted. |
Errors on this route · Secondary key levels
| HTTP | Code | When |
|---|---|---|
422 | VALIDATION_ERROR | Unknown field, nested value, repeated key, bad JSON, a bad alias, or a cursor that does not match this request. |
413 | PAYLOAD_TOO_LARGE | The JSON body is larger than 4 KiB. |
503 | DATA_WARMING | The datapoint is not built yet. Wait Retry-After seconds (1). |
422 | RESULT_TOO_LARGE | The uncompressed JSON would exceed 512 KiB. Narrow the filter. |
422 | UNKNOWN_SYMBOL | Required symbol is not in the universe. |
422 | UNKNOWN_EXPIRY | Expiry 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.
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.
| Name | Type | Required | Values |
|---|---|---|---|
symbol | string | One of | One ticker. Letter case folds to uppercase. |
expiry | string | One of | YYYY-MM-DD, or an alias 0, 1, w1–w4, M1–M3, ALL. Alias case folds onto that canonical form. |
method | string | No | cumulative (default) or standalone. |
cursor | string | No | Previous 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 --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.
{ "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
| Field | Type | Meaning |
|---|---|---|
symbol | string | Canonical ticker. Copy it from list_symbols. Letter case folds to uppercase. |
expiration_date | date | Calendar expiry, YYYY-MM-DD, ET. |
dte | integer | Days to that expiry, as stored for the row. |
aliases | array of strings | 0, 1, w1–w4, M1–M3, ALL. Weekly aliases use a lowercase w. Monthly aliases and ALL stay uppercase. |
is_monthly | boolean | True on the monthly expiry date. Same rule as discovery expiries. |
snapshot_type | string | latest on a current row. history on a stored day. |
snapshot_at | datetime ET or null | When the source row was captured. ISO 8601 with an ET offset, to milliseconds. |
spot_price | number or null | Underlying price of this snapshot, at most 4 decimal places. A future shows it before tick rounding. Null when the source has no price. |
sessions | array of strings | Empty on a current row. On history: pre, open, and close that matched the filter. |
exposure | object | net_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_gex | number or null | Net gamma exposure of this expiry. Rounded to 4 decimal places. |
exposure.net_gex_prev_close | number or null | net_gex at the previous close. Null when that snapshot does not exist. Rounded to 4 decimal places. |
exposure.net_gex_change | number or null | net_gex minus net_gex_prev_close. Null when either side is null. Rounded to 4 decimal places. |
exposure.net_dex | number or null | Net delta exposure of this expiry. Rounded to 4 decimal places. |
exposure.net_dex_prev_close | number or null | net_dex at the previous close. Null when that snapshot does not exist. Rounded to 4 decimal places. |
exposure.net_dex_change | number or null | net_dex minus net_dex_prev_close. Null when either side is null. Rounded to 4 decimal places. |
exposure.oi_share_pct | number or null | This expiry's share of the symbol's total open interest, in percent, rounded to 4 decimal places. |
exposure.oi_share_pct_prev_close | number or null | oi_share_pct at the previous close. Null when that snapshot does not exist. |
exposure.oi_share_pct_change | number or null | oi_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_at | datetime ET or null | Time 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
| HTTP | Code | When |
|---|---|---|
422 | VALIDATION_ERROR | Unknown field, nested value, repeated key, bad JSON, a bad alias, or a cursor that does not match this request. |
413 | PAYLOAD_TOO_LARGE | The JSON body is larger than 4 KiB. |
503 | DATA_WARMING | The datapoint is not built yet. Wait Retry-After seconds (1). |
422 | RESULT_TOO_LARGE | The uncompressed JSON would exceed 512 KiB. Narrow the filter. |
422 | UNKNOWN_SYMBOL | Required symbol is not in the universe. |
422 | UNKNOWN_EXPIRY | Expiry 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.
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
| Name | Type | Required | Values |
|---|---|---|---|
symbol | string | Yes | One ticker. Letter case folds to uppercase. |
expiry | string | Yes | YYYY-MM-DD, or an alias 0, 1, w1–w4, M1–M3, ALL. Alias case folds. |
method | string | No | cumulative (default) or standalone. |
cursor | string | No | Previous 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 --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.
{ "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
| Field | Type | Meaning |
|---|---|---|
symbol | string | Canonical ticker. Copy it from list_symbols. Letter case folds to uppercase. |
expiration_date | date | Calendar expiry, YYYY-MM-DD, ET. |
dte | integer | Days to that expiry, as stored for the row. |
aliases | array of strings | Expiry aliases. is_monthly sits beside them on the header. |
is_monthly | boolean | True on the monthly expiry date, same rule as discovery expiries. |
snapshot_type | string | latest on a current row. history on a stored day. |
snapshot_at | datetime ET or null | When the source row was captured. ISO 8601 with an ET offset, to milliseconds. |
spot_price | number or null | Underlying 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_at | datetime ET or null | Time of the key-level row. Null when that row is missing. This is not the chain snapshot_at. |
strike | number | Strike in the chain slice, descending. Rounded to 4 decimal places. |
value | number | net GEX at this strike, rounded to 4 decimal places. |
levels | array of strings | Webapp labels on this strike, or an empty array. This is not the key-level object. |
unmatched_levels | object | Label to strike when that strike is not in the slice. Empty object when every label matched. |
Errors on this route · Strike net gex
| HTTP | Code | When |
|---|---|---|
422 | VALIDATION_ERROR | Unknown field, nested value, repeated key, bad JSON, a bad alias, or a cursor that does not match this request. |
413 | PAYLOAD_TOO_LARGE | The JSON body is larger than 4 KiB. |
503 | DATA_WARMING | The datapoint is not built yet. Wait Retry-After seconds (1). |
422 | RESULT_TOO_LARGE | The uncompressed JSON would exceed 512 KiB. Narrow the filter. |
422 | UNKNOWN_SYMBOL | Required symbol is not in the universe. |
422 | UNKNOWN_EXPIRY | Expiry 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.
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
| Name | Type | Required | Values |
|---|---|---|---|
symbol | string | Yes | One ticker. Letter case folds to uppercase. |
expiry | string | Yes | YYYY-MM-DD, or an alias 0, 1, w1–w4, M1–M3, ALL. Alias case folds. |
method | string | No | cumulative (default) or standalone. |
cursor | string | No | Previous 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 --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.
{ "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
| Field | Type | Meaning |
|---|---|---|
symbol | string | Canonical ticker. Copy it from list_symbols. Letter case folds to uppercase. |
expiration_date | date | Calendar expiry, YYYY-MM-DD, ET. |
dte | integer | Days to that expiry, as stored for the row. |
aliases | array of strings | Expiry aliases. is_monthly sits beside them on the header. |
is_monthly | boolean | True on the monthly expiry date, same rule as discovery expiries. |
snapshot_type | string | latest on a current row. history on a stored day. |
snapshot_at | datetime ET or null | When the source row was captured. ISO 8601 with an ET offset, to milliseconds. |
spot_price | number or null | Underlying 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_at | datetime ET or null | Time of the key-level row. Null when that row is missing. This is not the chain snapshot_at. |
strike | number | Strike in the chain slice, descending. Rounded to 4 decimal places. |
value | number | net DEX at this strike, rounded to 4 decimal places. |
levels | array of strings | Webapp labels on this strike, or an empty array. This is not the key-level object. |
unmatched_levels | object | Label to strike when that strike is not in the slice. Empty object when every label matched. |
Errors on this route · Strike net dex
| HTTP | Code | When |
|---|---|---|
422 | VALIDATION_ERROR | Unknown field, nested value, repeated key, bad JSON, a bad alias, or a cursor that does not match this request. |
413 | PAYLOAD_TOO_LARGE | The JSON body is larger than 4 KiB. |
503 | DATA_WARMING | The datapoint is not built yet. Wait Retry-After seconds (1). |
422 | RESULT_TOO_LARGE | The uncompressed JSON would exceed 512 KiB. Narrow the filter. |
422 | UNKNOWN_SYMBOL | Required symbol is not in the universe. |
422 | UNKNOWN_EXPIRY | Expiry 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.
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
| Name | Type | Required | Values |
|---|---|---|---|
symbol | string | Yes | One ticker. Letter case folds to uppercase. |
expiry | string | Yes | YYYY-MM-DD, or an alias 0, 1, w1–w4, M1–M3, ALL. Alias case folds. |
method | string | No | cumulative (default) or standalone. |
cursor | string | No | Previous 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 --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.
{ "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
| Field | Type | Meaning |
|---|---|---|
symbol | string | Canonical ticker. Copy it from list_symbols. Letter case folds to uppercase. |
expiration_date | date | Calendar expiry, YYYY-MM-DD, ET. |
dte | integer | Days to that expiry, as stored for the row. |
aliases | array of strings | Expiry aliases. is_monthly sits beside them on the header. |
is_monthly | boolean | True on the monthly expiry date, same rule as discovery expiries. |
snapshot_type | string | latest on a current row. history on a stored day. |
snapshot_at | datetime ET or null | When the source row was captured. ISO 8601 with an ET offset, to milliseconds. |
spot_price | number or null | Underlying 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_at | datetime ET or null | Time of the key-level row. Null when that row is missing. This is not the chain snapshot_at. |
strike | number | Strike in the chain slice, descending. Rounded to 4 decimal places. |
value | number | net open interest at this strike. |
levels | array of strings | Webapp labels on this strike, or an empty array. This is not the key-level object. |
unmatched_levels | object | Label to strike when that strike is not in the slice. Empty object when every label matched. |
Errors on this route · Strike net oi
| HTTP | Code | When |
|---|---|---|
422 | VALIDATION_ERROR | Unknown field, nested value, repeated key, bad JSON, a bad alias, or a cursor that does not match this request. |
413 | PAYLOAD_TOO_LARGE | The JSON body is larger than 4 KiB. |
503 | DATA_WARMING | The datapoint is not built yet. Wait Retry-After seconds (1). |
422 | RESULT_TOO_LARGE | The uncompressed JSON would exceed 512 KiB. Narrow the filter. |
422 | UNKNOWN_SYMBOL | Required symbol is not in the universe. |
422 | UNKNOWN_EXPIRY | Expiry 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.
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
| Name | Type | Required | Values |
|---|---|---|---|
symbol | string | Yes | One ticker. Letter case folds to uppercase. |
expiry | string | Yes | YYYY-MM-DD, or an alias 0, 1, w1–w4, M1–M3, ALL. Alias case folds. |
method | string | No | cumulative (default) or standalone. |
cursor | string | No | Previous 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 --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.
{ "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
| Field | Type | Meaning |
|---|---|---|
symbol | string | Canonical ticker. Copy it from list_symbols. Letter case folds to uppercase. |
expiration_date | date | Calendar expiry, YYYY-MM-DD, ET. |
dte | integer | Days to that expiry, as stored for the row. |
aliases | array of strings | Expiry aliases. is_monthly sits beside them on the header. |
is_monthly | boolean | True on the monthly expiry date, same rule as discovery expiries. |
snapshot_type | string | latest on a current row. history on a stored day. |
snapshot_at | datetime ET or null | When the source row was captured. ISO 8601 with an ET offset, to milliseconds. |
spot_price | number or null | Underlying 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_at | datetime ET or null | Time of the key-level row. Null when that row is missing. This is not the chain snapshot_at. |
strike | number | Strike in the chain slice, descending. Rounded to 4 decimal places. |
value | number | absolute open interest at this strike. |
levels | array of strings | Webapp labels on this strike, or an empty array. This is not the key-level object. |
unmatched_levels | object | Label to strike when that strike is not in the slice. Empty object when every label matched. |
Errors on this route · Strike abs oi
| HTTP | Code | When |
|---|---|---|
422 | VALIDATION_ERROR | Unknown field, nested value, repeated key, bad JSON, a bad alias, or a cursor that does not match this request. |
413 | PAYLOAD_TOO_LARGE | The JSON body is larger than 4 KiB. |
503 | DATA_WARMING | The datapoint is not built yet. Wait Retry-After seconds (1). |
422 | RESULT_TOO_LARGE | The uncompressed JSON would exceed 512 KiB. Narrow the filter. |
422 | UNKNOWN_SYMBOL | Required symbol is not in the universe. |
422 | UNKNOWN_EXPIRY | Expiry 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.
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
| Name | Type | Required | Values |
|---|---|---|---|
symbol | string | Yes | One ticker. Letter case folds to uppercase. |
expiry | string | Yes | YYYY-MM-DD, or an alias 0, 1, w1–w4, M1–M3, ALL. Alias case folds. |
method | string | No | cumulative (default) or standalone. |
cursor | string | No | Previous 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 --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.
{ "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
| Field | Type | Meaning |
|---|---|---|
symbol | string | Canonical ticker. Copy it from list_symbols. Letter case folds to uppercase. |
expiration_date | date | Calendar expiry, YYYY-MM-DD, ET. |
dte | integer | Days to that expiry, as stored for the row. |
aliases | array of strings | Expiry aliases. is_monthly sits beside them on the header. |
is_monthly | boolean | True on the monthly expiry date, same rule as discovery expiries. |
snapshot_type | string | latest on a current row. history on a stored day. |
snapshot_at | datetime ET or null | When the source row was captured. ISO 8601 with an ET offset, to milliseconds. |
spot_price | number or null | Underlying 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_at | datetime ET or null | Time of the key-level row. Null when that row is missing. This is not the chain snapshot_at. |
strike | number | Strike in the chain slice, descending. Rounded to 4 decimal places. |
value | number | absolute GEX at this strike, rounded to 4 decimal places. |
levels | array of strings | Webapp labels on this strike, or an empty array. This is not the key-level object. |
unmatched_levels | object | Label to strike when that strike is not in the slice. Empty object when every label matched. |
Errors on this route · Strike abs gex
| HTTP | Code | When |
|---|---|---|
422 | VALIDATION_ERROR | Unknown field, nested value, repeated key, bad JSON, a bad alias, or a cursor that does not match this request. |
413 | PAYLOAD_TOO_LARGE | The JSON body is larger than 4 KiB. |
503 | DATA_WARMING | The datapoint is not built yet. Wait Retry-After seconds (1). |
422 | RESULT_TOO_LARGE | The uncompressed JSON would exceed 512 KiB. Narrow the filter. |
422 | UNKNOWN_SYMBOL | Required symbol is not in the universe. |
422 | UNKNOWN_EXPIRY | Expiry 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.
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
| Name | Type | Required | Values |
|---|---|---|---|
symbol | string | Yes | One ticker. Letter case folds to uppercase. |
expiry | string | Yes | YYYY-MM-DD, or an alias 0, 1, w1–w4, M1–M3, ALL. Alias case folds. |
method | string | No | cumulative (default) or standalone. |
cursor | string | No | Previous 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 --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.
{ "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
| Field | Type | Meaning |
|---|---|---|
symbol | string | Canonical ticker. Copy it from list_symbols. Letter case folds to uppercase. |
expiration_date | date | Calendar expiry, YYYY-MM-DD, ET. |
dte | integer | Days to that expiry, as stored for the row. |
aliases | array of strings | Expiry aliases. is_monthly sits beside them on the header. |
is_monthly | boolean | True on the monthly expiry date, same rule as discovery expiries. |
snapshot_type | string | latest on a current row. history on a stored day. |
snapshot_at | datetime ET or null | When the source row was captured. ISO 8601 with an ET offset, to milliseconds. |
spot_price | number or null | Underlying 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_at | datetime ET or null | Time of the key-level row. Null when that row is missing. This is not the chain snapshot_at. |
strike | number | Strike in the chain slice, descending. Rounded to 4 decimal places. |
value | number | net volume at this strike. |
levels | array of strings | Webapp labels on this strike, or an empty array. This is not the key-level object. |
unmatched_levels | object | Label to strike when that strike is not in the slice. Empty object when every label matched. |
Errors on this route · Strike net volume
| HTTP | Code | When |
|---|---|---|
422 | VALIDATION_ERROR | Unknown field, nested value, repeated key, bad JSON, a bad alias, or a cursor that does not match this request. |
413 | PAYLOAD_TOO_LARGE | The JSON body is larger than 4 KiB. |
503 | DATA_WARMING | The datapoint is not built yet. Wait Retry-After seconds (1). |
422 | RESULT_TOO_LARGE | The uncompressed JSON would exceed 512 KiB. Narrow the filter. |
422 | UNKNOWN_SYMBOL | Required symbol is not in the universe. |
422 | UNKNOWN_EXPIRY | Expiry 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.
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
| Name | Type | Required | Values |
|---|---|---|---|
symbol | string | Yes | One ticker. Letter case folds to uppercase. |
expiry | string | Yes | YYYY-MM-DD, or an alias 0, 1, w1–w4, M1–M3, ALL. Alias case folds. |
method | string | No | cumulative (default) or standalone. |
cursor | string | No | Previous 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 --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.
{ "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
| Field | Type | Meaning |
|---|---|---|
symbol | string | Canonical ticker. Copy it from list_symbols. Letter case folds to uppercase. |
expiration_date | date | Calendar expiry, YYYY-MM-DD, ET. |
dte | integer | Days to that expiry, as stored for the row. |
aliases | array of strings | Expiry aliases. is_monthly sits beside them on the header. |
is_monthly | boolean | True on the monthly expiry date, same rule as discovery expiries. |
snapshot_type | string | latest on a current row. history on a stored day. |
snapshot_at | datetime ET or null | When the source row was captured. ISO 8601 with an ET offset, to milliseconds. |
spot_price | number or null | Underlying 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_at | datetime ET or null | Time of the key-level row. Null when that row is missing. This is not the chain snapshot_at. |
strike | number | Strike in the chain slice, descending. Rounded to 4 decimal places. |
value | number | GEX by volume at this strike, rounded to 4 decimal places. |
levels | array of strings | Webapp labels on this strike, or an empty array. This is not the key-level object. |
unmatched_levels | object | Label to strike when that strike is not in the slice. Empty object when every label matched. |
Errors on this route · Strike gex by volume
| HTTP | Code | When |
|---|---|---|
422 | VALIDATION_ERROR | Unknown field, nested value, repeated key, bad JSON, a bad alias, or a cursor that does not match this request. |
413 | PAYLOAD_TOO_LARGE | The JSON body is larger than 4 KiB. |
503 | DATA_WARMING | The datapoint is not built yet. Wait Retry-After seconds (1). |
422 | RESULT_TOO_LARGE | The uncompressed JSON would exceed 512 KiB. Narrow the filter. |
422 | UNKNOWN_SYMBOL | Required symbol is not in the universe. |
422 | UNKNOWN_EXPIRY | Expiry 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