Repository navigation
docs(internal): correct BYOK prompt against the API (#222), and E1 for browser apps (api#532) - #223
Merged
Merged
Conversation
E2 kept cached mode as the recommendation and never said it is paid-only. Free Forever and every trial get a 402 for mode=cached, so an app that followed E2 literally broke for exactly the users F1 tells it to onboard. It now says to repeat the request without mode on a 402. E4 said the 403 clears after five minutes with no requests. The block expires five minutes after the IP switch, and requests during it do not extend it. F3 said a missing entitlement raises no error. That holds with no mode, and on paid plans, which are downgraded silently. On Free and trial keys an explicit mode=live/delayed/eod is a 402, and so is a date older than the plan allows. The historical case applied the options cutoff to everything. It now states the stock (4:15:01 PM ET) and option (9:30:01 AM ET next open) cutoffs separately, matching account/data-freshness.md, and the 06:00 ET example is about options. The fee-liability wording is unchanged; a TODO asks compliance whether the stock cutoff is also the fee boundary. Prime Trial joins the cached-mode exclusion in api/rate-limiting.md and account/plan-limits.md. Fixes #222
… send E1 required a unique User-Agent. Chrome and Safari drop a User-Agent set from JavaScript, so every browser app failed a P2 it had no way to fix. E1 now accepts the X-MarketData-Client: <app>/<version> header, and requires it of a browser app. A native app may send either the header or a User-Agent that names it. A library default with no header still fails, and so does a header whose app name is generic or not the app's own. The header is attribution only: it grants no access, credits, or exemption. X-MarketData-Client joins the search seeds, and the page's note on live request behaviour no longer names User-Agent alone. Do not merge before MarketData-App/api#532 deploys: until then the CORS preflight rejects the header and a browser request that sends it fails. Refs MarketData-App/api#532
MarketDataApp
marked this pull request as draft
October 13, 2026 17:16
…s needed OPTIONDATA now quotes a range of contracts in one formula (one row per cell, blank rows for contracts it cannot serve, single date only, no tables); the noheaders note said one attribute never has a header, which is false for several symbols or a date range, and the samples used STOCKQUOTE, which no longer exists.
…AIN as of quote date OPTIONDATA now accepts a table of exactly four columns, one contract per row in the order the first row sets, and a failed contract shows what was entered in the symbol column instead of a blank row (MarketData-App/api#550); OPTIONCHAIN gains a sixth argument for one past session's end-of-day chain, with omitted meaning current, a blank meaning an error, DTE counted from the quote date and no delta or greeks on a historical chain (MarketData-App/sheets#82)
…ormulas, the 52-week columns for STOCKDATA, and the contract fields of options/quotes OPTIONDATA now documents underlying, expiration, side, strike, first traded and dte as OPTIONCHAIN does, and OPTIONCHAIN gains dte, counted from today or from the quote date on a historical request; STOCKDATA's quote attributes gain 52weekHigh, 52weekLow and 52week, with all noted as leaving them out unless written all,52week; the public options/quotes page lists the six contract fields the endpoint returns after optionSymbol, worded as on options/chain (MarketData-App/sheets#94)
…PTIONDATA and noheaders details OPTIONCHAIN refuses today's date on a trading day even after the close (api sheets/handlers.py:421), so "today" is dropped, as the add-on's own README and JSDoc already leave it out. "last session" now points at the one definition on the dates-and-times page instead of describing a third reading; MarketData-App/api#576 makes that definition universal. OPTIONDATA: a range where nothing resolves is an error, not blank rows, and date cells work in a table as well as YYYY-MM-DD text. noheaders: OPTIONCHAIN prints no header over a single column.
docs(sheets): OPTIONDATA ranges and tables, OPTIONCHAIN quote date, contract and 52-week columns, and when noheaders is needed
…s data is readable after the close Ahead of MarketData-App/api#576. `last session` names the newest closed session for every endpoint and plan, as these pages already said; what changes is that a plan with only Historical options data now gets a 402 between the close and the next open instead of an older session, so both dates-and-times pages say so and point at Data Freshness. The shared handler serves today's closed session from the end-of-day snapshot, so today's date is refused only while the market is open: the OPTIONCHAIN page and Case 4 of the 400 troubleshooting page say that now.
…ed quarterly The plan now starts at $333/month and steps to $666 in months 7-12 and $999 from month 13, billed as $999, $1,998 and $2,997 a quarter, with a 14-day free trial. It lists real-time derived stock and options prices over REST and WebSocket, 15-minute delayed CBOE data, end-of-day, historical and tick-level data, US fundamentals, MCP access, and its rate limits. SmartMid, our API limits, the T+1 text and the links to the Commercial Use Addendum are gone, the addendum being withdrawn. Redistribution follows the plan's licence: display in your own product, no resale of the raw data. The comparison table shows only what the plan adds. Every purchase link goes to the contact form. The page is no longer unlisted or noindex, sits after Prime in the sidebar, and so appears on the plans index and in the sitemap. Its description is cut to 153 characters for lint:seo, and removing the <Head> block also stops it printing as text in the Markdown twin. Two comments that called the page noindex are corrected.
…t business use at it The Commercial Plan page now opens on its advantage: real-time, delayed, historical and tick-level data and the commercial licence for one price, with no exchange agreements, exchange fees or per-user fees, and no IP limit. A "No Exchange Licensing, No Extra Fees" section says why that matters; the feature list is grouped into data, rights, and tools and limits; "What You Can Build" lists only what the plan permits; the comparison table gains Multiple IP Addresses. The "Not Suitable for Trading" warning and the list of what the plan forbids are gone. A closing "Need More?" sends dedicated exchange feeds, API distribution and resale rights to the contact form as enterprise licensing. The pages that told a business user to "contact sales" for a commercial or exchange licence now name the Commercial Plan instead: the data redistribution, professional status and single-IP policies, the classification dispute and self-employed guides, CORS, and the multiple-environments option of the 403 multiple-IP guide. Enterprise licensing keeps the contact form. Fixes "varity" on Data Plans.
The list is a plain bulleted list again; the check marks stay only in the comparison table, where they compare plans.
…doc page src/theme/DocItem/Paginator was the 3.0.1 file with no change of ours. Upstream 3.10 gives the paginator `className="docusaurus-mt-lg"` (3rem); the fork did not, so the cards sat directly under the article. The tag footer used to carry the same margin, and since the tags were retired it renders on no page, so every one of the 263 pages with cards showed a 0px gap. Deleting the swizzle restores upstream: 48px, measured in a browser on two pages of a local build.
…me feeds omit it The API is not a set of feeds, and the sentence was the only place in the SDK docs that said so.
This was referenced Oct 23, 2026
Three pages said "index options expire at 4:15 PM Eastern". No contract the API returns carries 4:15 PM. Measured 2026-10-26 on /v1/options/chain/: - PM-settled index options (SPXW, NDXP, RUTW, XSP) carry 16:00 ET, and so do equity options (AAPL). - AM-settled monthlies (SPX, NDX, RUT, VIX) carry 09:30 ET on the expiration date, the time of the opening settlement. Cboe's SPX specification agrees: "Trading in SPXW options will ordinarily cease on the day of expiration, 4:00 pm ET", and SPX options cease "on the business day (usually a Thursday) preceding" expiration. 4:15 PM is the end of the regular session for non-expiring index options, not an expiration time. A customer asked which time applies; the docs were the only source that disagreed with the API. VIXW is left out on purpose: the API stamps it 16:00 although Cboe settles VIX and VIXW on the Special Opening Quotation. That is an API question.
…the same work PR #223 (staging -> main) was DIRTY. #227 and #228 had carried most of staging into main as new commits, so the same changes met twice. By content (git cherry), staging had four commits main lacked (a923ba2, 8a8f150, d20c110, aa146bc) and main had one change staging lacked: sync-sdk-docs.yml (#217, #218). The five conflicting files take staging's side, which is main's text plus those four commits. Verified before committing: this tree differs from staging only in sync-sdk-docs.yml, and from main only in the four commits' files.
MarketDataApp
marked this pull request as ready for review
October 26, 2026 18:01
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Warning
Draft: do not merge until MarketData-App/api#532 is deployed. The new E1 tells browser apps to send
X-MarketData-Client. Until api#532 ships, the API's CORS preflight rejects that header, and a browser request that sends it fails. The #222 fixes below have no such dependency.Fixes #222
Refs MarketData-App/api#532
What changed
internal/byok-audit-prompt.md, inside the prompt block:mode=cachedstays the recommendation. It now says cached mode is only on paid plans that are not trials. Free Forever and every trial (Starter Trial, Trader Trial, Prime Trial) get a402, so the app repeats the request withoutmodeon a402.403block expires five minutes after the IP switch; further requests during the block do not extend it.mode, and on paid plans (silently downgraded). On Free and trial keys, an explicitmode=live,delayedoreodreturns402"Feed not available for your plan.", as does a date older than the plan allows. The app omitsmodeunless needed and handles the402.account/data-freshness.md. The 06:00 ET example is now about options.Also: Prime Trial added to the cached-mode exclusion in
api/rate-limiting.mdandaccount/plan-limits.md.E1 for browser apps (MarketData-App/api#532)
X-MarketData-Client: <app>/<version>(<app>: lowercase letters, digits,.,_,-, at most 64;<version>: at most 32). Browser apps must use the header, because Chrome and Safari drop aUser-Agentset from JavaScript. Native apps may use the header or aUser-Agentthat names the app and its version. A library default with no header fails, and so does a generic or borrowed app name (app,test,sheets, a language name). Still P2.X-MarketData-Clientadded underUser-Agent.User-Agentalone.application=query parameter is not mentioned.Left open on purpose
The fee-liability wording is unchanged. An MDX comment above the prompt block (hidden from the page and from the Markdown twin) asks compliance to confirm whether the 4:15 PM stock cutoff is also the exchange redistribution-fee boundary. Until then, the prompt's "no fee for historical data" sentence implies stocks are fee-free from 4:15:01 PM ET.
Verification
pnpm run build,pnpm run lint:links(strict),pnpm run lint:contract: passpnpm run test:lib: 243/243;pnpm run test:scriptson aPROD=truebuild: 124/124build/internal/byok-audit-prompt/index.htmlnor its.mdtwin