Every strike.
Every expiry.
Checksummed.
Full-chain end-of-day history for US stocks and ETFs, delivered as Parquet or CSV with a manifest your loader can verify. 69.8 million real contracts across eight deep names, plus a 1,500-name breadth tier and a live closing capture. No subscription. No per-query meter.
Coverage, measured per symbol
These are the eight names we hold at full field depth. Each row is counted from the file itself, not from a catalogue page. Sessions are measured against the NYSE calendar; the missing ones are listed.
| Symbol | First | Last | Sessions | Missing | Coverage | Contracts | Parquet |
|---|---|---|---|---|---|---|---|
| SPY | 2008-01-02 | 2025-12-12 | 4,514 | 4 | 99.93 % | 518,256 | 632 MB |
| QQQ | 2011-03-23 | 2025-12-15 | 3,700 | 6 | 99.84 % | 373,642 | 388 MB |
| NVDA | 2008-01-02 | 2025-12-16 | 4,515 | 4 | 99.91 % | 129,624 | 198 MB |
| AVGO | 2009-08-24 | 2025-12-17 | 4,103 | 3 | 99.93 % | 92,980 | 118 MB |
| GS | 2008-01-02 | 2025-12-19 | 4,515 | 7 | 99.85 % | 96,059 | 122 MB |
| JPM | 2008-01-02 | 2025-12-17 | 4,516 | 4 | 99.91 % | 82,265 | 89 MB |
| LLY | 2008-01-02 | 2025-12-17 | 4,514 | 6 | 99.87 % | 94,069 | 102 MB |
| ORCL | 2008-01-02 | 2025-12-17 | 4,516 | 4 | 99.91 % | 68,191 | 70 MB |
Breadth tier 2020 → yesterday
~1,500 US underlyings per session, including names that later delisted. Bid, ask, IV and greeks. No volume, no open interest, no underlying print — the holes are in the schema, not in the docs.
Census: 1,573 names on 2020-03-16, 1,521 on 2026-10-30. 546 have since stopped quoting — still in the file. e.g. AAWW, ABMD, AGN, ALXN, AJRD, ANTM.
Live close capture current session
Delayed Cboe chain with volume, open interest, sizes and the underlying at the feed timestamp. Captured at 15:27 ET on 2026-11-01: 11,904 SPY contracts, spot 755.72.
Use for marks and sanity checks, not fills.
Fields
36 columns, fixed order, one row per contract per session. The 34 columns are the industry layout;
source and ingest_utc are ours and drop out cleanly. Empty means the upstream
cannot supply it — never zero, never imputed.
| Group | Columns | Deep | Breadth | Live |
|---|---|---|---|---|
| Identity | contract · underlying · expiration · type · strike · style | yes | yes | yes |
| Top of book | bid · bid_size · ask · ask_size · quote_time | yes | no sizes | yes |
| Activity | volume · open_interest | yes | no | yes |
| Vol & greeks | iv · delta · gamma · theta · vega · rho · iv_flag | yes | yes | yes |
| Underlying | underlying_close | yes | join | yes |
| Trade detail | open · high · low · close · last_trade_date | no | no | yes |
Method. IV and greeks are Black-Scholes-Merton with a continuous dividend
yield, solved from the quote mid with the session risk-free curve and underlying close. Theta is per
calendar day; vega and rho per one point. Non-convergent rows ship empty rather than a sentinel.
Snapshot is the last consolidated top of book at or before 16:00 ET, stamped 16:00:00.
There is no 15:45 executable quote in the free history.
Quality, with the gaps left in
The sample is 68,250 real contracts across the worst week you could pick. It is checked by a script a buyer can run. These are its output numbers, not a marketing summary.
Known gaps, stated plainly
- No January 2007. Earliest row is 2008-01-02. A licensed top-up back to 2007-01-03 is a 5–10 day order.
- Deep files stop in December 2025. The last eleven months come from the breadth tier or the licensed feed.
- IWM, SMH and IGV are absent. SPY and QQQ are deep; XL* sector ETFs and KRE are in the breadth tier; index roots (SPX, VIX) are not held.
- Breadth has no volume or open interest, and starts in 2020.
- Single-session holes exist: 2018-11-06, 2019-09-03 and 2020-06-23 hit most of the book at once; SPY misses 2009-01-06; LLY misses two in a row in 2008. Longest run anywhere is two sessions.
- Coverage is 99.84–99.93 % per name, against the NYSE calendar. Every missing date is listed in
catalog/missing-dates.csv.
Split handling, proven
NVDA 10:1, 2024-06-10. The pre-split call listed at 10.00 is re-listed the ex-date as a new OCC symbol at 1.00, and a fresh unadjusted series appears at 10.00. Both are in the file. Adjusted contacts have no root marker, so we document the mapping rule instead of pretending one exists.
2024-06-07: 381 strikes, 5.00–2,500.00 · 2024-06-10: 702 strikes, 0.50–2,500.00
Take the sample, then run the checks
SPY and NVDA, 16–20 March 2020, full chain. CSV per session plus one Parquet per symbol, 68,250 rows, 17.9 MB unpacked, SHA-256 for every file. It is built by the same pipeline as a paid order.
# 1. unzip, then verify independently unzip closebell-sample-2020-03-16.zip uv run --with duckdb python pipeline/verify.py PASS sha256 for every file PASS no duplicate contract-day PASS no crossed quotes PASS NVDA split adjustment re-listed at 1/10 strike all hard checks passed
Sample covers what you asked for: one index ETF, one single stock, one stressed week. Ask for any other pair and you get the same extract, same day.
Delivery
Shape
Parquet (zstd) default, CSV on request, DuckDB file by arrangement. One object per symbol per year, or
per session, never over 1 GB. manifest.jsonl with key, rows, bytes and SHA-256. Schema
version in the path.
The eight-name deep archive is 1.72 GB Parquet / ~8.6 GB CSV.
Pipe
Cloudflare R2, S3-compatible presigned URLs; aws s3 sync or rclone, resumable.
50 concurrent objects, no daily request cap, HTTP Range for single columns. Cursor API for incremental
pulls at 1,000 rows a page.
Corrections land in a dated overlay that supersedes on
(contract, quote_date). Base files are never rewritten.
Pricing
Single name, single year
Full chain, every expiry. Any of the eight deep names, any year from 2008.
instant
Deep archive
All eight names, 2008 → 2025, 69.8 M rows, 1.72 GB Parquet, checksums and manifest. Perpetual research licence.
instant
Breadth tier
~1,500 underlyings, delisted included, bid/ask/IV/greeks, monthly refresh for twelve months.
3 business days
2007 top-up
Licensed OPRA source back to 2007-01-03, priced at vendor cost plus assembly. Also covers IWM, SMH, IGV and index roots.
5–10 business days
Straight answers
Can you do January 2007?
Not from the free archive — 2008-01-02 is the first row. A licensed top-up to 2007-01-03 is orderable and takes 5–10 business days. We would rather say that than sell you a 2007 file that turns out to be a back-filled index.
Is there survivorship bias?
The breadth tier keeps delisted names and their history (AAWW, ABMD, AGN, ALXN and others are live in the data). The deep tier is eight survivors only. There is no permanent security id, so a ticker change is two symbols.
What exact time is the quote?
The last consolidated top of book at or before 16:00 ET, stamped 16:00:00. It is a mark, not a
fill. A 15:45 variant is a priced option.
How are adjusted contracts marked?
They are not. On a split the pre-split series is re-listed under a new OCC symbol at the adjusted strike and the old strikes are re-listed unadjusted. You map across the ex-date by expiry, type and the split ratio; the rule is written down in the field dictionary.
Where did the data come from, and can I redistribute it?
Public research mirrors plus a live delayed Cboe capture; a licensed feed for the top-up. Each row carries
source and the delivery ships NOTICE.md. Research use is clear; redistribution inside
a commercial product is yours to confirm and the licensed tier covers it.
What if the sample is bad?
Run verify.py, pick a random day, compare 20 rows against your broker. If it does not hold up,
you have lost an afternoon and $0.