History
One ET day, or one symbol’s past rows.
Stored sessions for volatility, the 0DTE box, gamma, and technical context.
Volatility and technical history require at least one of symbol or snapshot_date. Sending both is fine, and returns that one row. Rows come newest day first. A date with no stored session is HTTP 200 and an empty list, not a 503. DATA_WARMING (HTTP 503) means the current datapoint is not built yet: wait the Retry-After seconds and retry. Past 0DTE boxes are POST /api/v1/history/range/0dte-box (list_history_0dte_expected_move_boxes). The clocks are in the glossary.
Gamma history requires snapshot_date and at least one of symbol or expiry. sessions may be pre, open, close. Omit it for every snapshot. pre is the day’s first snapshot from 06:30 to 09:30 ET. open is the earliest after 09:30. close is the latest after 09:30, and only when the day is before today ET.
History rows and the current realized-volatility row use snapshot_date. The current price-change row has no day field: its time is snapshot_at. The price-change history row has spot_price, that day’s close on the same scale as change_pts, at most 4 decimals; a missing close is null. change_pct is rounded to 4 decimal places; change_pts is at most 4 decimals, with no tick rounding. A future’s history change_pts uses the conversion factor of the row’s ET day. A day before the first positive finite factor is omitted on every history route, including price change, realized volatility, volatility, the 0DTE box, and gamma. A micro future uses its parent’s factor when its own key is absent. Volatility values are not scaled. A stored 0DTE box is not scaled a second time. Gamma history spot_price and levels use that day’s factor. XSP uses its fixed one-tenth scale on every SPX day. If the conversion-factor table cannot be read, gamma, volatility, realized volatility, and 0DTE history return 503 DATA_WARMING instead of an empty list. A listed symbol or XSP requested alone does not wait; a day or expiry view that would include a mapped future does. Call/put skew history resolves an alias only for M1, M2, or M3: the next three standard monthly expiries counted from the row date, and only when the generator expiry is that exact date.
Reads daily IV rank. Required: at least one of symbol or snapshot_date. Sending both is fine. The latest stored day uses snapshot_type latest. IV rank 0 is kept. Values are not scaled. A mapped symbol is omitted before the first day with a positive finite conversion factor. XSP is returned on every base day. If the conversion-factor table cannot be read, the response is 503 DATA_WARMING, not an empty list. A listed symbol or XSP does not wait for the table. A day that would include a mapped future does. The MCP tool is list_history_volatility_iv_rank. The arguments are this same JSON body. The bearer token stays on the HTTP header.
Parameters · IV rank history
One of Required: at least one of symbol or snapshot_date. Sending both is fine.
| Name | Type | Required | Values |
|---|---|---|---|
snapshot_date | string | One of | One ET day, YYYY-MM-DD. |
symbol | string | One of | One ticker. Letter case folds to uppercase. |
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"}{"snapshot_date":"2026-10-15"}{"snapshot_date":"2026-10-15","symbol":"SPX"}
curl --compressed \ --request POST \ --url "${TANUKI_BASE_URL}/api/v1/history/volatility/iv-rank" \ --header "Authorization: Bearer 12345.YOUR_API_KEY" \ --header "Content-Type: application/json" \ --header "Accept: application/json" \ --data '{"snapshot_date":"2026-10-15","symbol":"SPX"}'
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", "is_synthetic": false, "mapped_from": null, "snapshot_date": "2026-10-15", "snapshot_type": "history", "snapshot_at": "2026-10-15T16:01:15.000-04:00", "iv_rank": 34.26 } ] }, "meta": { "request": { "snapshot_date": "2026-10-15", "symbol": "SPX" }, "count": 1, "total": 1, "page": 1, "page_count": 1, "next_cursor": null, "generation": "dd5e362e22d5", "as_of": {}, "built_at": "2026-10-23T01:08:02-04:00", "omitted": [], "docs": { "reference": "https://tanukitrade.com/docs/api/history#list_history_volatility_iv_rank", "glossary": "https://tanukitrade.com/docs/api/glossary" } } }
Response fields · IV rank history
| Field | Type | Meaning |
|---|---|---|
symbol | string | Canonical ticker. Copy it from list_symbols. Letter case folds to uppercase. |
is_synthetic | boolean | True when the ticker is mapped from another symbol. False is a listed underlying. |
mapped_from | string or null | The symbol a synthetic is mapped from. Null on a listed underlying. A micro names the optionable base, not its parent future. |
snapshot_date | date | The ET day of the row. Current IV metrics do not use this name. |
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. |
iv_rank | number or null | IV rank for that session. 0 is kept. Rounded to 4 decimal places. |
Errors on this route · IV rank history
| 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. |
Auth, rate limit, and the other shared failures are on Errors.
Reads daily IVx average and ivx_5d_change_pct. ivx_avg is annualized volatility in percent and keeps no unit suffix. IVx 0 and a 5-day change of 99 are null. Values are not scaled. A mapped symbol is omitted before the first day with a positive finite conversion factor. XSP is returned on every base day. If the conversion-factor table cannot be read, the response is 503 DATA_WARMING, not an empty list. A listed symbol or XSP does not wait for the table. A day that would include a mapped future does. The MCP tool is list_history_volatility_ivx. The arguments are this same JSON body. The bearer token stays on the HTTP header.
Parameters · IVx history
One of Required: at least one of symbol or snapshot_date. Sending both is fine.
| Name | Type | Required | Values |
|---|---|---|---|
snapshot_date | string | One of | One ET day, YYYY-MM-DD. |
symbol | string | One of | One ticker. Letter case folds to uppercase. |
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"}{"snapshot_date":"2026-10-15"}{"snapshot_date":"2026-10-15","symbol":"SPX"}
curl --compressed \ --request POST \ --url "${TANUKI_BASE_URL}/api/v1/history/volatility/ivx" \ --header "Authorization: Bearer 12345.YOUR_API_KEY" \ --header "Content-Type: application/json" \ --header "Accept: application/json" \ --data '{"snapshot_date":"2026-10-15","symbol":"SPX"}'
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", "is_synthetic": false, "mapped_from": null, "snapshot_date": "2026-10-15", "snapshot_type": "history", "snapshot_at": "2026-10-15T16:01:15.000-04:00", "ivx_avg": 16.3, "ivx_5d_change_pct": 1.76 } ] }, "meta": { "request": { "snapshot_date": "2026-10-15", "symbol": "SPX" }, "count": 1, "total": 1, "page": 1, "page_count": 1, "next_cursor": null, "generation": "dd5e362e22d5", "as_of": {}, "built_at": "2026-10-23T01:08:02-04:00", "omitted": [], "docs": { "reference": "https://tanukitrade.com/docs/api/history#list_history_volatility_ivx", "glossary": "https://tanukitrade.com/docs/api/glossary" } } }
Response fields · IVx history
| Field | Type | Meaning |
|---|---|---|
symbol | string | Canonical ticker. Copy it from list_symbols. Letter case folds to uppercase. |
is_synthetic | boolean | True when the ticker is mapped from another symbol. False is a listed underlying. |
mapped_from | string or null | The symbol a synthetic is mapped from. Null on a listed underlying. A micro names the optionable base, not its parent future. |
snapshot_date | date | ET session of the row, YYYY-MM-DD. |
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. |
ivx_avg | number or null | IVx average. 0 is null. Rounded to 4 decimal places. |
ivx_5d_change_pct | number or null | Five-day IVx change in percent, rounded to 4 decimal places. 99 is null. |
Errors on this route · IVx history
| 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. |
Auth, rate limit, and the other shared failures are on Errors.
Reads the daily call/put skew at the generator optimal expiry. An alias on this history is only M1, M2, or M3. Values are not scaled. A mapped symbol is omitted before the first day with a positive finite conversion factor. XSP is returned on every base day. If the conversion-factor table cannot be read, the response is 503 DATA_WARMING, not an empty list. A listed symbol or XSP does not wait for the table. A day that would include a mapped future does. The MCP tool is list_history_volatility_call_put_skew. The arguments are this same JSON body. The bearer token stays on the HTTP header.
Parameters · Call/put skew history
One of Required: at least one of symbol or snapshot_date. Sending both is fine.
| Name | Type | Required | Values |
|---|---|---|---|
snapshot_date | string | One of | One ET day, YYYY-MM-DD. |
symbol | string | One of | One ticker. Letter case folds to uppercase. |
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"}{"snapshot_date":"2026-10-15"}{"snapshot_date":"2026-10-15","symbol":"SPX"}
curl --compressed \ --request POST \ --url "${TANUKI_BASE_URL}/api/v1/history/volatility/call-put-skew" \ --header "Authorization: Bearer 12345.YOUR_API_KEY" \ --header "Content-Type: application/json" \ --header "Accept: application/json" \ --data '{"snapshot_date":"2026-10-15","symbol":"SPX"}'
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", "is_synthetic": false, "mapped_from": null, "snapshot_date": "2026-10-15", "snapshot_type": "history", "snapshot_at": "2026-10-15T16:01:15.000-04:00", "call_put_skew": -66.89, "optimal_expiry": { "expiration_date": "2026-11-20", "dte": 36, "aliases": [ "M2" ], "is_monthly": true } } ] }, "meta": { "request": { "snapshot_date": "2026-10-15", "symbol": "SPX" }, "count": 1, "total": 1, "page": 1, "page_count": 1, "next_cursor": null, "generation": "dd5e362e22d5", "as_of": {}, "built_at": "2026-10-23T01:08:02-04:00", "omitted": [], "docs": { "reference": "https://tanukitrade.com/docs/api/history#list_history_volatility_call_put_skew", "glossary": "https://tanukitrade.com/docs/api/glossary" } } }
Response fields · Call/put skew history
| Field | Type | Meaning |
|---|---|---|
symbol | string | Canonical ticker. Copy it from list_symbols. Letter case folds to uppercase. |
is_synthetic | boolean | True when the ticker is mapped from another symbol. False is a listed underlying. |
mapped_from | string or null | The symbol a synthetic is mapped from. Null on a listed underlying. A micro names the optionable base, not its parent future. |
snapshot_date | date | ET session of the row, YYYY-MM-DD. |
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. |
call_put_skew | number or null | Call/put skew on that session's optimal expiry, times 100. A zero value is null. Rounded to 4 decimal places. |
optimal_expiry | object or null | expiration_date, dte, aliases, is_monthly. Aliases are only M1, M2, or M3. |
Errors on this route · Call/put skew history
| 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. |
Auth, rate limit, and the other shared failures are on Errors.
Reads valid 0DTE expected-move days. Required: at least one of symbol or snapshot_date. Sending both is fine. mode is separated or widest_known (default). A mapped future is omitted before the first day with a positive finite conversion factor. Prices are not multiplied again: an own row is already that instrument's price, a micro uses its parent's stored price, and XSP is already one tenth of SPX. If the conversion-factor table cannot be read, the response is 503 DATA_WARMING, not an empty list. A listed symbol or XSP does not wait for the table. A day that would include a mapped future does. No data is an empty list. The MCP tool is list_history_0dte_expected_move_boxes. The arguments are this same JSON body. The bearer token stays on the HTTP header.
Parameters · 0DTE box history
One of Required: at least one of symbol or snapshot_date. Sending both is fine.
| Name | Type | Required | Values |
|---|---|---|---|
snapshot_date | string | One of | One ET day, YYYY-MM-DD. |
symbol | string | One of | One ticker. Letter case folds to uppercase. |
mode | string | No | widest_known (default) or separated. |
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"}{"snapshot_date":"2026-10-15"}{"snapshot_date":"2026-10-15","symbol":"SPX","mode":"widest_known"}
curl --compressed \ --request POST \ --url "${TANUKI_BASE_URL}/api/v1/history/range/0dte-box" \ --header "Authorization: Bearer 12345.YOUR_API_KEY" \ --header "Content-Type: application/json" \ --header "Accept: application/json" \ --data '{"snapshot_date":"2026-10-15","symbol":"SPX","mode":"widest_known"}'
Live builder output for the request in this file. The row list was short enough to keep. widest_known changes keep the written snapshot_at: eod snapshot_at 2026-10-14T16:15:01-04:00; pre snapshot_at 2026-10-15T06:35:01-04:00; open snapshot_at 2026-10-15T09:33:01-04:00. The glossary box write times are about 06:35, 09:33 and 16:15 ET, not the 06:40 data clock. built_at is the builder health clock of this capture.
{ "ok": true, "data": { "items": [ { "symbol": "SPX", "target_date": "2026-10-15", "snapshot_type": "history", "changes": [ { "trigger": "eod", "changed_at": "2026-10-14T16:00:00-04:00", "snapshot_at": "2026-10-14T16:15:01-04:00", "valid_until": "2026-10-15T06:30:00-04:00", "spot_price": 7715.48, "em_upper": 7760.71, "em_lower": 7670.25, "sigma_upper": 7782.3, "sigma_lower": 7648.66 }, { "trigger": "pre", "changed_at": "2026-10-15T06:30:00-04:00", "snapshot_at": "2026-10-15T06:35:01-04:00", "valid_until": "2026-10-15T09:30:00-04:00", "spot_price": 7697.38, "em_upper": 7760.71, "em_lower": 7659.43, "sigma_upper": 7782.3, "sigma_lower": 7644.45 }, { "trigger": "open", "changed_at": "2026-10-15T09:30:00-04:00", "snapshot_at": "2026-10-15T09:33:01-04:00", "valid_until": "2026-10-15T16:00:00-04:00", "spot_price": 7686.91, "em_upper": 7760.71, "em_lower": 7655.59, "sigma_upper": 7782.3, "sigma_lower": 7642.67 } ] } ] }, "meta": { "request": { "snapshot_date": "2026-10-15", "symbol": "SPX", "mode": "widest_known" }, "count": 1, "total": 1, "page": 1, "page_count": 1, "next_cursor": null, "generation": "a3b5a6f43ab6", "as_of": {}, "built_at": "2026-10-23T01:08:02-04:00", "omitted": [], "docs": { "reference": "https://tanukitrade.com/docs/api/history#list_history_0dte_expected_move_boxes", "glossary": "https://tanukitrade.com/docs/api/glossary" } } }
Response fields · 0DTE box history
| Field | Type | Meaning |
|---|---|---|
symbol | string | Canonical ticker. Copy it from list_symbols. Letter case folds to uppercase. |
target_date | date | The box day. |
snapshot_type | string | history. |
changes | array of objects | widest_known only. trigger, changed_at, snapshot_at, valid_until, spot_price (the peg of the snapshot that triggered the change), and the four box levels. |
snapshots | object | separated mode only. Same session keys as the latest box, each with its peg as spot_price. |
Errors on this route · 0DTE box history
| 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. |
Auth, rate limit, and the other shared failures are on Errors.
Lists stored gamma profile snapshots for one ET day. A mapped symbol's history is available from the first day with a conversion factor. If the conversion-factor table cannot be read, the response is 503 DATA_WARMING, not an empty list. A listed symbol or XSP does not wait for the table. An expiry-only view that would include a mapped future does. The MCP tool is list_history_gamma_profile_states. The arguments are this same JSON body. The bearer token stays on the HTTP header.
Parameters · Profile history
One of Required: at least one of symbol or expiry. Sending both is fine.
| Name | Type | Required | Values |
|---|---|---|---|
snapshot_date | string | Yes | One ET day, YYYY-MM-DD. A bad value says snapshot_date must be an ET day. |
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. |
sessions | array of strings | No | pre, open, close. Unique. Omit it for every snapshot. Missing is echoed as null. |
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 60 seconds (rc_ttl).
Valid bodies, from the minimal to the one the sample answers:
{"snapshot_date":"2026-10-15","symbol":"SPX"}{"snapshot_date":"2026-10-15","expiry":"w1"}{"snapshot_date":"2026-10-15","symbol":"SPX","sessions":["close"]}
curl --compressed \ --request POST \ --url "${TANUKI_BASE_URL}/api/v1/history/gamma/profile-states" \ --header "Authorization: Bearer 12345.YOUR_API_KEY" \ --header "Content-Type: application/json" \ --header "Accept: application/json" \ --data '{"snapshot_date":"2026-10-15","symbol":"SPX","sessions":["close"]}'
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 (53) and meta.total is the filtered total (53). 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-15", "dte": 0, "aliases": [ "0" ], "is_monthly": false, "snapshot_type": "history", "snapshot_at": "2026-10-15T15:35:07.000-04:00", "spot_price": 7747.79, "sessions": [ "close" ], "profile": { "state": "POS_TRANSITION", "polarity": "positive", "state_description": "Price is above HVL but below cTrans: positive gamma transition zone.", "is_broken": false, "oi_share_pct": 1.53, "confluence": [ { "strike": 7750, "count": 5, "levels": [ "cT", "C1", "Ab1", "nCV", "CV" ] }, { "strike": 7745, "count": 3, "levels": [ "pT", "HVL", "P3" ] }, { "strike": 7575, "count": 3, "levels": [ "nPOI", "POI", "AbOI" ] }, "..." ] } }, { "symbol": "SPX", "expiration_date": "2026-10-16", "dte": 1, "aliases": [ "1", "w1", "M1" ], "is_monthly": true, "snapshot_type": "history", "snapshot_at": "2026-10-15T15:35:07.000-04:00", "spot_price": 7747.79, "sessions": [ "close" ], "profile": { "state": "POS_TRANSITION", "polarity": "positive", "state_description": "Price is above HVL but below cTrans: positive gamma transition zone.", "is_broken": false, "oi_share_pct": 12.99, "confluence": [ { "strike": 7700, "count": 3, "levels": [ "P1", "Ab3", "PV" ] }, { "strike": 7800, "count": 3, "levels": [ "C1", "Ab2", "nCV" ] }, { "strike": 7000, "count": 3, "levels": [ "D+", "POI", "AbOI" ] }, "..." ] } }, { "symbol": "SPX", "expiration_date": "2026-10-19", "dte": 4, "aliases": [], "is_monthly": false, "snapshot_type": "history", "snapshot_at": "2026-10-15T15:35:07.000-04:00", "spot_price": 7747.79, "sessions": [ "close" ], "profile": { "state": "NEG", "polarity": "negative", "state_description": "Price is below pTrans but above P1: negative gamma profile.", "is_broken": false, "oi_share_pct": 0.55, "confluence": [ { "strike": 7700, "count": 3, "levels": [ "P1", "Ab3", "PV" ] }, { "strike": 7800, "count": 3, "levels": [ "C1", "Ab2", "nCV" ] }, { "strike": 7000, "count": 3, "levels": [ "D+", "POI", "AbOI" ] }, "..." ] } }, "..." ] }, "meta": { "request": { "snapshot_date": "2026-10-15", "symbol": "SPX", "expiry": null, "method": "cumulative", "sessions": [ "close" ] }, "count": 53, "generation": "gd52584ca", "as_of": {}, "built_at": "2026-10-23T01:08:02-04:00", "omitted": [], "docs": { "reference": "https://tanukitrade.com/docs/api/history#list_history_gamma_profile_states", "glossary": "https://tanukitrade.com/docs/api/glossary" }, "total": 53, "page": 1, "page_count": 1, "next_cursor": null } }
Response fields · Profile history
| 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 | history. |
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 uses the conversion factor of the row's ET day, with no tick rounding; a micro future uses its parent's. A mapped symbol's history is available from the first day with a conversion factor; earlier days are omitted. XSP uses its fixed scale on every day. Null when the source has no price. |
sessions | array of strings | Which of pre, open, close this snapshot is. |
profile | object | Same shape as the current profile route. 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 history
| 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 stored primary key levels for one ET day. A mapped symbol's history is available from the first day with a conversion factor. If the conversion-factor table cannot be read, the response is 503 DATA_WARMING, not an empty list. A listed symbol or XSP does not wait for the table. An expiry-only view that would include a mapped future does. The MCP tool is list_history_key_levels_primary. The arguments are this same JSON body. The bearer token stays on the HTTP header.
Parameters · Primary levels history
One of Required: at least one of symbol or expiry. Sending both is fine.
| Name | Type | Required | Values |
|---|---|---|---|
snapshot_date | string | Yes | One ET day, YYYY-MM-DD. A bad value says snapshot_date must be an ET day. |
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. |
sessions | array of strings | No | pre, open, close. Unique. Omit it for every snapshot. Missing is echoed as null. |
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 60 seconds (rc_ttl).
Valid bodies, from the minimal to the one the sample answers:
{"snapshot_date":"2026-10-15","symbol":"SPX"}{"snapshot_date":"2026-10-15","expiry":"w1"}{"snapshot_date":"2026-10-15","symbol":"SPX","expiry":"w1","sessions":["close"]}
curl --compressed \ --request POST \ --url "${TANUKI_BASE_URL}/api/v1/history/gamma/key-levels/primary" \ --header "Authorization: Bearer 12345.YOUR_API_KEY" \ --header "Content-Type: application/json" \ --header "Accept: application/json" \ --data '{"snapshot_date":"2026-10-15","symbol":"SPX","expiry":"w1","sessions":["close"]}'
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-16", "dte": 1, "aliases": [ "1", "w1", "M1" ], "is_monthly": true, "snapshot_type": "history", "snapshot_at": "2026-10-15T15:35:07.000-04:00", "spot_price": 7747.79, "sessions": [ "close" ], "levels": { "P1": { "strike": 7700, "weight": -78.17 }, "pT": { "strike": 7720, "weight": null }, "HVL": { "strike": 7745, "weight": null }, "cT": { "strike": 7780, "weight": null }, "C1": { "strike": 7800, "weight": 100 } } } ] }, "meta": { "request": { "snapshot_date": "2026-10-15", "symbol": "SPX", "expiry": "w1", "method": "cumulative", "sessions": [ "close" ] }, "count": 1, "generation": "gd52584ca", "as_of": {}, "built_at": "2026-10-23T01:08:02-04:00", "omitted": [], "docs": { "reference": "https://tanukitrade.com/docs/api/history#list_history_key_levels_primary", "glossary": "https://tanukitrade.com/docs/api/glossary" }, "total": 1, "page": 1, "page_count": 1, "next_cursor": null } }
Response fields · Primary levels history
| 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 uses the conversion factor of the row's ET day, with no tick rounding; a micro future uses its parent's. A mapped symbol's history is available from the first day with a conversion factor; earlier days are omitted. XSP uses its fixed scale on every day. Null when the source has no price. |
sessions | array of strings | close matched this filter. |
levels | object | P1, pT, HVL, cT, C1. |
Errors on this route · Primary levels history
| 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 stored secondary key levels for one ET day. A mapped symbol's history is available from the first day with a conversion factor. If the conversion-factor table cannot be read, the response is 503 DATA_WARMING, not an empty list. A listed symbol or XSP does not wait for the table. An expiry-only view that would include a mapped future does. The MCP tool is list_history_key_levels_secondary. The arguments are this same JSON body. The bearer token stays on the HTTP header.
Parameters · Secondary levels history
One of Required: at least one of symbol or expiry. Sending both is fine.
| Name | Type | Required | Values |
|---|---|---|---|
snapshot_date | string | Yes | One ET day, YYYY-MM-DD. A bad value says snapshot_date must be an ET day. |
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. |
sessions | array of strings | No | pre, open, close. Unique. Omit it for every snapshot. Missing is echoed as null. |
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 60 seconds (rc_ttl).
Valid bodies, from the minimal to the one the sample answers:
{"snapshot_date":"2026-10-15","symbol":"SPX"}{"snapshot_date":"2026-10-15","expiry":"w1"}{"snapshot_date":"2026-10-15","symbol":"SPX","expiry":"w1","sessions":["close"]}
curl --compressed \ --request POST \ --url "${TANUKI_BASE_URL}/api/v1/history/gamma/key-levels/secondary" \ --header "Authorization: Bearer 12345.YOUR_API_KEY" \ --header "Content-Type: application/json" \ --header "Accept: application/json" \ --data '{"snapshot_date":"2026-10-15","symbol":"SPX","expiry":"w1","sessions":["close"]}'
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-16", "dte": 1, "aliases": [ "1", "w1", "M1" ], "is_monthly": true, "snapshot_type": "history", "snapshot_at": "2026-10-15T15:35:07.000-04:00", "spot_price": 7747.79, "sessions": [ "close" ], "levels": { "P2": { "strike": 7685, "weight": -50.96 }, "P3": { "strike": 7670, "weight": -46.16 }, "C2": { "strike": 7790, "weight": 67.35 }, "C3": { "strike": 7810, "weight": 46.23 }, "C4": { "strike": 7785, "weight": 42.73 }, "C5": { "strike": 7820, "weight": 42.18 }, "P4": { "strike": 7710, "weight": -38.08 }, "C6": { "strike": 7825, "weight": 37.92 }, "Ab1": { "strike": 7750, "weight": null }, "Ab2": { "strike": 7800, "weight": null }, "Ab3": { "strike": 7700, "weight": null }, "D+": { "strike": 7000, "weight": null }, "D-": { "strike": 8000, "weight": null }, "nCOI": { "strike": 7900, "weight": null }, "nPOI": { "strike": 6250, "weight": null }, "COI": { "strike": 8000, "weight": null }, "POI": { "strike": 7000, "weight": null }, "AbOI": { "strike": 7000, "weight": null }, "nCV": { "strike": 7800, "weight": null }, "nPV": { "strike": 7600, "weight": null }, "CV": { "strike": 7750, "weight": null }, "PV": { "strike": 7700, "weight": null } } } ] }, "meta": { "request": { "snapshot_date": "2026-10-15", "symbol": "SPX", "expiry": "w1", "method": "cumulative", "sessions": [ "close" ] }, "count": 1, "generation": "gd52584ca", "as_of": {}, "built_at": "2026-10-23T01:08:02-04:00", "omitted": [], "docs": { "reference": "https://tanukitrade.com/docs/api/history#list_history_key_levels_secondary", "glossary": "https://tanukitrade.com/docs/api/glossary" }, "total": 1, "page": 1, "page_count": 1, "next_cursor": null } }
Response fields · Secondary levels history
| 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 uses the conversion factor of the row's ET day, with no tick rounding; a micro future uses its parent's. A mapped symbol's history is available from the first day with a conversion factor; earlier days are omitted. XSP uses its fixed scale on every day. 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. The live object continued past C2. |
Errors on this route · Secondary levels history
| 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 stored net GEX and net DEX for one ET day. 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. A mapped symbol's history is available from the first day with a conversion factor. If the conversion-factor table cannot be read, the response is 503 DATA_WARMING, not an empty list. A listed symbol or XSP does not wait for the table. An expiry-only view that would include a mapped future does. The MCP tool is list_history_gamma_net_exposures. The arguments are this same JSON body. The bearer token stays on the HTTP header.
Parameters · Net exposure history
One of Required: at least one of symbol or expiry. Sending both is fine.
| Name | Type | Required | Values |
|---|---|---|---|
snapshot_date | string | Yes | One ET day, YYYY-MM-DD. A bad value says snapshot_date must be an ET day. |
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. |
sessions | array of strings | No | pre, open, close. Unique. Omit it for every snapshot. Missing is echoed as null. |
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 60 seconds (rc_ttl).
Valid bodies, from the minimal to the one the sample answers:
{"snapshot_date":"2026-10-15","symbol":"SPX"}{"snapshot_date":"2026-10-15","expiry":"w1"}{"snapshot_date":"2026-10-15","symbol":"SPX","expiry":"w1","sessions":["close"]}
curl --compressed \ --request POST \ --url "${TANUKI_BASE_URL}/api/v1/history/gamma/net-exposures" \ --header "Authorization: Bearer 12345.YOUR_API_KEY" \ --header "Content-Type: application/json" \ --header "Accept: application/json" \ --data '{"snapshot_date":"2026-10-15","symbol":"SPX","expiry":"w1","sessions":["close"]}'
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-16", "dte": 1, "aliases": [ "1", "w1", "M1" ], "is_monthly": true, "snapshot_type": "history", "snapshot_at": "2026-10-15T15:35:07.000-04:00", "spot_price": 7747.79, "sessions": [ "close" ], "exposure": { "net_gex": -42303900, "net_gex_prev_close": -347382000, "net_gex_change": 305078100, "net_dex": 123720000000, "net_dex_prev_close": 46841600000, "net_dex_change": 76878400000, "oi_share_pct": 12.99, "oi_share_pct_prev_close": 13.02, "oi_share_pct_change": -0.03, "prev_close_snapshot_at": "2026-10-14T14:44:06.000-04:00" } } ] }, "meta": { "request": { "snapshot_date": "2026-10-15", "symbol": "SPX", "expiry": "w1", "method": "cumulative", "sessions": [ "close" ] }, "count": 1, "generation": "gd52584ca", "as_of": {}, "built_at": "2026-10-23T01:08:02-04:00", "omitted": [], "docs": { "reference": "https://tanukitrade.com/docs/api/history#list_history_gamma_net_exposures", "glossary": "https://tanukitrade.com/docs/api/glossary" }, "total": 1, "page": 1, "page_count": 1, "next_cursor": null } }
Response fields · Net exposure history
| 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 uses the conversion factor of the row's ET day, with no tick rounding; a micro future uses its parent's. A mapped symbol's history is available from the first day with a conversion factor; earlier days are omitted. XSP uses its fixed scale on every day. 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 | Same flat triples as the current net-exposure row: net_gex, net_dex, and oi_share_pct, each with _prev_close and _change, plus prev_close_snapshot_at. 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 exposure history
| 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.
Reads the daily point and percent change. History is the close minus the previous close. spot_price is that day's close on the same scale as change_pts, including a future's row-day conversion factor. A day before the first positive finite factor is omitted. XSP uses its fixed 0.1 scale on every SPX day. A missing, zero, or negative close is null. The date field is snapshot_date. The MCP tool is list_history_technical_price_change. The arguments are this same JSON body. The bearer token stays on the HTTP header.
Parameters · Price change history
One of Required: at least one of symbol or snapshot_date. Sending both is fine.
| Name | Type | Required | Values |
|---|---|---|---|
snapshot_date | string | One of | One ET day, YYYY-MM-DD. |
symbol | string | One of | One ticker. Letter case folds to uppercase. |
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 120 seconds (rc_ttl).
Valid bodies, from the minimal to the one the sample answers:
{"symbol":"SPX"}{"snapshot_date":"2026-10-15"}{"snapshot_date":"2026-10-15","symbol":"SPX"}
curl --compressed \ --request POST \ --url "${TANUKI_BASE_URL}/api/v1/history/technical/price-change" \ --header "Authorization: Bearer 12345.YOUR_API_KEY" \ --header "Content-Type: application/json" \ --header "Accept: application/json" \ --data '{"snapshot_date":"2026-10-15","symbol":"SPX"}'
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", "type": "INDEX", "is_synthetic": false, "mapped_from": null, "snapshot_date": "2026-10-15", "session_complete": true, "spot_price": 7743.98, "change_pts": 20.1, "change_pct": 0.2602 } ] }, "meta": { "request": { "snapshot_date": "2026-10-15", "symbol": "SPX" }, "count": 1, "total": 1, "page": 1, "page_count": 1, "next_cursor": null, "generation": "07cc6709c6cf", "as_of": {}, "built_at": "2026-10-23T01:08:02-04:00", "omitted": [], "docs": { "reference": "https://tanukitrade.com/docs/api/history#list_history_technical_price_change", "glossary": "https://tanukitrade.com/docs/api/glossary" } } }
Response fields · Price change history
| Field | Type | Meaning |
|---|---|---|
symbol | string | Canonical ticker. Copy it from list_symbols. Letter case folds to uppercase. |
type | string | STOCK, ETF, INDEX, FUTURES, or CFD_CRYPTO. |
is_synthetic | boolean | True when the ticker is mapped from another symbol. False is a listed underlying. |
mapped_from | string or null | The symbol a synthetic is mapped from. Null on a listed underlying. A micro names the optionable base, not its parent future. |
snapshot_date | date | ET session of the history row, YYYY-MM-DD. |
session_complete | boolean | True when that ET session is closed. |
spot_price | number or null | That day's close, the price change_pts is measured from, on the same scale as change_pts. At most 4 decimal places, with no tick rounding. A synthetic uses that symbol's scale. A future uses the conversion factor of the row's day, the latest positive finite one on or before that day; a micro future uses its parent's when its own key is absent. A day before the first such factor is omitted. XSP uses its fixed 0.1 scale on every SPX day. A missing, zero, or negative close is null, including a datapoint built before this field. On a session that is still open this is the forming regular-session close, not the screener quote. |
change_pts | number or null | Close minus the previous close, in points, at most 4 decimal places. A synthetic uses that symbol's scale, with no tick rounding. A future uses the conversion factor of the row's day: the latest positive finite one on or before that day. A micro future uses its parent's when its own key is absent. A day before the first such factor is omitted. |
change_pct | number or null | Close over the previous close, percent, rounded to 4 decimal places. |
Errors on this route · Price change history
| 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. |
Auth, rate limit, and the other shared failures are on Errors.
Reads daily realized volatility. The first window of bars is null. Values are not scaled. A mapped symbol is omitted before the first day with a positive finite conversion factor. XSP is returned on every SPX day. If the conversion-factor table cannot be read, the response is 503 DATA_WARMING, not an empty list. A listed symbol or XSP does not wait for the table. A day that would include a mapped future does. The MCP tool is list_history_technical_realized_volatility. The arguments are this same JSON body. The bearer token stays on the HTTP header.
Parameters · Realized volatility history
One of Required: at least one of symbol or snapshot_date. Sending both is fine.
| Name | Type | Required | Values |
|---|---|---|---|
snapshot_date | string | One of | One ET day, YYYY-MM-DD. |
symbol | string | One of | One ticker. Letter case folds to uppercase. |
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 120 seconds (rc_ttl).
Valid bodies, from the minimal to the one the sample answers:
{"symbol":"SPX"}{"snapshot_date":"2026-10-15"}{"snapshot_date":"2026-10-15","symbol":"SPX"}
curl --compressed \ --request POST \ --url "${TANUKI_BASE_URL}/api/v1/history/technical/realized-volatility" \ --header "Authorization: Bearer 12345.YOUR_API_KEY" \ --header "Content-Type: application/json" \ --header "Accept: application/json" \ --data '{"snapshot_date":"2026-10-15","symbol":"SPX"}'
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", "type": "INDEX", "is_synthetic": false, "mapped_from": null, "snapshot_date": "2026-10-15", "session_complete": true, "hv_10d": 9.22, "hv_20d": 9.56, "hv_30d": 9.53, "hv_60d": 10.57, "parkinson_20d": 7.36, "atr_14_pct": 0.8419, "bb_percent_b_20": 0.5191, "bb_bandwidth_20_pct": 2.8137, "iv_hv_spread_30_vol_pts": 6.77, "iv_hv_ratio_30": 1.7104 } ] }, "meta": { "request": { "snapshot_date": "2026-10-15", "symbol": "SPX" }, "count": 1, "total": 1, "page": 1, "page_count": 1, "next_cursor": null, "generation": "07cc6709c6cf", "as_of": {}, "built_at": "2026-10-23T01:08:02-04:00", "omitted": [], "docs": { "reference": "https://tanukitrade.com/docs/api/history#list_history_technical_realized_volatility", "glossary": "https://tanukitrade.com/docs/api/glossary" } } }
Response fields · Realized volatility history
| Field | Type | Meaning |
|---|---|---|
symbol | string | Canonical ticker. Copy it from list_symbols. Letter case folds to uppercase. |
type | string | STOCK, ETF, INDEX, FUTURES, or CFD_CRYPTO. |
is_synthetic | boolean | True when the ticker is mapped from another symbol. False is a listed underlying. |
mapped_from | string or null | The symbol a synthetic is mapped from. Null on a listed underlying. A micro names the optionable base, not its parent future. |
snapshot_date | date | History name for the session. |
session_complete | boolean | True when that ET session is closed. |
hv_10d | number or null | 10-day close-to-close historical volatility, annualised, in percent. Rounded to 4 decimal places. |
hv_20d | number or null | 20-day close-to-close historical volatility, annualised, in percent. Rounded to 4 decimal places. |
hv_30d | number or null | 30-day close-to-close historical volatility, annualised, in percent. Rounded to 4 decimal places. |
hv_60d | number or null | 60-day close-to-close historical volatility, annualised, in percent. Rounded to 4 decimal places. |
parkinson_20d | number or null | 20-day Parkinson (high-low) volatility, annualised, in percent. Rounded to 4 decimal places. |
atr_14_pct | number or null | 14-day average true range as a percent of the close, rounded to 4 decimal places. Not a price. |
bb_percent_b_20 | number or null | 20-day Bollinger percent-b. 0 is the lower band, 1 the upper band. Rounded to 4 decimal places. |
bb_bandwidth_20_pct | number or null | 20-day Bollinger bandwidth, band width over the middle band, in percent, rounded to 4 decimal places. |
iv_hv_spread_30_vol_pts | number or null | IVx minus hv_30d, in annualised volatility percentage points. Rounded to 4 decimal places. |
iv_hv_ratio_30 | number or null | IVx divided by hv_30d. Null when hv_30d is 0. Rounded to 4 decimal places. |
Errors on this route · Realized volatility history
| 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. |
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