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.
createdrepresents the datetime the report was generated andlast_traderepresents 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
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
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
symbol | string | yes | — | Ticker symbol (e.g. AAPL) |
expiration | date | yes | — | Expiration date YYYYMMDD. Pass * to select all expirations for the underlying (chain-wide; query one date at a time). |
start_date | date | yes | — | Start date YYYYMMDD |
end_date | date | yes | — | End date YYYYMMDD |
strike | string | no | * | Strike price in dollars as a string (e.g. 500 or 17.5). Use * for wildcard selection. |
right | string | no | both | Option side. Use both or * (alias) for calls and puts. Accepted values: call, put, both, *. |
max_dte | int | no | — | Maximum days to expiration |
strike_range | int | no | — | Strike range filter |
timeout_ms | int | no | — | Per-request deadline in milliseconds. 0 means no deadline. |
Response
Rows of EodTick:
| Field | Type | Description |
|---|---|---|
created_ms_of_day | i32 | EOD report creation time (NOT a trade time), milliseconds since midnight ET. |
last_trade_ms_of_day | i32 | Time of the day's last trade, milliseconds since midnight ET. 0 when no trades printed that day. |
open | f64 | Opening trade price. 0.0 when no trades printed that day. |
high | f64 | Highest traded price. 0.0 when no trades printed that day. |
low | f64 | Lowest traded price. 0.0 when no trades printed that day. |
close | f64 | Closing traded price. 0.0 when no trades printed that day. |
volume | i64 | Number of contracts or shares traded. |
count | i64 | Number of trades. |
bid_size | i32 | Last NBBO bid size. |
bid_exchange | i32 | Exchange code of the NBBO bid. |
bid | f64 | Last NBBO bid price. |
bid_condition | i32 | Quote condition code on the bid side. |
ask_size | i32 | Last NBBO ask size. |
ask_exchange | i32 | Exchange code of the NBBO ask. |
ask | f64 | Last NBBO ask price. |
ask_condition | i32 | Quote condition code on the ask side. |
date | i32 | Trading 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).