API reference

Every operation of the public data API: its return value, its parameters, a recorded response and the meaning of each field.

The API returns the numbers that the site displays, as JSON. Every call is a GET to an address under https://tickplunge.com/api/v1.

Every call needs an API token in the Authorization header, as Bearer followed by the token. A call without a token returns 401. Make your first API call describes how to create a token and lists the error for each refused call. Pull a symbol's history describes date ranges and how to skip the download of an unchanged response.

Each entry below lists the address, its parameters, a curl command, a response recorded from the live API, and the meaning and unit of every field. A part of an address in braces, such as {symbol}, takes a value. Long lists in a response are cut to their first items. The note under the response gives the full count.

Rates are decimals: 0.142 means 14.2%. A field described as percent points is shown as written: 15.9 means 15.9%. Dates use YYYY-MM-DD and identify the trading session of the value. The full machine-readable description is at /api/v1/openapi.json and requires the same token.

Symbols

GET /api/v1/symbols

The ticker symbols the API carries. Every route that takes a symbol accepts one of these.

curl -H "Authorization: Bearer $TP_TOKEN" "https://tickplunge.com/api/v1/symbols"
{
  "symbols": [
    "SPY",
    "QQQ"
  ],
  "vol_surface_skipped": [
    "BOIL"
  ]
}
symbols[]
Ticker symbols the pipeline computes each day, in the configured order.
vol_surface_skipped[]
Symbols with no volatility surface by design. Their vol-surface routes return 404.

`symbols` holds 23 items; the first 2 are shown.

Volatility

GET /api/v1/chart/{symbol}/features

Signals built from the VRP series of one symbol: rolling z-score, percentile ranks, vol of vol and regime labels.

symbol
Ticker symbol, such as SPY. GET /api/v1/symbols lists the valid ones.
from
First trade date to include, as YYYY-MM-DD, inclusive. Leave it out to start at the first record.
to
Last trade date to include, as YYYY-MM-DD, inclusive. Leave it out to run to the latest record.
curl -H "Authorization: Bearer $TP_TOKEN" "https://tickplunge.com/api/v1/chart/SPY/features"
{
  "count": 1163,
  "records": [
    {
      "trade_date": "2022-01-03",
      "symbol": "SPY",
      "iv30d": 0.122806,
      "hv_30": 0.17489999999999997,
      "vrp": -0.2978502001143509,
      "vrp_zscore": 0,
      "vrp_pctile_10": 0,
      "vrp_pctile_90": 0,
      "iv_pctile": 0,
      "hv_pctile": 0,
      "vol_of_vol": 0,
      "vrp_regime": "neutral",
      "vrp_regime_interp": "Fair value, no edge",
      "vol_regime": "low_vol",
      "vol_regime_interp": "Subdued vol, compression risk",
      "signal_strength": 50
    },
    {
      "trade_date": "2022-01-04",
      "symbol": "SPY",
      "iv30d": 0.122039,
      "hv_30": 0.1748,
      "vrp": -0.30183638443935934,
      "vrp_zscore": 0,
      "vrp_pctile_10": 0,
      "vrp_pctile_90": 0,
      "iv_pctile": 0,
      "hv_pctile": 0,
      "vol_of_vol": 0,
      "vrp_regime": "neutral",
      "vrp_regime_interp": "Fair value, no edge",
      "vol_regime": "low_vol",
      "vol_regime_interp": "Subdued vol, compression risk",
      "signal_strength": 50
    }
  ],
  "symbol": "SPY"
}
count
Number of records between from and to, before the example was cut.
records[].trade_date
The trading day the row describes, as YYYY-MM-DD.
records[].symbol
Ticker symbol of the row.
records[].iv30d
30-day implied volatility from ORATS on trade_date, annualized, as a decimal.
records[].hv_30
30-day close-to-close historical volatility paired with trade_date, annualized, as a decimal.
records[].vrp
iv30d / hv_30 - 1 on trade_date, as a decimal.
records[].vrp_zscore
z-score of vrp against the 20 trading days ending on trade_date. null until 20 days of history exist.
records[].vrp_pctile_10
10th percentile of vrp over the 20 trading days ending on trade_date, as a decimal. null until 20 days exist.
records[].vrp_pctile_90
90th percentile of vrp over the 20 trading days ending on trade_date, as a decimal. null until 20 days exist.
records[].iv_pctile
Percent of days from the first record through trade_date with a lower iv30d, from 0 to 100.
records[].hv_pctile
Percent of days from the first record through trade_date with a lower hv_30, from 0 to 100.
records[].vol_of_vol
Standard deviation of daily iv30d changes over the 20 days ending on trade_date, as a decimal. null until 21 days exist.
records[].vrp_regime
Label from vrp_zscore: extreme_rich above 2, rich above 1, neutral above -1, cheap above -2, else extreme_cheap. null while vrp_zscore is null.
records[].vrp_regime_interp
One plain sentence that reads vrp_regime. null while vrp_regime is null.
records[].vol_regime
Label from iv_pctile: crisis at 90 or more, high_vol at 70 or more, normal at 30 or more, else low_vol.
records[].vol_regime_interp
One plain sentence that reads vol_regime.
records[].signal_strength
Score from 0 to 100. Half comes from the size of vrp_zscore, capped at 3; half from how far iv_pctile sits from 50.
symbol
Ticker symbol the response describes.

`records` holds 1,163 items; the first 2 are shown.

GET /api/v1/straddle/{symbol}

The price of the 30-day at-the-money straddle and the 25-delta strangle, each as a share of spot.

symbol
Ticker symbol, such as SPY. GET /api/v1/symbols lists the valid ones.
from
First trade date to include, as YYYY-MM-DD, inclusive. Leave it out to start at the first record.
to
Last trade date to include, as YYYY-MM-DD, inclusive. Leave it out to run to the latest record.
curl -H "Authorization: Bearer $TP_TOKEN" "https://tickplunge.com/api/v1/straddle/SPY"
{
  "count": 1167,
  "records": [
    {
      "trade_date": "2022-01-03",
      "symbol": "SPY",
      "straddle_pct": 0.02658469878802048,
      "strangle_pct": 0.01135156449665453,
      "ratio": 2.3419413945853345
    },
    {
      "trade_date": "2022-01-04",
      "symbol": "SPY",
      "straddle_pct": 0.027936492515742987,
      "strangle_pct": 0.011052111420319673,
      "ratio": 2.527706376935435
    }
  ],
  "symbol": "SPY"
}
count
Number of records between from and to, before the example was cut.
records[].trade_date
The trading day the row describes, as YYYY-MM-DD.
records[].symbol
Ticker symbol of the row.
records[].straddle_pct
At-the-money call plus put price over spot, as a decimal, for the expiry closest to 30 days on trade_date.
records[].strangle_pct
25-delta out-of-the-money call plus put price over spot, as a decimal, same expiry.
records[].ratio
straddle_pct / strangle_pct on trade_date, a plain ratio.
symbol
Ticker symbol the response describes.

`records` holds 1,167 items; the first 2 are shown.

GET /api/v1/vix/{symbol}

A VIX-style implied volatility index for one symbol, computed from its option chain each trading day.

symbol
Ticker symbol, such as SPY. GET /api/v1/symbols lists the valid ones.
from
First trade date to include, as YYYY-MM-DD, inclusive. Leave it out to start at the first record.
to
Last trade date to include, as YYYY-MM-DD, inclusive. Leave it out to run to the latest record.
curl -H "Authorization: Bearer $TP_TOKEN" "https://tickplunge.com/api/v1/vix/SPY"
{
  "count": 1167,
  "records": [
    {
      "trade_date": "2022-01-03",
      "symbol": "SPY",
      "vix_30d": 15.890117753335655,
      "vix_3m": 20.916409789873253
    },
    {
      "trade_date": "2022-01-04",
      "symbol": "SPY",
      "vix_30d": 16.206787367048555,
      "vix_3m": 20.858785413731244
    }
  ],
  "symbol": "SPY"
}
count
Number of records between from and to, before the example was cut.
records[].trade_date
The trading day the row describes, as YYYY-MM-DD.
records[].symbol
Ticker symbol of the row.
records[].vix_30d
Model-free 30-day implied volatility on trade_date by the CBOE VIX method, in percent points (15.9 is 15.9%).
records[].vix_3m
The same index at 91 days on trade_date, in percent points.
symbol
Ticker symbol the response describes.

`records` holds 1,167 items; the first 2 are shown.

GET /api/v1/vrp/{symbol}

The daily volatility risk premium for one symbol: 30-day implied volatility against 30-day historical volatility.

symbol
Ticker symbol, such as SPY. GET /api/v1/symbols lists the valid ones.
from
First trade date to include, as YYYY-MM-DD, inclusive. Leave it out to start at the first record.
to
Last trade date to include, as YYYY-MM-DD, inclusive. Leave it out to run to the latest record.
curl -H "Authorization: Bearer $TP_TOKEN" "https://tickplunge.com/api/v1/vrp/SPY"
{
  "count": 1711,
  "records": [
    {
      "trade_date": "2020-01-02",
      "symbol": "SPY",
      "iv30d": 0.100912,
      "hv30": 0.0718,
      "vrp": 0.40545961002785513,
      "ex_ern_iv_30d": 0.1009,
      "log_return_adj": null
    },
    {
      "trade_date": "2020-01-03",
      "symbol": "SPY",
      "iv30d": 0.113213,
      "hv30": 0.0761,
      "vrp": 0.48768725361366605,
      "ex_ern_iv_30d": 0.11320000000000001,
      "log_return_adj": -0.004112114873574285
    }
  ],
  "symbol": "SPY"
}
count
Number of records between from and to, before the example was cut.
records[].trade_date
The trading day the row describes, as YYYY-MM-DD.
records[].symbol
Ticker symbol of the row.
records[].iv30d
30-day implied volatility from ORATS on trade_date, annualized, as a decimal (0.12 is 12%).
records[].hv30
30-day close-to-close historical volatility, annualized, as a decimal. It is the latest reading on or before trade_date, at most 7 days old.
records[].vrp
iv30d / hv30 - 1, as a decimal. 0.40 means implied volatility sits 40% above historical volatility on trade_date.
records[].ex_ern_iv_30d
30-day implied volatility on trade_date with the expected earnings move taken out, as a decimal.
records[].log_return_adj
Split-adjusted log return of the close from the prior trading day to trade_date, as a decimal. null when a close is missing.
symbol
Ticker symbol the response describes.

`records` holds 1,711 items; the first 2 are shown.

Surface

GET /api/v1/vol-surface/{symbol}

The fitted implied volatility surface for one symbol and date, as a matrix of tenor by delta.

symbol
Ticker symbol, such as SPY. GET /api/v1/symbols lists the valid ones.
metric
What each cell holds: iv, skew, vrp, anomaly, calendar_arb or butterfly_arb. Default iv.
as_of
Trade date to read, as YYYY-MM-DD. Leave it out for the latest date.
curl -H "Authorization: Bearer $TP_TOKEN" "https://tickplunge.com/api/v1/vol-surface/SPY?metric=iv"
{
  "symbol": "SPY",
  "trade_date": "2026-08-21",
  "metric": "iv",
  "quality_grade": "B",
  "quality_status": "published",
  "quality_as_of": "2026-08-22T06:58:00Z",
  "tenors": [
    7,
    14
  ],
  "deltas": [
    -0.5,
    -0.45
  ],
  "data": [
    [
      0.10915095368094425,
      0.11125354920917369
    ],
    [
      0.10823310100268291,
      0.11162916834662494
    ]
  ]
}
symbol
Ticker symbol the response describes.
trade_date
The trading day the surface was fitted for, as YYYY-MM-DD.
metric
The metric each cell of data holds, as requested.
quality_grade
Fit grade of the surface on trade_date: A, B or C, or F when a hard gate failed.
quality_status
published when every gate passed, degraded when a soft gate failed, blocked when a hard gate failed, fit_failed when the fit could not run, skipped when the symbol was skipped, missing_quality_artifact when no quality report exists.
quality_as_of
UTC time the quality report for trade_date was written, in ISO 8601.
latest_trade_date
Newest trade date with raw strikes for the symbol, as YYYY-MM-DD. Left out when none is found, and on a request with as_of.
stale
true when the served surface trade_date is before latest_trade_date, so the newest fit failed or has not run. Absent on a request with as_of.
stale_status
Why the surface is stale, present only when stale is true: blocked or fit_failed when the newer quality report records it, not_recorded when no newer report exists.
stale_reasons
Gate names or the fit error message from the newer quality report, verbatim; empty when stale_status is not_recorded. Present only when stale is true.
tenors[]
Row labels of data: days to expiry.
deltas[]
Column labels of data: option delta, negative for puts and positive for calls.
data[][]
data[i][j] is the metric at tenors[i] and deltas[j]. iv is a decimal; null marks a missing cell, or a skew, vrp, anomaly or calendar_arb cell the fit could not compute.

`tenors` and `data` each hold 8 items; the first 2 are shown. `deltas` holds 16 items; the first 2 are shown. Each `data[]` holds up to 16 items; the first 2 of each are shown.

GET /api/v1/vol-surface/{symbol}/quality

How well the surface fit the quotes on its trade date: quote filters, fit error, coverage, model parameters and publish gates.

