Exposure by strike
Strike-by-strike exposure for one symbol and expiry.
Nine routes under POST /api/v1/gamma/strikes/. Each returns the full chain slice, one row per strike, with the same header. Only the meaning of value changes.
Both symbol and expiry are required. method defaults to cumulative, every expiry through the selected date. Choose standalone to isolate one expiration. The slice is the full chain, not a strike window. Pages are 400 rows. Strikes stay on the level grid. The summary routes, profile state, key levels, and net exposures, are on Gamma profile & levels. These routes belong to the gamma group: a token limited to an explicit group list needs gamma to call them.
The strike header is symbol, expiration_date, dte, aliases, is_monthly, snapshot_type, snapshot_at, spot_price, levels_snapshot_at, items, and unmatched_levels. spot_price is the chain snapshot’s price; for a future it is the base price times today’s conversion factor, then rounded to the contract tick. XSP is not tick-rounded. is_monthly uses the same rule as discovery expiries.
Net vanna and net charm are dollar delta, call minus put, with the net GEX dealer convention (dealers long the calls, short the puts). Net vanna is the delta change for a 1 volatility point rise in IV: a positive value means falling IV makes dealers buy the underlying. Net charm is the delta change over one calendar day, through expiry on the expiry day: a positive value means time passing makes dealers sell. These two routes add value_total to the header, the sum over the whole slice, not only the page. They are live only.
Live strike refresh: the strike routes publish a new snapshot about once a minute on NYSE weekdays from 06:40 through 16:00 ET. For your own private, non-commercial intraday strike history or alert, call the strike route you need once per minute in that window and store or evaluate each response subject to the retention and deletion rules in Section 19 of the Terms.
History scope: the history API stores high-level gamma profile state, key levels, and net exposures at named sessions. It does not provide strike-by-strike history, and no strike-history route is planned.
Support window: the live routes on this page are supported on NYSE trading days from 06:40 through 16:00 ET. Outside that window, on weekends, on holidays, and during maintenance, they still answer with the last snapshot, but that answer is not meant for trading decisions, and we do not investigate differences from the webapp outside the window. The history routes are supported at any time. Details: data clock.
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.
Valid bodies, from the minimal to the one the sample answers:
{"symbol":"SPX","expiry":"w1"}{"symbol":"SPX","expiry":"w1","method":"standalone"}
curl --compressed \ --request POST \ --url "${TANUKI_BASE_URL}/api/v1/gamma/strikes/net-gex" \ --header "Authorization: Bearer 12345.YOUR_API_KEY" \ --header "Content-Type: application/json" \ --header "Accept: application/json" \ --data '{"symbol":"SPX","expiry":"w1","method":"standalone"}'
Live builder output for the request in this file. The first 3 rows of the page are shown; "..." is not a row. meta.count is the untrimmed page length (238) and meta.total is the filtered total (238). built_at is the builder health clock of this capture.
{ "ok": true, "data": { "symbol": "SPX", "expiration_date": "2026-11-06", "dte": 1, "aliases": [ "1", "w1" ], "is_monthly": false, "snapshot_type": "latest", "snapshot_at": "2026-10-28T16:01:49.356-04:00", "spot_price": 7744.59, "levels_snapshot_at": "2026-10-28T15:59:05.000-04:00", "items": [ { "strike": 8325, "value": 1858.7016, "levels": [] }, { "strike": 8300, "value": 22149.5274, "levels": [] }, { "strike": 8275, "value": 12778.5735, "levels": [] }, "..." ], "unmatched_levels": { "nCOI": 8800, "nPOI": 6350, "COI": 8800, "POI": 6350, "AbOI": 6350 } }, "meta": { "request": { "symbol": "SPX", "expiry": "w1", "method": "standalone" }, "count": 238, "total": 238, "page": 1, "page_count": 1, "next_cursor": null, "generation": "508c3caeef44.2ae9b2b3a5fb", "as_of": { "price": "2026-10-28T16:01:49.356-04:00" }, "built_at": "2026-11-05T19:34:02-05:00", "omitted": [], "docs": { "reference": "https://tanukitrade.com/docs/api/gamma#list_gamma_strikes_net_gex", "glossary": "https://tanukitrade.com/docs/api/glossary" } } }
Response fields · Strike net GEX
| 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, then rounded to the contract tick. XSP is not tick-rounded. 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.
For the concept, calculation, and interpretation, read Delta exposure in Learn.
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.
Valid bodies, from the minimal to the one the sample answers:
{"symbol":"SPX","expiry":"w1"}{"symbol":"SPX","expiry":"w1","method":"standalone"}
curl --compressed \ --request POST \ --url "${TANUKI_BASE_URL}/api/v1/gamma/strikes/net-dex" \ --header "Authorization: Bearer 12345.YOUR_API_KEY" \ --header "Content-Type: application/json" \ --header "Accept: application/json" \ --data '{"symbol":"SPX","expiry":"w1","method":"standalone"}'
Live builder output for the request in this file. The first 3 rows of the page are shown; "..." is not a row. meta.count is the untrimmed page length (238) and meta.total is the filtered total (238). built_at is the builder health clock of this capture.
{ "ok": true, "data": { "symbol": "SPX", "expiration_date": "2026-11-06", "dte": 1, "aliases": [ "1", "w1" ], "is_monthly": false, "snapshot_type": "latest", "snapshot_at": "2026-10-28T16:01:49.356-04:00", "spot_price": 7744.59, "levels_snapshot_at": "2026-10-28T15:59:05.000-04:00", "items": [ { "strike": 8325, "value": 65054.556, "levels": [] }, { "strike": 8300, "value": -1460784.5658, "levels": [] }, { "strike": 8275, "value": 523921.5135, "levels": [] }, "..." ], "unmatched_levels": { "nCOI": 8800, "nPOI": 6350, "COI": 8800, "POI": 6350, "AbOI": 6350 } }, "meta": { "request": { "symbol": "SPX", "expiry": "w1", "method": "standalone" }, "count": 238, "total": 238, "page": 1, "page_count": 1, "next_cursor": null, "generation": "508c3caeef44.2ae9b2b3a5fb", "as_of": { "price": "2026-10-28T16:01:49.356-04:00" }, "built_at": "2026-11-05T19:34:02-05:00", "omitted": [], "docs": { "reference": "https://tanukitrade.com/docs/api/gamma#list_gamma_strikes_net_dex", "glossary": "https://tanukitrade.com/docs/api/glossary" } } }
Response fields · Strike net DEX
| 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, then rounded to the contract tick. XSP is not tick-rounded. 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.
Valid bodies, from the minimal to the one the sample answers:
{"symbol":"SPX","expiry":"w1"}{"symbol":"SPX","expiry":"w1","method":"standalone"}
curl --compressed \ --request POST \ --url "${TANUKI_BASE_URL}/api/v1/gamma/strikes/net-oi" \ --header "Authorization: Bearer 12345.YOUR_API_KEY" \ --header "Content-Type: application/json" \ --header "Accept: application/json" \ --data '{"symbol":"SPX","expiry":"w1","method":"standalone"}'
Live builder output for the request in this file. The first 3 rows of the page are shown; "..." is not a row. meta.count is the untrimmed page length (238) and meta.total is the filtered total (238). built_at is the builder health clock of this capture.
{ "ok": true, "data": { "symbol": "SPX", "expiration_date": "2026-11-06", "dte": 1, "aliases": [ "1", "w1" ], "is_monthly": false, "snapshot_type": "latest", "snapshot_at": "2026-10-28T16:01:49.356-04:00", "spot_price": 7744.59, "levels_snapshot_at": "2026-10-28T15:59:05.000-04:00", "items": [ { "strike": 8325, "value": 24, "levels": [] }, { "strike": 8300, "value": 286, "levels": [] }, { "strike": 8275, "value": 165, "levels": [] }, "..." ], "unmatched_levels": { "nCOI": 8800, "nPOI": 6350, "COI": 8800, "POI": 6350, "AbOI": 6350 } }, "meta": { "request": { "symbol": "SPX", "expiry": "w1", "method": "standalone" }, "count": 238, "total": 238, "page": 1, "page_count": 1, "next_cursor": null, "generation": "508c3caeef44.2ae9b2b3a5fb", "as_of": { "price": "2026-10-28T16:01:49.356-04:00" }, "built_at": "2026-11-05T19:34:02-05:00", "omitted": [], "docs": { "reference": "https://tanukitrade.com/docs/api/gamma#list_gamma_strikes_net_oi", "glossary": "https://tanukitrade.com/docs/api/glossary" } } }
Response fields · Strike net OI
| 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, then rounded to the contract tick. XSP is not tick-rounded. 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.
Valid bodies, from the minimal to the one the sample answers:
{"symbol":"SPX","expiry":"w1"}{"symbol":"SPX","expiry":"w1","method":"standalone"}
curl --compressed \ --request POST \ --url "${TANUKI_BASE_URL}/api/v1/gamma/strikes/abs-oi" \ --header "Authorization: Bearer 12345.YOUR_API_KEY" \ --header "Content-Type: application/json" \ --header "Accept: application/json" \ --data '{"symbol":"SPX","expiry":"w1","method":"standalone"}'
Live builder output for the request in this file. The first 3 rows of the page are shown; "..." is not a row. meta.count is the untrimmed page length (238) and meta.total is the filtered total (238). built_at is the builder health clock of this capture.
{ "ok": true, "data": { "symbol": "SPX", "expiration_date": "2026-11-06", "dte": 1, "aliases": [ "1", "w1" ], "is_monthly": false, "snapshot_type": "latest", "snapshot_at": "2026-10-28T16:01:49.356-04:00", "spot_price": 7744.59, "levels_snapshot_at": "2026-10-28T15:59:05.000-04:00", "items": [ { "strike": 8325, "value": 24, "levels": [] }, { "strike": 8300, "value": 292, "levels": [] }, { "strike": 8275, "value": 165, "levels": [] }, "..." ], "unmatched_levels": { "nCOI": 8800, "nPOI": 6350, "COI": 8800, "POI": 6350, "AbOI": 6350 } }, "meta": { "request": { "symbol": "SPX", "expiry": "w1", "method": "standalone" }, "count": 238, "total": 238, "page": 1, "page_count": 1, "next_cursor": null, "generation": "508c3caeef44.2ae9b2b3a5fb", "as_of": { "price": "2026-10-28T16:01:49.356-04:00" }, "built_at": "2026-11-05T19:34:02-05:00", "omitted": [], "docs": { "reference": "https://tanukitrade.com/docs/api/gamma#list_gamma_strikes_abs_oi", "glossary": "https://tanukitrade.com/docs/api/glossary" } } }
Response fields · Strike abs OI
| 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, then rounded to the contract tick. XSP is not tick-rounded. 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.
Valid bodies, from the minimal to the one the sample answers:
{"symbol":"SPX","expiry":"w1"}{"symbol":"SPX","expiry":"w1","method":"standalone"}
curl --compressed \ --request POST \ --url "${TANUKI_BASE_URL}/api/v1/gamma/strikes/abs-gex" \ --header "Authorization: Bearer 12345.YOUR_API_KEY" \ --header "Content-Type: application/json" \ --header "Accept: application/json" \ --data '{"symbol":"SPX","expiry":"w1","method":"standalone"}'
Live builder output for the request in this file. The first 3 rows of the page are shown; "..." is not a row. meta.count is the untrimmed page length (238) and meta.total is the filtered total (238). built_at is the builder health clock of this capture.
{ "ok": true, "data": { "symbol": "SPX", "expiration_date": "2026-11-06", "dte": 1, "aliases": [ "1", "w1" ], "is_monthly": false, "snapshot_type": "latest", "snapshot_at": "2026-10-28T16:01:49.356-04:00", "spot_price": 7744.59, "levels_snapshot_at": "2026-10-28T15:59:05.000-04:00", "items": [ { "strike": 8325, "value": 1858.7016, "levels": [] }, { "strike": 8300, "value": 22614.2028, "levels": [] }, { "strike": 8275, "value": 12778.5735, "levels": [] }, "..." ], "unmatched_levels": { "nCOI": 8800, "nPOI": 6350, "COI": 8800, "POI": 6350, "AbOI": 6350 } }, "meta": { "request": { "symbol": "SPX", "expiry": "w1", "method": "standalone" }, "count": 238, "total": 238, "page": 1, "page_count": 1, "next_cursor": null, "generation": "508c3caeef44.2ae9b2b3a5fb", "as_of": { "price": "2026-10-28T16:01:49.356-04:00" }, "built_at": "2026-11-05T19:34:02-05:00", "omitted": [], "docs": { "reference": "https://tanukitrade.com/docs/api/gamma#list_gamma_strikes_abs_gex", "glossary": "https://tanukitrade.com/docs/api/glossary" } } }
Response fields · Strike abs GEX
| 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, then rounded to the contract tick. XSP is not tick-rounded. 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.
Valid bodies, from the minimal to the one the sample answers:
{"symbol":"SPX","expiry":"w1"}{"symbol":"SPX","expiry":"w1","method":"standalone"}
curl --compressed \ --request POST \ --url "${TANUKI_BASE_URL}/api/v1/gamma/strikes/net-volume" \ --header "Authorization: Bearer 12345.YOUR_API_KEY" \ --header "Content-Type: application/json" \ --header "Accept: application/json" \ --data '{"symbol":"SPX","expiry":"w1","method":"standalone"}'
Live builder output for the request in this file. The first 3 rows of the page are shown; "..." is not a row. meta.count is the untrimmed page length (238) and meta.total is the filtered total (238). built_at is the builder health clock of this capture.
{ "ok": true, "data": { "symbol": "SPX", "expiration_date": "2026-11-06", "dte": 1, "aliases": [ "1", "w1" ], "is_monthly": false, "snapshot_type": "latest", "snapshot_at": "2026-10-28T16:01:49.356-04:00", "spot_price": 7744.59, "levels_snapshot_at": "2026-10-28T15:59:05.000-04:00", "items": [ { "strike": 8325, "value": 0, "levels": [] }, { "strike": 8300, "value": 13, "levels": [] }, { "strike": 8275, "value": 6, "levels": [] }, "..." ], "unmatched_levels": { "nCOI": 8800, "nPOI": 6350, "COI": 8800, "POI": 6350, "AbOI": 6350 } }, "meta": { "request": { "symbol": "SPX", "expiry": "w1", "method": "standalone" }, "count": 238, "total": 238, "page": 1, "page_count": 1, "next_cursor": null, "generation": "508c3caeef44.2ae9b2b3a5fb", "as_of": { "price": "2026-10-28T16:01:49.356-04:00" }, "built_at": "2026-11-05T19:34:02-05:00", "omitted": [], "docs": { "reference": "https://tanukitrade.com/docs/api/gamma#list_gamma_strikes_net_volume", "glossary": "https://tanukitrade.com/docs/api/glossary" } } }
Response fields · Strike net volume
| 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, then rounded to the contract tick. XSP is not tick-rounded. 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.
Valid bodies, from the minimal to the one the sample answers:
{"symbol":"SPX","expiry":"w1"}{"symbol":"SPX","expiry":"w1","method":"standalone"}
curl --compressed \ --request POST \ --url "${TANUKI_BASE_URL}/api/v1/gamma/strikes/gex-by-volume" \ --header "Authorization: Bearer 12345.YOUR_API_KEY" \ --header "Content-Type: application/json" \ --header "Accept: application/json" \ --data '{"symbol":"SPX","expiry":"w1","method":"standalone"}'
Live builder output for the request in this file. The first 3 rows of the page are shown; "..." is not a row. meta.count is the untrimmed page length (238) and meta.total is the filtered total (238). built_at is the builder health clock of this capture.
{ "ok": true, "data": { "symbol": "SPX", "expiration_date": "2026-11-06", "dte": 1, "aliases": [ "1", "w1" ], "is_monthly": false, "snapshot_type": "latest", "snapshot_at": "2026-10-28T16:01:49.356-04:00", "spot_price": 7744.59, "levels_snapshot_at": "2026-10-28T15:59:05.000-04:00", "items": [ { "strike": 8325, "value": 0, "levels": [] }, { "strike": 8300, "value": 10.068, "levels": [] }, { "strike": 8275, "value": 4.6468, "levels": [] }, "..." ], "unmatched_levels": { "nCOI": 8800, "nPOI": 6350, "COI": 8800, "POI": 6350, "AbOI": 6350 } }, "meta": { "request": { "symbol": "SPX", "expiry": "w1", "method": "standalone" }, "count": 238, "total": 238, "page": 1, "page_count": 1, "next_cursor": null, "generation": "508c3caeef44.2ae9b2b3a5fb", "as_of": { "price": "2026-10-28T16:01:49.356-04:00" }, "built_at": "2026-11-05T19:34:02-05:00", "omitted": [], "docs": { "reference": "https://tanukitrade.com/docs/api/gamma#list_gamma_strikes_gex_by_volume", "glossary": "https://tanukitrade.com/docs/api/glossary" } } }
Response fields · Strike GEX by volume
| 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, then rounded to the contract tick. XSP is not tick-rounded. 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.
Lists strike-level net vanna for one symbol and expiry: the dollar delta change for a 1 volatility point rise in implied volatility. Call minus put, the dealer convention of net GEX. A positive value means falling IV makes dealers buy the underlying. value_total is the sum over the whole slice. Live only; there is no strike history. The MCP tool is list_gamma_strikes_net_vanna. The arguments are this same JSON body. The bearer token stays on the HTTP header.
For the concept, calculation, and interpretation, read Vanna exposure in Learn.
Parameters · Strike net vanna
| 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.
Valid bodies, from the minimal to the one the sample answers:
{"symbol":"SPX","expiry":"w1"}{"symbol":"SPX","expiry":"w1","method":"standalone"}
curl --compressed \ --request POST \ --url "${TANUKI_BASE_URL}/api/v1/gamma/strikes/net-vanna" \ --header "Authorization: Bearer 12345.YOUR_API_KEY" \ --header "Content-Type: application/json" \ --header "Accept: application/json" \ --data '{"symbol":"SPX","expiry":"w1","method":"standalone"}'
Live builder output for the request in this file. The first 3 rows of the page are shown; "..." is not a row. meta.count is the untrimmed page length (238) and meta.total is the filtered total (238). built_at is the builder health clock of this capture.
{ "ok": true, "data": { "symbol": "SPX", "expiration_date": "2026-11-06", "dte": 1, "aliases": [ "1", "w1" ], "is_monthly": false, "snapshot_type": "latest", "snapshot_at": "2026-10-28T16:01:49.356-04:00", "spot_price": 7744.59, "levels_snapshot_at": "2026-10-28T15:59:05.000-04:00", "value_total": 1100598103.5221, "items": [ { "strike": 8325, "value": 40408.7304, "levels": [] }, { "strike": 8300, "value": 529216.7685, "levels": [] }, { "strike": 8275, "value": 336330.7767, "levels": [] }, "..." ], "unmatched_levels": { "nCOI": 8800, "nPOI": 6350, "COI": 8800, "POI": 6350, "AbOI": 6350 } }, "meta": { "request": { "symbol": "SPX", "expiry": "w1", "method": "standalone" }, "count": 238, "total": 238, "page": 1, "page_count": 1, "next_cursor": null, "generation": "508c3caeef44.2ae9b2b3a5fb", "as_of": { "price": "2026-10-28T16:01:49.356-04:00" }, "built_at": "2026-11-05T19:34:02-05:00", "omitted": [], "docs": { "reference": "https://tanukitrade.com/docs/api/gamma#list_gamma_strikes_net_vanna", "glossary": "https://tanukitrade.com/docs/api/glossary" } } }
Response fields · Strike net vanna
| 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, then rounded to the contract tick. XSP is not tick-rounded. 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. |
value_total | number or null | Sum of value over every strike of the slice, not only this page. Null when the slice has no strikes. |
strike | number | Strike in the chain slice, descending. Rounded to 4 decimal places. |
value | number or null | Dollar delta change for a 1 volatility point IV rise: vanna per point times open interest times 100 times the underlying price, call minus put. Positive: an IV drop makes dealers buy about this much of the underlying; an IV rise makes them sell. |
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 vanna
| 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 charm for one symbol and expiry: the dollar delta change over one calendar day, through expiry on the expiry day. Call minus put, the dealer convention of net GEX. A positive value means time passing makes dealers sell the underlying. value_total is the sum over the whole slice. Live only; there is no strike history. The MCP tool is list_gamma_strikes_net_charm. The arguments are this same JSON body. The bearer token stays on the HTTP header.
For the concept, calculation, and interpretation, read Charm exposure in Learn.
Parameters · Strike net charm
| 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.
Valid bodies, from the minimal to the one the sample answers:
{"symbol":"SPX","expiry":"w1"}{"symbol":"SPX","expiry":"w1","method":"standalone"}
curl --compressed \ --request POST \ --url "${TANUKI_BASE_URL}/api/v1/gamma/strikes/net-charm" \ --header "Authorization: Bearer 12345.YOUR_API_KEY" \ --header "Content-Type: application/json" \ --header "Accept: application/json" \ --data '{"symbol":"SPX","expiry":"w1","method":"standalone"}'
Live builder output for the request in this file. The first 3 rows of the page are shown; "..." is not a row. meta.count is the untrimmed page length (238) and meta.total is the filtered total (238). built_at is the builder health clock of this capture.
{ "ok": true, "data": { "symbol": "SPX", "expiration_date": "2026-11-06", "dte": 1, "aliases": [ "1", "w1" ], "is_monthly": false, "snapshot_type": "latest", "snapshot_at": "2026-10-28T16:01:49.356-04:00", "spot_price": 7744.59, "levels_snapshot_at": "2026-10-28T15:59:05.000-04:00", "value_total": -1035748925.7854, "items": [ { "strike": 8325, "value": -36133.1591, "levels": [] }, { "strike": 8300, "value": -461856.3692, "levels": [] }, { "strike": 8275, "value": -285089.9748, "levels": [] }, "..." ], "unmatched_levels": { "nCOI": 8800, "nPOI": 6350, "COI": 8800, "POI": 6350, "AbOI": 6350 } }, "meta": { "request": { "symbol": "SPX", "expiry": "w1", "method": "standalone" }, "count": 238, "total": 238, "page": 1, "page_count": 1, "next_cursor": null, "generation": "508c3caeef44.2ae9b2b3a5fb", "as_of": { "price": "2026-10-28T16:01:49.356-04:00" }, "built_at": "2026-11-05T19:34:02-05:00", "omitted": [], "docs": { "reference": "https://tanukitrade.com/docs/api/gamma#list_gamma_strikes_net_charm", "glossary": "https://tanukitrade.com/docs/api/glossary" } } }
Response fields · Strike net charm
| 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, then rounded to the contract tick. XSP is not tick-rounded. 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. |
value_total | number or null | Sum of value over every strike of the slice, not only this page. Null when the slice has no strikes. |
strike | number | Strike in the chain slice, descending. Rounded to 4 decimal places. |
value | number or null | Dollar delta change over one calendar day with spot and IV unchanged, through expiry on the expiry day: charm per day times open interest times 100 times the underlying price, call minus put. Positive: dealers sell about this much of the underlying as the day passes; negative: they buy. |
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 charm
| 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