Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

- **Config-file migration.** A `config.toml` that still sets `flush_mode`, `streaming.host_selection`, `streaming.host_shuffle_seed`, or a `reconnect_jitter` of `"equal"` / `"decorrelated"` now fails to load with a typed error rather than being silently ignored — remove those keys / values when upgrading.

- **`QuoteTick.midpoint` derived column.** Removed from every binding (Python `QuoteTick.midpoint`, TypeScript `QuoteTick.midpoint`, C `ThetaDataDxQuoteTick.midpoint`, and the Arrow / Polars `midpoint` column). The quote wire carries `bid` and `ask`; `midpoint` was an SDK-computed `(bid + ask) / 2` column the server never sends and the terminal never exposes — compute it from `bid` / `ask` at the call site if you need it. The `IvTick.midpoint` field is a real wire column and is unaffected. This is a breaking change to the quote tick schema.

- **List endpoints now preserve wire order.** `list_*` results (roots / symbols, expirations, strikes, dates) come back in the server's row order rather than re-sorted ascending by the SDK. The terminal streams these lists in wire order untouched; the SDK's numeric-aware ascending sort had no terminal counterpart. Sort client-side if you need a specific order. This is a behavioral change to the `list_*` returns.

- **`interval` is forwarded verbatim.** The `interval` argument is no longer snapped to the nearest preset: a raw-millisecond value such as `"250"` or `"60000"` is now rejected client-side rather than silently mapped to `"500ms"` / `"1m"`. The server accepts only the closed preset enum (`tick`, `10ms`, `100ms`, `500ms`, `1s`, `5s`, `10s`, `15s`, `30s`, `1m`, `5m`, `10m`, `15m`, `30m`, `1h`); the SDK now forwards the string as-is and validates against that set. Pass an explicit preset. This is a breaking change to the `interval` parameter.

## [0.1.1] - 2026-07-07

### Added
Expand Down
2 changes: 1 addition & 1 deletion docs-site/docs/articles/symbology.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ Strikes are dollars across every surface, including the bundled server's [WebSoc
- Dates are `YYYYMMDD` strings (`"20250303"`). The HTTP server also accepts ISO `YYYY-MM-DD`.
- Date ranges are inclusive on both ends.
- Time-of-day inputs (`start_time`, `end_time`, `time_of_day`) are Eastern Time wall-clock `HH:MM:SS` (at-time endpoints take milliseconds: `HH:MM:SS.SSS`).
- `interval` accepts a preset (`1s`, `1m`, `1h`, …) or a millisecond count as a string (`"60000"`).
- `interval` is one of the presets: `tick`, `10ms`, `100ms`, `500ms`, `1s`, `5s`, `10s`, `15s`, `30s`, `1m`, `5m`, `10m`, `15m`, `30m`, `1h`.

## Timestamps out

Expand Down
6 changes: 6 additions & 0 deletions docs-site/docs/changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

- **Config-file migration.** A `config.toml` that still sets `flush_mode`, `streaming.host_selection`, `streaming.host_shuffle_seed`, or a `reconnect_jitter` of `"equal"` / `"decorrelated"` now fails to load with a typed error rather than being silently ignored — remove those keys / values when upgrading.

- **`QuoteTick.midpoint` derived column.** Removed from every binding (Python `QuoteTick.midpoint`, TypeScript `QuoteTick.midpoint`, C `ThetaDataDxQuoteTick.midpoint`, and the Arrow / Polars `midpoint` column). The quote wire carries `bid` and `ask`; `midpoint` was an SDK-computed `(bid + ask) / 2` column the server never sends and the terminal never exposes — compute it from `bid` / `ask` at the call site if you need it. The `IvTick.midpoint` field is a real wire column and is unaffected. This is a breaking change to the quote tick schema.

- **List endpoints now preserve wire order.** `list_*` results (roots / symbols, expirations, strikes, dates) come back in the server's row order rather than re-sorted ascending by the SDK. The terminal streams these lists in wire order untouched; the SDK's numeric-aware ascending sort had no terminal counterpart. Sort client-side if you need a specific order. This is a behavioral change to the `list_*` returns.