symbol
Ticker symbol, such as SPY. GET /api/v1/symbols lists the valid ones.
curl -H "Authorization: Bearer $TP_TOKEN" "https://tickplunge.com/api/v1/vol-surface/SPY/quality"
{
  "symbol": "SPY",
  "trade_date": "2026-10-23",
  "surface_model": "v2",
  "quality_grade": "B",
  "quality_status": "published",
  "quality_as_of": "2026-10-24T04:31:45Z",
  "publish_blocked": false,
  "diagnostics": {
    "actual_nodes": 128,
    "arb_construction": 0.3027,
    "convergence_ratio": 1,
    "core_tenor_nodes": {
      "7": 16,
      "14": 16,
      "30": 16,
      "60": 16
    },
    "coverage_ratio": 1,
    "expected_nodes": 128,
    "filter": {
      "bid_drop": 166,
      "iv_drop": 0,
      "n_in": 4149,
      "n_out": 3240,
      "oi_drop": 526,
      "spread_drop": 111,
      "wing_survival": {
        "body": 2312,
        "shoulder": 699,
        "wing": 229
      }
    },
    "max_butterfly_arb": 0.0076,
    "max_calendar_arb": 0,
    "weighted_rmse_bp": 27.529
  },
  "model": {
    "family": "per_slice_ssvi",
    "slice_count": 22,
    "params": {
      "11": {
        "k_anchor": 0.0006,
        "phi": 27.9361,
        "psi": 0.019,
        "rho": -0.63,
        "tenor": 11,
        "w_anchor": 0.0007
      },
      "12": {
        "k_anchor": 0.0005,
        "phi": 27.293,
        "psi": 0.0206,
        "rho": -0.63,
        "tenor": 12,
        "w_anchor": 0.0007
      },
      "13": {
        "k_anchor": 0.0004,
        "phi": 28.3352,
        "psi": 0.0247,
        "rho": -0.61,
        "tenor": 13,
        "w_anchor": 0.0009
      },
      "14": {
        "k_anchor": -0.001,
        "phi": 29.1766,
        "psi": 0.0273,
        "rho": -0.59,
        "tenor": 14,
        "w_anchor": 0.001
      }
    },
    "converged": true,
    "tenor_diagnostics": [
      {
        "converged_tenor": true,
        "k_max": 0.0814,
        "k_max_applied": 0.0831,
        "k_min": -0.0829,
        "quote_count": 92,
        "rmse_bp": 28.8758,
        "std_tenor": 14,
        "tenor": 11
      },
      {
        "converged_tenor": true,
        "k_max": 0.0813,
        "k_max_applied": 0.0857,
        "k_min": -0.083,
        "quote_count": 89,
        "rmse_bp": 22.3843,
        "std_tenor": 14,
        "tenor": 12
      }
    ]
  },
  "gates": [
    {
      "name": "coverage_ratio",
      "passed": true,
      "value": 1,
      "threshold": 0.98,
      "message": "Grid coverage ratio must meet soft threshold (degraded if violated)"
    },
    {
      "name": "core_tenor_completeness",
      "passed": true,
      "value": {
        "7": 16,
        "14": 16,
        "30": 16,
        "60": 16
      },
      "threshold": 14,
      "message": "Core tenors must have at least 14 of 16 nodes (soft)"
    }
  ]
}
symbol
Ticker symbol the response describes.
trade_date
The trading day the surface was fitted for, as YYYY-MM-DD.
surface_model
Version of the surface pipeline that made the fit.
quality_grade
Fit grade of the surface on trade_date: A, B or C, or F when a hard gate failed.
quality_status
published when every gate passed, degraded when a soft gate failed, blocked when a hard gate failed, fit_failed when the fit could not run, skipped when the symbol was skipped, missing_quality_artifact when no quality report exists.
quality_as_of
UTC time the quality report for trade_date was written, in ISO 8601.
latest_trade_date
Newest trade date with raw strikes for the symbol, as YYYY-MM-DD. Left out when none is found, and on a request with as_of.
stale
true when the served surface trade_date is before latest_trade_date, so the newest fit failed or has not run. Absent on a request with as_of.
stale_status
Why the surface is stale, present only when stale is true: blocked or fit_failed when the newer quality report records it, not_recorded when no newer report exists.
stale_reasons
Gate names or the fit error message from the newer quality report, verbatim; empty when stale_status is not_recorded. Present only when stale is true.
publish_blocked
true when a hard gate failed and the surface was not published.
hard_fail_reasons[]
Names of the hard gates that failed, or the fit error message when quality_status is fit_failed. Left out when none failed.
diagnostics.actual_nodes
Grid cells, tenor by delta, that hold a finite IV.
diagnostics.arb_construction
Largest psi x (1 + |rho|) across fitted slices. A value of 4 or less keeps the slice free of butterfly arbitrage.
diagnostics.convergence_ratio
Share of fitted tenors whose own fit error is under its limit, from 0 to 1.
diagnostics.core_tenor_nodes.{tenor}
For each core tenor in days, the number of deltas with a finite IV, out of 16.
diagnostics.coverage_ratio
actual_nodes / expected_nodes, from 0 to 1.
diagnostics.expected_nodes
Grid cells the standard grid asks for: standard tenors times standard deltas.
diagnostics.filter.bid_drop
Quotes dropped for a missing or zero bid or ask.
diagnostics.filter.iv_drop
Quotes dropped for IV under the floor.
diagnostics.filter.n_in
Option quotes read for trade_date before any filter.
diagnostics.filter.n_out
Quotes left for the fit after every filter.
diagnostics.filter.oi_drop
Quotes dropped for open interest under the floor.
diagnostics.filter.spread_drop
Quotes dropped for a bid-ask spread wider than the cap.
diagnostics.filter.wing_survival.body
Quotes left with |log(strike / forward)| under 0.2.
diagnostics.filter.wing_survival.shoulder
Quotes left with |log(strike / forward)| from 0.2 to under 0.5.
diagnostics.filter.wing_survival.wing
Quotes left with |log(strike / forward)| of 0.5 or more.
diagnostics.max_butterfly_arb
Size of the largest butterfly violation on the fitted grid.
diagnostics.max_calendar_arb
Size of the largest calendar violation on the fitted grid.
diagnostics.weighted_rmse_bp
Weighted root mean square gap between quoted and fitted IV, in basis points of volatility.
model.family
The volatility model fitted: per_slice_ssvi fits one SSVI smile per expiry.
model.slice_count
Number of expiries fitted.
model.params.{tenor}
Fitted parameters for one expiry, keyed by its days to expiry.
model.params.{tenor}.k_anchor
Log moneyness, log(strike / forward), of the quote the slice passes through exactly.
model.params.{tenor}.phi
psi divided by the at-the-money total variance of the slice.
model.params.{tenor}.psi
SSVI parameter for the slope of the smile at the money, in total variance.
model.params.{tenor}.rho
SSVI skew parameter, from -1 to 1. Negative means puts carry higher IV.
model.params.{tenor}.tenor
Days to expiry of the slice.
model.params.{tenor}.w_anchor
Total implied variance, IV squared times tenor / 365, of that anchor quote.
model.converged
true when the fit converged overall.
model.tenor_diagnostics[].converged_tenor
true when rmse_bp is under its limit: 150 up to 21 days, 100 up to 60 days, else 75.
model.tenor_diagnostics[].k_max
Highest log moneyness among those quotes.
model.tenor_diagnostics[].k_max_applied
The log moneyness cap applied to the slice.
model.tenor_diagnostics[].k_min
Lowest log moneyness among those quotes.
model.tenor_diagnostics[].quote_count
Quotes used to fit the slice.
model.tenor_diagnostics[].rmse_bp
Weighted root mean square IV error of the slice, in basis points of volatility.
model.tenor_diagnostics[].std_tenor
Nearest standard grid tenor, in days.
model.tenor_diagnostics[].tenor
Days to expiry of the fitted slice.
gates[].name
Name of the check.
gates[].passed
true when the check passed.
gates[].value
The measured value the check compared, in the unit of its threshold.
gates[].threshold
The limit the value must meet.
gates[].message
What the check requires, and whether failing it degrades or blocks the surface.
gates[].value.{tenor}
For a check made per tenor, the measured value for each tenor in days.

`diagnostics.core_tenor_nodes` holds 7 keys; the first 4 are shown. `model.params` holds 22 keys; the first 4 are shown. `model.tenor_diagnostics` holds 22 items; the first 2 are shown. `gates` holds 5 items; the first 2 are shown. Each `gates[].value` holds up to 7 keys; the first 4 of each are shown.

GET /api/v1/vol-surface/{symbol}/stats

Summary numbers read off the latest surface: the 30-day at-the-money level, term slope, skew, smile, anomalies and arbitrage counts.

symbol
Ticker symbol, such as SPY. GET /api/v1/symbols lists the valid ones.
curl -H "Authorization: Bearer $TP_TOKEN" "https://tickplunge.com/api/v1/vol-surface/SPY/stats"
{
  "trade_date": "2026-08-21",
  "symbol": "SPY",
  "quality_grade": "B",
  "quality_status": "published",
  "quality_as_of": "2026-08-22T06:58:00Z",
  "atm_iv_30d": 0.12537878691049992,
  "ts_slope": 3.0061957265188712,
  "ts_shape": "steep",
  "ts_shape_interp": "Steep upward term structure, contango",
  "skew_25d": 0.04628448316018814,
  "skew_pctile": 0,
  "skew_interp": "Moderate put premium, normal demand",
  "smile_curvature": 0.02225877560369538,
  "anomaly_count": 6,
  "max_anomaly": 3.668647174178595,
  "max_anomaly_tenor": 90,
  "max_anomaly_delta": -0.05,
  "calendar_arb_count": 0,
  "butterfly_arb_count": 28,
  "max_calendar_arb": 0,
  "max_butterfly_arb": 0.006905924064527169
}
trade_date
The trading day of the surface the numbers come from, as YYYY-MM-DD.
symbol
Ticker symbol the response describes.
quality_grade
Fit grade of the surface on trade_date: A, B or C, or F when a hard gate failed.
quality_status
published when every gate passed, degraded when a soft gate failed, blocked when a hard gate failed, fit_failed when the fit could not run, skipped when the symbol was skipped, missing_quality_artifact when no quality report exists.
quality_as_of
UTC time the quality report for trade_date was written, in ISO 8601.
latest_trade_date
Newest trade date with raw strikes for the symbol, as YYYY-MM-DD. Left out when none is found, and on a request with as_of.
stale
true when the served surface trade_date is before latest_trade_date, so the newest fit failed or has not run. Absent on a request with as_of.
stale_status
Why the surface is stale, present only when stale is true: blocked or fit_failed when the newer quality report records it, not_recorded when no newer report exists.
stale_reasons
Gate names or the fit error message from the newer quality report, verbatim; empty when stale_status is not_recorded. Present only when stale is true.
atm_iv_30d
Implied volatility at 30 days and 0.50 delta, as a decimal.
ts_slope
Term slope: (IV at 90 days - IV at 30 days) x 10000 / 60, in basis points of volatility per day.
ts_shape
steep when ts_slope is above 1, flat above -1, else inverted.
ts_shape_interp
One plain sentence that reads ts_shape.
skew_25d
IV of the 25-delta put minus IV of the 25-delta call at 30 days, as a decimal.
skew_pctile
Percent of earlier trade dates with skew_25d at or below this one, from 0 to 100. null with no earlier history.
skew_interp
One plain sentence that reads skew_25d.
smile_curvature
Mean IV of the 10-delta put and 10-delta call minus at-the-money IV at 30 days, as a decimal.
anomaly_count
Number of surface cells whose quote residual z-score is above 2 in size.
max_anomaly
The largest quote residual z-score on the surface, in standard units.
max_anomaly_tenor
Days to expiry of the cell with max_anomaly.
max_anomaly_delta
Delta of the cell with max_anomaly.
calendar_arb_count
Number of cells where total variance falls as tenor rises, a calendar arbitrage.
butterfly_arb_count
Number of cells where the fitted smile breaks the butterfly condition.
max_calendar_arb
Size of the largest calendar violation on the surface.
max_butterfly_arb
Size of the largest butterfly violation on the surface.

Distribution and forwards

GET /api/v1/distribution/{symbol}

The probability distribution of the price at one expiry, implied by option prices, with tail odds and percentiles.

