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#

MethodPathDescription
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.

Shell
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.

Shell
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.

Python
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.

Python
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 empty rows with a no_rows warning, 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_curve for 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_volume or widen moneyness to change the view. With no date=, 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 as snapshot_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 hard 422 guards 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 explicit error/warning field, never a 500.
  • 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.