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

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.

1 / 10

IV rank history

POST/api/v1/history/volatility/iv-rankMCP list_history_volatility_iv_rank

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.

NameTypeRequiredValues
snapshot_datestringOne ofOne ET day, YYYY-MM-DD.
symbolstringOne ofOne ticker. Letter case folds to uppercase.
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:

  • {"symbol":"SPX"}
  • {"snapshot_date":"2026-10-15"}
  • {"snapshot_date":"2026-10-15","symbol":"SPX"}
curl
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.

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

FieldTypeMeaning
symbolstringCanonical ticker. Copy it from list_symbols. Letter case folds to uppercase.
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_datedateThe ET day of the row. Current IV metrics do not use this name.
snapshot_typestringlatest on a current row. history on a stored day.
snapshot_atdatetime ET or nullWhen the source row was captured. ISO 8601 with an ET offset, to milliseconds.
iv_ranknumber or nullIV rank for that session. 0 is kept. Rounded to 4 decimal places.

Errors on this route · IV rank history

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.
422UNKNOWN_SYMBOLRequired symbol is not in the universe.

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

2 / 10

IVx history

POST/api/v1/history/volatility/ivxMCP list_history_volatility_ivx

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.

NameTypeRequiredValues
snapshot_datestringOne ofOne ET day, YYYY-MM-DD.
symbolstringOne ofOne ticker. Letter case folds to uppercase.
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:

  • {"symbol":"SPX"}
  • {"snapshot_date":"2026-10-15"}
  • {"snapshot_date":"2026-10-15","symbol":"SPX"}
curl
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.

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

FieldTypeMeaning
symbolstringCanonical ticker. Copy it from list_symbols. Letter case folds to uppercase.
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.
snapshot_typestringlatest on a current row. history on a stored day.
snapshot_atdatetime ET or nullWhen the source row was captured. ISO 8601 with an ET offset, to milliseconds.
ivx_avgnumber or nullIVx average. 0 is null. Rounded to 4 decimal places.
ivx_5d_change_pctnumber or nullFive-day IVx change in percent, rounded to 4 decimal places. 99 is null.

Errors on this route · IVx history

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.
422UNKNOWN_SYMBOLRequired symbol is not in the universe.

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

3 / 10

Call/put skew history

POST/api/v1/history/volatility/call-put-skewMCP list_history_volatility_call_put_skew

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.

NameTypeRequiredValues
snapshot_datestringOne ofOne ET day, YYYY-MM-DD.
symbolstringOne ofOne ticker. Letter case folds to uppercase.
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:

  • {"symbol":"SPX"}
  • {"snapshot_date":"2026-10-15"}
  • {"snapshot_date":"2026-10-15","symbol":"SPX"}
curl
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.

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

FieldTypeMeaning
symbolstringCanonical ticker. Copy it from list_symbols. Letter case folds to uppercase.
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.
snapshot_typestringlatest on a current row. history on a stored day.
snapshot_atdatetime ET or nullWhen the source row was captured. ISO 8601 with an ET offset, to milliseconds.
call_put_skewnumber or nullCall/put skew on that session's optimal expiry, times 100. A zero value is null. Rounded to 4 decimal places.
optimal_expiryobject or nullexpiration_date, dte, aliases, is_monthly. Aliases are only M1, M2, or M3.

Errors on this route · Call/put skew history

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.
422UNKNOWN_SYMBOLRequired symbol is not in the universe.

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

4 / 10

0DTE box history

POST/api/v1/history/range/0dte-boxMCP list_history_0dte_expected_move_boxes

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.

NameTypeRequiredValues
snapshot_datestringOne ofOne ET day, YYYY-MM-DD.
symbolstringOne ofOne ticker. Letter case folds to uppercase.
modestringNowidest_known (default) or separated.
cursorstringNoPrevious 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
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.

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