symbol
Ticker symbol, such as SPY. GET /api/v1/symbols lists the valid ones.
tenor
Target days to expiry; the nearest listed expiry is used. Default 30.
as_of
Trade date to read, as YYYY-MM-DD. Leave it out for the latest date.
curl -H "Authorization: Bearer $TP_TOKEN" "https://tickplunge.com/api/v1/distribution/SPY?tenor=30"
{
  "trade_date": "2026-10-30",
  "symbol": "SPY",
  "dte": 29,
  "spot": 756.17,
  "forward_price": 758.3178,
  "forward_premium_pct": 0.284,
  "atm_vol": 0.1522,
  "atm_iv_source": "fitted_surface",
  "price_source": "fitted_surface",
  "forward_fallback": false,
  "points": [
    {
      "strike": 505,
      "moneyness": 0.66783924249838,
      "impl_pdf": 0.000014417425889989332,
      "logn_pdf": 7.102664069731682e-22
    },
    {
      "strike": 510,
      "moneyness": 0.6744515122260868,
      "impl_pdf": 0.00001643736701609447,
      "logn_pdf": 6.008488064876457e-21
    }
  ],
  "tail_prob_down_10": 0.0433,
  "tail_prob_up_10": 0.0037,
  "tail_ratio": 11.6245,
  "crash_prob_20": 0.0065,
  "implied_skewness": -1.7891,
  "implied_kurtosis": 5.4209,
  "implied_mean": 758.4653,
  "implied_stdev": 36.9568,
  "price_p10": 713.5552,
  "price_p25": 745.9102,
  "price_p50": 766.58,
  "price_p75": 780.5611,
  "price_p90": 792.5735,
  "ci68_pct_low": -3.353,
  "ci68_pct_high": 4.0443,
  "ci95_pct_low": -12.9597,
  "ci95_pct_high": 6.9482
}
trade_date
The trading day whose option prices the distribution comes from, as YYYY-MM-DD.
symbol
Ticker symbol the response describes.
dte
Days to expiry of the expiry used, which may differ from the requested tenor.
spot
Underlying price on trade_date, in dollars.
forward_price
Forward price for the expiry, in dollars.
forward_premium_pct
(forward_price / spot - 1) x 100, in percent.
atm_vol
At-the-money implied volatility for the expiry, as a decimal: the vol-surface fit at call delta 0.50, or ORATS smv_vol at the strike nearest delta 0.50 when the surface is missing, stale or blocked.
atm_iv_source
Where atm_vol came from: fitted_surface (the vol-surface fit at call delta 0.50) or orats_smv (the fallback to ORATS smv_vol). null for a distribution computed before the field existed.
price_source
Where the call prices behind the density came from: fitted_surface (the vol-surface fit) or orats_smv (the fallback to smoothed ORATS smv_vol when the surface is missing, stale or blocked). null for a distribution computed before the field existed.
forward_fallback
true when the parity forward for the expiry was missing and spot stood in for it, false otherwise. null for a distribution computed before the field existed.
points[].strike
Strike price, in dollars.
points[].moneyness
strike / spot.
points[].impl_pdf
Implied probability density at the strike, per dollar of price, from the Breeden-Litzenberger method.
points[].logn_pdf
Lognormal density at the strike with atm_vol, per dollar, for comparison.
tail_prob_down_10
Implied probability the price ends below 90% of spot at expiry, from 0 to 1.
tail_prob_up_10
Implied probability the price ends above 110% of spot at expiry, from 0 to 1.
tail_ratio
tail_prob_down_10 / tail_prob_up_10, a plain ratio.
crash_prob_20
Implied probability the price ends below 80% of spot at expiry, from 0 to 1.
implied_skewness
Skewness of the implied distribution, unitless. Negative means a longer left tail.
implied_kurtosis
Excess kurtosis of the implied distribution, unitless. 0 matches a normal curve.
implied_mean
Mean of the implied price at expiry, in dollars.
implied_stdev
Standard deviation of the implied price at expiry, in dollars.
price_p10
10th percentile of the implied price at expiry, in dollars.
price_p25
25th percentile of the implied price at expiry, in dollars.
price_p50
Median of the implied price at expiry, in dollars.
price_p75
75th percentile of the implied price at expiry, in dollars.
price_p90
90th percentile of the implied price at expiry, in dollars.
ci68_pct_low
(16th percentile of the implied price / spot - 1) x 100, in percent. The low end of the Dist Stats Panel 68% CI.
ci68_pct_high
(84th percentile of the implied price / spot - 1) x 100, in percent. The high end of the Dist Stats Panel 68% CI.
ci95_pct_low
(2.5th percentile of the implied price / spot - 1) x 100, in percent. The low end of the Dist Stats Panel 95% CI.
ci95_pct_high
(97.5th percentile of the implied price / spot - 1) x 100, in percent. The high end of the Dist Stats Panel 95% CI.

`points` holds 149 items; the first 2 are shown.

GET /api/v1/distribution/{symbol}/tenors

The expiries, in days, that have an implied distribution on the latest trade date.

symbol
Ticker symbol, such as SPY. GET /api/v1/symbols lists the valid ones.
curl -H "Authorization: Bearer $TP_TOKEN" "https://tickplunge.com/api/v1/distribution/SPY/tenors"
{
  "symbol": "SPY",
  "tenors": [
    5,
    6
  ]
}
symbol
Ticker symbol the response describes.
tenors[]
Days to expiry with a distribution, ascending. Pass one as tenor to the distribution route.

`tenors` holds 26 items; the first 2 are shown.

GET /api/v1/forward-curve/{symbol}

The forward price at each listed expiry, from put-call parity on the option chain.

symbol
Ticker symbol, such as SPY. GET /api/v1/symbols lists the valid ones.
as_of
Trade date to read, as YYYY-MM-DD. The latest date on or before it is used. Leave it out for the latest.
curl -H "Authorization: Bearer $TP_TOKEN" "https://tickplunge.com/api/v1/forward-curve/SPY"
{
  "trade_date": "2026-08-21",
  "symbol": "SPY",
  "stockPrice": 765.49,
  "points": [
    {
      "dte": 5,
      "forward": 765.7498681159103,
      "stockPrice": 765.49,
      "premium_pct": 0.03394794391962108
    },
    {
      "dte": 6,
      "forward": 765.8298923769064,
      "stockPrice": 765.49,
      "premium_pct": 0.044401935610705046
    }
  ]
}
trade_date
The trading day whose option prices the curve comes from, as YYYY-MM-DD.
symbol
Ticker symbol the response describes.
stockPrice
Underlying price on trade_date, in dollars.
points[].dte
Days to expiry.
points[].forward
Forward price for the expiry by put-call parity, in dollars.
points[].stockPrice
Underlying price on trade_date, in dollars, repeated per point.
points[].premium_pct
(forward / stockPrice - 1) x 100, in percent.

`points` holds 26 items; the first 2 are shown.

Greeks

GET /api/v1/greeks/{symbol}

One higher-order greek, or its open-interest exposure, at every strike of one expiry.

symbol
Ticker symbol, such as SPY. GET /api/v1/symbols lists the valid ones.
tenor
Target days to expiry; the nearest listed expiry is used. Default 30.
metric
vanna, charm, gamma, vanna_exposure, charm_exposure or gamma_exposure. Default vanna_exposure.
offset
0 for the latest trade date, 1 for the one before. Cannot be combined with as_of. The day before exists only for the expiry the diff route compares; for any other tenor, offset 1 returns empty arrays and reference_tenor, the days to expiry of that expiry.
as_of
Trade date to read, as YYYY-MM-DD. Leave it out for the latest date.
curl -H "Authorization: Bearer $TP_TOKEN" "https://tickplunge.com/api/v1/greeks/SPY?metric=vanna_exposure&tenor=30&offset=0"
{
  "symbol": "SPY",
  "trade_date": "2026-10-30",
  "dte": 29,
  "metric": "vanna_exposure",
  "spot": 756.17,
  "forward": 758.317754162493,
  "forward_source": "parity",
  "moneyness": [
    0.6612269727706733,
    0.66783924249838
  ],
  "strikes": [
    500,
    505
  ],
  "values": [
    17.810199471233066,
    0.45827743717742975
  ],
  "delta": [
    0.9996,
    0.9994
  ],
  "callOpenInterest": [
    0,
    0
  ],
  "putOpenInterest": [
    548,
    12
  ],
  "smvVol": [
    0.5256,
    0.5251
  ],
  "callVolume": [
    0,
    0
  ],
  "putVolume": [
    26,
    0
  ],
  "hedging_flow": {
    "atm_iv": 0.1522,
    "atm_iv_source": "fitted_surface",
    "move_1sd_pct": 0.9587,
    "gamma_flow_1sd": 532166.5762,
    "vanna_flow_1vp": 29170.0951,
    "charm_flow_1d": -5686.9323,
    "gamma_flow_1sd_notional": 402408399.9299,
    "vanna_flow_1vp_notional": 22057550.795,
    "charm_flow_1d_notional": -4300287.5953,
    "assumption": "customer_long_oi"
  }
}
symbol
Ticker symbol the response describes.
trade_date
The trading day the greeks were computed for, as YYYY-MM-DD.
dte
Days to expiry of the expiry used.
metric
The greek values[] holds, as requested.
spot
Underlying price on trade_date, in dollars.
forward
Forward price for the expiry by put-call parity, in dollars: the forward-curve route point nearest dte on or before trade_date. Spot when the symbol has no forward curve.
forward_source
parity when forward is the put-call parity forward from the forward-curve route, spot_fallback when the symbol has no forward curve and forward is spot.
moneyness[]
strike / spot, one per strike.
strikes[]
Strike prices, in dollars, ascending.
values[]
The metric at each strike. An exposure is -greek x open interest, summed over calls and puts, per contract.
delta[]
Call delta from ORATS at each strike, from 0 to 1.
callOpenInterest[]
Call open interest at each strike, in contracts.
putOpenInterest[]
Put open interest at each strike, in contracts.
smvVol[]
ORATS smoothed implied volatility at each strike, as a decimal. The greeks use it.
callVolume[]
Call contracts traded on trade_date at each strike.
putVolume[]
Put contracts traded on trade_date at each strike.
hedging_flow.atm_iv
At-the-money implied volatility for the expiry, as a decimal: the vol-surface fit at call delta 0.50, or ORATS smv_vol at the strike nearest moneyness 1 when the surface is missing, stale or blocked.
hedging_flow.atm_iv_source
Where atm_iv came from: fitted_surface (the vol-surface fit) or orats_smv (the fallback to ORATS smv_vol). null for a summary computed before the field existed.
hedging_flow.move_1sd_pct
One-day one-standard-deviation move of the underlying, 100 x atm_iv / sqrt(252), in percent.
hedging_flow.gamma_flow_1sd
Shares the hedger trades to stay delta neutral after the underlying rises by one move_1sd_pct: -100 x spot x atm_iv / sqrt(252) x net_gamma_exposure. Positive is buying, negative selling.
hedging_flow.vanna_flow_1vp
Shares the hedger trades after implied volatility rises one vol point (0.01): -100 x 0.01 x net_vanna_exposure. Positive is buying, negative selling.
hedging_flow.charm_flow_1d
Shares the hedger trades as one calendar day passes: -100 x net_charm_exposure / 365. Positive is buying, negative selling.
hedging_flow.gamma_flow_1sd_notional
gamma_flow_1sd x spot, in dollars.
hedging_flow.vanna_flow_1vp_notional
vanna_flow_1vp x spot, in dollars.
hedging_flow.charm_flow_1d_notional
charm_flow_1d x spot, in dollars.
hedging_flow.assumption
The positioning the flows assume: customer_long_oi, customers long the open interest and the hedger short it.

`moneyness`, `strikes`, `values`, `delta`, `callOpenInterest`, `putOpenInterest`, `smvVol`, `callVolume` and `putVolume` each hold 151 items; the first 2 are shown.

GET /api/v1/greeks/{symbol}/diff

Day-over-day change in vanna, charm, gamma and their exposures at each strike of the expiry nearest 30 days.

symbol
Ticker symbol, such as SPY. GET /api/v1/symbols lists the valid ones.
curl -H "Authorization: Bearer $TP_TOKEN" "https://tickplunge.com/api/v1/greeks/SPY/diff"
{
  "symbol": "SPY",
  "trade_date": "2026-10-30",
  "dte": 29,
  "records": [
    {
      "trade_date": "2026-10-30",
      "symbol": "SPY",
      "strike": 500,
      "moneyness": 0.6612269727706733,
      "vanna_today": -0.032500363998600484,
      "vanna_yesterday": -0.006789236561990335,
      "vanna_change": -0.02571112743661015,
      "charm_today": 0.11614437679769585,
      "charm_yesterday": 0.027982456624435804,
      "charm_change": 0.08816192017326005,
      "gamma_today": 0.000055753142508470275,
      "gamma_yesterday": 0.000009136383750062259,
      "gamma_change": 0.000046616758758408014,
      "vanna_exposure_today": 17.810199471233066,
      "vanna_exposure_yesterday": 3.184151947573467,
      "vanna_exposure_change": 14.626047523659599,
      "charm_exposure_today": -58.171470728537706,
      "charm_exposure_yesterday": -8.437625367652737,
      "charm_exposure_change": -49.73384536088497,
      "gamma_exposure_today": -0.030552722094641712,
      "gamma_exposure_yesterday": -0.004284963978779199,
      "gamma_exposure_change": -0.026267758115862513,
      "computed_at": "2026-10-31T05:07:17Z",
      "reference_dte": 29
    },
    {
      "trade_date": "2026-10-30",
      "symbol": "SPY",
      "strike": 505,
      "moneyness": 0.66783924249838,
      "vanna_today": -0.03818978643145248,
      "vanna_yesterday": -0.008702575718897931,
      "vanna_change": -0.02948721071255455,
      "charm_today": 0.13456826812758235,
      "charm_yesterday": 0.03304567191735267,
      "charm_change": 0.10152259621022969,
      "gamma_today": 0.00006709503382710733,
      "gamma_yesterday": 0.000011991399783619547,
      "gamma_change": 0.00005510363404348778,
      "vanna_exposure_today": 0.45827743717742975,
      "vanna_exposure_yesterday": 0.10443090862677518,
      "vanna_exposure_change": 0.35384652855065457,
      "charm_exposure_today": -1.4949145221309967,
      "charm_exposure_yesterday": -0.276646652623388,
      "charm_exposure_change": -1.2182678695076088,
      "gamma_exposure_today": -0.0008051404059252879,
      "gamma_exposure_yesterday": -0.00014389679740343456,
      "gamma_exposure_change": -0.0006612436085218534,
      "computed_at": "2026-10-31T05:07:17Z",
      "reference_dte": 29
    }
  ]
}
symbol
Ticker symbol the response describes.
trade_date
The later of the two trading days compared, as YYYY-MM-DD.
dte
Days to expiry, on trade_date, of the expiry compared.
records[].trade_date
The later of the two trading days compared, as YYYY-MM-DD.
records[].symbol
Ticker symbol of the row.
records[].strike
Strike price, in dollars.
records[].moneyness
strike / spot on trade_date.
records[].vanna_today
Black-Scholes vanna on trade_date: change in delta per 1.00 change in volatility.
records[].vanna_yesterday
Vanna for the same strike and expiry on the prior trading day.
records[].vanna_change
vanna_today - vanna_yesterday.
records[].charm_today
Black-Scholes charm on trade_date: change in delta per year of time passing.
records[].charm_yesterday
Charm for the same strike and expiry on the prior trading day.
records[].charm_change
charm_today - charm_yesterday.
records[].gamma_today
Black-Scholes gamma on trade_date: change in delta per $1 move in the underlying.
records[].gamma_yesterday
Gamma for the same strike and expiry on the prior trading day.
records[].gamma_change
gamma_today - gamma_yesterday.
records[].vanna_exposure_today
-vanna x (call + put open interest) on trade_date, per contract.
records[].vanna_exposure_yesterday
The same exposure on the prior trading day.
records[].vanna_exposure_change
vanna_exposure_today - vanna_exposure_yesterday.
records[].charm_exposure_today
-charm x (call + put open interest) on trade_date, per contract.
records[].charm_exposure_yesterday
The same exposure on the prior trading day.
records[].charm_exposure_change
charm_exposure_today - charm_exposure_yesterday.
records[].gamma_exposure_today
-gamma x (call + put open interest) on trade_date, per contract.
records[].gamma_exposure_yesterday
The same exposure on the prior trading day.
records[].gamma_exposure_change
gamma_exposure_today - gamma_exposure_yesterday.
records[].computed_at
UTC time the comparison was computed, in ISO 8601.
records[].reference_dte
Days to expiry, on trade_date, of the expiry compared. It is the listed expiry closest to 30 days.