- **`interval` is forwarded verbatim.** The `interval` argument is no longer snapped to the nearest preset: a raw-millisecond value such as `"250"` or `"60000"` is now rejected client-side rather than silently mapped to `"500ms"` / `"1m"`. The server accepts only the closed preset enum (`tick`, `10ms`, `100ms`, `500ms`, `1s`, `5s`, `10s`, `15s`, `30s`, `1m`, `5m`, `10m`, `15m`, `30m`, `1h`); the SDK now forwards the string as-is and validates against that set. Pass an explicit preset. This is a breaking change to the `interval` parameter.

## [0.1.1] - 2026-07-07

### Added
Expand Down
72 changes: 36 additions & 36 deletions docs-site/docs/public/thetadatadx.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ info:
bindings backed by the same Rust core.

All dates use YYYYMMDD format. Times use milliseconds since midnight ET.
Intervals accept milliseconds ("60000") or shorthand ("1m"). Valid presets: 100ms, 500ms, 1s, 5s, 10s, 15s, 30s, 1m, 5m, 10m, 15m, 30m, 1h.
Intervals are one of the presets: tick, 10ms, 100ms, 500ms, 1s, 5s, 10s, 15s, 30s, 1m, 5m, 10m, 15m, 30m, 1h.
All prices are f64 (double) -- decoded during parsing.
version: 0.1.1
contact:
Expand Down Expand Up @@ -152,7 +152,7 @@ x-anchors:
required: true
schema:
type: string
description: 'Accepts milliseconds ("60000") or shorthand ("1m"). Valid presets: 100ms, 500ms, 1s, 5s, 10s, 15s, 30s, 1m, 5m, 10m, 15m, 30m, 1h.'
description: 'One of the interval presets: tick, 10ms, 100ms, 500ms, 1s, 5s, 10s, 15s, 30s, 1m, 5m, 10m, 15m, 30m, 1h.'

time_of_day-param: &time_of_day-param
name: time_of_day
Expand Down Expand Up @@ -871,7 +871,7 @@ paths:
summary: Stock intraday OHLC bars
description: |
Intraday OHLC bars. Supply `date` for a single day, or `start_date`/`end_date` for a date range on the same route.
Interval accepts milliseconds ("60000") or shorthand ("1m"). Valid presets: 100ms, 500ms, 1s, 5s, 10s, 15s, 30s, 1m, 5m, 10m, 15m, 30m, 1h.
Interval is one of the presets: tick, 10ms, 100ms, 500ms, 1s, 5s, 10s, 15s, 30s, 1m, 5m, 10m, 15m, 30m, 1h.
gRPC: GetStockHistoryOhlc
tags: [Stock / History]
parameters:
Expand All @@ -889,15 +889,15 @@ paths:
- lang: rust
label: Rust
source: |
let bars = client.market_data().stock_history_ohlc("AAPL").date("20240315").interval("60000").await?;
let bars = client.market_data().stock_history_ohlc("AAPL").date("20240315").interval("1m").await?;
- lang: python
label: Python
source: |
bars = client.market_data.stock_history_ohlc("AAPL", date="20240315", interval="60000")
bars = client.market_data.stock_history_ohlc("AAPL", date="20240315", interval="1m")
- lang: cpp
label: C++
source: |
auto bars = client.market_data().stock_history_ohlc("AAPL", thetadatadx::EndpointRequestOptions{}.with_date("20240315").with_interval("60000"));
auto bars = client.market_data().stock_history_ohlc("AAPL", thetadatadx::EndpointRequestOptions{}.with_date("20240315").with_interval("1m"));

