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"
]
}
Fields
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"
}
Fields
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"
}
Fields
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"
}
Fields
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"
}
Fields
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
]
]
}
Fields
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)"
}
]
}
Fields
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
}
Fields
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
}
Fields
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
]
}
Fields
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
}
]
}
Fields
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"
}
}
Fields
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
}
]
}
Fields
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"
}
Fields
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
]
}
Fields
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"
}
Fields
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"
}
]
Fields
[].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"
]
}
Fields
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"
}
Fields
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
}
]
}
]
}
Fields
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
}
]
}
]
}
Fields
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"
}
]
}
Fields
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"
}
Fields
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"