FieldTypeMeaning
symbolstringCanonical ticker. Copy it from list_symbols. Letter case folds to uppercase.
target_datedateThe box day.
snapshot_typestringhistory.
changesarray of objectswidest_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.
snapshotsobjectseparated mode only. Same session keys as the latest box, each with its peg as spot_price.

Errors on this route · 0DTE box history

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.
422UNKNOWN_SYMBOLRequired symbol is not in the universe.

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

5 / 10

Profile history

POST/api/v1/history/gamma/profile-statesMCP list_history_gamma_profile_states

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.

NameTypeRequiredValues
snapshot_datestringYesOne ET day, YYYY-MM-DD. A bad value says snapshot_date must be an ET day.
symbolstringOne ofOne ticker. Letter case folds to uppercase.
expirystringOne ofYYYY-MM-DD, or an alias 0, 1, w1–w4, M1–M3, ALL. Alias case folds onto that canonical form.
methodstringNocumulative (default) or standalone.
sessionsarray of stringsNopre, open, close. Unique. Omit it for every snapshot. Missing is echoed as null.
cursorstringNoPrevious 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
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.

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

FieldTypeMeaning
symbolstringCanonical ticker. Copy it from list_symbols. Letter case folds to uppercase.
expiration_datedateCalendar expiry, YYYY-MM-DD, ET.
dteintegerDays to that expiry, as stored for the row.
aliasesarray of strings0, 1, w1–w4, M1–M3, ALL. Weekly aliases use a lowercase w. Monthly aliases and ALL stay uppercase.
is_monthlybooleanTrue on the monthly expiry date. Same rule as discovery expiries.
snapshot_typestringhistory.
snapshot_atdatetime ET or nullWhen the source row was captured. ISO 8601 with an ET offset, to milliseconds.
spot_pricenumber or nullUnderlying 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.
sessionsarray of stringsWhich of pre, open, close this snapshot is.
profileobjectSame 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.statestringPOS_SQUEEZE, POS, POS_TRANSITION, NEG_TRANSITION, NEG, NEG_SQUEEZE, or INSUFFICIENT_DATA.
profile.polaritystringpositive or negative on a classified state. neutral on INSUFFICIENT_DATA.
profile.state_descriptionstringThe fixed English sentence for that state.
profile.is_brokenboolean or nullTrue 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.confluencearray of objectsLabels that share an exact scaled strike. count descending. A tie prefers the strike nearer the row, then the smaller strike.
profile.oi_share_pctnumber or nullThis expiry's share of the symbol's total open interest, in percent, rounded to 4 decimal places.

Errors on this route · Profile history

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.
422UNKNOWN_SYMBOLRequired symbol is not in the universe.
422UNKNOWN_EXPIRYExpiry 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.

6 / 10

Primary levels history

POST/api/v1/history/gamma/key-levels/primaryMCP list_history_key_levels_primary

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.

NameTypeRequiredValues
snapshot_datestringYesOne ET day, YYYY-MM-DD. A bad value says snapshot_date must be an ET day.
symbolstringOne ofOne ticker. Letter case folds to uppercase.
expirystringOne ofYYYY-MM-DD, or an alias 0, 1, w1–w4, M1–M3, ALL. Alias case folds onto that canonical form.
methodstringNocumulative (default) or standalone.
sessionsarray of stringsNopre, open, close. Unique. Omit it for every snapshot. Missing is echoed as null.
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 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
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.

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

FieldTypeMeaning
symbolstringCanonical ticker. Copy it from list_symbols. Letter case folds to uppercase.
expiration_datedateCalendar expiry, YYYY-MM-DD, ET.
dteintegerDays to that expiry, as stored for the row.
aliasesarray of strings0, 1, w1–w4, M1–M3, ALL. Weekly aliases use a lowercase w. Monthly aliases and ALL stay uppercase.
is_monthlybooleanTrue on the monthly expiry date. Same rule as discovery expiries.
snapshot_typestringlatest on a current row. history on a stored day.
snapshot_atdatetime ET or nullWhen the source row was captured. ISO 8601 with an ET offset, to milliseconds.
spot_pricenumber or nullUnderlying 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.
sessionsarray of stringsclose matched this filter.
levelsobjectP1, pT, HVL, cT, C1.