/v3/stock/history/trade:
x-min-subscription: standard
Expand Down Expand Up @@ -975,15 +975,15 @@ paths:
- lang: rust
label: Rust
source: |
let quotes = client.market_data().stock_history_quote("AAPL").date("20240315").interval("60000").await?;
let quotes = client.market_data().stock_history_quote("AAPL").date("20240315").interval("1m").await?;
- lang: python
label: Python
source: |
quotes = client.market_data.stock_history_quote("AAPL", date="20240315", interval="60000")
quotes = client.market_data.stock_history_quote("AAPL", date="20240315", interval="1m")
- lang: cpp
label: C++
source: |
auto quotes = client.market_data().stock_history_quote("AAPL", thetadatadx::EndpointRequestOptions{}.with_date("20240315").with_interval("60000"));
auto quotes = client.market_data().stock_history_quote("AAPL", thetadatadx::EndpointRequestOptions{}.with_date("20240315").with_interval("1m"));
/v3/stock/history/trade_quote:
x-min-subscription: standard
get:
Expand Down Expand Up @@ -1772,15 +1772,15 @@ paths:
- lang: rust
label: Rust
source: |
let bars = client.market_data().option_history_ohlc("SPY", "20240419", "500", "C", "20240315", "60000").await?;
let bars = client.market_data().option_history_ohlc("SPY", "20240419", "500", "C", "20240315", "1m").await?;
- lang: python
label: Python
source: |
bars = client.market_data.option_history_ohlc("SPY", "20240419", "500", "C", "20240315", "60000")
bars = client.market_data.option_history_ohlc("SPY", "20240419", "500", "C", "20240315", "1m")
- lang: cpp
label: C++
source: |
auto bars = client.market_data().option_history_ohlc("SPY", "20240419", "500", "C", "20240315", "60000");
auto bars = client.market_data().option_history_ohlc("SPY", "20240419", "500", "C", "20240315", "1m");

/v3/option/history/trade:
x-min-subscription: standard
Expand Down Expand Up @@ -1866,15 +1866,15 @@ paths:
- lang: rust
label: Rust
source: |
let quotes = client.market_data().option_history_quote("SPY", "20240419", "500", "C", "20240315", "60000").await?;
let quotes = client.market_data().option_history_quote("SPY", "20240419", "500", "C", "20240315", "1m").await?;
- lang: python
label: Python
source: |
quotes = client.market_data.option_history_quote("SPY", "20240419", "500", "C", "20240315", "60000")
quotes = client.market_data.option_history_quote("SPY", "20240419", "500", "C", "20240315", "1m")
- lang: cpp
label: C++
source: |
auto quotes = client.market_data().option_history_quote("SPY", "20240419", "500", "C", "20240315", "60000");
auto quotes = client.market_data().option_history_quote("SPY", "20240419", "500", "C", "20240315", "1m");
/v3/option/history/trade_quote:
x-min-subscription: standard
get:
Expand Down Expand Up @@ -2052,15 +2052,15 @@ paths:
- lang: rust
label: Rust
source: |
let greeks = client.market_data().option_history_greeks_all("SPY", "20240419", "500", "C", "20240315", "60000").await?;
let greeks = client.market_data().option_history_greeks_all("SPY", "20240419", "500", "C", "20240315", "1m").await?;
- lang: python
label: Python
source: |
greeks = client.market_data.option_history_greeks_all("SPY", "20240419", "500", "C", "20240315", "60000")
greeks = client.market_data.option_history_greeks_all("SPY", "20240419", "500", "C", "20240315", "1m")
- lang: cpp
label: C++
source: |
auto greeks = client.market_data().option_history_greeks_all("SPY", "20240419", "500", "C", "20240315", "60000");
auto greeks = client.market_data().option_history_greeks_all("SPY", "20240419", "500", "C", "20240315", "1m");

