Range
0DTE boxes and four distance lists.
How far the expected move and the delta ladder sit, and the spot each distance is measured from. No lower or upper bound is returned.
The four distance lists require at least one of symbol or expiry. Sending both is fine. expiry is a date or an alias 0, 1, w1–w4, M1–M3, ALL. Alias case folds. A negative DTE is omitted. A non-positive binary or 1σ distance is omitted. distance_pts is instrument points, at most 4 decimals, with no tick rounding. distance_pct is that distance over the expiry’s spot, rounded to 4 decimal places. That spot is the row’s spot_price, the expiry’s average opex spot, scaled like the distance. Each row’s snapshot_at is its own expiry’s latest opex update.
An unknown expiry next to a symbol is 422 UNKNOWN_EXPIRY. The same unknown expiry with no symbol is HTTP 200 and an empty items list. error.details[0].available lists up to 20 dates the symbol does have.
Box levels are em_upper, em_lower, sigma_upper, and sigma_lower. They are the expected-move box, not a quote. Each snapshot’s spot_price is its peg, the price the box is centred on; widest.spot_price is the peg of the latest snapshot that arrived. The session keys eod, pre, and open are always present. A session that was not stored is null. A symbol with its own row uses that row, unscaled. A micro future uses its parent future, unscaled. XSP uses the SPX row at one tenth. Another synthetic with no row of its own is omitted.
Live options and derived data refresh every minute on NYSE weekdays from 06:40 through 16:00 ET. Outside that window the last snapshot is served. The clocks, the 0DTE capture times, and past boxes are in the glossary.
Lists the latest and previous 0DTE expected-move boxes. A box has target_date, snapshots (eod, pre, open), and widest. The MCP tool is list_0dte_expected_move_boxes. The arguments are this same JSON body. The bearer token stays on the HTTP header.
Parameters · 0DTE boxes
| Name | Type | Required | Values |
|---|---|---|---|
symbols | array of strings | No | Up to 300 tickers. Unknown names are left out. Order in the response is symbol ascending. |
cursor | string | No | Previous meta.next_cursor. Omit it on the first page. |
Page size is fixed at 100 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:
{}{"symbols":["SPX"]}
curl --compressed \ --request POST \ --url "${TANUKI_BASE_URL}/api/v1/range/0dte-box" \ --header "Authorization: Bearer 12345.YOUR_API_KEY" \ --header "Content-Type: application/json" \ --header "Accept: application/json" \ --data '{"symbols":["SPX"]}'
Live builder output for the request in this file. The row list was short enough to keep. latest.snapshots keeps every session: pre snapshot_at 2026-10-21T06:35:02-04:00; open snapshot_at 2026-10-21T09:33:02-04:00; eod snapshot_at 2026-10-20T16:15:02-04:00. Those snapshot_at values are the box write times in get_glossary (about 06:35, 09:33 and 16:15 ET). 06:40 ET is when live data is published, not when the box is written. previous is the prior day's box. built_at is the builder health clock of this capture.
{ "ok": true, "data": { "items": [ { "symbol": "SPX", "snapshot_type": "latest", "latest": { "target_date": "2026-10-21", "snapshots": { "eod": { "valid_from": "2026-10-20T16:00:00-04:00", "valid_until": "2026-10-21T16:00:00-04:00", "snapshot_at": "2026-10-20T16:15:02-04:00", "spot_price": 7710.2, "em_upper": 7748.96, "em_lower": 7671.44, "sigma_upper": 7764.87, "sigma_lower": 7655.53 }, "pre": { "valid_from": "2026-10-21T06:30:00-04:00", "valid_until": "2026-10-21T16:00:00-04:00", "snapshot_at": "2026-10-21T06:35:02-04:00", "spot_price": 7723.38, "em_upper": 7755.07, "em_lower": 7691.69, "sigma_upper": 7767.09, "sigma_lower": 7679.67 }, "open": { "valid_from": "2026-10-21T09:30:00-04:00", "valid_until": "2026-10-21T16:00:00-04:00", "snapshot_at": "2026-10-21T09:33:02-04:00", "spot_price": 7738.33, "em_upper": 7772.77, "em_lower": 7703.89, "sigma_upper": 7775.85, "sigma_lower": 7700.81 } }, "widest": { "spot_price": 7738.33, "em_upper": 7772.77, "em_lower": 7671.44, "sigma_upper": 7775.85, "sigma_lower": 7655.53 } }, "previous": { "target_date": "2026-10-20", "snapshots": { "eod": { "valid_from": "2026-10-19T16:00:00-04:00", "valid_until": "2026-10-20T16:00:00-04:00", "snapshot_at": "2026-10-19T16:15:01-04:00", "spot_price": 7691.49, "em_upper": 7732.75, "em_lower": 7650.23, "sigma_upper": 7750.32, "sigma_lower": 7632.66 }, "pre": { "valid_from": "2026-10-20T06:30:00-04:00", "valid_until": "2026-10-20T16:00:00-04:00", "snapshot_at": "2026-10-20T06:35:01-04:00", "spot_price": 7688.21, "em_upper": 7721.68, "em_lower": 7654.74, "sigma_upper": 7734.19, "sigma_lower": 7642.23 }, "open": { "valid_from": "2026-10-20T09:30:00-04:00", "valid_until": "2026-10-20T16:00:00-04:00", "snapshot_at": "2026-10-20T09:33:01-04:00", "spot_price": 7684.56, "em_upper": 7714.65, "em_lower": 7654.47, "sigma_upper": 7727.01, "sigma_lower": 7642.11 } }, "widest": { "spot_price": 7684.56, "em_upper": 7732.75, "em_lower": 7650.23, "sigma_upper": 7750.32, "sigma_lower": 7632.66 } } } ] }, "meta": { "request": { "symbols": [ "SPX" ] }, "count": 1, "total": 1, "page": 1, "page_count": 1, "next_cursor": null, "generation": "3f1a595090be", "as_of": {}, "built_at": "2026-10-23T01:08:02-04:00", "omitted": [], "docs": { "reference": "https://tanukitrade.com/docs/api/range#list_0dte_expected_move_boxes", "glossary": "https://tanukitrade.com/docs/api/glossary" } } }
Response fields · 0DTE boxes
| Field | Type | Meaning |
|---|---|---|
symbol | string | Canonical ticker. Copy it from list_symbols. Letter case folds to uppercase. |
snapshot_type | string | latest on this route. |
latest | object | target_date, snapshots, widest. eod, pre, and open are always present; a missing session is null. Each snapshot's spot_price is its peg, the price the box is centred on; widest.spot_price is the peg of the latest snapshot that arrived. |
previous | object or null | The prior box, same shape as latest, or null when there is none. |
Errors on this route · 0DTE boxes
| 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. |
Auth, rate limit, and the other shared failures are on Errors.
Lists the binary expected move. distance_pts is the per-expiry average of the stored expected move, at most 4 decimal places. distance_pct is that distance over the expiry opex spot, in percent, rounded to 4 decimal places. The MCP tool is list_range_binary_expected_move. The arguments are this same JSON body. The bearer token stays on the HTTP header.
Parameters · Binary expected move
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. |
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":"1"}{"symbol":"SPX","expiry":"1"}
curl --compressed \ --request POST \ --url "${TANUKI_BASE_URL}/api/v1/range/binary-expected-move" \ --header "Authorization: Bearer 12345.YOUR_API_KEY" \ --header "Content-Type: application/json" \ --header "Accept: application/json" \ --data '{"symbol":"SPX","expiry":"1"}'
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-26", "dte": 3, "aliases": [ "1" ], "is_monthly": false, "snapshot_type": "latest", "snapshot_at": "2026-10-21T16:01:44-04:00", "spot_price": 7760.88, "distance_pts": 74.5264, "distance_pct": 0.9603 } ] }, "meta": { "request": { "symbol": "SPX", "expiry": "1" }, "count": 1, "total": 1, "page": 1, "page_count": 1, "next_cursor": null, "generation": "934247a0818e.0277c81a9576", "as_of": {}, "built_at": "2026-10-23T01:08:02-04:00", "omitted": [], "docs": { "reference": "https://tanukitrade.com/docs/api/range#list_range_binary_expected_move", "glossary": "https://tanukitrade.com/docs/api/glossary" } } }
Response fields · Binary expected move
| 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 | That expiry's average opex spot, the distance_pct basis, at most 4 decimal places. A synthetic is scaled the same way as the distance. |
distance_pts | number | Instrument points, at most 4 decimal places. |
distance_pct | number | distance_pts / that expiry's opex spot × 100, in percent, rounded to 4 decimal places. |
Errors on this route · Binary expected move
| 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 1-sigma distance_pts. The generator’s 0DTE override is already in the stored column. Same scaling and omission rules as the binary expected move. distance_pct is a percent. ivx is not returned. The MCP tool is list_range_std1_sigma. The arguments are this same JSON body. The bearer token stays on the HTTP header.
Parameters · 1-sigma range
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. |
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":"1"}{"symbol":"SPX","expiry":"1"}
curl --compressed \ --request POST \ --url "${TANUKI_BASE_URL}/api/v1/range/std1-sigma" \ --header "Authorization: Bearer 12345.YOUR_API_KEY" \ --header "Content-Type: application/json" \ --header "Accept: application/json" \ --data '{"symbol":"SPX","expiry":"1"}'
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-26", "dte": 3, "aliases": [ "1" ], "is_monthly": false, "snapshot_type": "latest", "snapshot_at": "2026-10-21T16:01:44-04:00", "spot_price": 7760.88, "distance_pts": 105.0961, "distance_pct": 1.3542 } ] }, "meta": { "request": { "symbol": "SPX", "expiry": "1" }, "count": 1, "total": 1, "page": 1, "page_count": 1, "next_cursor": null, "generation": "934247a0818e.0277c81a9576", "as_of": {}, "built_at": "2026-10-23T01:08:02-04:00", "omitted": [], "docs": { "reference": "https://tanukitrade.com/docs/api/range#list_range_std1_sigma", "glossary": "https://tanukitrade.com/docs/api/glossary" } } }
Response fields · 1-sigma range
| 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 | That expiry's average opex spot, the distance_pct basis, at most 4 decimal places. A synthetic is scaled the same way as the distance. |
distance_pts | number | Instrument points, at most 4 decimal places. |
distance_pct | number | distance_pts / that expiry's opex spot × 100, in percent, rounded to 4 decimal places. |
Errors on this route · 1-sigma range
| 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 16, 20, 25, 30, 35, and 40 delta distances. Puts are stored negative; the response uses the absolute distance. A rung is null unless both sides are finite. The row returns spot_price, that expiry's average opex spot, not a live quote. A rung does not include a strike or a price. The MCP tool is list_range_delta_interpolated_ladder. The arguments are this same JSON body. The bearer token stays on the HTTP header.
Parameters · Delta ladder
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. |
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":"1"}{"symbol":"SPX","expiry":"1"}
curl --compressed \ --request POST \ --url "${TANUKI_BASE_URL}/api/v1/range/delta-interpolated-ladder" \ --header "Authorization: Bearer 12345.YOUR_API_KEY" \ --header "Content-Type: application/json" \ --header "Accept: application/json" \ --data '{"symbol":"SPX","expiry":"1"}'
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-26", "dte": 3, "aliases": [ "1" ], "is_monthly": false, "snapshot_type": "latest", "snapshot_at": "2026-10-21T16:01:44-04:00", "spot_price": 7760.88, "ladder": { "16": { "put": { "distance_pts": 106.88, "distance_pct": 1.3772 }, "call": { "distance_pts": 90.2658, "distance_pct": 1.1631 } }, "20": { "put": { "distance_pts": 87.1073, "distance_pct": 1.1224 }, "call": { "distance_pts": 77.8556, "distance_pct": 1.0032 } }, "25": { "put": { "distance_pts": 66.8501, "distance_pct": 0.8614 }, "call": { "distance_pts": 64.0164, "distance_pct": 0.8249 } }, "30": { "put": { "distance_pts": 49.685, "distance_pct": 0.6402 }, "call": { "distance_pts": 51.386, "distance_pct": 0.6621 } }, "35": { "put": { "distance_pts": 34.5294, "distance_pct": 0.4449 }, "call": { "distance_pts": 39.3581, "distance_pct": 0.5071 } }, "40": { "put": { "distance_pts": 20.6958, "distance_pct": 0.2667 }, "call": { "distance_pts": 27.6247, "distance_pct": 0.3559 } } } } ] }, "meta": { "request": { "symbol": "SPX", "expiry": "1" }, "count": 1, "total": 1, "page": 1, "page_count": 1, "next_cursor": null, "generation": "934247a0818e.0277c81a9576", "as_of": {}, "built_at": "2026-10-23T01:08:02-04:00", "omitted": [], "docs": { "reference": "https://tanukitrade.com/docs/api/range#list_range_delta_interpolated_ladder", "glossary": "https://tanukitrade.com/docs/api/glossary" } } }
Response fields · Delta ladder
| 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 | That expiry's average opex spot, the distance_pct basis, at most 4 decimal places. A synthetic is scaled the same way as the distance. |
ladder | object | Keys "16" through "40". Each side is put and call, each with distance_pts and distance_pct. |
Errors on this route · Delta ladder
| 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.
Each side is the mean of the available positive binary expected move, positive 1-sigma distance, and absolute delta-16 distance. put and call sit on the row. skew is on the row. components carries bem_pts, std1_pts, delta16_put_pts, and delta16_call_pts. The MCP tool is list_range_tanuki_smart_range. The arguments are this same JSON body. The bearer token stays on the HTTP header.
Parameters · Tanuki Smart range
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. |
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":"1"}{"symbol":"SPX","expiry":"1"}
curl --compressed \ --request POST \ --url "${TANUKI_BASE_URL}/api/v1/range/tanuki-smart-range" \ --header "Authorization: Bearer 12345.YOUR_API_KEY" \ --header "Content-Type: application/json" \ --header "Accept: application/json" \ --data '{"symbol":"SPX","expiry":"1"}'
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-26", "dte": 3, "aliases": [ "1" ], "is_monthly": false, "snapshot_type": "latest", "snapshot_at": "2026-10-21T16:01:44-04:00", "spot_price": 7760.88, "put": { "distance_pts": 95.5008, "distance_pct": 1.2305 }, "call": { "distance_pts": 89.9628, "distance_pct": 1.1592 }, "skew": "put", "components": { "bem_pts": 74.5264, "std1_pts": 105.0961, "delta16_put_pts": 106.88, "delta16_call_pts": 90.2658 } } ] }, "meta": { "request": { "symbol": "SPX", "expiry": "1" }, "count": 1, "total": 1, "page": 1, "page_count": 1, "next_cursor": null, "generation": "934247a0818e.0277c81a9576", "as_of": {}, "built_at": "2026-10-23T01:08:02-04:00", "omitted": [], "docs": { "reference": "https://tanukitrade.com/docs/api/range#list_range_tanuki_smart_range", "glossary": "https://tanukitrade.com/docs/api/glossary" } } }
Response fields · Tanuki Smart range
| 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 | That expiry's average opex spot, the distance_pct basis, at most 4 decimal places. A synthetic is scaled the same way as the distance. |
put | object | distance_pts and distance_pct. |
call | object | distance_pts and distance_pct. |
skew | string | symmetric when the wings differ by at most 0.01, otherwise call or put for the wider wing. |
components | object | bem_pts, std1_pts, delta16_put_pts, and delta16_call_pts. Null when that input is missing. |
Errors on this route · Tanuki Smart range
| 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