Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
15 commits
Select commit Hold shift + click to select a range
ac29512
docs(internal): correct four BYOK prompt statements against the API
MarketDataApp Oct 13, 2026
a923ba2
docs(internal): let E1 accept X-MarketData-Client, which browsers can…
MarketDataApp Oct 13, 2026
3070763
docs(sheets): document OPTIONDATA ranges and correct when noheaders i…
MarketDataDev03 Oct 14, 2026
3213f8e
docs(sheets): document four-column OPTIONDATA tables and the OPTIONCH…
MarketDataDev03 Oct 19, 2026
e6d90ea
docs(sheets,api): list the contract columns and DTE for both option f…
MarketDataDev03 Oct 22, 2026
8a8f150
docs(sheets): correct OPTIONCHAIN today and last session, and three O…
MarketDataApp Oct 20, 2026
f0d6643
Merge pull request #224 from MarketDataDev03/02_sheets_optiondata_ranges
MarketDataApp Oct 22, 2026
d20c110
docs: last session is the same date on every plan, and today's option…
MarketDataApp Oct 22, 2026
3a11d70
docs(plans): publish the Commercial Plan at $333/month to start, bill…
MarketDataApp Oct 23, 2026
1fe777d
docs(plans): lead the Commercial Plan with what it includes, and poin…
MarketDataApp Oct 23, 2026
3117b20
docs(plans): drop the check marks from the What You Can Build list
MarketDataApp Oct 23, 2026
edc11b9
fix(theme): restore the space above the next/previous cards on every …
MarketDataApp Oct 23, 2026
927ca3a
docs(sdk/csharp): PresentGreeks says a greek can be null, not that so…
MarketDataApp Oct 23, 2026
aa146bc
fix(options): an expiring SPXW contract expires at 4:00 PM, not 4:15 PM
MarketDataApp Oct 26, 2026
6b65161
Merge main into staging: the release PR conflicted only on copies of …
MarketDataApp Oct 26, 2026
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
4 changes: 2 additions & 2 deletions api/dates-and-times.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ For real-time quotes, intraday candles, and `updated` fields, the timestamp repr

Although US-listed options primarily trade on exchanges in Chicago (CBOE), the API returns all option timestamps in **Eastern Time**, consistent with the rest of the API. The `updated` field on option quotes and chain responses reflects the Eastern Time snapshot of the data.

Option expiration timestamps reflect the **actual expiration time**, not midnight. Equity options expire at **4:00 PM Eastern** and index options expire at **4:15 PM Eastern**.
Option expiration timestamps reflect the **actual expiration time**, not midnight. Equity options and PM-settled index options, such as SPXW, NDXP, RUTW and XSP, expire at **4:00 PM Eastern**. AM-settled index options, such as the monthly SPX, NDX and RUT contracts, carry **9:30 AM Eastern** on the expiration date, the time of the opening settlement; their last trading day is the business day before.

## Request Date Formats

Expand Down Expand Up @@ -81,7 +81,7 @@ Relative dates allow Market Data endpoints to continually modify the date sent t

- `yesterday` Yesterday's date.

- `last session` Returns the date of the last closed market session. This keyphrase always gets the previous closed session, accounting for weekends, holidays, and half-days (which are counted as valid sessions). For example, on Monday during market hours, it would return Friday's date. After market close on Monday, it would return Monday's date. This allows you to always track the previous session without having to account for weekends, holidays, or other market closures.
- `last session` Returns the date of the last closed market session. This keyphrase always gets the previous closed session, accounting for weekends, holidays, and half-days (which are counted as valid sessions). For example, on Monday during market hours, it would return Friday's date. After market close on Monday, it would return Monday's date. This allows you to always track the previous session without having to account for weekends, holidays, or other market closures. The date is the same on every plan. On a plan that provides only Historical options data, an options session becomes Historical at the next session's open (see [Data Freshness](/account/data-freshness)), so between the close and the next open an options request for `last session` returns a 402 error.

- `-[number] days` Use negative days to specify a time in the past _n_ days before. When this is used alone, it is relative to the current day. When used in conjunction in `from` field (i.e. the starting date), it is relative to the `to` field (i.e. the ending date). For example, if the current date is January 20, but January 10 is used in the `to` field and `-5 days` in the `from` field, then the starting day will be January 5. The query would return values from January 5 to January 10. However, if the `to` field were to be omitted, then the same query would return data from January 15 to January 20 since `-5 days` would be relative to the current date of January 20.

Expand Down
2 changes: 1 addition & 1 deletion api/options/chain.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -413,7 +413,7 @@ The `am` and `pm` parameters are only applicable for index options such as SPX,

- **expiration** `array[number]`

The option's expiration date and time. Equity options expire at 4:00 PM Eastern and index options expire at 4:15 PM Eastern. All timestamps use US Eastern Time (America/New_York). See [Response Timezone](/docs/api/dates-and-times#response-timezone) for details.
The option's expiration date and time. Equity options and PM-settled index options (such as SPXW) expire at 4:00 PM Eastern. AM-settled index options (such as the monthly SPX) carry 9:30 AM Eastern on the expiration date, the time of the opening settlement. All timestamps use US Eastern Time (America/New_York). See [Response Timezone](/docs/api/dates-and-times#response-timezone) for details.