/v3/option/history/greeks/first_order:
x-min-subscription: standard
Expand Down Expand Up @@ -2103,15 +2103,15 @@ paths:
- lang: rust
label: Rust
source: |
let g1 = client.market_data().option_history_greeks_first_order("SPY", "20240419", "500", "C", "20240315", "60000").await?;
let g1 = client.market_data().option_history_greeks_first_order("SPY", "20240419", "500", "C", "20240315", "1m").await?;
- lang: python
label: Python
source: |
g1 = client.market_data.option_history_greeks_first_order("SPY", "20240419", "500", "C", "20240315", "60000")
g1 = client.market_data.option_history_greeks_first_order("SPY", "20240419", "500", "C", "20240315", "1m")
- lang: cpp
label: C++
source: |
auto g1 = client.market_data().option_history_greeks_first_order("SPY", "20240419", "500", "C", "20240315", "60000");
auto g1 = client.market_data().option_history_greeks_first_order("SPY", "20240419", "500", "C", "20240315", "1m");

/v3/option/history/greeks/second_order:
x-min-subscription: professional
Expand Down Expand Up @@ -2154,15 +2154,15 @@ paths:
- lang: rust
label: Rust
source: |
let g2 = client.market_data().option_history_greeks_second_order("SPY", "20240419", "500", "C", "20240315", "60000").await?;
let g2 = client.market_data().option_history_greeks_second_order("SPY", "20240419", "500", "C", "20240315", "1m").await?;
- lang: python
label: Python
source: |
g2 = client.market_data.option_history_greeks_second_order("SPY", "20240419", "500", "C", "20240315", "60000")
g2 = client.market_data.option_history_greeks_second_order("SPY", "20240419", "500", "C", "20240315", "1m")
- lang: cpp
label: C++
source: |
auto g2 = client.market_data().option_history_greeks_second_order("SPY", "20240419", "500", "C", "20240315", "60000");
auto g2 = client.market_data().option_history_greeks_second_order("SPY", "20240419", "500", "C", "20240315", "1m");

/v3/option/history/greeks/third_order:
x-min-subscription: professional
Expand Down Expand Up @@ -2205,15 +2205,15 @@ paths:
- lang: rust
label: Rust
source: |
let g3 = client.market_data().option_history_greeks_third_order("SPY", "20240419", "500", "C", "20240315", "60000").await?;
let g3 = client.market_data().option_history_greeks_third_order("SPY", "20240419", "500", "C", "20240315", "1m").await?;
- lang: python
label: Python
source: |
g3 = client.market_data.option_history_greeks_third_order("SPY", "20240419", "500", "C", "20240315", "60000")
g3 = client.market_data.option_history_greeks_third_order("SPY", "20240419", "500", "C", "20240315", "1m")
- lang: cpp
label: C++
source: |
auto g3 = client.market_data().option_history_greeks_third_order("SPY", "20240419", "500", "C", "20240315", "60000");
auto g3 = client.market_data().option_history_greeks_third_order("SPY", "20240419", "500", "C", "20240315", "1m");

/v3/option/history/greeks/implied_volatility:
x-min-subscription: standard
Expand Down Expand Up @@ -2256,15 +2256,15 @@ paths:
- lang: rust
label: Rust
source: |
let iv = client.market_data().option_history_greeks_implied_volatility("SPY", "20240419", "500", "C", "20240315", "60000").await?;
let iv = client.market_data().option_history_greeks_implied_volatility("SPY", "20240419", "500", "C", "20240315", "1m").await?;
- lang: python
label: Python
source: |
iv = client.market_data.option_history_greeks_implied_volatility("SPY", "20240419", "500", "C", "20240315", "60000")
iv = client.market_data.option_history_greeks_implied_volatility("SPY", "20240419", "500", "C", "20240315", "1m")
- lang: cpp
label: C++
source: |
auto iv = client.market_data().option_history_greeks_implied_volatility("SPY", "20240419", "500", "C", "20240315", "60000");
auto iv = client.market_data().option_history_greeks_implied_volatility("SPY", "20240419", "500", "C", "20240315", "1m");