Errors on this route · Primary levels history

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.
422UNKNOWN_SYMBOLRequired symbol is not in the universe.
422UNKNOWN_EXPIRYExpiry 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.

7 / 10

Secondary levels history

POST/api/v1/history/gamma/key-levels/secondaryMCP list_history_key_levels_secondary

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.

NameTypeRequiredValues
snapshot_datestringYesOne ET day, YYYY-MM-DD. A bad value says snapshot_date must be an ET day.
symbolstringOne ofOne ticker. Letter case folds to uppercase.
expirystringOne ofYYYY-MM-DD, or an alias 0, 1, w1–w4, M1–M3, ALL. Alias case folds onto that canonical form.
methodstringNocumulative (default) or standalone.
sessionsarray of stringsNopre, open, close. Unique. Omit it for every snapshot. Missing is echoed as null.
cursorstringNoPrevious 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
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.

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

FieldTypeMeaning
symbolstringCanonical ticker. Copy it from list_symbols. Letter case folds to uppercase.
expiration_datedateCalendar expiry, YYYY-MM-DD, ET.
dteintegerDays to that expiry, as stored for the row.
aliasesarray of strings0, 1, w1–w4, M1–M3, ALL. Weekly aliases use a lowercase w. Monthly aliases and ALL stay uppercase.
is_monthlybooleanTrue on the monthly expiry date. Same rule as discovery expiries.
snapshot_typestringlatest on a current row. history on a stored day.
snapshot_atdatetime ET or nullWhen the source row was captured. ISO 8601 with an ET offset, to milliseconds.
spot_pricenumber or nullUnderlying 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.
sessionsarray of stringsEmpty on a current row. On history: pre, open, and close that matched the filter.
levelsobjectSecondary labels. The live object continued past C2.

Errors on this route · Secondary levels history

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.
422UNKNOWN_SYMBOLRequired symbol is not in the universe.
422UNKNOWN_EXPIRYExpiry 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.

8 / 10

Net exposure history

POST/api/v1/history/gamma/net-exposuresMCP list_history_gamma_net_exposures

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.

NameTypeRequiredValues
snapshot_datestringYesOne ET day, YYYY-MM-DD. A bad value says snapshot_date must be an ET day.
symbolstringOne ofOne ticker. Letter case folds to uppercase.
expirystringOne ofYYYY-MM-DD, or an alias 0, 1, w1–w4, M1–M3, ALL. Alias case folds onto that canonical form.
methodstringNocumulative (default) or standalone.
sessionsarray of stringsNopre, open, close. Unique. Omit it for every snapshot. Missing is echoed as null.
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 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
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.

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

