Skip to content

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

curl "http://localhost:25510/v3/option/snapshot/greeks/all?symbol=AAPL&expiration=*"
#                    ^^^^^
curl "http://localhost:2112/v3/option/snapshot/greeks/all?symbol=AAPL&expiration=*"
#                     ^^^^
curl "http://localhost:25510/v2/bulk_snapshot/option/all_greeks?root=AAPL&exp=0"
#                    ^^^^^
curl "http://localhost:2112/v2/bulk_snapshot/option/all_greeks?root=AAPL&exp=0"
#                     ^^^^

Change the port. The path, parameters, column names, and output format are all identical.

Try it in your browser

http://localhost:2112/v3/option/snapshot/greeks/all?symbol=SPY&expiration=*&max_dte=30&format=html

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

curl "http://localhost:25510/v3/option/snapshot/greeks/all?symbol=AAPL&expiration=20261218&strike=230.0&format=json"
curl "http://localhost:2112/v3/option/snapshot/greeks/all?symbol=AAPL&expiration=20261218&strike=230.0&format=json"

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

curl "http://localhost:25510/v3/option/snapshot/greeks/first_order?symbol=AAPL&expiration=20261218&format=json"
curl "http://localhost:2112/v3/option/snapshot/greeks/first_order?symbol=AAPL&expiration=20261218&format=json"

Base fields plus: delta, theta, vega, rho, epsilon, lambda, implied_vol, iv_error, underlying_timestamp, underlying_price.


Second Order

curl "http://localhost:25510/v3/option/snapshot/greeks/second_order?symbol=SPY&expiration=*&max_dte=30&format=json"
curl "http://localhost:2112/v3/option/snapshot/greeks/second_order?symbol=SPY&expiration=*&max_dte=30&format=json"

Base fields plus: gamma, vanna, charm, vomma, veta, vera, implied_vol, iv_error, underlying_timestamp, underlying_price.


Third Order

curl "http://localhost:25510/v3/option/snapshot/greeks/third_order?symbol=SPY&expiration=20261218&right=call&format=csv"
curl "http://localhost:2112/v3/option/snapshot/greeks/third_order?symbol=SPY&expiration=20261218&right=call&format=csv"

Base fields plus: speed, zomma, color, ultima, implied_vol, iv_error, underlying_timestamp, underlying_price.


Implied Volatility

curl "http://localhost:25510/v3/option/snapshot/greeks/implied_volatility?symbol=AAPL&expiration=*&format=json"
curl "http://localhost:2112/v3/option/snapshot/greeks/implied_volatility?symbol=AAPL&expiration=*&format=json"

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:

http://localhost:2112/v3/option/snapshot/greeks/all?symbol=SPY&expiration=*&max_dte=30&format=html

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

curl "...?symbol=AAPL&expiration=20261218&strike=230.0&format=html"

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

curl "...?symbol=SPY&expiration=20261218&right=call&format=csv"

By Max DTE

curl "...?symbol=SPY&expiration=*&max_dte=30&format=csv"

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. Zip format[i] with ticks[0][i] to reconstruct named fields.
  • One contract per response element — each response[] entry has a contract object and a ticks array (always length 1 for snapshots).
  • Strike in 1/10th cent230000 = $230.00. Divide by 1,000 to get dollars.
  • Expiration as integer20261218 instead 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 date field (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