`records` holds 151 items; the first 2 are shown.

GET /api/v1/greeks/{symbol}/summary

Net and peak vanna, charm and gamma, with their exposures and open interest, for every expiry on the latest trade date.

symbol
Ticker symbol, such as SPY. GET /api/v1/symbols lists the valid ones.
curl -H "Authorization: Bearer $TP_TOKEN" "https://tickplunge.com/api/v1/greeks/SPY/summary"
{
  "symbol": "SPY",
  "trade_date": "2026-10-30",
  "stockPrice": 756.17,
  "risk_free_rate": 0.0415,
  "div_yield": 0.01,
  "tenors": [
    {
      "dte": 5,
      "peak_vanna_abs": 1.9185,
      "peak_vanna_strike": 768,
      "peak_vanna_moneyness": 1.0156,
      "net_vanna": 1.9453,
      "net_charm": 30.276,
      "net_gamma": 1.0142,
      "mean_vanna": 0.0131,
      "mean_charm": 0.2032,
      "atm_charm": -0.295,
      "n_strikes": 149,
      "net_vanna_exposure": -26641.1011,
      "net_charm_exposure": 100950.6495,
      "net_gamma_exposure": -1292.3406,
      "peak_vanna_exposure": 8193.412,
      "peak_exposure_strike": 740,
      "peak_gamma_exposure": -98.5822,
      "peak_gamma_exposure_strike": 755,
      "total_call_oi": 43309,
      "total_put_oi": 87383,
      "total_call_volume": 197406,
      "total_put_volume": 177521,
      "forward": 756.1995450761812,
      "forward_source": "parity",
      "atm_iv": 0.1537,
      "atm_iv_source": "fitted_surface",
      "move_1sd_pct": 0.9679,
      "gamma_flow_1sd": 945891.5203,
      "vanna_flow_1vp": 26641.1011,
      "charm_flow_1d": -27657.7122,
      "gamma_flow_1sd_notional": 715254790.8894,
      "vanna_flow_1vp_notional": 20145201.3867,
      "charm_flow_1d_notional": -20913932.2195,
      "assumption": "customer_long_oi"
    },
    {
      "dte": 6,
      "peak_vanna_abs": 1.787,
      "peak_vanna_strike": 771,
      "peak_vanna_moneyness": 1.0196,
      "net_vanna": 4.7473,
      "net_charm": 15.9294,
      "net_gamma": 0.9764,
      "mean_vanna": 0.0319,
      "mean_charm": 0.1069,
      "atm_charm": -0.2921,
      "n_strikes": 149,
      "net_vanna_exposure": -92671.5622,
      "net_charm_exposure": 412485.1787,
      "net_gamma_exposure": -1997.025,
      "peak_vanna_exposure": -60040.5252,
      "peak_exposure_strike": 767,
      "peak_gamma_exposure": -819.1327,
      "peak_gamma_exposure_strike": 767,
      "total_call_oi": 39282,
      "total_put_oi": 86143,
      "total_call_volume": 98013,
      "total_put_volume": 290619,
      "forward": 756.2795086543409,
      "forward_source": "parity",
      "atm_iv": 0.1536,
      "atm_iv_source": "fitted_surface",
      "move_1sd_pct": 0.9676,
      "gamma_flow_1sd": 1461209.9802,
      "vanna_flow_1vp": 92671.5622,
      "charm_flow_1d": -113009.638,
      "gamma_flow_1sd_notional": 1104923150.6925,
      "vanna_flow_1vp_notional": 70075455.1614,
      "charm_flow_1d_notional": -85454497.9685,
      "assumption": "customer_long_oi"
    }
  ],
  "computed_at": "2026-10-31T05:07:17Z"
}
symbol
Ticker symbol the response describes.
trade_date
The trading day the greeks were computed for, as YYYY-MM-DD.
stockPrice
Underlying price on trade_date, in dollars.
risk_free_rate
Risk-free rate used in the greeks, as a decimal. It is the ORATS 5-week rate on trade_date.
div_yield
Dividend yield used in the greeks, as a decimal.
tenors[].dte
Days to expiry.
tenors[].peak_vanna_abs
Largest absolute vanna across the strikes of the expiry.
tenors[].peak_vanna_strike
Strike, in dollars, where that vanna sits.
tenors[].peak_vanna_moneyness
strike / spot at that strike.
tenors[].net_vanna
Sum of vanna across strikes.
tenors[].net_charm
Sum of charm across strikes, in delta per year.
tenors[].net_gamma
Sum of gamma across strikes, in delta per $1.
tenors[].mean_vanna
Mean vanna across strikes.
tenors[].mean_charm
Mean charm across strikes, in delta per year.
tenors[].atm_charm
Call charm at the strike nearest moneyness 1, in delta per year. null for a summary computed before the field existed.
tenors[].n_strikes
Number of strikes in the expiry.
tenors[].net_vanna_exposure
Sum over strikes of -vanna x (call + put open interest), per contract.
tenors[].net_charm_exposure
Sum over strikes of -charm x (call + put open interest), per contract.
tenors[].net_gamma_exposure
Sum over strikes of -gamma x (call + put open interest), per contract.
tenors[].peak_vanna_exposure
The strike vanna exposure largest in size, with its sign.
tenors[].peak_exposure_strike
Strike, in dollars, of peak_vanna_exposure.
tenors[].peak_gamma_exposure
The strike gamma exposure largest in size, with its sign.
tenors[].peak_gamma_exposure_strike
Strike, in dollars, of peak_gamma_exposure.
tenors[].total_call_oi
Call open interest across strikes, in contracts.
tenors[].total_put_oi
Put open interest across strikes, in contracts.
tenors[].total_call_volume
Call contracts traded on trade_date across strikes.
tenors[].total_put_volume
Put contracts traded on trade_date across strikes.
tenors[].forward
Forward price for the expiry by put-call parity, in dollars: the forward-curve route point nearest dte on or before trade_date. Spot when the symbol has no forward curve.
tenors[].forward_source
parity when forward is the put-call parity forward from the forward-curve route, spot_fallback when the symbol has no forward curve and forward is spot.
tenors[].atm_iv
At-the-money implied volatility for the expiry, as a decimal: the vol-surface fit at call delta 0.50, or ORATS smv_vol at the strike nearest moneyness 1 when the surface is missing, stale or blocked.
tenors[].atm_iv_source
Where atm_iv came from: fitted_surface (the vol-surface fit) or orats_smv (the fallback to ORATS smv_vol). null for a summary computed before the field existed.
tenors[].move_1sd_pct
One-day one-standard-deviation move of the underlying, 100 x atm_iv / sqrt(252), in percent.
tenors[].gamma_flow_1sd
Shares the hedger trades to stay delta neutral after the underlying rises by one move_1sd_pct: -100 x spot x atm_iv / sqrt(252) x net_gamma_exposure. Positive is buying, negative selling.
tenors[].vanna_flow_1vp
Shares the hedger trades after implied volatility rises one vol point (0.01): -100 x 0.01 x net_vanna_exposure. Positive is buying, negative selling.
tenors[].charm_flow_1d
Shares the hedger trades as one calendar day passes: -100 x net_charm_exposure / 365. Positive is buying, negative selling.
tenors[].gamma_flow_1sd_notional
gamma_flow_1sd x spot, in dollars.
tenors[].vanna_flow_1vp_notional
vanna_flow_1vp x spot, in dollars.
tenors[].charm_flow_1d_notional
charm_flow_1d x spot, in dollars.
tenors[].assumption
The positioning the flows assume: customer_long_oi, customers long the open interest and the hedger short it.
computed_at
UTC time the summary was computed, in ISO 8601.

`tenors` holds 27 items; the first 2 are shown.

GET /api/v1/greeks/{symbol}/tenors

The expiries, in days, that have greeks on the latest trade date.

symbol
Ticker symbol, such as SPY. GET /api/v1/symbols lists the valid ones.
curl -H "Authorization: Bearer $TP_TOKEN" "https://tickplunge.com/api/v1/greeks/SPY/tenors"
{
  "symbol": "SPY",
  "tenors": [
    5,
    6
  ]
}
symbol
Ticker symbol the response describes.
tenors[]
Days to expiry with greeks, ascending. Pass one as tenor to the greeks route.

`tenors` holds 26 items; the first 2 are shown.

Cross-asset

GET /api/v1/cross-asset/correlations

The correlation of daily VRP between every pair of symbols, over the last 252 trading days they share.

curl -H "Authorization: Bearer $TP_TOKEN" "https://tickplunge.com/api/v1/cross-asset/correlations"
{
  "symbols": [
    "AAPL",
    "AMD"
  ],
  "correlations": [
    [
      1,
      0.5139191053553395
    ],
    [
      0.5139191053553395,
      1
    ]
  ],
  "window_start": "2025-08-21",
  "window_end": "2026-08-21",
  "n_obs": 252,
  "computed_at": "2026-08-22T06:59:24Z"
}
symbols[]
Symbols in matrix order. Row i and column i of correlations belong to symbols[i].
correlations[][]
Pearson correlation of daily vrp between symbols[i] and symbols[j], from -1 to 1. The diagonal is 1.
window_start
First trading day in the window, as YYYY-MM-DD.
window_end
Last trading day in the window, as YYYY-MM-DD.
n_obs
Trading days in the window on which every symbol has a vrp value. At most 252.
computed_at
UTC time the matrix was computed, in ISO 8601.

`symbols` and `correlations` each hold 23 items; the first 2 are shown. Each `correlations[]` holds up to 23 items; the first 2 of each are shown.

GET /api/v1/cross-asset/summary

One row per symbol with its latest implied and historical volatility, VRP, percentiles and regime.

curl -H "Authorization: Bearer $TP_TOKEN" "https://tickplunge.com/api/v1/cross-asset/summary"
[
  {
    "symbol": "SPY",
    "iv30": 0.124,
    "hv30": 0.1233,
    "vrp": 0.005677210056772131,
    "vrp_zscore": -0.13626411614548825,
    "iv_pctile": 26.913155631986243,
    "hv_pctile": 38.435081685296645,
    "vol_regime": "low_vol",
    "trade_date": "2026-08-21"
  },
  {
    "symbol": "QQQ",
    "iv30": 0.1871,
    "hv30": 0.2198,
    "vrp": -0.14877161055505006,
    "vrp_zscore": -0.19599130763080477,
    "iv_pctile": 39.72484952708513,
    "hv_pctile": 62.42476354256233,
    "vol_regime": "normal",
    "trade_date": "2026-08-21"
  }
]
[].symbol
Ticker symbol of the row.
[].iv30
30-day implied volatility on trade_date, annualized, as a decimal.
[].hv30
30-day historical volatility paired with trade_date, annualized, as a decimal.
[].vrp
iv30 / hv30 - 1 on trade_date, as a decimal.
[].vrp_zscore
z-score of vrp against the 20 trading days ending on trade_date. null until 20 days of history exist.
[].iv_pctile
Percent of days through trade_date with a lower iv30, from 0 to 100.
[].hv_pctile
Percent of days through trade_date with a lower hv30, from 0 to 100.
[].vol_regime
low_vol, normal, high_vol or crisis, from iv_pctile at cuts of 30, 70 and 90.
[].trade_date
The latest trading day with a VRP record for the symbol, as YYYY-MM-DD.

The response holds 23 items; the first 2 are shown.

Rates and macro

GET /api/v1/fred

The names of the FRED rate and macro series the API carries, sorted.

curl -H "Authorization: Bearer $TP_TOKEN" "https://tickplunge.com/api/v1/fred"
{
  "count": 115,
  "series": [
    "Aaa_Yield",
    "Aaa_minus_UST10Y"
  ]
}
count
Number of series, before the example was cut.
series[]
Series names. Pass one to /api/v1/fred/{series} or to the macro history route.

`series` holds 115 items; the first 2 are shown.

GET /api/v1/fred/{series}

The full daily history of one FRED series, on the dates SOFR was published.

series
Series name from /api/v1/fred, such as SOFR. Case does not matter; an unknown name returns 404.
curl -H "Authorization: Bearer $TP_TOKEN" "https://tickplunge.com/api/v1/fred/SOFR"
{
  "count": 2094,
  "records": [
    {
      "date": "2018-04-03",
      "trading_day": 1,
      "value": 1.83
    },
    {
      "date": "2018-04-04",
      "trading_day": 2,
      "value": 1.74
    }
  ],
  "series": "SOFR"
}
count
Number of records, before the example was cut.
records[].date
The observation date, as YYYY-MM-DD.
records[].trading_day
Position of date in the SOFR date sequence, counting from 1.
records[].value
The series value on date, in the unit of the series (SOFR is in percent).
series
Series name the response describes.

