Skip to content

EOD ​

FreeValueStandardPro

Fetch end-of-day option data for a contract over a date range.

  • Since OPRA does not provide a national EOD report for options, Theta Data generates a national EOD report at 17:15 ET each day.
  • created represents the datetime the report was generated and last_trade represents the datetime of the last trade.
  • The quote in the response represents the last NBBO reported by OPRA at the time of report generation.
  • You can read more about EOD & OHLC data here.
SPY · 20250321 · 20250303 · 20250306
Client
Auth
Style
from thetadatadx import Client

client = Client.from_env()

rows = client.market_data.option_history_eod(
    "SPY", "20250321", "20250303", "20250306",
    strike="570", right="C",
)
for t in rows:
    print(t.date, t.open, t.close, t.volume)
Sample response · JSON
[
  {
    "ask": 52.45,
    "ask_condition": 50,
    "ask_exchange": 47,
    "ask_size": 15,
    "bid": 52.05,
    "bid_condition": 50,
    "bid_exchange": 60,
    "bid_size": 70,
    "close": 52.4,
    "count": 3,
    "created": "2024-11-04T17:16:56.205",
    "high": 52.75,
    "last_trade": "2024-11-04T15:48:12.005",
    "low": 52.4,
    "open": 52.54,
    "volume": 10
  }
]

Parameters ​

NameTypeRequiredDefaultDescription
symbolstringyes-Ticker symbol (e.g. AAPL)
expirationdateyes-Expiration date YYYYMMDD. Pass * to select all expirations for the underlying (chain-wide; query one date at a time).
start_datedateyes-Start date YYYYMMDD
end_datedateyes-End date YYYYMMDD
strikestringno*Strike price in dollars as a string (e.g. 500 or 17.5). Use * for wildcard selection.
rightstringnobothOption side. Use both or * (alias) for calls and puts. Accepted values: call, put, both, *.
max_dteintno-Maximum days to expiration
strike_rangeintno-Strike range filter
timeout_msintno-Per-request deadline in milliseconds. 0 means no deadline.

Response ​

Rows of EodTick:

FieldTypeDescription
created_ms_of_dayi32EOD report creation time (NOT a trade time), milliseconds since midnight ET.
last_trade_ms_of_dayi32Time of the day's last trade, milliseconds since midnight ET. 0 when no trades printed that day.
openf64Opening trade price. 0.0 when no trades printed that day.
highf64Highest traded price. 0.0 when no trades printed that day.
lowf64Lowest traded price. 0.0 when no trades printed that day.
closef64Closing traded price. 0.0 when no trades printed that day.
volumei64Number of contracts or shares traded.
counti64Number of trades.
bid_sizei32Last NBBO bid size.
bid_exchangei32Exchange code of the NBBO bid. Zero is a code the vendor assigns a meaning, so read columns() to tell a reported zero from a response that carried no such column.
bidf64Last NBBO bid price.
bid_conditioni32Quote condition code on the bid side. Zero is a code the vendor assigns a meaning, so read columns() to tell a reported zero from a response that carried no such column.
ask_sizei32Last NBBO ask size.
ask_exchangei32Exchange code of the NBBO ask. Zero is a code the vendor assigns a meaning, so read columns() to tell a reported zero from a response that carried no such column.
askf64Last NBBO ask price.
ask_conditioni32Quote condition code on the ask side. Zero is a code the vendor assigns a meaning, so read columns() to tell a reported zero from a response that carried no such column.
datei32Trading date as a YYYYMMDD integer.

Wildcard requests additionally populate expiration (YYYYMMDD), strike (dollars), and right ("C" / "P") on every row to identify the contract; on single-contract requests these are absent (None / null / undefined; the Rust and C rows carry the documented 0 / 0.0 / '\0' fills).

Released under the Apache-2.0 License.