Appearance
Tier quotas
ThetaData publishes a four-tier per-asset subscription matrix (see https://docs.thetadata.us/Articles/Getting-Started/Subscriptions.html). The matrix below summarises how the subscription tier maps onto the streams the client can request.
Per-asset matrix
| Asset class | Free | Value | Standard | Pro |
|---|---|---|---|---|
| Options | none | =Standard | 10 000 quote + 15 000 trade | per-contract quotes (unbounded) + full-feed trades |
| Stocks | none | =Standard | 1 000 quote + 1 000 trade | per-contract quotes (unbounded) + full-feed trades |
| Indices | none | =Standard | 3 trade-channel streams | 100 trade-channel streams |
| Rates | none | =Standard | 3 trade-channel streams | 100 trade-channel streams |
Free is a hard zero across the board: Free cannot drive realtime analytics. Value maps to the Standard ceiling (no separate Value quota; Value sits between Free and Standard on the ThetaData tier ladder).
Indices and rates are always capped — there is no full-feed broadcast path on either asset class. Both ride the Trade axis: live feed carries no NBBO quote stream for indices or rates; the canonical price is the price field on the Trade event of the asset's live feed streaming feed. Driving the (N+1)th index stream on Standard yields a too-many-requests rejection from the upstream live feed.
Analytic availability per tier
| Analytic | Required data | Min tier |
|---|---|---|
Greeks | Option quotes + stock trades | Standard |
Volatility | Full SPX / SPXW chain quotes | Pro |
Ohlcvc | Option or stock trades | Standard |
OptionFlow | Option trades + per-contract quotes (Lee–Ready) | Standard |
StockFlow | Stock trades + per-symbol quotes | Standard |
OptionTrades | Composes Greeks + option trades | Standard |
PerContractMoneynessSlice | Option trades + per-contract NBBO + Greeks | Standard |
Gex | Full option chain quotes + the prior-session open-interest snapshot | Pro |
IvChange | Per-contract IV surface (the same source Greeks reads from) | Standard |
BlockTrade | Option trades | Standard |
HistoricalVol | Trailing daily-close history + stock trades | Standard |
PriceBand52W | Trailing daily-close history + stock trades | Standard |
VolumeAnomaly | Stock trades + rolling baseline | Standard |
Vpin | Stock trades | Standard |
Data-dependency gaps surface to the caller as a LinkError::Engine { analytic, detail } from the .on_event call before any per-subscription buffer is allocated, so a quota-blocked subscription never silently degrades into an empty stream. The detail field carries the specific upstream rejection verbatim — including the "upgrade your subscription tier" hint when the rejection is a Pro-only analytic on a lower tier.
Historical entitlement
The ThetaData account model carries separate streaming and historical entitlements per asset class. The historical() accessor verifies the per-asset historical tier before issuing the first historical query backend call. A user with streaming Pro / historical Standard sees Free-tier rejections from historical().<analytic>(...).on_event(…) while live().<analytic>(...).on_event(…) continues to work.
The replay path (client.replay()) does not check entitlement — the dataset came from the user.