`records` holds 2,094 items; the first 2 are shown.

GET /api/v1/macro/event-paths

How chosen series moved around past calendar events, such as quarter ends, measured from the event day.

event
month_end, quarter_end, tax_date, debt_limit_bind, technical_adjustment or facility_start.
series
Comma-separated series names, 1 to 24.
curl -H "Authorization: Bearer $TP_TOKEN" "https://tickplunge.com/api/v1/macro/event-paths?event=quarter_end&series=EFFR_minus_IORB,SOFR_minus_IORB,SOFR_minus_TGCR"
{
  "count": 3,
  "event_type": "quarter_end",
  "n_events": 20,
  "series": [
    {
      "name": "EFFR_minus_IORB",
      "unit": "percentage_points",
      "frequency": "daily",
      "points": [
        {
          "offset": -10,
          "mean": 0.000499999999999999,
          "median": 0,
          "p25": 0,
          "p75": 0,
          "n": 20
        },
        {
          "offset": -9,
          "mean": 0.0009999999999999987,
          "median": 0,
          "p25": 0,
          "p75": 0,
          "n": 20
        }
      ]
    },
    {
      "name": "SOFR_minus_IORB",
      "unit": "percentage_points",
      "frequency": "daily",
      "points": [
        {
          "offset": -10,
          "mean": -0.0465,
          "median": -0.03,
          "p25": -0.08249999999999999,
          "p75": 0,
          "n": 20
        },
        {
          "offset": -9,
          "mean": -0.0515,
          "median": -0.05000000000000001,
          "p25": -0.08499999999999999,
          "p75": 0,
          "n": 20
        }
      ]
    }
  ]
}
count
Number of series in the response, before the example was cut.
event_type
The kind of event, as requested.
n_events
Number of past events of this kind in the history.
series[].name
Series name.
series[].unit
Unit of the series and of every point value.
series[].frequency
How often the series is observed.
series[].points[].offset
Open market days from the event date. 0 is the event date; negative is before.
series[].points[].mean
Mean change from the event-day value to the value at offset, over past events, in unit.
series[].points[].median
Median of that change, in unit.
series[].points[].p25
25th percentile of that change, in unit.
series[].points[].p75
75th percentile of that change, in unit.
series[].points[].n
Past events with a reading at this offset. A small n is weak evidence.

`series` holds 3 items; the first 2 are shown. Each `series[].points` holds up to 21 items; the first 2 of each are shown.

GET /api/v1/macro/history

The full history of up to 12 macro series at once, with each series unit and frequency.

series
Comma-separated series names, 1 to 12, returned in this order. An unknown name returns 404.
curl -H "Authorization: Bearer $TP_TOKEN" "https://tickplunge.com/api/v1/macro/history?series=EFFR,FF_Lower,FF_Upper,Fed_Assets,IORB,OBFR,RRP_Rate,RRP_TakeUp,Reserves,SOFR,TGA,TGCR"
{
  "count": 12,
  "series": [
    {
      "name": "EFFR",
      "unit": "percent",
      "frequency": "daily",
      "records": [
        {
          "date": "2018-04-03",
          "trading_day": 1,
          "value": 1.69
        },
        {
          "date": "2018-04-04",
          "trading_day": 2,
          "value": 1.69
        }
      ]
    },
    {
      "name": "FF_Lower",
      "unit": "percent",
      "frequency": "daily",
      "records": [
        {
          "date": "2018-04-03",
          "trading_day": 1,
          "value": 1.5
        },
        {
          "date": "2018-04-04",
          "trading_day": 2,
          "value": 1.5
        }
      ]
    }
  ]
}
count
Number of series in the response, before the example was cut.
series[].name
Series name.
series[].unit
Unit of value: percent, percentage_points, usd_mn (millions of dollars), ratio or thousands.
series[].frequency
How often the series is observed: daily, weekly_wed or monthly.
series[].records[].date
The observation date, as YYYY-MM-DD.
series[].records[].trading_day
Position of date in the SOFR date sequence, counting from 1.
series[].records[].value
The series value on date, in unit.

`series` holds 12 items; the first 2 are shown. Each `series[].records` holds up to 2,094 items; the first 2 of each are shown.

GET /api/v1/macro/snapshot

The whole macro board: section scores, factors, every feature with its statistics, the reserves bridge, calendar events and a glossary.