# =========================================================================
# OPTION / HISTORY TRADE GREEKS
Expand Down Expand Up @@ -2799,15 +2799,15 @@ paths:
- lang: rust
label: Rust
source: |
let bars = client.market_data().index_history_ohlc("SPX", "20240101", "20240301", "60000").await?;
let bars = client.market_data().index_history_ohlc("SPX", "20240101", "20240301", "1m").await?;
- lang: python
label: Python
source: |
bars = client.market_data.index_history_ohlc("SPX", "20240101", "20240301", "60000")
bars = client.market_data.index_history_ohlc("SPX", "20240101", "20240301", "1m")
- lang: cpp
label: C++
source: |
auto bars = client.market_data().index_history_ohlc("SPX", "20240101", "20240301", "60000");
auto bars = client.market_data().index_history_ohlc("SPX", "20240101", "20240301", "1m");

/v3/index/history/price:
x-min-subscription: value
Expand Down Expand Up @@ -2842,15 +2842,15 @@ paths:
- lang: rust
label: Rust
source: |
let prices = client.market_data().index_history_price("SPX", "20240315", "60000").await?;
let prices = client.market_data().index_history_price("SPX", "20240315", "1m").await?;
- lang: python
label: Python
source: |
prices = client.market_data.index_history_price("SPX", "20240315", "60000")
prices = client.market_data.index_history_price("SPX", "20240315", "1m")
- lang: cpp
label: C++
source: |
auto prices = client.market_data().index_history_price("SPX", "20240315", "60000");
auto prices = client.market_data().index_history_price("SPX", "20240315", "1m");

# =========================================================================
# INDEX / AT-TIME
Expand Down
2 changes: 1 addition & 1 deletion docs-site/docs/reference/index/history/ohlc.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ Fetch intraday OHLC bars for an index.
| `symbol` | string | yes | — | Ticker symbol (e.g. AAPL) |
| `start_date` | date | yes | — | Start date YYYYMMDD |
| `end_date` | date | yes | — | End date YYYYMMDD |
| `interval` | string | no | `1s` | Interval preset or millisecond string. Defaults to `1s` when omitted — matching the upstream ThetaData Python library. Accepted values: `tick`, `10ms`, `100ms`, `500ms`, `1s`, `5s`, `10s`, `15s`, `30s`, `1m`, `5m`, `10m`, `15m`, `30m`, `1h`. |
| `interval` | string | no | `1s` | Interval preset. Defaults to `1s` when omitted — matching the upstream ThetaData Python library. Accepted values: `tick`, `10ms`, `100ms`, `500ms`, `1s`, `5s`, `10s`, `15s`, `30s`, `1m`, `5m`, `10m`, `15m`, `30m`, `1h`. |
| `start_time` | string | no | `09:30:00` | Start time filter |
| `end_time` | string | no | `16:00:00` | End time filter |
| `timeout_ms` | int | no | — | Per-request deadline in milliseconds. 0 means no deadline. |
Expand Down
2 changes: 1 addition & 1 deletion docs-site/docs/reference/index/history/price.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ Fetch intraday price history for an index.
|---|---|---|---|---|
| `symbol` | string | yes | — | Ticker symbol (e.g. AAPL) |
| `date` | date | no | — | Single date YYYYMMDD. Supply this for a single-day pull, or supply `start_date`/`end_date` for a range. When present, `date` takes precedence over the range. |
| `interval` | string | no | `1s` | Interval preset or millisecond string. Defaults to `1s` when omitted — matching the upstream ThetaData Python library. Accepted values: `tick`, `10ms`, `100ms`, `500ms`, `1s`, `5s`, `10s`, `15s`, `30s`, `1m`, `5m`, `10m`, `15m`, `30m`, `1h`. |
| `interval` | string | no | `1s` | Interval preset. Defaults to `1s` when omitted — matching the upstream ThetaData Python library. Accepted values: `tick`, `10ms`, `100ms`, `500ms`, `1s`, `5s`, `10s`, `15s`, `30s`, `1m`, `5m`, `10m`, `15m`, `30m`, `1h`. |
| `start_time` | string | no | `09:30:00` | Start time filter |
| `end_time` | string | no | `16:00:00` | End time filter |
| `start_date` | date | no | — | Start date YYYYMMDD |
Expand Down
Loading
Loading