← tanukitrade.com Open WebApp (opens in a new tab) Start 7-day free trial

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.

1 / 2

Price change

POST/api/v1/technical/price-changeMCP list_technical_price_change

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

NameTypeRequiredValues
symbolsarray of stringsNoUp to 300 tickers. Unknown names are left out. Order in the response is symbol ascending.
sortstringNosymbol (default) or abs_change_pct.
limitintegerNo1 to 261. Omit it for the page size, which is still 400.
cursorstringNoPrevious 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
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.

200 application/json
{
  "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

FieldTypeMeaning
symbolstringCanonical ticker. Copy it from list_symbols. Letter case folds to uppercase.
typestringSTOCK, ETF, INDEX, FUTURES, or CFD_CRYPTO.
is_syntheticbooleanTrue when the ticker is mapped from another symbol. False is a listed underlying.
mapped_fromstring or nullThe symbol a synthetic is mapped from. Null on a listed underlying. A micro names the optionable base, not its parent future.
session_completebooleanTrue when that ET session is closed.
spot_pricenumber or nullPrice 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_ptsnumber or nullPoint change from the previous close, at most 4 decimal places.
change_pctnumber or nullPercent change from the previous close, rounded to 4 decimal places.
snapshot_atdatetime ET or nullQuote time, ISO 8601 with an ET offset, or null when the source has no time.

Errors on this route · Price change

HTTPCodeWhen
422VALIDATION_ERRORUnknown field, nested value, repeated key, bad JSON, a bad alias, or a cursor that does not match this request.
413PAYLOAD_TOO_LARGEThe JSON body is larger than 4 KiB.
503DATA_WARMINGThe datapoint is not built yet. Wait Retry-After seconds (1).
422RESULT_TOO_LARGEThe uncompressed JSON would exceed 512 KiB. Narrow the filter.

Auth, rate limit, and the other shared failures are on Errors.

2 / 2

Realized volatility

POST/api/v1/technical/realized-volatilityMCP list_technical_realized_volatility

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

NameTypeRequiredValues
symbolsarray of stringsNoUp to 300 tickers. Unknown names are left out. Order in the response is symbol ascending.
cursorstringNoPrevious 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
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.

200 application/json
{
  "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

FieldTypeMeaning
symbolstringCanonical ticker. Copy it from list_symbols. Letter case folds to uppercase.
typestringSTOCK, ETF, INDEX, FUTURES, or CFD_CRYPTO.
is_syntheticbooleanTrue when the ticker is mapped from another symbol. False is a listed underlying.
mapped_fromstring or nullThe symbol a synthetic is mapped from. Null on a listed underlying. A micro names the optionable base, not its parent future.
snapshot_datedateET session of the row, YYYY-MM-DD.
session_completebooleanTrue when that ET session is closed.
hv_10dnumber or null10-day close-to-close historical volatility, annualized volatility in percent. Rounded to 4 decimal places.
hv_20dnumber or null20-day close-to-close HV, annualized volatility in percent. Rounded to 4 decimal places.
hv_30dnumber or null30-day close-to-close HV, annualized volatility in percent. Rounded to 4 decimal places.
hv_60dnumber or null60-day close-to-close HV, annualized volatility in percent. Rounded to 4 decimal places.
parkinson_20dnumber or null20-day Parkinson volatility, annualized volatility in percent. Rounded to 4 decimal places.
atr_14_pctnumber or null14-day ATR as a percent, rounded to 4 decimal places. Not a price.
bb_percent_b_20number or null20-day Bollinger percent-b, a fraction from 0 to 1, not a percent. Rounded to 4 decimal places.
bb_bandwidth_20_pctnumber or null20-day Bollinger bandwidth, percent, rounded to 4 decimal places.
iv_hv_spread_30_vol_ptsnumber or nullIVx minus 30-day HV, in annualized volatility percentage points. Rounded to 4 decimal places.
iv_hv_ratio_30number or nullIVx 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

HTTPCodeWhen
422VALIDATION_ERRORUnknown field, nested value, repeated key, bad JSON, a bad alias, or a cursor that does not match this request.
413PAYLOAD_TOO_LARGEThe JSON body is larger than 4 KiB.
503DATA_WARMINGThe datapoint is not built yet. Wait Retry-After seconds (1).
422RESULT_TOO_LARGEThe 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