curl -H "Authorization: Bearer $TP_TOKEN" "https://tickplunge.com/api/v1/macro/snapshot"
{
  "v": 1,
  "as_of": "2026-10-29",
  "freshness": {
    "as_of": "2026-10-29",
    "age_days": 2,
    "status": "fresh"
  },
  "sections": [
    {
      "active_factor_count": 3,
      "as_of": "2026-10-29",
      "coherence": 100,
      "coherence_label": "High",
      "dislocation": 92,
      "dislocation_raw": 1.4655,
      "evidence": {
        "claim": "Unsecured dislocation confirmed by Secured funding pressure, Secured-unsecured basis.",
        "claim_type": "inference",
        "contradicting_factors": [],
        "data_freshness": "good",
        "independent_contradiction_count": 0,
        "independent_quiet_count": 0,
        "independent_support_count": 3,
        "independent_weak_count": 0,
        "model_health": 0.59,
        "permitted_language": [
          "observation",
          "inference"
        ],
        "quiet_factors": [],
        "supporting_factors": [
          "unsecured_funding_pressure",
          "secured_funding_pressure"
        ],
        "warnings": [
          "sofr_overnight dependency group accounts for more than 50% of funding conditions exposure"
        ],
        "weak_factors": []
      },
      "exposure": {
        "by_dependency_group": {
          "sofr_overnight": 0.6467,
          "unsecured_overnight": 0.3533
        },
        "by_family": {
          "funding": 1
        },
        "by_series": {
          "EFFR": 0.3486,
          "IORB": 0.1094,
          "OBFR": 0.0589,
          "RRP_Rate": 0.1094
        },
        "effective_n": 1.5201,
        "hhi": 0.256
      },
      "factor_contributions": {
        "residual": -1,
        "secured_funding_pressure": 28,
        "secured_unsecured_basis": 32,
        "unsecured_funding_pressure": 33
      },
      "health_coverage": 80,
      "level_pctile": 82.7105,
      "model_health": 59,
      "principal_contradiction": null,
      "read": "Unsecured dislocation confirmed by Secured funding pressure, Secured-unsecured basis.",
      "score_inputs": {
        "coherence": [
          "secured_funding_pressure",
          "unsecured_funding_pressure"
        ],
        "dislocation": [
          "secured_funding_pressure",
          "unsecured_funding_pressure"
        ],
        "stress": [
          "secured_funding_pressure",
          "unsecured_funding_pressure"
        ]
      },
      "section_id": "funding",
      "stale": false,
      "stress": 93,
      "stress_contributions": {
        "residual": 1,
        "secured_funding_pressure": 30,
        "secured_unsecured_basis": 31,
        "unsecured_funding_pressure": 31
      }
    },
    {
      "active_factor_count": 2,
      "as_of": "2026-10-29",
      "coherence": 100,
      "coherence_label": "High",
      "corridor_status": "Taut",
      "dislocation": 91,
      "dislocation_raw": 1.8849,
      "evidence": {
        "claim": "SecCorridor dislocation confirmed by Unsecured corridor position.",
        "claim_type": "inference",
        "contradicting_factors": [],
        "data_freshness": "good",
        "independent_contradiction_count": 0,
        "independent_quiet_count": 0,
        "independent_support_count": 2,
        "independent_weak_count": 0,
        "model_health": 0.66,
        "permitted_language": [
          "observation",
          "inference"
        ],
        "quiet_factors": [],
        "supporting_factors": [
          "secured_corridor_position",
          "unsecured_corridor_position"
        ],
        "warnings": [
          "Secured corridor position concentrates more than 50% of section |z|",
          "sofr_overnight dependency group accounts for more than 50% of corridor conditions exposure"
        ],
        "weak_factors": []
      },
      "exposure": {
        "by_dependency_group": {
          "sofr_overnight": 0.5074,
          "unsecured_overnight": 0.4926
        },
        "by_family": {
          "policy": 1
        },
        "by_series": {
          "EFFR": 0.1231,
          "FF_Lower": 0.25,
          "FF_Upper": 0.25,
          "OBFR": 0.1231
        },
        "effective_n": 1.287,
        "hhi": 0.2197
      },
      "factor_contributions": {
        "residual": 0,
        "secured_corridor_position": 46,
        "unsecured_corridor_position": 45
      },
      "health_coverage": 80,
      "level_pctile": 81.7849,
      "model_health": 66,
      "principal_contradiction": null,
      "read": "SecCorridor dislocation confirmed by Unsecured corridor position.",
      "score_inputs": {
        "coherence": [
          "unsecured_corridor_position",
          "secured_corridor_position"
        ],
        "dislocation": [
          "unsecured_corridor_position",
          "secured_corridor_position"
        ],
        "stress": [
          "unsecured_corridor_position",
          "secured_corridor_position"
        ]
      },
      "section_id": "corridor",
      "stale": false,
      "stress": 97,
      "stress_contributions": {
        "residual": 0,
        "secured_corridor_position": 49,
        "unsecured_corridor_position": 48
      }
    }
  ],
  "factors": [
    {
      "factor_id": "secured_funding_pressure",
      "section": "funding",
      "z": 1.3317,
      "oriented_z": 1.3317,
      "abs_z": 1.3317,
      "last": 0.0833,
      "d1w": 0.0267,
      "n_members": 3,
      "members": [
        "SOFR_minus_IORB",
        "SOFR_minus_TGCR"
      ],
      "factor_state": "elevated",
      "state_line": "Secured funding pressure: secured funding rates elevated versus policy anchors (+1.33 vs 5y norm)",
      "label": "Secured funding pressure",
      "short": "Secured"
    },
    {
      "factor_id": "unsecured_funding_pressure",
      "section": "funding",
      "z": 1.5532,
      "oriented_z": 1.5532,
      "abs_z": 1.5532,
      "last": 0.0367,
      "d1w": 0,
      "n_members": 3,
      "members": [
        "EFFR_minus_IORB",
        "OBFR_minus_EFFR"
      ],
      "factor_state": "elevated",
      "state_line": "Unsecured funding pressure: unsecured funding rates elevated versus policy anchors (+1.55 vs 5y norm)",
      "label": "Unsecured funding pressure",
      "short": "Unsecured"
    }
  ],
  "sections_meta": [
    {
      "id": "funding",
      "label": "Funding",
      "broad_phrase": "broad overnight funding pressure",
      "noun": "funding conditions"
    },
    {
      "id": "corridor",
      "label": "Fed corridor",
      "broad_phrase": "the Fed funds corridor",
      "noun": "corridor conditions"
    }
  ],
  "features": [
    {
      "name": "SOFR",
      "display_name": "SOFR",
      "feature_id": "us.funding.sofr",
      "feature_class": "raw_observation",
      "family": "funding",
      "dependency_group": "sofr_overnight",
      "factor_id": "",
      "stress_direction": null,
      "unit": "percent",
      "frequency": "daily",
      "composite_eligible": false,
      "normalization": {
        "visible_method": "rolling_z",
        "visible_window": "5y"
      },
      "vintage_policy": "latest_for_market_data",
      "freshness_policy": "daily_business_day",
      "source_series": "SOFR",
      "input_coefs": [
        {
          "alias": "SOFR",
          "coef": 1
        }
      ],
      "stats": {
        "last": 3.94,
        "d1w": 0.040000000000000036,
        "z_1y": 1.513750431464139,
        "z_3y": -0.7869983338743188,
        "z_5y": 0.09864077390284262,
        "z_5y_window": 1260,
        "z_full": 0.6473148535262134,
        "robust_z": -0.3468809620165347,
        "pctile_raw": 65.56956115779646,
        "pctile_stress": null,
        "n_obs": 2142,
        "n_unique": 266,
        "n_tied_at_last": 3,
        "phi": 0.9973051790123045,
        "obs_date": "2026-10-29",
        "hl_reason": 0,
        "hl_reason_label": "eligible",
        "hl_bucket": 4,
        "hl_bucket_label": "Structural",
        "hl": 256.86782531993924,
        "hl_ci_lo": 173.65107198824344,
        "hl_ci_hi": 492.64955442020886,
        "rev21_reason": 3,
        "rev21_reason_label": "fails_baselines",
        "rev21_n_eval": 78,
        "rev21_hit_rate": 0.2692307692307692,
        "rev21_mae": 0.22230404617051056,
        "rev21_mae_nochange": 0.10833333333333336,
        "rev21_mae_fullrev": 1.3525401912901913,
        "rev21_mae_histavg": 0.16491399904443382,
        "rev21_mae_zprop": 0.4550945996620675,
        "rev21": null,
        "rev21_margin": -1.0520373492662507,
        "rev21_se": null,
        "rev21_ci_lo": null,
        "rev21_ci_hi": null,
        "rev21_p_up": null,
        "rev21_regime": null,
        "rev21_lowvol_n_eval": 39,
        "rev21_lowvol_hit_rate": 0.2564102564102564,
        "rev21_lowvol_mae": 0.18685075215302419,
        "rev21_lowvol_mae_nochange": 0.16769230769230775,
        "rev21_lowvol_mae_fullrev": 0.8035042735042734,
        "rev21_lowvol_mae_histavg": 0.18880660402399535,
        "rev21_lowvol_mae_zprop": 0.3895951209507198,
        "rev21_highvol_n_eval": 39,
        "rev21_highvol_hit_rate": 0.28205128205128205,
        "rev21_highvol_mae": 0.25775734018799695,
        "rev21_highvol_mae_nochange": 0.048974358974358985,
        "rev21_highvol_mae_fullrev": 1.9015761090761092,
        "rev21_highvol_mae_histavg": 0.14102139406487232,
        "rev21_highvol_mae_zprop": 0.5205940783734152,
        "break_date": "2022-09-21",
        "obs_since_break": 1023,
        "break_frac_effect": 3.9624918933481306,
        "break_method": 1,
        "break_method_label": "binary_segmentation_mean",
        "days_since_update": 0,
        "expected_next_release": "2026-10-30",
        "freshness_status": "Fresh",
        "spark": [
          3.62,
          3.62
        ]
      }
    },
    {
      "name": "SOFR_AVG_30D",
      "display_name": "SOFR 30D Avg",
      "feature_id": "us.sofr_trailing.sofr_avg_30d",
      "feature_class": "raw_observation",
      "family": "sofr_trailing",
      "dependency_group": "sofr_trailing",
      "factor_id": "",
      "stress_direction": null,
      "unit": "percent",
      "frequency": "daily",
      "composite_eligible": false,
      "normalization": {
        "visible_method": "rolling_z",
        "visible_window": "5y"
      },
      "vintage_policy": "latest_for_market_data",
      "freshness_policy": "daily_business_day",
      "source_series": "SOFR30DAYAVG",
      "input_coefs": [
        {
          "alias": "SOFR_AVG_30D",
          "coef": 1
        }
      ],
      "stats": {
        "last": 3.89656,
        "d1w": 0.008690000000000087,
        "z_1y": 1.005479629903928,
        "z_3y": -0.8885570037102765,
        "z_5y": 0.08604170134542266,
        "z_5y_window": 1260,
        "z_full": 0.6211730483845287,
        "robust_z": -0.394683748742097,
        "pctile_raw": 64.71004243281472,
        "pctile_stress": null,
        "n_obs": 2121,
        "n_unique": 1522,
        "n_tied_at_last": 1,
        "phi": 0.9980217393465924,
        "obs_date": "2026-10-29",
        "hl_reason": 5,
        "hl_reason_label": "unstable",
        "hl_bucket": 0,
        "hl_bucket_label": "Unreliable",
        "hl": null,
        "hl_ci_lo": null,
        "hl_ci_hi": null,
        "rev21_reason": 1,
        "rev21_reason_label": "hl_ineligible",
        "rev21_n_eval": 77,
        "rev21_hit_rate": 0.18181818181818182,
        "rev21_mae": 0.1273736292366084,
        "rev21_mae_nochange": 0.10153779220779217,
        "rev21_mae_fullrev": 1.3723010157699442,
        "rev21_mae_histavg": 0.15089861364308568,
        "rev21_mae_zprop": 0.3757991719301838,
        "rev21": null,
        "rev21_margin": null,
        "rev21_se": null,
        "rev21_ci_lo": null,
        "rev21_ci_hi": null,
        "rev21_p_up": null,
        "rev21_regime": null,
        "rev21_lowvol_n_eval": 39,
        "rev21_lowvol_hit_rate": 0.15384615384615385,
        "rev21_lowvol_mae": 0.17160068139095452,
        "rev21_lowvol_mae_nochange": 0.15344230769230768,
        "rev21_lowvol_mae_fullrev": 0.874781862026862,
        "rev21_lowvol_mae_histavg": 0.17044061368583108,
        "rev21_lowvol_mae_zprop": 0.3596436685360696,
        "rev21_highvol_n_eval": 38,
        "rev21_highvol_hit_rate": 0.21052631578947367,
        "rev21_highvol_mae": 0.08198270728872681,
        "rev21_highvol_mae_nochange": 0.048267368421052566,
        "rev21_highvol_mae_fullrev": 1.882912778822055,
        "rev21_highvol_mae_histavg": 0.13084235044132067,
        "rev21_highvol_mae_zprop": 0.3923798201504589,
        "break_date": "2022-10-12",
        "obs_since_break": 1009,
        "break_frac_effect": 3.996758571913621,
        "break_method": 1,
        "break_method_label": "binary_segmentation_mean",
        "days_since_update": 0,
        "expected_next_release": "2026-10-30",
        "freshness_status": "Fresh",
        "spark": [
          3.62776,
          3.63011
        ]
      }
    }
  ],
  "glossary": {
    "scores": [
      {
        "key": "stress",
        "label": "Stress",
        "scale": "percentile_0_100",
        "definition": "directional stress percentile; 50 is neutral, higher means more stressed"
      },
      {
        "key": "dislocation",
        "label": "Dislocation",
        "scale": "percentile_0_100",
        "definition": "historical percentile of how unusual the configuration is, regardless of direction"
      }
    ],
    "units": [
      {
        "unit": "percent",
        "definition": "a rate in percent; 0.0100 = 1 basis point"
      },
      {
        "unit": "percentage_points",
        "definition": "a difference between two rates in percentage points; 0.0100 = 1 basis point"
      }
    ],
    "sign_conventions": [
      {
        "direction": "+1",
        "definition": "a higher value means more stress"
      },
      {
        "direction": "-1",
        "definition": "a lower value means more stress"
      }
    ],
    "forecast": [
      {
        "key": "rev21",
        "definition": "expected change in the series value over the next 21 trading days, in the feature's own units; a positive value means the value is expected to increase; fitted over the trailing 1260 observations, with eligibility earned by walk-forward validation of 504-observation fits"
      },
      {
        "key": "rev21_ci",
        "definition": "80% confidence interval on rev21 from the walk-forward error distribution (Student-t), in the feature's own units"
      }
    ],
    "percentile": [
      {
        "key": "pctile",
        "definition": "the latest value's midrank position in the feature's full history, in percent: observations strictly below it count in full and tied observations count half; a series with fewer than two distinct values (zero variance) has no percentile"
      },
      {
        "key": "percentile_method",
        "definition": "the percentile method is midrank: 100 * (n_less + 0.5 * n_equal) / n, where n_less counts observations strictly below the latest value and n_equal counts observations tied with it; a tied observation counts as half a step, not a full step, so a tied maximum never scores 100"
      }
    ],
    "freshness": [
      {
        "key": "days_since_update",
        "definition": "business days (weekends excluded) between the feature's own last observation date and the snapshot's as_of; counts a US federal holiday as an ordinary business day since no holiday table is consulted, so this can overstate true elapsed publication days by one around a holiday"
      },
      {
        "key": "expected_next_release",
        "definition": "the next weekday (Monday-Friday) strictly after the feature's own last observation date for a daily-cadence feature, or the next Wednesday strictly after it for a weekly_wed-cadence feature; not a FRED-published release schedule, and not holiday-aware, so it can name a date that is itself a holiday; for a series that has stopped updating, this date lies in the past - it was expected, and did not arrive"
      }
    ],
    "exposure": [
      {
        "key": "by_series",
        "definition": "share of a section's raw-series exposure attributable to each individual raw FRED series, 0-1"
      },
      {
        "key": "by_family",
        "definition": "share of a section's raw-series exposure attributable to each economic family; can sum to less than 1.0 when one or more contributing registry members have no family mapped, an expected unmapped remainder, not a computation defect"
      }
    ],
    "break": [
      {
        "key": "break_date",
        "definition": "the date of the feature's single STRONGEST detected sustained mean-shift break over its full history (not necessarily the most recent one), per the single binary-segmentation-on-the-mean detector this board runs (ISO date); this is the LAST PRE-BREAK observation, not the first post-break one"
      },
      {
        "key": "obs_since_break",
        "definition": "the number of observations accrued since break_date, through the feature's own last observation; always at least 60, the detector's own minimum-segment-length floor on each side of a candidate split"
      }
    ],
    "language": [
      {
        "key": "observation",
        "definition": "the model's claim about what the data currently shows, with no inference about cause or direction; always permitted for every section"
      },
      {
        "key": "inference",
        "definition": "the model's claim about how the current dislocation relates to corroborating or contradicting factors within the section; always permitted for every section"
      }
    ],
    "rev21_reason": [
      {
        "key": "hl_ineligible",
        "definition": "the series' own mean-reversion half-life fit failed eligibility (insufficient sample, zero variance, an out-of-bounds AR(1) fit, a confidence interval that cannot rule out a random walk, an unstable fit, or a too-long horizon), so no revision forecast is attempted; walk-forward evidence fields may still be served for diagnostic reading"
      },
      {
        "key": "insufficient_validation",
        "definition": "the walk-forward validation ran fewer than 8 non-overlapping 21-day evaluation steps, too few to trust a hit-rate or error estimate"
      }
    ],
    "rev21_regime": [
      {
        "key": "low_vol_only",
        "definition": "the model's walk-forward skill was demonstrated only in the low-volatility regime bucket; the high-volatility bucket failed its own baseline comparison, so the disclosed rev21 value should be read as regime-conditional, not unconditional"
      },
      {
        "key": "high_vol_only",
        "definition": "the model's walk-forward skill was demonstrated only in the high-volatility regime bucket; the low-volatility bucket failed its own baseline comparison, so the disclosed rev21 value should be read as regime-conditional, not unconditional"
      }
    ],
    "coherence_reason": [
      {
        "key": "single_active_factor",
        "definition": "exactly one of the section's directed factors met the |oriented_z| >= 1.0 activity threshold; coherence needs at least two active factors to compare, so it is suppressed"
      },
      {
        "key": "no_active_factors",
        "definition": "none of the section's directed factors met the |oriented_z| >= 1.0 activity threshold (including the case where the section has no directed factors at all); with no active factor to anchor a comparison, coherence is suppressed"
      }
    ],
    "funding_anomaly": [
      {
        "key": "Broad funding pressure",
        "definition": "the plumbing section's active factors concentrate on a QUANTITY-of-liquidity condition - reserve_scarcity (weekly) and/or cp_funding_stress (daily) - how much cash the banking system holds, distinct from a collateral-side condition"
      },
      {
        "key": "Bill-specific cheapness",
        "definition": "the plumbing section's active factors concentrate on bill_cheapness and/or bill_curve, both UNDIRECTED (non-monotonic) signals - Treasury bills trading cheap/rich to nearby references rather than a directional stress read"
      }
    ],
    "factor_state": [
      {
        "key": "quiet",
        "definition": "the reading is close to its usual level (5-year norm)"
      },
      {
        "key": "weak",
        "definition": "the reading is mildly away from its usual level (5-year norm), not yet notable"
      }
    ],
    "bridge": [
      {
        "key": "window",
        "definition": "the length of the change period, measured in weekly balance-sheet releases: 1w is the most recent release versus the one before it"
      },
      {
        "key": "d_reserves",
        "definition": "change in bank reserves held at the Fed over the window, in millions of dollars"
      }
    ],
    "events": [
      {
        "key": "event_type",
        "definition": "the kind of dated occurrence a study is built around; one of six fixed kinds"
      },
      {
        "key": "month_end",
        "definition": "the last day the funding market was open in a calendar month, excluding quarter-ends"
      }
    ],
    "releases": [
      {
        "key": "CPI",
        "definition": "the consumer price index: the average price of a fixed basket of household goods and services, published monthly"
      },
      {
        "key": "Core_CPI",
        "definition": "the same consumer price basket with food and energy taken out, because those two swing hardest month to month"
      }
    ]
  },
  "methodology_version": "2.0",
  "bridge": {
    "windows": [
      {
        "window": "1w",
        "start_date": "2026-10-21",
        "end_date": "2026-10-28",
        "d_reserves": -68837,
        "d_fed_assets": -7969,
        "d_tga": 47725,
        "d_rrp": -61,
        "d_other": 13204
      },
      {
        "window": "4w",
        "start_date": "2026-09-30",
        "end_date": "2026-10-28",
        "d_reserves": -54320,
        "d_fed_assets": 2604,
        "d_tga": 51053,
        "d_rrp": -11363,
        "d_other": 17234
      }
    ]
  },
  "events": {
    "inventory": [
      {
        "event_type": "month_end",
        "detection": "computed",
        "n_events": 68,
        "first_date": "2018-04-30",
        "last_date": "2026-08-31",
        "rule": {
          "excludes": "quarter_end",
          "spine_rule": "last_of_calendar_month"
        }
      },
      {
        "event_type": "quarter_end",
        "detection": "computed",
        "n_events": 34,
        "first_date": "2018-06-29",
        "last_date": "2026-09-30",
        "rule": {
          "spine_rule": "last_of_calendar_quarter"
        }
      }
    ],
    "effects": [
      {
        "event_type": "month_end",
        "series": "SOFR_minus_TBill3M",
        "horizon": 5,
        "mean_effect": -0.0215,
        "median_effect": -0.02,
        "hit_rate": 0.6912,
        "n": 68
      },
      {
        "event_type": "month_end",
        "series": "SOFR_minus_IORB",
        "horizon": 5,
        "mean_effect": -0.0295,
        "median_effect": -0.01,
        "hit_rate": 0.6667,
        "n": 42
      }
    ],
    "current": {
      "as_of": "2026-10-29",
      "in_window": []
    }
  },
  "releases": [
    {
      "name": "CPI",
      "display_name": "CPI",
      "observation_month": "2026-09-01",
      "level": 336.298,
      "mom": 0.6485480245771891,
      "yoy": 3.7172508442689933,
      "change_unit": "percent",
      "published": "2026-10-14",
      "next_release": "2026-11-10",
      "first_seen": "2026-10-15",
      "age_days": 17,
      "freshness_status": "Awaiting scheduled release"
    },
    {
      "name": "Core_CPI",
      "display_name": "Core CPI",
      "observation_month": "2026-09-01",
      "level": 338.896,
      "mom": 0.3348481932704761,
      "yoy": 2.565840844021827,
      "change_unit": "percent",
      "published": "2026-10-14",
      "next_release": "2026-11-10",
      "first_seen": "2026-10-15",
      "age_days": 17,
      "freshness_status": "Awaiting scheduled release"
    }
  ]
}
v
Version number of the response layout.
as_of
Date of the latest macro data the board uses, as YYYY-MM-DD.
freshness.as_of
The board as_of date, as YYYY-MM-DD.
freshness.age_days
Calendar days from as_of to the day the response was made.
freshness.status
fresh, or stale when age_days is over 5.
sections[].active_factor_count
Section factors whose stress-oriented z-score is 1.0 or more in size.
sections[].as_of
Latest observation date among the section factors, as YYYY-MM-DD.
sections[].coherence
Agreement in sign among the section factors, 0 to 100. null unless two or more factors are active.
sections[].coherence_label
High at 70 or more, Moderate at 40 or more, Low below, N/A when coherence is null.
sections[].dislocation
Percentile, 0 to 100, of how unusual the section reads against its own history, in either direction.
sections[].dislocation_raw
Mean absolute z-score of the section factors, the input to dislocation.
sections[].evidence.claim
The claim the board makes for the section, the same sentence as read.
sections[].evidence.claim_type
Kind of claim: observation, inference or forecast.
sections[].evidence.contradicting_factors[]
Factor ids that point the other way.
sections[].evidence.data_freshness
good when 80% or more of the factors are fresh, mixed at 50%, else stale.
sections[].evidence.independent_contradiction_count
Number of contradicting factors.
sections[].evidence.independent_quiet_count
Number of quiet factors.
sections[].evidence.independent_support_count
Number of supporting factors, the leading one included.
sections[].evidence.independent_weak_count
Number of weak factors.
sections[].evidence.model_health
model_health as a decimal from 0 to 1.
sections[].evidence.permitted_language[]
Kinds of claim the board may make for the section.
sections[].evidence.quiet_factors[]
Factor ids with a z-score of 0.75 or less in size.
sections[].evidence.supporting_factors[]
Factor ids that point the same way as the leading factor.
sections[].evidence.warnings[]
Plain warnings, such as one factor holding most of the section signal.
sections[].evidence.weak_factors[]
Factor ids with a z-score from 0.75 to under 1.0 in size.
sections[].exposure.by_dependency_group.{group}
Share, 0 to 1, of the section exposure in each dependency group.
sections[].exposure.by_family.{family}
Share, 0 to 1, of the section exposure in each economic family.
sections[].exposure.by_series.{series}
Share, 0 to 1, of the section exposure that traces to each raw FRED series.
sections[].exposure.effective_n
Effective number of independent factor signals, after correlation. From 1 up to the factor count.
sections[].exposure.hhi
Concentration of by_series from 0 to 1. 1 means one series carries all of it.
sections[].factor_contributions.{factor}
Points of dislocation each factor adds, keyed by factor id. The residual key holds the rounding remainder.
sections[].health_coverage
Share, 0 to 100, of the model health weight actually measured this run.
sections[].level_pctile
Mean stress percentile, 0 to 100, of the section member series.
sections[].model_health
Model health, 0 to 100, from data freshness, factor independence, fit stability and break recency. It is not a market signal.
sections[].principal_contradiction
One sentence naming the factor that most disagrees with the rest. null when none disagree.
sections[].read
One plain sentence that reads the section.
sections[].score_inputs.coherence[]
Factor ids that fed coherence.
sections[].score_inputs.dislocation[]
Factor ids that fed dislocation.
sections[].score_inputs.stress[]
Factor ids that fed stress.
sections[].section_id
Id of the board section, such as funding or corridor.
sections[].stale
true when the section as_of is more than 5 calendar days before the board as_of.
sections[].stress
Directional stress from 0 to 100. 50 is neutral; higher means more stress.
sections[].stress_contributions.{factor}
Points of stress each factor adds, keyed by factor id. The residual key holds the rounding remainder.
sections[].corridor_status
How taut the Fed funds corridor runs, from Orderly to Strained. Corridor section only.
sections[].forecastability
Supported, Mixed or Unreliable: whether enough section members have a reliable short-horizon fit to trust a forecast. sofr-trailing section only.
sections[].trailing_configuration
Order of the 30-day, 90-day and 180-day SOFR trailing averages: Upward, Inverted or Mixed. sofr-trailing section only.
sections[].curve_regime
Shape of the Treasury curve from its front and long slope factors: Upward, Inverted or Mixed. Curve section only.
sections[].momentum
Direction of the section over the last week: Steepening, Flattening or Stable on the curve section; Widening, Tightening or Stable on the credit section.
sections[].score_inputs.momentum[]
Factor ids that fed momentum.
sections[].inflation_regime
Level of the mean 5-year and 10-year breakeven: Disinflationary, Anchored, Elevated or Unanchored. real-inflation section only.
sections[].real_curve_regime
Slope of the TIPS real yield curve: Upward, Inverted or Flat. real-inflation section only.
sections[].coherence_reason
Why coherence is null: single_active_factor or no_active_factors. Absent when coherence has a value.
sections[].score_inputs.valuation_asymmetry[]
Factor ids that fed valuation_asymmetry.
sections[].valuation_asymmetry
100 minus the mean full-history stress percentile of the credit-level members, 0 to 100. Higher means spreads are historically tighter. Credit section only.
sections[].funding_anomaly
Mechanism the active plumbing factors concentrate on. glossary.funding_anomaly lists the values. Plumbing section only.
factors[].factor_id
Id of the factor.
factors[].section
Id of the section the factor belongs to.
factors[].z
Mean 5-year z-score of the member series, unitless.
factors[].oriented_z
Mean member z-score with its sign set so positive means more stress. null when no member has a direction.
factors[].abs_z
Absolute value of z.
factors[].last
Mean latest value of the member series, in their unit.
factors[].d1w
Mean change of the members over the last 5 observations, or 1 for weekly series, in their unit.
factors[].n_members
Number of member series.
factors[].members[]
Names of the member series.
factors[].factor_state
quiet, weak, elevated, easing or degraded, against the 5-year norm.
factors[].state_line
One plain sentence that reads factor_state.
factors[].label
Full name of the factor.
factors[].short
Short name of the factor.
sections_meta[].id
Id of the section.
sections_meta[].label
Display name of the section.
sections_meta[].broad_phrase
Phrase the board uses for the section as a whole.
sections_meta[].noun
Noun the board uses for the section conditions.
features[].name
Series name used across the API.
features[].display_name
Display name of the series.
features[].feature_id
Dotted registry id of the series.
features[].feature_class
Kind of series: raw_observation, derived_feature, algebraic_display or release.
features[].family
Economic family of the series.
features[].dependency_group
Group of series that share a common source and move together.
features[].factor_id
Id of the factor the series feeds. Empty when it feeds none.
features[].stress_direction
1 when a higher value means more stress, -1 when lower does, null when neither.
features[].unit
Unit of the series values: percent, percentage_points, usd_mn, ratio or thousands.
features[].frequency
How often the series is observed: daily, weekly_wed or monthly.
features[].composite_eligible
true when the series may enter a composite score.
features[].normalization.visible_method
How the board scales the series for display: rolling_z.
features[].normalization.visible_window
Window of that scaling: 5y.
features[].vintage_policy
Which release of a value is used: latest_for_market_data.
features[].freshness_policy
Schedule the freshness check expects: daily_business_day or monthly_release.
features[].source_series
FRED series id the values come from.
features[].input_coefs[].alias
A series that enters this one.
features[].input_coefs[].coef
Weight of that series. A spread is 1 times one series and -1 times the other.
features[].stats.last
The latest value, in the series unit.
features[].stats.d1w
Change over the last 5 observations, or 1 for weekly series, in the series unit.
features[].stats.z_1y
z-score of last against the trailing 252 observations (52 weekly).
features[].stats.z_3y
z-score of last against the trailing 756 observations (156 weekly).
features[].stats.z_5y
z-score of last against the trailing 1,260 observations (260 weekly).
features[].stats.z_5y_window
Observations actually used for z_5y, fewer when the history is short.
features[].stats.z_full
z-score of last against the full history.
features[].stats.robust_z
(last - median) / (1.4826 x median absolute deviation), over the same window as z_5y.
features[].stats.pctile_raw
Midrank percentile of last in the full history, 0 to 100. Ties count half.
features[].stats.pctile_stress
pctile_raw turned so higher means more stress. null when the series has no stress direction.
features[].stats.n_obs
Observations in the full history.
features[].stats.n_unique
Distinct values in the full history.
features[].stats.n_tied_at_last
Observations equal to last.
features[].stats.phi
AR(1) persistence of the daily series. Closer to 1 means slower return to the mean.
features[].stats.obs_date
Date of the latest observation of the series, as YYYY-MM-DD. Every stat below is as of this date.
features[].stats.hl_reason
Code for the result of the half-life fit. hl_reason_label names it.
features[].stats.hl_reason_label
eligible, or why the fit failed, such as unstable or zero_variance.
features[].stats.hl_bucket
Code for the half-life class. hl_bucket_label names it.
features[].stats.hl_bucket_label
Daily series: Fast under 10 trading days, Moderate 10 to 60, Slow 60 to 250, Structural 250 or more. Weekly series: Fast under 2 releases, Moderate 2 to 12, Slow 12 to 50, Structural 50 or more. Else Unreliable.
features[].stats.hl
Mean-reversion half-life, in trading days for daily series and in releases for weekly series. null when the fit failed.
features[].stats.hl_ci_lo
Lower edge of the 80% interval on hl, in trading days for daily series and in releases for weekly series.
features[].stats.hl_ci_hi
Upper edge of the 80% interval on hl, in trading days for daily series and in releases for weekly series.
features[].stats.rev21_reason
Code for the result of the forecast checks. rev21_reason_label names it.
features[].stats.rev21_reason_label
Why no forecast is shown, such as hl_ineligible or fails_baselines.
features[].stats.rev21_n_eval
Number of separate walk-forward test steps, one forecast horizon apart, over the full test history.
features[].stats.rev21_hit_rate
Share of those steps where the forecast had the right sign, from 0 to 1 (over the full test history).
features[].stats.rev21_mae
Mean absolute error of the forecast over those steps, in the feature's unit (over the full test history).
features[].stats.rev21_mae_nochange
Mean absolute error of a forecast of no change over the same steps, in the feature's unit (over the full test history).
features[].stats.rev21_mae_fullrev
Mean absolute error of a forecast of full return to the window mean, in the feature's unit (over the full test history).
features[].stats.rev21_mae_histavg
Mean absolute error of a forecast of the average past change over the forecast horizon, in the feature's unit (over the full test history).
features[].stats.rev21_mae_zprop
Mean absolute error of a forecast of return in proportion to the z-score, in the feature's unit (over the full test history).
features[].stats.rev21
Expected change over the next 21 trading days for daily series and the next 4 releases for weekly series, in the series unit. null unless the forecast passed its checks.
features[].stats.rev21_margin
(rev21_mae_nochange - rev21_mae) / rev21_mae_nochange. Negative means the forecast lost to no change.
features[].stats.rev21_se
Root mean square error of the walk-forward forecasts behind rev21, in the series unit.
features[].stats.rev21_ci_lo
Lower edge of the 80% interval on rev21, in the series unit.
features[].stats.rev21_ci_hi
Upper edge of the 80% interval on rev21, in the series unit.
features[].stats.rev21_p_up
Probability, 0 to 1, that the change over the forecast horizon is positive.
features[].stats.rev21_regime
low_vol_only or high_vol_only when the forecast passed in one volatility half only.
features[].stats.rev21_lowvol_n_eval
Number of separate walk-forward test steps, one forecast horizon apart, in the low-volatility half of the history.
features[].stats.rev21_lowvol_hit_rate
Share of those steps where the forecast had the right sign, from 0 to 1 (in the low-volatility half of the history).
features[].stats.rev21_lowvol_mae
Mean absolute error of the forecast over those steps, in the feature's unit (in the low-volatility half of the history).
features[].stats.rev21_lowvol_mae_nochange
Mean absolute error of a forecast of no change over the same steps, in the feature's unit (in the low-volatility half of the history).
features[].stats.rev21_lowvol_mae_fullrev
Mean absolute error of a forecast of full return to the window mean, in the feature's unit (in the low-volatility half of the history).
features[].stats.rev21_lowvol_mae_histavg
Mean absolute error of a forecast of the average past change over the forecast horizon, in the feature's unit (in the low-volatility half of the history).
features[].stats.rev21_lowvol_mae_zprop
Mean absolute error of a forecast of return in proportion to the z-score, in the feature's unit (in the low-volatility half of the history).
features[].stats.rev21_highvol_n_eval
Number of separate walk-forward test steps, one forecast horizon apart, in the high-volatility half of the history.
features[].stats.rev21_highvol_hit_rate
Share of those steps where the forecast had the right sign, from 0 to 1 (in the high-volatility half of the history).
features[].stats.rev21_highvol_mae
Mean absolute error of the forecast over those steps, in the feature's unit (in the high-volatility half of the history).
features[].stats.rev21_highvol_mae_nochange
Mean absolute error of a forecast of no change over the same steps, in the feature's unit (in the high-volatility half of the history).
features[].stats.rev21_highvol_mae_fullrev
Mean absolute error of a forecast of full return to the window mean, in the feature's unit (in the high-volatility half of the history).
features[].stats.rev21_highvol_mae_histavg
Mean absolute error of a forecast of the average past change over the forecast horizon, in the feature's unit (in the high-volatility half of the history).
features[].stats.rev21_highvol_mae_zprop
Mean absolute error of a forecast of return in proportion to the z-score, in the feature's unit (in the high-volatility half of the history).
features[].stats.break_date
Last date before the strongest lasting shift in the series mean, as YYYY-MM-DD.
features[].stats.obs_since_break
Observations from break_date through obs_date. Always 60 or more.
features[].stats.break_frac_effect
Size of that mean shift, in pooled standard deviations.
features[].stats.break_method
Code for the break test. break_method_label names it.
features[].stats.break_method_label
Name of the break test: binary_segmentation_mean.
features[].stats.days_since_update
Weekdays from obs_date to the board as_of. Holidays are not skipped.
features[].stats.expected_next_release
Date the next observation is due, as YYYY-MM-DD: the next weekday, or the next Wednesday for weekly series.
features[].stats.freshness_status
Fresh, Awaiting scheduled release, Delayed by publication schedule or Stale.
features[].stats.spark[]
The last 90 values (18 for weekly series), oldest first, in the series unit. null for a monthly release.
features[].board_section
section_id of the Macro Board section that shows the series. Absent when the board does not show it.
features[].inputs[]
Series a derived spread is built from. Absent on a series read from FRED.
features[].formula
How a derived spread is built from its inputs, such as SOFR - EFFR. Absent on a series read from FRED.
glossary.scores[].key
Name of a section score.
glossary.scores[].label
Display name of the score.
glossary.scores[].scale
Scale of the score, such as percentile_0_100.
glossary.scores[].definition
What the score means.
glossary.units[].unit
Name of a unit.
glossary.units[].definition
What the unit means.
glossary.sign_conventions[].direction
A stress_direction value.
glossary.sign_conventions[].definition
What that direction means.
glossary.forecast[].key
Name of a forecast statistic.
glossary.forecast[].definition
What the statistic means.
glossary.percentile[].key
Name of a percentile term.
glossary.percentile[].definition
What the term means.
glossary.freshness[].key
Name of a freshness term.
glossary.freshness[].definition
What the term means.
glossary.exposure[].key
Name of an exposure statistic.
glossary.exposure[].definition
What the statistic means.
glossary.break[].key
Name of a break statistic.
glossary.break[].definition
What the statistic means.
glossary.language[].key
A kind of claim.
glossary.language[].definition
What that kind of claim may say.
glossary.rev21_reason[].key
A rev21_reason_label value.
glossary.rev21_reason[].definition
What that reason means.
glossary.rev21_regime[].key
A rev21_regime value.
glossary.rev21_regime[].definition
What that value means.
glossary.coherence_reason[].key
A coherence_reason value.
glossary.coherence_reason[].definition
What that reason means.
glossary.funding_anomaly[].key
A funding_anomaly value of the plumbing section.
glossary.funding_anomaly[].definition
What that value means.
glossary.factor_state[].key
A factor_state value.
glossary.factor_state[].definition
What that state means.
glossary.bridge[].key
Name of a reserves bridge field.
glossary.bridge[].definition
What the field means.
glossary.events[].key
Name of a calendar event term.
glossary.events[].definition
What the term means.
glossary.releases[].key
A monthly release series name, or the name of a releases[] field.
glossary.releases[].definition
What the release measures, or what the field means.
methodology_version
Version of the scoring method. Numbers from different versions do not compare.
bridge.windows[].window
Length of the change period in weekly Fed balance sheet releases: 1w, 4w and so on.
bridge.windows[].start_date
Release date at the start of the window, as YYYY-MM-DD.
bridge.windows[].end_date
Release date at the end of the window, as YYYY-MM-DD.
bridge.windows[].d_reserves
Change in bank reserves at the Fed over the window, in millions of dollars.
bridge.windows[].d_fed_assets
Change in Fed total assets over the window, in millions of dollars.
bridge.windows[].d_tga
Change in the Treasury General Account over the window, in millions of dollars.
bridge.windows[].d_rrp
Change in overnight reverse repo take-up over the window, in millions of dollars.
bridge.windows[].d_other
What is left after the other changes, in millions of dollars. It is computed, not measured.
events.inventory[].event_type
A kind of calendar event.
events.inventory[].detection
computed when the dates come from the calendar, detected when they come from the data.
events.inventory[].n_events
Number of events of this kind in the history.
events.inventory[].first_date
Date of the first event, as YYYY-MM-DD.
events.inventory[].last_date
Date of the latest event, as YYYY-MM-DD.
events.inventory[].rule.excludes
An event kind whose dates are left out of this one.
events.inventory[].rule.spine_rule
The rule that picks the event dates from open market days.
events.inventory[].rule.month_days[][]
Month and day of each tax date, such as [3, 15] for March 15.
events.inventory[].rule.roll
Where a tax date that falls on a closed day moves: forward_to_spine, the next open market day.
events.inventory[].rule.min_consecutive
Tight days in a row that open a debt-limit episode, and days not tight in a row that close it.
events.inventory[].rule.suspension_inactive
true: a day when the debt limit is suspended never counts as tight.
events.inventory[].rule.threshold_pct
Room under the debt limit, in percent of the limit, below which a day counts as tight.
events.inventory[].rule.range_window
Open market days on each side of a rate change during which the Fed funds target range must not change.
events.inventory[].rule.series[]
Administered rate series the rule watches, IORB and RRP_Rate.
events.effects[].event_type
A kind of calendar event.
events.effects[].series
Series name.
events.effects[].horizon
Open market days after the event date the change is measured at.
events.effects[].mean_effect
Mean change from the event-day value to horizon, in the series unit.
events.effects[].median_effect
Median of that change, in the series unit.
events.effects[].hit_rate
Share of past events, 0 to 1, that moved the same way as mean_effect.
events.effects[].n
Past events behind the numbers.
events.current.as_of
The board as_of date, as YYYY-MM-DD.
events.current.in_window[]
Events the board as_of sits near. Empty when no event is near.
events.current.in_window[].event_type
A kind of event the board as_of sits near.
events.current.in_window[].event_date
Date of that event, as YYYY-MM-DD.
events.current.in_window[].offset
Open market days from event_date to as_of: positive when as_of is after the event, negative before it. 0 means as_of is the event date.
releases[].name
Series name of a monthly release, such as CPI.
releases[].display_name
Display name of the release.
releases[].observation_month
First day of the month the latest value describes, as YYYY-MM-DD.
releases[].level
The value for observation_month, in the native unit of the release.
releases[].mom
Change from the month before, in change_unit.
releases[].yoy
Change from 12 months before, in change_unit.
releases[].change_unit
Unit of mom and yoy: percent, or the release unit for a plain difference.
releases[].published
Date the latest value was published, as YYYY-MM-DD.
releases[].next_release
Date the next value is due, as YYYY-MM-DD.
releases[].first_seen
Date the pipeline first read the latest value, as YYYY-MM-DD.
releases[].age_days
Calendar days since published.
releases[].freshness_status
Fresh, Awaiting scheduled release, or late or stale against the monthly schedule.

