- POST /analyze-strategy: a calendar's probability of profit is the chance, at the front expiration, of finishing where the position makes money. It used the first leg's days to expiry and ignored the back month, so an AAPL 300 put calendar read 93.9% with spot outside both breakevens, and the answer changed with leg order. max_loss values the back leg at no less than intrinsic, so a long calendar's worst case is its debit (it read -$295 on a $145 debit). Single-expiry strategies are unchanged.
- GET /market-overview merges the live index levels into index_prices, as the Terminal does. It returned the feed's stub, so at the close on Friday 16 October it would have said VIX 16.46 and every index 0% on the day, when the VIX closed at 19.99 and SPX was down 1.1%.
- GET /economic-calendar: datetime is ISO 8601 with its offset (2026-10-21T08:30:00-04:00), and each event carries timezone: America/New_York. Times were already US Eastern but went out as RFC 1123 text ending in GMT, so an 8:30 AM ET release read as 08:30 GMT.
- GET /search: supported is true whenever anything matches, since every result is in coverage, and a new best_match names the symbol. A search for nvidia found NVDA and still answered supported: false, because only an exact symbol counted. The MCP summary says exact match, best match or not covered.
- GET /relative-value-scan (view=mean_reversion, the default): the z-score universe needs 500 or more option contracts a day and a today-to-one-year IV/SPY ratio between 0.25 and 4. The scan led with names trading 0 to 50 contracts a day and z-scores up to 26, driven by a few bad one-year averages in the feed; the top names now trade 500 to 7,400 contracts a day. sector is null, not the string "Null", when the feed has none.
- GET /relative-value/{ticker}: slope_pctile reads the feed's slopepctile field. It read slopePctile, which no row carries, so it was always null.
- GET /zero-dte/{ticker}: vol_context.hv_30d is null. It read a 30-day close-to-close field the feed does not have (its windows are 5, 10, 20, 60 trading days and longer), so it was always 0.
- Hosted connector: tool descriptions describe what a tool returns instead of instructing the assistant, following the Claude directory guidance. This covers the four positions tools, get_options_chain's strike window, help and get_options_flow.
- API
- What changed,
Changelog
What changed,
and when.
One entry per API version, newest first. Response shapes only gain fields inside a version; anything renamed or removed gets a new version and an entry here first.
- GET /screen prices each row from the live quote. It used the feed's prior close, so SNOW read 343.40 while it traded at 368.09.
- Hosted connector: the failure budget on MCP calls and POST /oauth/token counts only credentials we never issued. A revoked or expired real token no longer counts toward it, because every hosted-connector call arrives from the same address. GET /oauth/authorize is limited to 30 requests a minute per IP.
- Docs: /docs/api is the API page, with a real request and response. The AI assistant material moved to /mcp, which shows answers captured from the tools, and the site menu has separate AI and API links.
- Next earnings dates could be the furthest scheduled report instead of the nearest, because the earnings calendar lists newest first, so TSLA, RIVN and DOW read February 2027. Fixed in GET /stock's next_earnings fallback, GET /price-context and the earnings verdict.
- MCP: every tool sets readOnlyHint: true, destructiveHint: false and openWorldHint: true explicitly.
- Docs: getting started, the Claude client page and the API panels on /account and in the Terminal open ApexVol's listing in Claude's connector directory first. Pasting https://apexvol.com/mcp-server stays the route for other assistants and for setting it up by hand.
- POST /pop and POST /analyze-strategy: debit verticals are priced off their breakeven. A long call below the short call, or a long put above the short put, went down the credit-spread branch, so an AAPL 340/350 call spread read 68% instead of about 43%.
- POST /build-strategy uses the expiration you send. It was swapped for the listing nearest 30 days. A date that is not listed is a 400 naming the next listed ones.
- GET /zero-dte/{ticker}: a mispricing leg needs a value of at least $0.05, and an unusable out-of-the-money side no longer falls back to the in-the-money one. The live feed quotes bid equal to ask equal to theoretical value, so penny wings passed the old has-a-bid test: SPY listed strikes at 100 to 175% IV, all overpriced, and the verdict read IV_RICH. Rows echo call and put IV only when the leg passed, so the feed's 1000.0 cap no longer prints.
- GET /flow/{ticker} and GET /smart-money/{ticker}: when live per-contract volume is not reported, the answer is built from the previous session's end-of-day file and marked data_freshness: PREVIOUS_SESSION with its trade_date. A 503 now means both are empty. Smart money adds total_premium, call_premium, put_premium and sentiment, and the MCP summary reads them.
- MCP positions tools: the descriptions say Greeks are per share. Their example was 100 times too large.
- GET /economic-calendar: from_date to to_date is capped at 62 days. A missing, unparseable or out-of-window date (before 2000, or more than five years out) falls back to the default span, today plus 14 days. from_date=0001-01-01 used to return a 500.
- Deleting an account revokes every API token on it, including tokens made by hand, not only connector grants.
- Hosted connector: a malformed authorize request redirects only to a trusted callback (claude.ai, claude.com, chatgpt.com, loopback and listed app callbacks). Anything else gets the error page, with a link back that still carries the error.
- Hosted connector: Cursor's app callback, cursor://anysphere.cursor-mcp/oauth/callback, is accepted.
- Hosted connector: when an account cannot approve a connection, the page says which case it is: no plan (with a trial that returns to the consent step), a lapsed plan, a failed payment (fix the card, no second checkout) or API access not enabled. Signing in, Google included, and signing up keep the authorize link, so the connection finishes where it started.
- Docs: every first question and first call in the client pages, the account console, the curl examples, the onboarding emails and the llms files works on Basic. The connector URL has copy buttons on /account#api and the Terminal's API tab.
- GET /iv-rank/{ticker}, GET /batch/iv-rank and the endpoints built on them: an IV under 10 or a rank under 1 is no longer multiplied by 100. The feed's iv is already in percentage points, so HYG read 593.7 for 5.94 and IEF 761 for 7.61, and GET /iv-opportunities flagged both IV_TOO_HIGH. 59 names were under 10 that day, mostly bond, TIPS, muni and currency ETFs, plus JEPI and SPYI.
- GET /earnings-verdict timing.expected_move_pct and GET /iv-crush expected_move are the whole at-the-money straddle. They used 0.85 times it, which matched neither the docs (the straddle is the average move, and one standard deviation is about 1.25 times it) nor GET /expected-move. AAPL went from 5.19% to 6.11%.
- Market-wide endpoints drop the feed's constituent-basket rows (SPY_C, XLF_C and 33 others). They carry real sectors and caps, so GET /screen let 17 through, XLF_C at $314 in high_vrp among them. Class shares (_A, _B) stay.
- GET /vix: the level and session range come from Cboe's delayed quote, about 15 minutes behind, which matches the published index, with Yahoo as the fallback. Prior close, percentile, rank and history come from ORATS daily closes, which matched Cboe's history on 252 of 252 days. The feed's own live VIX ran 0.13 to 0.15 under the index, and Yahoo had printed a bad close (20.37 for 17.76 on 6 February).
- GET /correlation/{ticker}, GET /correlation/{ticker}/compare/{ticker2}, GET /price-context and GET /relative-value: one-month (21-day) and one-year (252-day) correlations to SPY and the best ETF are computed from daily returns. They were the feed's correlSpy and correlEtf fields, which are not price-return correlations and stayed positive where returns were negative (KO one-year +0.52 against -0.17 from returns; QQQ 0.68 against 0.93). The feed's beta fields do match a returns beta and stay.
- GET /api/correlation/scan, the decorrelation scanner, is paused and returns an error until it is rebuilt on correlations from daily returns.
- Live since 16 September and missing from the 1.20 notes: an expiration= the feed does not list for the symbol is a 400 naming the available ones, with available_expirations, instead of a 424 upstream error. POST /analyze-strategy rejects a leg without a YYYY-MM-DD expiration up front.
- POST /analyze-strategy prices legs you leave unpriced. A leg without a premium takes the chain's theoretical mid, Greeks and IV; a leg without an expiration takes the body's expiration, else the listing nearest 30 days. Before this the MCP tool analyze_strategy failed on every call. Breakevens are now exact rather than read off a 100-point grid (an iron condor's upper breakeven was 0.84 off).
- GET /vol-arb-scan: a butterfly's max profit is the wing-to-body distance less its cost. It used the full span, which doubled every published max profit and return. edge_pct (the "potential return") is now max profit over cost; it subtracted the cost a second time.
- GET /greeks-heatmap takes greek= (delta, gamma, theta, vega, rho, vanna, charm, iv). It used to answer delta whatever was asked.
- GET /term-structure takes spacing=curve: the three nearest listings, then those nearest 1, 2, 3, 6 and 12 months. The default stays nearest.
- POST /hedge-recommendations sizes the hedge in shares of hedge_ticker: each name's delta in dollars, scaled by its 1-year beta over the hedge's. It used to hedge share for share, so 152 NVDA deltas became 152 SPY shares. New fields share_delta, delta_units, weighting, weighting_basis and projected_delta. current_delta changes meaning: it is now in hedge_ticker shares, and the unweighted share delta it used to carry is share_delta.
- Class shares resolve: BRK.B, BRK/B, BRK-B and BRKB all reach BRK_B, the feed's spelling. A batch with one symbol outside coverage now answers the rest and lists that symbol under errors, instead of a 404 for the whole call.
- GET /stock adds beta_1y and market_cap_usd as numbers and next_earnings, which falls back to the earnings calendar when the feed has no date.
- A 403 upgrade_required now says the answer is the same for every ticker and carries retryable: false. MCP tool descriptions name the plan each tool needs.
- Compact detail (the default for the MCP clients, ?detail=compact for anyone) now trims greeks-exposure, cross-index-gex, market-overview, economic-calendar, hv-regimes, borrow-rate, charm, third-order-greeks, greeks-heatmap and chain-at-time. Each trimmed answer says what it left out under compact. Raw REST callers still get the full payload.
- MCP client 0.1.5: summaries for the earnings calendar, earnings history, screen, market overview, economic calendar, cross-index GEX, vol-arb scan and VIX read the fields the server sends (they printed zeros and N/A); analyze_strategy takes an expiration and legs like "SELL 2 P 140 2026-10-16 @3.20"; get_term_structure asks for the curve.
- Batch endpoints: GET /batch/iv-rank, /batch/gex and /batch/expected-move take tickers= with up to 25 symbols and return the single endpoint's payload per symbol under results, failures per symbol under errors. One rate-limit unit per call; the monthly allowance is still spent per symbol. In the MCP client (0.1.4), get_iv_rank, get_gex and calculate_expected_move take the same tickers argument.
- GET /me/usage: the caller's own meter. Data requests used, the plan's allowance, remaining and the reset time, the live rate-limit position, calls per endpoint this month with docs links, active tokens, and the unknown paths this token hit in the last seven days. No data cost, any paid plan. The account page shows the same per-endpoint table.
- Retry-After on a 429 is now the seconds left in the window that tripped (minute or hour), and on the monthly allowance the seconds to the first of next month. The budget error body links /me/usage.
- Allowance emails: one mail at 80 percent of the month's allowance and one at 100 percent, once each per month, with the batch endpoints and /me/usage as the ways to make it go further. The allowance is now read per plan (every plan keeps 10,000 data requests until the per-plan numbers are set).
- OpenAPI: components.schemas inferred from every captured sample, a tag per data family, and 400, 404 and 424 documented on every operation. Endpoint count 60 to 64.
- MCP client 0.1.4: tickers on get_iv_rank, get_gex and calculate_expected_move; strikes_around and detail on get_gex and get_zero_dte; limit and detail on get_options_flow. The help tool and the prompt picker entries from 1.18 ship in this release, now 41 prompts: 33 starters plus one per recipe.
- MCP: a help tool. help() returns the families, counts and how to ask; help("get_iv_rank"), help("gex") or help("/iv-rank/{ticker}") return the tool, family or endpoint record (question, parameters, units, basis, fields, plan, prompts, docs URL); any other words run a search. It reads a copy of the API reference bundled with the package, so it costs no request and works before a token is set. Tool count 43 to 44.
- MCP: 33 prompt starters, three per data family, in the client prompt picker (Claude Desktop, Cursor, VS Code). Each carries the ticker as an argument with a real default, names the tools that answer it and links the family page. Same wording as the prompt library at /mcp/prompts.
- Hosted connector: /mcp-health reports the prompt count next to the tool count.
- GET /api/mcp/data/ (token required) lists every endpoint with its method, path, plan, parameters, docs page and a working example request, plus the family list and links to the OpenAPI spec and the Markdown reference. No market-data cost.
- Unknown paths under /api/mcp/data: each did_you_mean entry is now {path, docs, example} instead of a bare path, and the body names the index URL.
- Every /api/mcp/data response carries a Link header, rel=describedby, pointing at the endpoint's developer page. Present on 401, 403 and 429 responses as well.
- Signal strings on zero-dte (iv_forecast.signal), earnings-verdict (the wing signals), screen (preset descriptions) and price-context (essentials_summary) drop the vendor name and typographic dashes. The docs samples already showed this wording; the live responses now match them.
- Every endpoint's response sample is now a real captured payload (8 September 2026), shared with the endpoint records behind the developer pages; the note above each sample says which request produced it. Regenerated weekly.
- Markdown twins of the developer docs: GET /developers/<family>.md and /developers/<family>/<endpoint>.md, and /llms-full.txt for the whole reference.
- Access wording corrected: tokens are issued to any paid or trial plan from Basic; each endpoint follows the same tier as the web app.
- Compact payloads for LLM consumers (GET /gex, GET /zero-dte, GET /flow). When the caller is the apexvol-mcp package or the hosted connector (X-ApexVol-Client header present) the strike lists are trimmed to the strikes around spot (gex 25 per side over gex_by_strike and gex_profile; zero-dte 15 per side over by_strike and chain_table) and flow rows are capped (all_flow 25, largest_flows and unusual_activity 10). Raw REST callers keep full payloads. ?detail=compact|full overrides either way; ?strikes_around= and ?limit= size the window. Every response carries a window block saying what was trimmed (rows_total, rows_returned, truncated). Scalars, key_levels, implications and summary blocks are never trimmed. Before: 148 KB (zero-dte), 89 KB (gex), 68 KB (flow) per call, about 37k, 22k and 17k tokens.
- One realized-vol estimator: every realized figure is the standard deviation of close-to-close log returns over exactly N sessions, annualised by the square root of 252, in percentage points, and payloads say so (hv_basis). GET /vrp/<ticker> had taken the std over every row that 60 calendar days returned (about 42), so its 30-day figure sat 12 points from the exact-window figure on PLTR and TSLA (4 Sep); it now matches /volatility-cone 30d and /vrp/<ticker>/timeseries current.hv, and carries hv_window.
- One IV per family, labelled (iv_basis). GET /vrp/<ticker> and the mispricing components quote the vendor's 30-day constant-maturity iv30d, the same series /vrp/<ticker>/timeseries plots and the terminal's IV chip reads; the IV-rank series ran 0.2 to 1.3 points higher on every name checked. GET /iv-rank/<ticker> stays on its own series (its rank and 52-week range are computed on it) and adds iv30d so the two can be reconciled. GET /volatility-cone/<ticker> labels its per-tenor chain-interpolated IVs and adds iv30d.
- GET /iv-rank/<ticker>: iv_percentile is now the platform percentile (cores ivPctile1y, the figure the terminal shows) and equals iv_percentile_1y; iv_percentile_source names the series. It used to quote the IV-rank series' own one-year percentile beside a different one-year percentile (AAPL 61.9 and 69 in one payload).
- Earnings awareness: GET /vrp/<ticker> and GET /volatility-cone/<ticker> carry earnings_in_window and an ex-earnings realized figure (realized_volatility_ex_earnings / volatility_risk_premium_ex_earnings on VRP; rv_ex_earnings per tenor and realized_vol_30d_ex_earnings on the cone) computed with the earnings-reaction session dropped, so a window that contains a report no longer reads as a rich or cheap verdict without saying why.
- GET /hv-regimes/<ticker>?view=ex_earnings (basis hv, the default) works again. It asked the feed for a 30-day ex-earnings realized series that no feed carries (the live row has the pair only at 5 to 120 days, the history export has none), so it failed for every ticker. Both series are now computed from the daily closes with the platform's realized-vol estimator: regular is the last 30 close-to-close returns, ex-earnings the last 30 that are not an earnings-reaction session (tenor: 30d, source, hv_basis, reaction_sessions_excluded).
- Mispricing assessment (GET /mispricing-assessment, the MCP earnings analysis default): components.vrp and components.realized_vol were always 0 because the endpoint read keys the VRP provider never returned. Fixed; the VRP term (40% of mispricing_score) contributes again and the signal moves with it.
- Upstream failures answer HTTP 424 instead of 502, same body ({success: false, error, upstream: true}). Cloudflare replaces an origin 502 with a plain-text page, so from 18 July to 6 September no client ever received the explanation (no two-sided quote to price, a history the feed does not carry); the MCP client printed Server error. 424 passes through unchanged. The options-flow 503 (dead volume feed) is not affected.
- Unknown paths under /api/mcp/data answer {error: 'No endpoint at ...', did_you_mean: [...], docs, endpoint_count} instead of a bare Not found.
- Bounded parameters: lookback_days, num_expirations, periods, days, days_ahead, num_quarters, quarters, years, days_before/after, hv_period, max_expirations, exclude_earnings_days and strikes_around are clamped to documented ranges; a value that is not a whole number answers 400 with a plain message instead of a Python error string.
- Service note from 18 July removed: options flow is serving again (end-of-day figures while the market is closed).
- Documented GET /api/event/earnings-breakevens (session surface).
- Guides: plans, authentication, errors and rate limits now describe per-plan access (every paid plan since 4 August, each endpoint at its web feature tier) and the monthly allowance unit (upstream data requests, not calls; one call can spend more than one). New rows for 424 and 503 and the www. redirect trap.
- GET /stock/<ticker> carries company_name (from the coverage registry) so clients stop printing the ticker twice; it never carried bid/ask, and the 0.1.3 client no longer prints $0.00 for them.
- GET /options-by-delta/<ticker> declares iv_units: decimal and adds iv_pct (percentage points) beside the unchanged decimal iv.
- apexvol-mcp 0.1.3: the flow, GEX and stock-price summaries read the keys the server sends (0.1.0 to 0.1.2 printed zero volume, a $0.00 gamma flip and N/A walls above correct data); the client version header reports the installed version (it was pinned at 0.1.0).
- Earnings move basis: the data feed's impliedEarningsMove is a one-sigma figure, and every place that set it against a realized average (a mean absolute move, about 0.8 sigma) read roughly 25% rich. Every implied earnings move the API publishes is now the expected absolute move, 0.8 x the vendor figure, with the raw sigma beside it: implied_move / implied_move_sigma and move_ratio on the earnings calendar (rows carry implied_move_basis: expected_abs_move; the MCP earnings calendar follows); implied_move_pct / implied_move_sigma_pct on /api/event/earnings-from-cores; implied_move_model_pct / implied_move_model_sigma_pct on /api/event/earnings-verdict and current.implied_move_model_pct on /api/earnings-straddle/<ticker>, whose vendor-model fallback for implied_move_pct converts too; implied_earnings_move / implied_earnings_move_sigma in /api/main_data cores_extras, /api/iv-dashboard/init, the /api/expected-move orats_expected_move block, /api/price-context, the /api/zero-dte vol context and the /api/vol-term earnings block (which had been empty: it read a column the feed no longer fills); implied_earn_move / implied_earn_move_sigma on /api/iv-shift; implied_move / implied_move_sigma on /api/relative-value; imp_earn_move / imp_earn_move_sigma on the screener.
- Earnings: implied_move_pct on /api/earnings-straddle/<ticker> (current) and /api/event/earnings-verdict (edge) is now the event-only move. It used to be the full ATM straddle of the first expiration on or after the report, which also holds every day of ordinary drift until that expiry; with the report weeks out that read several times the event. The straddle itself is still published beside it as straddle_move_pct with straddle_dte, and the split as diffusion_move_pct and event_variance_share. implied_move_source now reads chain_event, surface_event, impliedEarningsMove or straddle_total.
- Earnings verdict: historical_avg_move_pct is the average close-to-open gap (historical_avg_move_basis: gap), matching the hit rate; the close-to-close figure is historical_avg_close_to_close_pct. The front-month straddle mispricing only scores when that month contains the report (straddle_mispricing_is_event). A report more than 30 days out returns verdict.preliminary: true with the move ratio reported but not scored. estimated_iv_crush_pct and estimated_iv_after_event come from the earnings expiration's surface rather than a fixed 40%. New signal NO_EARNINGS for names with no scheduled report and no history.
- Hosted Claude connector documented: add https://apexvol.com/mcp-server as a custom connector in Claude (Settings → Connectors), sign in and approve: no install, no API token to paste. Use the apex form of the URL; www. fails the audience check. Approving creates a token labelled "Claude connector" on your account; revoke it under Account → API Access to disconnect.
- The local apexvol-mcp client is now documented as the developer alternative rather than the only route.
- Per-plan API access: every paid plan (Basic, Premium, Pro) now includes the API and MCP server. Each endpoint enforces the same plan tier as its web-app feature; the new access column names the plan an endpoint needs; utility endpoints (search, expirations, calendars) work on any plan.
- New 403 payload upgrade_required with required_tier and your_tier when an endpoint sits above your plan.
- Public launch: apexvol-mcp published to PyPI: install is now `pipx install apexvol-mcp` (git-URL installs retired).
- Docs, OpenAPI 3.1 spec and the one-file Markdown reference are public; the Markdown reference now serves inline so it can be read in place.
- Private-beta wording retired: API & MCP access is included with the Pro plan (rolling out to Pro accounts).
- mcp_tools now enumerates the complete 43-tool registry per category.
- New endpoint: POST /hedge-recommendations (delta-hedge suggestions with stock + option legs). Fixed the get_hedge_recommendations MCP tool, which previously called a non-existent endpoint; risk tools now accept structured JSON positions and their summaries read the correct response fields. Removed the unused server-to-server token endpoints POST /api/mcp/validate-token and POST /api/mcp/token-info (never called by the MCP client; validation happens inline on every /api/mcp/data request). GET /chain now defaults to 1 expiration and a 20-strikes-per-side window (was 3 full expirations); pass num_expirations / strikes_around=0 to widen; responses declare iv_units on IV analytics; rate-limit and monthly-budget headers (X-RateLimit-*, X-Monthly-Budget-Remaining, Retry-After) on all /api/mcp/data responses; 500s no longer echo internal exception text. Five new MCP tools (get_ticker_analytics, get_earnings_move_analysis, get_max_pain, get_volume_profile, get_zero_dte) now cover all 14 previously tool-less data endpoints; every /api/mcp/data endpoint is reachable from Claude. Ported from the platform: VRP timeseries + per-expiration endpoints, and the earnings-intelligence suite (earnings-verdict, seasonality, post-earnings-drift, iv-crush). /screen upgraded from 3 scans to the full 11-preset catalog with market-cap and earnings-proximity filters. Simulator ported to the public API: POST /simulate-chain (Black-Scholes chain what-if), POST /pop (probability of profit), and GET /chain-at-time/<ticker> (historical EOD chain snapshots) with matching MCP tools, 37 tools total. New GET /cores/<ticker> exposes the full 340+-field our institutional data feed cores row with field selection, plus a machine-readable OpenAPI 3.1 spec at /docs/api/openapi.json generated from these docs. Token hygiene: new tokens now expire after 1 year by default (expires_in_days on creation, 0 = never), and POST /api/account/api-tokens/<id>/rotate swaps a token for a fresh secret in one step. Final coverage batch: economic calendar, ticker search/validation, pairwise correlation compare, skew and HV-regime deep views, our institutional data feed monies surfaces (implied vs forecast), VIX snapshot, and market-wide relative-value scans: 59 endpoints, 43 MCP tools.
- Docs clarity: token-handling guidance (pasting into your config/private setup chat is safe; only rotate if exposed publicly), index-symbol caveat (chain price is the forward, not spot; ~20–30pt skew on indices), and corrected the private-beta install to the git+ form (not yet on PyPI).
- Added 6 MCP data endpoints completing analytics coverage: greeks-exposure, volume-profile, max-pain, correlation, hv-regimes, price-context.
- Added 5 MCP data endpoints (skew, relative-value, zero-dte, dividend, borrow-rate); fixed term-structure, greeks-heatmap, earnings-history and mispricing-assessment; added captured Response samples to the MCP page.
- Public documentation site launched: each analytics section now has its own crawlable page under /docs/api with curl, Python, and Claude/MCP examples. Internal sections remain in the gated reference.
- Reference trimmed to the customer-facing analytics and MCP surface; internal platform and account-management endpoints are no longer listed. Removed retired fair-value and forward-vol endpoints.
- Documentation moved from the .docx artifact to this page. MCP/API private beta: self-service token management added at Account → API Access (up to 3 active tokens, secret shown once); user tokens require the beta flag on the owning account. MCP build_strategy width parameter now accepts fractional dollar widths (e.g. 2.5).
- options_chain feature key defined (Basic, API-only): /api/volume-profile and /api/max-pain are now live for Basic+ subscribers (previously returned 404 due to the undefined key). Feature-key map updated to 38 keys. MCP fixes: /api/mcp/* surfaces are now CSRF-exempt (Bearer/hash auth; POSTs previously failed with 400), and all six MCP POST endpoints (build/analyze/optimize-strategy, portfolio-greeks, scenario-analysis, stress-tests) had their request/response plumbing repaired and verified end-to-end.
- Initial complete documentation: 46 API modules, ~240 routes, tiers & quotas, rate limits, error model, MCP integration (31 data endpoints, 29 Claude tools), full endpoint index.
Response shapes only ever gain fields inside a version; a renamed or removed field gets a new version and an entry here first. The site-wide changelog covers the terminal and the pages.
Included with
every paid plan.
From $55 a month, tier-matched: your token queries the data your plan includes and Pro unlocks the full surface.
Real market data, not a sandbox. See it live on AAPL.