FieldTypeMeaning
symbolstringCanonical ticker. Copy it from list_symbols. Letter case folds to uppercase.
expiration_datedateCalendar expiry, YYYY-MM-DD, ET.
dteintegerDays to that expiry, as stored for the row.
aliasesarray of strings0, 1, w1–w4, M1–M3, ALL. Weekly aliases use a lowercase w. Monthly aliases and ALL stay uppercase.
is_monthlybooleanTrue on the monthly expiry date. Same rule as discovery expiries.
snapshot_typestringlatest on a current row. history on a stored day.
snapshot_atdatetime ET or nullWhen the source row was captured. ISO 8601 with an ET offset, to milliseconds.
spot_pricenumber or nullUnderlying 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.
sessionsarray of stringsEmpty on a current row. On history: pre, open, and close that matched the filter.
exposureobjectSame 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_gexnumber or nullNet gamma exposure of this expiry. Rounded to 4 decimal places.
exposure.net_gex_prev_closenumber or nullnet_gex at the previous close. Null when that snapshot does not exist. Rounded to 4 decimal places.
exposure.net_gex_changenumber or nullnet_gex minus net_gex_prev_close. Null when either side is null. Rounded to 4 decimal places.
exposure.net_dexnumber or nullNet delta exposure of this expiry. Rounded to 4 decimal places.
exposure.net_dex_prev_closenumber or nullnet_dex at the previous close. Null when that snapshot does not exist. Rounded to 4 decimal places.
exposure.net_dex_changenumber or nullnet_dex minus net_dex_prev_close. Null when either side is null. Rounded to 4 decimal places.
exposure.oi_share_pctnumber or nullThis expiry's share of the symbol's total open interest, in percent, rounded to 4 decimal places.
exposure.oi_share_pct_prev_closenumber or nulloi_share_pct at the previous close. Null when that snapshot does not exist.
exposure.oi_share_pct_changenumber or nulloi_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_atdatetime ET or nullTime 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

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.
422UNKNOWN_SYMBOLRequired symbol is not in the universe.
422UNKNOWN_EXPIRYExpiry 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.

9 / 10

Price change history

POST/api/v1/history/technical/price-changeMCP list_history_technical_price_change

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.

NameTypeRequiredValues
snapshot_datestringOne ofOne ET day, YYYY-MM-DD.
symbolstringOne ofOne ticker. Letter case folds to uppercase.
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:

  • {"symbol":"SPX"}
  • {"snapshot_date":"2026-10-15"}
  • {"snapshot_date":"2026-10-15","symbol":"SPX"}
curl
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.

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

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 history row, YYYY-MM-DD.
session_completebooleanTrue when that ET session is closed.
spot_pricenumber or nullThat 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_ptsnumber or nullClose 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_pctnumber or nullClose over the previous close, percent, rounded to 4 decimal places.

Errors on this route · Price change history

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.
422UNKNOWN_SYMBOLRequired symbol is not in the universe.

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

10 / 10

Realized volatility history

POST/api/v1/history/technical/realized-volatilityMCP list_history_technical_realized_volatility

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.

NameTypeRequiredValues
snapshot_datestringOne ofOne ET day, YYYY-MM-DD.
symbolstringOne ofOne ticker. Letter case folds to uppercase.
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:

  • {"symbol":"SPX"}
  • {"snapshot_date":"2026-10-15"}
  • {"snapshot_date":"2026-10-15","symbol":"SPX"}
curl
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.

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

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_datedateHistory name for the session.
session_completebooleanTrue when that ET session is closed.
hv_10dnumber or null10-day close-to-close historical volatility, annualised, in percent. Rounded to 4 decimal places.
hv_20dnumber or null20-day close-to-close historical volatility, annualised, in percent. Rounded to 4 decimal places.
hv_30dnumber or null30-day close-to-close historical volatility, annualised, in percent. Rounded to 4 decimal places.
hv_60dnumber or null60-day close-to-close historical volatility, annualised, in percent. Rounded to 4 decimal places.
parkinson_20dnumber or null20-day Parkinson (high-low) volatility, annualised, in percent. Rounded to 4 decimal places.
atr_14_pctnumber or null14-day average true range as a percent of the close, rounded to 4 decimal places. Not a price.
bb_percent_b_20number or null20-day Bollinger percent-b. 0 is the lower band, 1 the upper band. Rounded to 4 decimal places.
bb_bandwidth_20_pctnumber or null20-day Bollinger bandwidth, band width over the middle band, in percent, rounded to 4 decimal places.
iv_hv_spread_30_vol_ptsnumber or nullIVx minus hv_30d, in annualised volatility percentage points. Rounded to 4 decimal places.
iv_hv_ratio_30number or nullIVx divided by hv_30d. Null when hv_30d is 0. Rounded to 4 decimal places.

Errors on this route · Realized volatility history

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.
422UNKNOWN_SYMBOLRequired 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