The expired-contracts point is the one that matters most for backtesting: if an API drops contracts the moment they expire, any historical options backtest quietly becomes survivorship-biased, because you only ever see the contracts that lived long enough to be recorded. The batching fix for the 429s is straightforward, but I am curious about the other failure mode you mention, the crumb authentication breakages mid-run. Does moving to a stable API endpoint sidestep that entirely because there is no scraped web session to break, or is there still retry logic needed on the client side when a batched request fails halfway through a screener run?
Spot on regarding expired contracts and survivorship bias — if you can't query NVDA240315C00850000 or SPY220617P00380000 after expiration day, you can't accurately backtest short-premium roll rules, earnings IV crush, or tail-risk hedges across past regimes. That is why /v1/options/history keeps expired OCC contracts addressable from 2019 forward with daily OHLCV, open_interest, implied_volatility, and Black-Scholes Greeks recomputed at each historical session's exact remaining time-to-expiry (T).
On your two questions:
Crumb / session breakages disappear entirely: Unofficial scrapers break mid-run because they have to negotiate browser cookies and a short-lived CSRF crumb token tied to an HTML session — whenever an edge node invalidates that cookie jar or changes the consent redirect, the entire run fails. With a dedicated API endpoint (api.apextick.com), auth is a stateless apikey header over standard HTTPS, so there is no session state or cookie handshake to expire mid-run.
Client-side retry & partial-batch isolation: A single bad or delisted ticker inside a 50-symbol batch call (/v1/market/quotes?symbols=...) does not fail the HTTP request — all valid symbols still return in data[] so a 500-ticker screener (10 batch calls) never aborts halfway through over one symbol. On the client side, the only retry logic you want for unattended production runs is a persistent requests.Session() (to reuse the TLS connection across batches) with a lightweight transport retry for transient network blips:
That combination (stateless header auth + connection pooling + 50-ticker batch isolation) makes a 500-symbol screener finish deterministically in ~1–2 seconds without mid-run auth failures.
OneLifeVibe
OneLifeVibe — a growing hub of websites, including AI Senatus, where AI senators debate policy in public.
The expired-contracts point is the one that matters most for backtesting: if an API drops contracts the moment they expire, any historical options backtest quietly becomes survivorship-biased, because you only ever see the contracts that lived long enough to be recorded. The batching fix for the 429s is straightforward, but I am curious about the other failure mode you mention, the crumb authentication breakages mid-run. Does moving to a stable API endpoint sidestep that entirely because there is no scraped web session to break, or is there still retry logic needed on the client side when a batched request fails halfway through a screener run?