Skip to content

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 classFreeValueStandardPro
Optionsnone=Standard10 000 quote + 15 000 tradeper-contract quotes (unbounded) + full-feed trades
Stocksnone=Standard1 000 quote + 1 000 tradeper-contract quotes (unbounded) + full-feed trades
Indicesnone=Standard3 trade-channel streams100 trade-channel streams
Ratesnone=Standard3 trade-channel streams100 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

AnalyticRequired dataMin tier
GreeksOption quotes + stock tradesStandard
VolatilityFull SPX / SPXW chain quotesPro
OhlcvcOption or stock tradesStandard
OptionFlowOption trades + per-contract quotes (Lee–Ready)Standard
StockFlowStock trades + per-symbol quotesStandard
OptionTradesComposes Greeks + option tradesStandard
PerContractMoneynessSliceOption trades + per-contract NBBO + GreeksStandard
GexFull option chain quotes + the prior-session open-interest snapshotPro
IvChangePer-contract IV surface (the same source Greeks reads from)Standard
BlockTradeOption tradesStandard
HistoricalVolTrailing daily-close history + stock tradesStandard
PriceBand52WTrailing daily-close history + stock tradesStandard
VolumeAnomalyStock trades + rolling baselineStandard
VpinStock tradesStandard

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.

Proprietary. All rights reserved.