`sections` holds 7 items; the first 2 are shown. Each `sections[].evidence.supporting_factors`, `sections[].score_inputs.coherence`, `sections[].score_inputs.dislocation`, `sections[].score_inputs.stress` and `factors[].members` holds up to 3 items; the first 2 of each are shown. Each `sections[].exposure.by_series` holds up to 6 keys; the first 4 of each are shown. `factors` holds 26 items; the first 2 are shown. `sections_meta` holds 9 items; the first 2 are shown. `features` holds 120 items; the first 2 are shown. Each `features[].stats.spark` holds up to 90 items; the first 2 of each are shown. `glossary.scores` holds 15 items; the first 2 are shown. `glossary.units`, `glossary.funding_anomaly`, `glossary.bridge` and `events.inventory` each hold 6 items; the first 2 are shown. `glossary.sign_conventions` and `glossary.language` each hold 3 items; the first 2 are shown. `glossary.forecast` holds 28 items; the first 2 are shown. `glossary.freshness` holds 8 items; the first 2 are shown. `glossary.exposure`, `glossary.rev21_reason`, `glossary.factor_state` and `releases` each hold 5 items; the first 2 are shown. `glossary.break` and `bridge.windows` each hold 4 items; the first 2 are shown. `glossary.events` holds 12 items; the first 2 are shown. `glossary.releases` holds 13 items; the first 2 are shown. `events.effects` holds 70 items; the first 2 are shown.

