Technical
Price change and realized volatility.
Today’s price with its point and percent change, and close-to-close volatility.
The current price-change row is intraday and refreshes with the screener: spot_price, change_pts, change_pct, and snapshot_at. A future uses its own last price. XSP is one tenth of SPX. spot_price and change_pts are at most 4 decimals, with no tick rounding. change_pct is rounded to 4 decimal places. Prices are not tick-rounded. Realized volatility is as of the last completed session and updates after 16:00 ET. atr_14_pct and bb_bandwidth_20_pct are rounded to 4 decimal places. The current realized-volatility row uses snapshot_date. The current price-change row uses snapshot_at.
Lists the latest price and the change from the previous close. spot_price is the price at snapshot_at. change_pts is points, at most 4 decimal places, with no tick rounding. change_pct is percent, rounded to 4 decimal places. sort is symbol or abs_change_pct. limit is 1 to 261. The MCP tool is list_technical_price_change. The arguments are this same JSON body. The bearer token stays on the HTTP header.
Parameters · Price change
| 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. |
sort | string | No | symbol (default) or abs_change_pct. |
limit | integer | No | 1 to 261. Omit it for the page size, which is still 400. |
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:
{}{"symbols":["SPX","QQQ"],"sort":"symbol","limit":5}
curl --compressed \ --request POST \ --url "${TANUKI_BASE_URL}/api/v1/technical/price-change" \ --header "Authorization: Bearer 12345.YOUR_API_KEY" \ --header "Content-Type: application/json" \ --header "Accept: application/json" \ --data '{"symbols":["SPX","QQQ"],"sort":"symbol","limit":5}'
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": "QQQ", "type": "ETF", "is_synthetic": false, "mapped_from": null, "session_complete": false, "spot_price": 725.32, "change_pts": 7.79, "change_pct": 1.09, "snapshot_at": "2026-10-21T16:01:20.000-04:00" }, { "symbol": "SPX", "type": "INDEX", "is_synthetic": false, "mapped_from": null, "session_complete": false, "spot_price": 7759.51, "change_pts": 42.48, "change_pct": 0.55, "snapshot_at": "2026-10-21T16:01:20.000-04:00" } ] }, "meta": { "request": { "symbols": [ "QQQ", "SPX" ], "sort": "symbol", "limit": 5 }, "count": 2, "total": 2, "page": 1, "page_count": 1, "next_cursor": null, "generation": "5c246baa69d6", "as_of": {}, "built_at": "2026-10-23T01:08:02-04:00", "omitted": [], "docs": { "reference": "https://tanukitrade.com/docs/api/technical#list_technical_price_change", "glossary": "https://tanukitrade.com/docs/api/glossary" } } }
Response fields · Price change
| 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. |
session_complete | boolean | True when that ET session is closed. |
spot_price | number or null | Price at snapshot_at. Futures use their own last price. XSP is one tenth of SPX, with no tick rounding. Null when the source has no price. Rounded to 4 decimal places. |
change_pts | number or null | Point change from the previous close, at most 4 decimal places. |
change_pct | number or null | Percent change from the previous close, rounded to 4 decimal places. |
snapshot_at | datetime ET or null | Quote time, ISO 8601 with an ET offset, or null when the source has no time. |
Errors on this route · Price change
| 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 close-to-close HV, Parkinson, ATR percent, Bollinger percent-b and bandwidth, and iv_hv_spread_30_vol_pts. hv and parkinson fields are annualized volatility in percent. bb_percent_b_20 is a fraction from 0 to 1. iv_hv_ratio_30 is a ratio, not a percent. The current row is the last completed session. The MCP tool is list_technical_realized_volatility. The arguments are this same JSON body. The bearer token stays on the HTTP header.
Parameters · Realized volatility
| 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 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:
{}{"symbols":["SPX"]}
curl --compressed \ --request POST \ --url "${TANUKI_BASE_URL}/api/v1/technical/realized-volatility" \ --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. 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-21", "session_complete": true, "hv_10d": 9.95, "hv_20d": 8.85, "hv_30d": 10.07, "hv_60d": 10.4, "parkinson_20d": 7.99, "atr_14_pct": 0.8963, "bb_percent_b_20": 0.6051, "bb_bandwidth_20_pct": 2.7843, "iv_hv_spread_30_vol_pts": 6.78, "iv_hv_ratio_30": 1.6733 } ] }, "meta": { "request": { "symbols": [ "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/technical#list_technical_realized_volatility", "glossary": "https://tanukitrade.com/docs/api/glossary" } } }
Response fields · Realized volatility
| 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 row, YYYY-MM-DD. |
session_complete | boolean | True when that ET session is closed. |
hv_10d | number or null | 10-day close-to-close historical volatility, annualized volatility in percent. Rounded to 4 decimal places. |
hv_20d | number or null | 20-day close-to-close HV, annualized volatility in percent. Rounded to 4 decimal places. |
hv_30d | number or null | 30-day close-to-close HV, annualized volatility in percent. Rounded to 4 decimal places. |
hv_60d | number or null | 60-day close-to-close HV, annualized volatility in percent. Rounded to 4 decimal places. |
parkinson_20d | number or null | 20-day Parkinson volatility, annualized volatility in percent. Rounded to 4 decimal places. |
atr_14_pct | number or null | 14-day ATR as a percent, rounded to 4 decimal places. Not a price. |
bb_percent_b_20 | number or null | 20-day Bollinger percent-b, a fraction from 0 to 1, not a percent. Rounded to 4 decimal places. |
bb_bandwidth_20_pct | number or null | 20-day Bollinger bandwidth, percent, rounded to 4 decimal places. |
iv_hv_spread_30_vol_pts | number or null | IVx minus 30-day HV, in annualized volatility percentage points. Rounded to 4 decimal places. |
iv_hv_ratio_30 | number or null | IVx divided by 30-day HV, a ratio (1.5 means 1.5 times), not a percent. Rounded to 4 decimal places. |
Errors on this route · Realized volatility
| 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.
TanukiTrade API and MCP. Derived options analytics for your code and for agents. Not investment advice. tanukitrade.com