From ThetaData — Option Snapshots¶
Looking for a second source of option Greeks alongside ThetaData, or an alternative option Greeks API with dividend-aware, early-exercise-aware pricing and extended Greeks through third order? Lavender delivers independently computed Greeks through ThetaData's own wire format — no code changes required.
Already fetching option Greeks from a ThetaData terminal? Change the port number — everything else stays the same.
ThetaData v2 is deprecated
Lavender supports both ThetaData v3 and v2 wire formats. ThetaData is deprecating v2 — if you're still on v2, consider migrating to v3. Both versions work with Lavender today. See ThetaData v2 differences below.
What Changes¶
Change the port. The path, parameters, column names, and output format are all identical.
Try it in your browser¶
Paste this into any browser to see ThetaData-format Greeks rendered as an HTML table. No code needed.
Pick Your Endpoint¶
ThetaData v3 organizes Greek snapshots into five endpoints by Greek order. Lavender supports all five — same paths, same field sets:
| Your Current Endpoint | What It Returns |
|---|---|
/v3/option/snapshot/greeks/all |
Full set: first + second + third order, d1, d2, dual Greeks |
/v3/option/snapshot/greeks/first_order |
delta, theta, vega, rho, epsilon, lambda |
/v3/option/snapshot/greeks/second_order |
gamma, vanna, charm, vomma, veta, vera |
/v3/option/snapshot/greeks/third_order |
speed, zomma, color, ultima |
/v3/option/snapshot/greeks/implied_volatility |
IV and IV error only |
Gamma is second-order
Following ThetaData's convention, gamma is grouped with second-order Greeks, not first-order. The /greeks/all endpoint returns everything.
All Greeks¶
Same response format — a flat columnar JSON object where each key maps to an array of values:
{
"symbol": ["AAPL"],
"expiration": ["2026-12-18"],
"strike": [230.0],
"right": ["CALL"],
"timestamp": ["2026-03-06T17:42:14.943"],
"bid": [0.0],
"ask": [0.0],
"delta": [0.3924],
"theta": [-0.2261],
"vega": [19.5855],
"rho": [3.7952],
"epsilon": [-3.9564],
"lambda": [24.5713],
"gamma": [0.025],
"vanna": [0.4221],
"charm": [-2.1382],
"vomma": [5.9757],
"veta": [288.5863],
"vera": [3.5401],
"speed": [0.0003],
"zomma": [-0.075],
"color": [-3.0092],
"ultima": [-58.6674],
"d1": [-0.2793],
"d2": [-0.3383],
"dual_delta": [-0.3669],
"dual_gamma": [0.025],
"implied_vol": [0.245],
"iv_error": [0.0],
"underlying_timestamp": ["2026-03-06T17:42:14.943"],
"underlying_price": [260.5]
}
Market data fields are zeroed
The bid and ask fields are returned as 0.0. The Greek, IV, and computed fields contain Lavender's computed values.
Field Reference — All Greeks¶
Base Fields¶
| Field | Type | Description |
|---|---|---|
symbol |
string | Underlying ticker |
expiration |
string | Expiration date (YYYY-MM-DD) |
strike |
decimal | Strike price |
right |
string | CALL or PUT (uppercase) |
timestamp |
string | Quote timestamp (ISO 8601) |
bid |
double | Option bid (always 0.0) |
ask |
double | Option ask (always 0.0) |
First-Order Greeks¶
| Field | Type | Description |
|---|---|---|
delta |
double | \(\partial V / \partial S\) |
theta |
double | \(\partial V / \partial t\) — per calendar day |
vega |
double | \(\partial V / \partial \sigma\) |
rho |
double | \(\partial V / \partial r\) |
epsilon |
double | \(\partial V / \partial q\) |
lambda |
double | \(\Delta \cdot S / V\) (leverage ratio) |
Second-Order Greeks¶
| Field | Type | Description |
|---|---|---|
gamma |
double | \(\partial^2 V / \partial S^2\) |
vanna |
double | \(\partial^2 V / \partial S\,\partial \sigma\) |
charm |
double | \(\partial^2 V / \partial S\,\partial t\) — annualized |
vomma |
double | \(\partial^2 V / \partial \sigma^2\) |
veta |
double | \(\partial^2 V / \partial \sigma\,\partial t\) — per calendar day |
vera |
double | \(\partial^2 V / \partial \sigma\,\partial r\) |
Third-Order Greeks¶
| Field | Type | Description |
|---|---|---|
speed |
double | \(\partial^3 V / \partial S^3\) |
zomma |
double | \(\partial^3 V / \partial S^2\,\partial \sigma\) |
color |
double | \(\partial^3 V / \partial S^2\,\partial t\) — annualized |
ultima |
double | \(\partial^3 V / \partial \sigma^3\) |
Computed Fields¶
| Field | Type | Description |
|---|---|---|
d1 |
double | Black-76 d1 (computed from calibrated forward, strike, vol, time) |
d2 |
double | Black-76 d2 |
dual_delta |
double | dPrice/dStrike (foreign delta under Black-76) |
dual_gamma |
double | d²Price/dStrike² |
Volatility & Underlying¶
| Field | Type | Description |
|---|---|---|
implied_vol |
double | Annualized implied volatility |
iv_error |
double | (theo / mid) − 1 — near 0 when model agrees with market (0.0 when no market data) |
underlying_timestamp |
string | Spot price timestamp (ISO 8601) |
underlying_price |
double | Current underlying spot price |
First Order¶
Base fields plus: delta, theta, vega, rho, epsilon, lambda, implied_vol, iv_error, underlying_timestamp, underlying_price.
Second Order¶
Base fields plus: gamma, vanna, charm, vomma, veta, vera, implied_vol, iv_error, underlying_timestamp, underlying_price.
Third Order¶
Base fields plus: speed, zomma, color, ultima, implied_vol, iv_error, underlying_timestamp, underlying_price.
Implied Volatility¶
Base fields plus: implied_vol, iv_error, underlying_timestamp, underlying_price.
Parameters¶
All five endpoints share the same parameters:
| Parameter | Type | Required | Allowed Values | Default |
|---|---|---|---|---|
symbol |
string | Yes | Underlying ticker (e.g., SPY) |
— |
expiration |
string | Yes | YYYYMMDD, YYYY-MM-DD, or * (all) |
— |
strike |
decimal | No | Numeric (e.g., 230.0) or * (all) |
* |
right |
string | No | call, put, or both |
both |
max_dte |
integer | No | Maximum days to expiry (non-negative) | — |
strike_range |
integer | No | N strikes above/below ATM per expiry | — |
format |
string | No | csv, json, ndjson, html |
csv |
The following ThetaData parameters are accepted but silently ignored — Lavender uses its own model inputs:
annual_dividend, rate_type, rate_value, stock_price, version, min_time, use_market_value
Default format is CSV
The ThetaData compatibility layer defaults to csv, matching ThetaData's convention. The Lavender native API defaults to json.
Response Formats¶
CSV (default)¶
Standard header row followed by data rows:
symbol,expiration,strike,right,timestamp,bid,ask,delta,theta,vega,...
AAPL,2026-12-18,230.0000,CALL,2026-03-06T17:42:14.943,0.0000,0.0000,0.3924,-0.2261,19.5855,...
Content-Type: text/csv; charset=utf-8
Columnar JSON¶
A flat object — each key is a column name mapping to an array of values. All arrays have the same length.
Columnar vs. row-oriented
To access the Nth contract, read index N from every array. This matches ThetaData's v3 response convention.
NDJSON¶
One JSON object per line — each line is a complete contract record:
{"symbol":"AAPL","expiration":"2026-12-18","strike":230.0,"right":"CALL","delta":0.3924,...}
{"symbol":"AAPL","expiration":"2026-12-18","strike":230.0,"right":"PUT","delta":-0.6076,...}
Content-Type: application/x-ndjson; charset=utf-8
HTML¶
Renders a full Greeks table directly in your browser — no code needed. Paste this URL and see all Greeks for SPY's near-term chain:
Numeric values are formatted to 4 decimal places. Useful for quick inspection, spot-checking positions, or sharing a link.
Filtering¶
By Expiration¶
Use * for all expirations, or specify a date:
# All expirations
curl "...?symbol=SPY&expiration=*&format=csv"
# Single expiration (both formats accepted)
curl "...?symbol=SPY&expiration=20261218&format=csv"
curl "...?symbol=SPY&expiration=2026-12-18&format=csv"
By Strike¶
By Strike Range¶
Return only N strikes above and below the ATM strike per expiration. ATM is determined by the call with delta closest to 0.5.
# 5 strikes above + 5 below + ATM = up to 11 strikes × both sides
curl "...?symbol=SPY&expiration=20261218&strike_range=5&format=csv"
By Right¶
By Max DTE¶
Greek Scaling¶
ThetaData is the only vendor that returns vega, rho, and epsilon as raw BSM values (per unit) rather than per 1%. All other 8 supported vendors use per-1%, which matches the Lavender API convention. ThetaData values for these Greeks will be 100× larger than the same Greek on any other endpoint.
| Greek | Convention | Notes |
|---|---|---|
| Theta, Veta | Per calendar day | Same as all other vendors |
| Charm, Color | Annualized (per year) | ThetaData convention |
| Vega, Rho, Epsilon | Per unit (raw BSM) | 100× larger than per-1% convention used by other vendors |
| All others | Standard units | No conversion |
All output values are rounded to up to 4 decimal places.
Ignored parameters
ThetaData parameters stock_price, annual_dividend, rate_type, rate_value, and use_market_value are accepted but silently ignored. Lavender uses its own calibrated rates, dividends, and forward prices.
Timestamps
The timestamp field reflects the time of the Lavender computation snapshot, not the last market data tick time. If you need data freshness, compare successive snapshots.
Notes on specific fields¶
| Field | Notes |
|---|---|
iv_error |
Relative difference between theoretical and mid-market price: (theo / mid) − 1. Values near 0.0 indicate agreement. Returns 0.0 when no market data is available. |
bid, ask |
Always 0.0 — Lavender computes Greeks only, not market quotes. Present for wire compatibility. |
vomma |
Also known as volga. Same as volga on the Lavender API. |
How Lavender's Greeks Differ¶
ThetaData computes Greeks using the standard Black-Scholes formula with European-style assumptions. Running Lavender alongside ThetaData gives you a second perspective that accounts for:
- Early exercise — Lavender prices American options, which matters for deep ITM equity options near ex-dividend dates
- Discrete dividends — rather than a continuous yield approximation, Lavender uses the actual dividend schedule
- Implied borrow rates — Lavender solves for the borrow rate per expiry to enforce put-call parity, producing consistent call/put Greeks even in hard-to-borrow names
- Two views of time decay — Lavender provides conventional theta (\(\partial V / \partial t\)) on this endpoint, plus a separate decay metric (expected change to next trading day, accounting for weekends and holidays) on the Lavender API
Comparing the two reports side-by-side highlights where these modeling differences matter most for your positions.
Migrating to the Lavender Native API¶
If you want to move from ThetaData-compatible endpoints to the Lavender native API, here are the key field name changes:
| ThetaData | Lavender API |
|---|---|
symbol |
root (or underlying for multi-root) |
expiration |
expiry |
underlying_price |
und_price |
implied_vol |
lav_vol |
vomma |
volga |
ThetaData v2¶
Lavender also supports ThetaData's v2 bulk snapshot endpoints. The v2 API uses a different response format and parameter naming but returns the same Greeks.
v2 is deprecated
ThetaData is deprecating v2. New integrations should use v3. If you have existing v2 code, it works unchanged with Lavender — just change the port.
v2 Endpoints¶
| v2 Endpoint | Equivalent v3 Endpoint | Fields |
|---|---|---|
/v2/bulk_snapshot/option/greeks |
/v3/.../greeks/first_order |
delta, theta, vega, rho, epsilon, lambda |
/v2/bulk_snapshot/option/greeks_second_order |
/v3/.../greeks/second_order |
gamma, vanna, charm, vomma, veta |
/v2/bulk_snapshot/option/all_greeks |
/v3/.../greeks/all |
All first + second + third order |
There are no v2 equivalents for /greeks/third_order or /greeks/implied_volatility — use v3 for those.
v2 Parameters¶
| v2 Parameter | v3 Equivalent | Differences |
|---|---|---|
root |
symbol |
Same meaning, different name |
exp |
expiration |
YYYYMMDD integer or 0 for all (v3 uses YYYY-MM-DD or *) |
right |
right |
C or P (v3 uses call, put, or both) |
The v2 endpoints do not support strike, max_dte, strike_range, or format parameters.
v2 Response Format¶
The v2 response uses a format-header + ticks-array structure — different from v3's columnar JSON:
{
"header": {
"latency_ms": 0,
"next_page": null,
"format": [
"ms_of_day", "bid", "ask", "delta", "theta", "vega",
"rho", "epsilon", "lambda", "implied_vol", "iv_error",
"ms_of_day2", "underlying_price", "date"
]
},
"response": [
{
"contract": {
"security_type": "OPTION",
"root": "AAPL",
"expiration": 20261218,
"strike": 230000,
"right": "C"
},
"ticks": [
[63000000, 0.0, 0.0, 0.3924, -0.2261, 19.5855,
3.7952, -3.9564, 24.5713, 0.245, 0.0,
63000000, 230.15, 20260314]
]
}
]
}
Key differences from v3:
- Format header — column names are in
header.format, not as JSON keys. Zipformat[i]withticks[0][i]to reconstruct named fields. - One contract per response element — each
response[]entry has acontractobject and aticksarray (always length 1 for snapshots). - Strike in 1/10th cent —
230000= $230.00. Divide by 1,000 to get dollars. - Expiration as integer —
20261218instead of"2026-12-18". - Right as single char —
"C"or"P"instead of"CALL"/"PUT". - Time as ms_of_day — milliseconds since midnight ET, plus a separate
datefield (YYYYMMDD integer).
v2 Format Arrays by Endpoint¶
/greeks (first order — 14 fields):
ms_of_day, bid, ask, delta, theta, vega, rho, epsilon, lambda, implied_vol, iv_error, ms_of_day2, underlying_price, date
/greeks_second_order (13 fields):
ms_of_day, bid, ask, gamma, vanna, charm, vomma, veta, implied_vol, iv_error, ms_of_day2, underlying_price, date
/all_greeks (24 fields):
ms_of_day, bid, ask, delta, theta, vega, rho, epsilon, lambda, gamma, vanna, charm, vomma, veta, vera, speed, zomma, color, ultima, implied_vol, iv_error, ms_of_day2, underlying_price, date
Error Responses¶
| Status | Condition |
|---|---|
200 |
Success |
400 |
Missing/invalid symbol/root, expiration/exp, strike, right, format, max_dte, or strike_range |
404 |
Unsupported Greek order (e.g., /greeks/fourth_order) |
502 |
Upstream data unavailable |