End-of-day US options · 2008 → today

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.

2008-01-02earliest row
69,856,552contract rows
99.93 %SPY session coverage
0crossed quotes shipped
01

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.

SymbolFirstLastSessionsMissingCoverageContractsParquet
SPY2008-01-022025-12-124,514499.93 %518,256632 MB
QQQ2011-03-232025-12-153,700699.84 %373,642388 MB
NVDA2008-01-022025-12-164,515499.91 %129,624198 MB
AVGO2009-08-242025-12-174,103399.93 %92,980118 MB
GS2008-01-022025-12-194,515799.85 %96,059122 MB
JPM2008-01-022025-12-174,516499.91 %82,26589 MB
LLY2008-01-022025-12-174,514699.87 %94,069102 MB
ORCL2008-01-022025-12-174,516499.91 %68,19170 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.

02

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.

GroupColumnsDeepBreadthLive
Identitycontract · underlying · expiration · type · strike · styleyesyesyes
Top of bookbid · bid_size · ask · ask_size · quote_timeyesno sizesyes
Activityvolume · open_interestyesnoyes
Vol & greeksiv · delta · gamma · theta · vega · rho · iv_flagyesyesyes
Underlyingunderlying_closeyesjoinyes
Trade detailopen · high · low · close · last_trade_datenonoyes

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.

Full field dictionary and the split-adjustment rule →

03

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.

94.71 %SPY two-sided
89.79 %NVDA two-sided
0.66 %SPY parity residual
0.24 %NVDA parity residual
100 %IV and greeks present
0crossed quotes

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

04

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.

05

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.

06

Pricing

Single name, single year

$180 / name / year

Full chain, every expiry. Any of the eight deep names, any year from 2008.

instant

Deep archive

$2,400 one-time

All eight names, 2008 → 2025, 69.8 M rows, 1.72 GB Parquet, checksums and manifest. Perpetual research licence.

instant

Breadth tier

$7,500 2020 → today

~1,500 underlyings, delisted included, bid/ask/IV/greeks, monthly refresh for twelve months.

3 business days

2007 top-up

on request

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

07

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.

Same-day extracts

Name the pair and the week.

Request an extract