Volatility Board

GET /api/v1/vol-board

For every symbol on the latest common trade date, four volatility metrics with a model read of where each moves over 21 trading days.

curl -H "Authorization: Bearer $TP_TOKEN" "https://tickplunge.com/api/v1/vol-board"
{
  "metric_version": 2,
  "model_version": 3,
  "p_floor": 0.65,
  "symbols": [
    {
      "symbol": "SPY",
      "group": 1,
      "metrics": {
        "iv": {
          "value": 14.89,
          "signal": "NONE",
          "p_rev": 0.4566500227,
          "e_move": -0.8265,
          "e_move_iqr_lo": -3.9793,
          "e_move_iqr_hi": 2.965,
          "bin_n": 4145,
          "column_state": "value_only",
          "reason": "G3 iv_exp coverage 0.368 on 38 rows below 0.60"
        },
        "rv": {
          "value": 11.498649034547539,
          "signal": "NONE",
          "p_rev": 0.40983606557,
          "e_move": 0.52906272952,
          "e_move_iqr_lo": -2.4047044158,
          "e_move_iqr_hi": 4.3429461953,
          "bin_n": 4874,
          "column_state": "full",
          "reason": ""
        },
        "vov": {
          "value": 100.34480377279218,
          "signal": "NONE",
          "p_rev": 0.38865447726,
          "e_move": 2.3872447735,
          "e_move_iqr_lo": -14.8764606888,
          "e_move_iqr_hi": 27.8000988445,
          "bin_n": 3836,
          "column_state": "full",
          "reason": ""
        },
        "vrp": {
          "value": 2.9171372848594306,
          "signal": "NONE",
          "p_rev": 0.54257425743,
          "e_move": -1.7036131635,
          "e_move_iqr_lo": -4.6901811525,
          "e_move_iqr_hi": 1.1778097175,
          "bin_n": 4282,
          "column_state": "full",
          "reason": ""
        }
      }
    },
    {
      "symbol": "QQQ",
      "group": 1,
      "metrics": {
        "iv": {
          "value": 24.709999999999997,
          "signal": "NONE",
          "p_rev": 0.59666666667,
          "e_move": -2.73695,
          "e_move_iqr_lo": -6.7974,
          "e_move_iqr_hi": 1.902525,
          "bin_n": 3780,
          "column_state": "value_only",
          "reason": "G3 iv_exp coverage 0.368 on 38 rows below 0.60"
        },
        "rv": {
          "value": 22.804460665486058,
          "signal": "NONE",
          "p_rev": 0.53342618384,
          "e_move": -1.9600436688,
          "e_move_iqr_lo": -5.8988895099,
          "e_move_iqr_hi": 2.62200112,
          "bin_n": 7252,
          "column_state": "full",
          "reason": ""
        },
        "vov": {
          "value": 112.79985368138506,
          "signal": "NONE",
          "p_rev": 0.57339449541,
          "e_move": -17.488497057,
          "e_move_iqr_lo": -34.6679493041,
          "e_move_iqr_hi": 4.7702099206,
          "bin_n": 3849,
          "column_state": "full",
          "reason": ""
        },
        "vrp": {
          "value": 1.4939347407453645,
          "signal": "NONE",
          "p_rev": 0.47549019608,
          "e_move": -0.52148660997,
          "e_move_iqr_lo": -3.2892080009,
          "e_move_iqr_hi": 1.8994759129,
          "bin_n": 5200,
          "column_state": "full",
          "reason": ""
        }
      }
    }
  ],
  "trade_date": "2026-10-30"
}
metric_version
Version of the metric definitions.
model_version
Version of the trained models behind signal and p_rev.
p_floor
Probability p_rev must reach for signal to name a direction, from 0 to 1.
symbols[].symbol
Ticker symbol of the row.
symbols[].group
1 for the index funds SPY, QQQ, DIA, IWM and TLT, else 0.
symbols[].metrics.{metric}
One entry per metric: iv, rv, vov and vrp.
symbols[].metrics.{metric}.value
The metric on trade_date in percent points: iv and rv are annualized volatility, vov the volatility of IV, vrp IV minus forecast RV.
symbols[].metrics.{metric}.signal
Direction the model expects: UP or DOWN, CHEAPEN or RICHEN for vrp, or NONE when p_rev is below p_floor.
symbols[].metrics.{metric}.p_rev
Calibrated probability, 0 to 1, of the more likely direction.
symbols[].metrics.{metric}.e_move
Median 21-trading-day change of the metric in past cases with a similar p_rev, in percent points.
symbols[].metrics.{metric}.e_move_iqr_lo
25th percentile of that past change, in percent points.
symbols[].metrics.{metric}.e_move_iqr_hi
75th percentile of that past change, in percent points.
symbols[].metrics.{metric}.bin_n
Past cases behind e_move.
symbols[].metrics.{metric}.column_state
full when signal and e_move may be read, value_only when only value should be.
symbols[].metrics.{metric}.reason
Why column_state is value_only. Empty otherwise.
trade_date
The latest trading day every symbol has, as YYYY-MM-DD. Every value is as of this day.

`symbols` holds 31 items; the first 2 are shown.

This document

GET /api/v1/openapi.json

The OpenAPI 3 description of every route on this page, for tools that generate clients.

curl -H "Authorization: Bearer $TP_TOKEN" "https://tickplunge.com/api/v1/openapi.json"