Tape & Intraday History
FIRM's OWN self-collected tick and intraday capture — full-market minute bars, per-print options and futures trade tape, futures term structure, live microstructure windows, and a daily options-chain history with greeks, implied vol and open interest. We have been snapshotting the tape into the lakehouse every trading day since May 2026. No competitor sells this history self-serve: options and futures vendors rent you today's prints and today's chain, but FIRM lets an agent replay the intraday tape and the greeks/IV/OI surface exactly as they stood on any past captured day.
What's inside#
This product serves seven read surfaces over FIRM's day-partitioned tick/minute archives — self-collected from Polygon and processed in-house:
- Equity minute bars — 1-minute OHLCV + VWAP + trade count for ~10.5k tickers, extended hours included, resampled to 5m/15m/1h server-side. Capture begins 2026-05-10.
- Index minute bars — the same grain for the major index tapes SPX, NDX, DJI, RUT and VIX (index tapes carry no volume). Capture begins 2026-05-14.
- Options trade tape — raw per-print options trades for one underlying, one day: premium (notional), strike, expiry, side, block and sweep flags, sorted largest-premium first. Capture begins 2026-05-11.
- Futures trade tape — raw CME futures trade prints for one product root across every contract month: price, size, notional, block flag. Capture begins 2026-05-13; live trade capture is currently concentrated in CME energy (NG-heavy, some CL).
- Futures curve — the daily futures-chain snapshot as a term structure: per contract month, last/settlement price, bid/ask, session OHLC, volume, open interest and days-to-expiry. Snapshots begin 2026-05-18 (captured ~22:00 UTC).
- Intraday microstructure — 60-second windows for the most active tickers: rolling VWAP, trade count, average trade size, block-trade count/volume, buy/sell imbalance and large-trade premium. Coverage is the ~200 most active tickers per session (dynamic). Capture begins 2026-05-13.
- Options-chain history — the ENTIRE captured chain (strike × expiry × side) for one underlying on any past snapshot day, with Polygon model greeks, implied vol, open interest and a chain summary. ~0.5 TB and growing; capture begins 2026-05-10.
The tick tables are huge and day-partitioned, so a date bound is mandatory on the trade-tape surfaces (options/futures prints) and a start..end window on the bar surfaces spans at most 5 trading days per call. Every response carries an honest note with the archive's capture-start date so you never retry-loop on a pre-archive day, and reader faults degrade to an explicit error/warning field rather than a 500.
Access#
3 credits/call · Pro and up — the Tape & Intraday History product is not available on Free or Starter. It unlocks on Pro ($499/mo) and Expert/Enterprise. This is FIRM's own self-collected capture; there is no vendor add-on equivalent.
Endpoints#
| Method | Path | Description |
|---|---|---|
GET | /api/v3/tape/bars/{ticker} | Equity minute bars (1m native; 5m/15m/1h resampled). Pass ?date=YYYY-MM-DD OR ?start=&end= (max 5 trading days), ?interval= (1m/5m/15m/1h, default 1m), ?limit= (1–10000, default 5000). Returns {ticker, window, interval, source, note, n, rows}; rows carry bar_start, open, high, low, close, volume, vwap, n_transactions. |
GET | /api/v3/tape/index_bars/{index} | Index minute bars for SPX/NDX/DJI/RUT/VIX (404 on any other index). Same date/start/end/interval/limit params. Returns {index, polygon_ticker, window, interval, source, note, n, rows}; rows carry bar_start, open, high, low, close, volume, vwap, n_ticks (index volume is zero). |
GET | /api/v3/tape/options/{ticker} | Raw options trade prints for one underlying on one day. ?date= is required; ?min_premium= (notional_usd ≥), ?side= (C/P), ?limit= (1–5000, default 1000). Rows sorted largest-premium first. Returns {ticker, date, side, min_premium, source, note, n, rows}; rows carry option_ticker, contract_type, strike_price, expiration_date, trade_ts, price, size, notional_usd, exchange, is_block, is_sweep. |
GET | /api/v3/tape/futures/{root} | Raw CME futures trade prints for one product root (e.g. NG, CL, ES, GC, ZN) on one day. ?date= is required; ?limit= (1–5000, default 1000). Rows are the day's most recent prints (ascending by time). Returns {root, date, source, known_roots, note, n, rows}; rows carry contract_ticker, product_code, trade_ts, price, size, notional_usd, exchange, is_block. |
GET | /api/v3/tape/futures_curve/{root} | Futures term structure (chain snapshot) for one root — 27 roots total. Omit ?date= for the latest snapshot, or pass ?date=YYYY-MM-DD; ?limit= (1–500, default 120). Returns {root, snapshot, source, known_roots, note, n, snapshot_ts, rows}; rows carry contract_ticker, contract_month, expiration_date, dte, last_price, bid, ask, midpoint, settlement_price, previous_settlement, change_percent, session_volume, open_interest. |
GET | /api/v3/tape/microstructure/{ticker} | 60-second microstructure windows for one ticker (≈200 most active tickers/session). Omit ?date= for the most recent windows; ?limit= (1–5000, default 500). Returns {ticker, window, source, note, n, rows}; rows carry as_of_ts, vwap_60s, trade_count, total_volume, avg_trade_size, block_trade_count, block_trade_volume, trade_imbalance, large_trade_premium. |
GET | /api/v3/tape/options_chain/{ticker} | Historical full options chain (per-contract greeks/IV/OI) for one underlying on one snapshot day. Omit ?date= for the LATEST captured day (reported as snapshot_day). Filters: ?contract_type= (call/put), ?expiration=, ?min_dte=/?max_dte= (0–3650), ?min_open_interest=, ?min_volume=, ?moneyness= (±band, 0–5.0), ?sort= (open_interest/notional, default open_interest), ?limit= (1–2000, default 100). Returns {ticker, mode, snapshot_day, snapshot_ts, source, note, summary, contract_type, sort, n, rows}. |
Examples#
Example 1: Equity minute bars around an event (bash + curl)#
Pull 5-minute bars for AAPL for a single session (3 credits per call). Use date= for one day, or start=&end= for a window of up to 5 trading days.
1curl -H "Authorization: Bearer $TENGU_API_KEY" \2 "https://firm.tengu.co/api/v3/tape/bars/AAPL?date=2026-07-16&interval=5m&limit=200"3 4# Response envelope:5# {6# "ok": true,7# "timestamp": "2026-07-17T20:15:00Z",8# "ticker": "AAPL",9# "window": "2026-07-16",10# "interval": "5m",11# "source": "warehouse:bronze.polygon_minute_bars",12# "note": "Own Polygon minute-bar capture begins 2026-05-10 — earlier dates have no rows.",13# "n": 78,14# "rows": [15# {16# "bar_start": "2026-07-16T13:30:00Z",17# "open": 210.44,18# "high": 211.02,19# "low": 210.10,20# "close": 210.88,21# "volume": 1842300,22# "vwap": 210.61,23# "n_transactions": 982124# }25# // ... more 5-minute bars26# ]27# }The same shape serves the index tapes — swap in /api/v3/tape/index_bars/SPX (or VIX) for the market/vol benchmark leg. Index rows carry n_ticks and a zero volume.
Example 2: The options and futures trade tape (bash + curl)#
The trade-tape surfaces require a date= (the tables are day-partitioned and large). Options prints come back largest-premium first; min_premium narrows to the whales.
1# Largest TSLA options prints on a day, notional >= $250k (3 credits)2curl -H "Authorization: Bearer $TENGU_API_KEY" \3 "https://firm.tengu.co/api/v3/tape/options/TSLA?date=2026-07-16&min_premium=250000&limit=50"4 5# Response envelope:6# {7# "ok": true,8# "timestamp": "2026-07-17T20:16:30Z",9# "ticker": "TSLA",10# "date": "2026-07-16",11# "side": null,12# "min_premium": 250000.0,13# "source": "warehouse:bronze.polygon_options_trades",14# "note": "Own Polygon options-trade capture begins 2026-05-11. Rows are the largest-premium prints of the day (sorted server-side); raise min_premium to narrow the tape further.",15# "n": 41,16# "rows": [17# {18# "option_ticker": "O:TSLA260918C00300000",19# "contract_type": "call",20# "strike_price": 300.0,21# "expiration_date": "2026-09-18",22# "trade_ts": "2026-07-16T15:42:11Z",23# "price": 12.35,24# "size": 500,25# "notional_usd": 617500.0,26# "exchange": 312,27# "is_block": true,28# "is_sweep": false29# }30# // ... more prints, descending by notional_usd31# ]32# }33 34# CME futures trade tape — one product root, one day (3 credits).35# Live trade capture is currently energy-heavy (NG, CL); other roots may be empty.36curl -H "Authorization: Bearer $TENGU_API_KEY" \37 "https://firm.tengu.co/api/v3/tape/futures/NG?date=2026-07-16&limit=100"38 39# Response envelope:40# {41# "ok": true,42# "timestamp": "2026-07-17T20:17:05Z",43# "root": "NG",44# "date": "2026-07-16",45# "source": "warehouse:bronze.polygon_futures_trades",46# "known_roots": ["6B","6E","6J","CL","ES","GC","HE","HG","HO","LE","NQ","PA","PL","RB","RTY","SI","UB","YM","ZB","ZC","ZF","ZL","ZM","ZN","ZS","ZT","ZW"],47# "note": "Own Polygon futures-trade capture begins 2026-05-13; live trade capture is currently concentrated in CME energy (NG, CL) — other roots may be empty even on active days. ...",48# "n": 100,49# "rows": [50# {51# "contract_ticker": "NGQ6",52# "product_code": "NG",53# "trade_ts": "2026-07-16T19:58:44Z",54# "price": 3.412,55# "size": 4,56# "notional_usd": 136480.0,57# "exchange": 42,58# "is_block": false59# }60# // ... most recent prints of the day, ascending by trade_ts61# ]62# }Example 3: Futures curve + microstructure (Python)#
futures_curve returns one snapshot day as a term structure (omit date for the latest). microstructure returns the 60-second execution-grade windows for the active-ticker set.
1import os, requests2 3H = {"Authorization": f"Bearer {os.environ['TENGU_API_KEY']}"}4 5# 1. Latest CL (crude) term structure — contango/backwardation + open interest (3 credits)6r = requests.get("https://firm.tengu.co/api/v3/tape/futures_curve/CL",7 headers=H, timeout=30)8r.raise_for_status()9curve = r.json()10print(f"CL curve snapshot {curve.get('snapshot_ts')} — {curve['n']} contracts")11for c in curve["rows"][:6]:12 print(f" {c['contract_ticker']} dte={c['dte']:>4} "13 f"settle={c.get('settlement_price')} OI={c.get('open_interest')}")14 15# 2. Microstructure — is smart money accumulating? (positive imbalance + block activity)16r = requests.get("https://firm.tengu.co/api/v3/tape/microstructure/MSFT",17 headers=H, params={"limit": 30}, timeout=30)18r.raise_for_status()19micro = r.json()20# micro is empty if MSFT wasn't in that session's ~200 most-active set21for w in micro["rows"][-5:]:22 print(f" {w['as_of_ts']} vwap={w['vwap_60s']} "23 f"imbalance={w['trade_imbalance']} blocks={w['block_trade_count']}")Example 4: Historical options-chain snapshot with greeks (Python)#
Reconstruct the IV surface / greeks / OI distribution AS IT STOOD on a past day. Omit date for the latest captured snapshot (the served day is echoed back as snapshot_day); the summary block is always over the full captured chain, before your row filters.
1import os, requests2 3H = {"Authorization": f"Bearer {os.environ['TENGU_API_KEY']}"}4 5# Near-the-money AAPL chain on a snapshot day, both sides, >=100 OI (3 credits)6r = requests.get(7 "https://firm.tengu.co/api/v3/tape/options_chain/AAPL",8 headers=H,9 params={"date": "2026-07-16", "moneyness": 0.1,10 "min_open_interest": 100, "sort": "open_interest", "limit": 50},11 timeout=30,12)13r.raise_for_status()14chain = r.json()15# Response envelope (abridged):16# {17# "ok": true,18# "timestamp": "2026-07-17T20:19:00Z",19# "ticker": "AAPL",20# "requested_date": "2026-07-16",21# "mode": "snapshot", # "latest_available" when date is omitted22# "snapshot_day": "2026-07-16",23# "snapshot_ts": "2026-07-16T22:01:33Z",24# "source": "warehouse:nuble_bronze.polygon_options_chain",25# "note": "FIRM's own daily options-chain capture begins 2026-05-01; ... Per-day coverage is the top open-interest contracts per underlying (a few hundred), not the full listed chain — raise min_open_interest / min_volume to focus, or widen moneyness to see more strikes.",26# "summary": {27# "underlying_price": 210.55,28# "n_contracts": 480,29# "n_calls": 242,30# "n_puts": 238,31# "n_expirations": 14,32# "call_open_interest": 1284500.0,33# "put_open_interest": 1102300.0,34# "put_call_oi_ratio": 0.8582,35# "call_volume": 318400.0,36# "put_volume": 271900.0,37# "put_call_volume_ratio": 0.8539,38# "total_open_interest": 2386800.0,39# "total_day_volume": 590300.0,40# "atm_iv": 0.296,41# "atm_strike": 210.0,42# "atm_expiry_dte": 32.043# },44# "contract_type": null,45# "sort": "open_interest",46# "n": 50,47# "rows": [48# {49# "option_ticker": "O:AAPL260821C00210000",50# "contract_type": "call",51# "strike_price": 210.0,52# "expiration_date": "2026-08-21",53# "dte": 36,54# "bid": 6.85, "ask": 6.95, "midpoint": 6.90, "last_price": 6.88,55# "day_volume": 12840, "day_vwap": 6.91,56# "implied_volatility": 0.298,57# "delta": 0.531, "gamma": 0.021, "theta": -0.089, "vega": 0.164,58# "open_interest": 48210,59# "underlying_price": 210.5560# }61# // ... top contracts by open interest, after the moneyness/OI filters62# ]63# }64print(f"{chain['ticker']} {chain['snapshot_day']}: "65 f"P/C OI {chain['summary']['put_call_oi_ratio']}, "66 f"front-month ATM IV {chain['summary']['atm_iv']}")Coverage & caveats#
- Capture start dates differ per stream (all surfaced in each response
note): minute bars 2026-05-10, options trades 2026-05-11, futures trades and microstructure 2026-05-13, index bars 2026-05-14, futures-chain snapshots 2026-05-18, options-chain history 2026-05-10. Dates before a stream's start return an emptyrowswith ano_rowswarning, not an error. - Futures trade capture is energy-heavy. Live per-print capture is currently concentrated in CME energy (NG-heavy, some CL). An empty result for another root means that root isn't in the trade-capture set yet — not that the market was quiet. Use
/tape/futures_curvefor the full 27-product chain snapshots. - Microstructure is a dynamic ~200-ticker set. Only the most active tickers per session are captured; an empty result means the ticker wasn't active enough that session.
- Options-chain history is top-of-book by open interest. Per-day coverage is the top open-interest contracts per underlying (a few hundred), not the full listed chain. Narrow with
min_open_interest/min_volumeor widenmoneynessto change the view. With nodate=, the route serves the latest captured snapshot day (never a today-relative window that could read empty on a holiday or capture gap) and echoes it assnapshot_day. - A date bound is mandatory on the trade-tape surfaces (
/tape/options,/tape/futures); bar windows span at most 5 trading days per call. These are hard422guards that keep unbounded scans of the multi-hundred-GB tick tables out. - Every response follows the standard envelope
{ok, timestamp, ...}. Reader faults degrade to an expliciterror/warningfield, never a500.
Related#
- Options Flow — live dealer positioning, GEX, max pain, and dark-pool prints (the real-time complement to the historical tape).
- Market Data — daily quotes, OHLC and reference data.
- Pricing & credits — plan tiers, credit costs, and budgeting.
- API reference — complete endpoint listing and per-plan access.