- **side** `array[string]`

Expand Down
2 changes: 1 addition & 1 deletion api/options/quotes.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,7 @@ foreach (var quote in (await client.Options.GetQuoteAsync("AAPL271217C00250000")

- **expiration** `array[number]`

The option's expiration date and time. Equity options expire at 4:00 PM Eastern and index options expire at 4:15 PM Eastern. All timestamps use US Eastern Time (America/New_York). See [Response Timezone](/docs/api/dates-and-times#response-timezone) for details.
The option's expiration date and time. Equity options and PM-settled index options (such as SPXW) expire at 4:00 PM Eastern. AM-settled index options (such as the monthly SPX) carry 9:30 AM Eastern on the expiration date, the time of the opening settlement. All timestamps use US Eastern Time (America/New_York). See [Response Timezone](/docs/api/dates-and-times#response-timezone) for details.

- **side** `array[string]`

Expand Down
4 changes: 2 additions & 2 deletions api/troubleshooting/bad-request.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -83,12 +83,12 @@ You may receive:
Meaning:

- Request can be otherwise valid
- `date` was used in a current-data context
- `date` was used in a current-data context, such as today's date while the market is open

How to fix:

1. For current data: omit `date`
2. For historical data: provide a past trading date
2. For historical data: provide a past trading date, or today's date after the market closes

```http
# Current request (correct): no date parameter
Expand Down
7 changes: 4 additions & 3 deletions internal/byok-audit-prompt.md
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ or UNRESOLVED.

| ID | The rule |
|----|----------|
| E1 | Every request carries a unique `User-Agent` that names the application and its version. A library default such as `axios/1.6.0`, `python-requests/2.31.0`, or `okhttp/4.12.0` fails this rule. |
| E1 | Every request identifies the application and its version, in one of two ways. The first is the header `X-MarketData-Client: <app>/<version>`, where `<app>` is lowercase letters, digits, `.`, `_`, or `-`, at most 64 characters, and `<version>` is at most 32 characters. A browser application must use this header, because Chrome and Safari drop a `User-Agent` set from JavaScript. The second is for a native application only (desktop, mobile, a CLI with no server, a platform plugin): a `User-Agent` that names the application and its version. A native application may use either one. A library default such as `axios/1.6.0`, `python-requests/2.31.0`, or `okhttp/4.12.0` with no `X-MarketData-Client` header fails this rule. So does a header whose app name is generic or is not the application's own, such as `app`, `test`, `sheets`, or a language name. The header identifies the application for attribution only. It grants no access, no credits, and no exemption from any control. An application that relies on it for anything else is wrong. |
| E2 | Option chain requests use `mode=cached` unless the use case needs live data. A live chain costs one credit per contract; a cached chain costs one credit. Cached mode is available only on paid plans that are not trials. Free Forever and every trial (Starter Trial, Trader Trial, Prime Trial) get a `402` for `mode=cached`, so on a `402` the application repeats the request without `mode`. |
| E3 | Polling intervals fit a credit budget. A free key holds 100 credits a day. State the worst-case daily credit spend you can derive from the code. |
| E4 | The application handles `429`, `402`, and `403` with a message to the user. A `403` is the single-IP control. The block expires five minutes after the IP switch; further requests during the block do not extend it. |
Expand Down Expand Up @@ -256,6 +256,7 @@ Bearer # authorization headers
/v1/options/chain # and the other endpoints
mode=cached
User-Agent
X-MarketData-Client
```

Then search the repository's own vocabulary for each rule group: the name of
Expand Down Expand Up @@ -344,6 +345,6 @@ outside its reach, and the report should not be read as covering them:
hosting dashboard leaves no file to find.
- **A binary or closed dependency.** The prompt records these as unresolved
rather than clearing them.
- **Live request behaviour.** Our own API logs answer this. A `User-Agent` in
the code and a `User-Agent` on the wire are two claims.
- **Live request behaviour.** Our own API logs answer this. An identifying header
in the code and the same header on the wire are two claims.
- **Whether the developer follows the report.** A GO is a verdict on a commit.
2 changes: 1 addition & 1 deletion sheets/dates-and-times.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ Relative dates allow Market Data formulas to continually modify the date sent to

- `yesterday` Yesterday's date. The same as Sheets formula `today()-1`.

- `last session` Returns the date of the last closed market session. This keyphrase always gets the previous closed session, accounting for weekends, holidays, and half-days (which are counted as valid sessions). For example, on Monday during market hours, it would return Friday's date. After market close on Monday, it would return Monday's date. This allows you to always track the previous session without having to account for weekends, holidays, or other market closures.
- `last session` Returns the date of the last closed market session. This keyphrase always gets the previous closed session, accounting for weekends, holidays, and half-days (which are counted as valid sessions). For example, on Monday during market hours, it would return Friday's date. After market close on Monday, it would return Monday's date. This allows you to always track the previous session without having to account for weekends, holidays, or other market closures. The date is the same on every plan. On a plan that provides only Historical options data, an options session becomes Historical at the next session's open (see [Data Freshness](/account/data-freshness)), so between the close and the next open an options request for `last session` returns a 402 error.

- `-[number] days` Use negative days to specify a time in the past _n_ days before. When this is used alone, it is relative to the current day. When used in conjunction in `from` field (i.e. the starting date), it is relative to the `to` field (i.e. the ending date). For example, if the current date is January 20, but January 10 is used in the `to` field and `-5 days` in the `from` field, then the starting day will be January 5. The query would return values from January 5 to January 10. However, if the `to` field were to be omitted, then the same query would return data from January 15 to January 20 since `-5 days` would be relative to the current date of January 20.

Expand Down
6 changes: 3 additions & 3 deletions sheets/options/optionchain.md
Original file line number Diff line number Diff line change
Expand Up @@ -87,8 +87,8 @@ Fetches a current option chain, or the end-of-day option chain of a past trading
- _(omitted)_ or "current" - The current chain, the same as a formula without this parameter.
- "date" - A single date in YYYY-MM-DD or MM/DD/YYYY format enclosed between quotes.
- \[date cell reference] - A cell reference to a date in Sheets.
- "last session" - The most recent trading day whose end-of-day chain has been published.
- "yesterday", "today" - The calendar day before today, or today. On a weekend or holiday these return an error, so "last session" is usually the better choice.
- "last session" - The last closed market session. See [Relative Dates and Times](/sheets/dates-and-times#relative-dates-and-times).
- "yesterday" - The calendar day before today. If that day was a weekend or a market holiday, the formula returns an error, so "last session" is usually the better choice.
- An empty cell or `""` returns an error, not the current chain. To switch a sheet between current and historical chains with one cell, write "current" in it.

## Usage Information
Expand All @@ -112,7 +112,7 @@ With an **as of** date, `OPTIONCHAIN` returns the chain as it closed on that tra
- Only end-of-day chains are available. There are no intraday snapshots, and only one date per formula.
- The columns are the same as for a current chain. Implied volatility and the greeks (delta, gamma, theta, vega) are blank, and selecting strikes by delta is not available.
- Open interest is the figure settled out of the previous session, as described under the "open interest" attribute.
- A date in the future, a weekend or a market holiday returns an error. Today's chain returns a "not available yet" error until the end-of-day chain is published after the close.
- A date in the future, a weekend or a market holiday returns an error, and so does today's date while the market is open. After the close, today's chain is available as soon as its end-of-day data is published; until then the formula returns a "not available yet" error.
- A relative date such as "last session" is resolved when the formula calculates. It updates when the sheet is refreshed or a referenced cell changes, not on its own as days pass.
- Historical data is subject to your plan's limits. [Learn more about plan limits](/account/plan-limits).

Expand Down
3 changes: 2 additions & 1 deletion sheets/options/optiondata.md
Original file line number Diff line number Diff line change
Expand Up @@ -100,11 +100,12 @@ A single `OPTIONDATA` formula can fetch quotes for many option contracts at once

- One row comes back for each contract, in the same order as your cells, even when the range is a row. Wrap the formula in `TRANSPOSE()` to lay the results out horizontally.
- A contract that cannot be served (not found, expired, or misspelled) keeps its place, so the results stay aligned with your contracts. Its row shows what you entered in the symbol column, with the other columns blank, so you can spot it. Request the `symbol` attribute to see it; without it the row is blank.
- If none of the contracts can be served, the formula returns an error instead of blank rows.
- Use a single historical date (start date only). Date ranges are not supported with more than one contract.
- A range must be a single row, a single column, or a table of exactly four columns. Any other table, such as three or five columns, returns an error.
- A row of four cells can describe one contract in parts: underlying, expiration date, strike and side (for example, `AAPL | 12/17/2027 | 250 | call`). On its own, a row like that is read as a single contract, so it also accepts a date range.
- With more than one contract the results include a header row. Add `noheaders` to the attributes to line the results up with your cells.
- For best results use OCC symbols, or a table with dates in `YYYY-MM-DD` format and numeric strikes. Contracts written in words are slower to read, and a long list of them may fill in over a few refreshes.
- For best results use OCC symbols, or a table with date cells (or dates in `YYYY-MM-DD` format) and numeric strikes. Contracts written in words are slower to read, and a long list of them may fill in over a few refreshes.

#### Tables of Contracts

Expand Down
2 changes: 1 addition & 1 deletion sheets/universal-attributes/no-headers.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,6 @@ Add `noheaders` anywhere in the attribute list of any Market Data formula. Ensur

:::info

The `noheaders` attribute is needed whenever the output has more than one row or column: several attributes, several symbols or contracts, or a date range. A single attribute for a single symbol and date returns one cell with no header.
The `noheaders` attribute is needed whenever the output has more than one row or column: several attributes, several symbols or contracts, or a date range. A single attribute for a single symbol and date returns one cell with no header. `OPTIONCHAIN` with a single attribute returns one column with no header row.

:::
Loading