Docs

API

Units and nulls

Units are part of the contract. GEX is in dollars per $1 move (with the conversion to shares), timestamps are epoch milliseconds, strikes are integer thousandths of a dollar, and a missing value stays null, never zero.

The rules

QuantityUnitExample
Timestamps (*_ms, captured_at, ts)Epoch milliseconds, UTC1790256713559
DatesISO calendar date, YYYY-MM-DD2026-09-25
Option strikes, strike filtersInteger thousandths of a dollar600000 = $600.00
Prices (spot, bars, quotes, flip point)Dollars764.18
GEX (gex, net_gex, max_abs_gex, delta_adj)Dollars of dealer hedging per $1 move in the underlying-878059914.5
Premium (*_usd)US dollars250000
Implied volatilityAnnualised, as a fraction0.119 = 11.9%
Protobuf prices (*_scaled)Integer dollars × 10,0007641800 = $764.18

Each reference page marks a field's unit next to its type where the contract states one.

Dollars, shares and delta-adjusted

GEX answers one question: if the underlying moves $1, how much stock do dealers have to buy or sell to stay hedged? There are two ways to say "how much", and each comes plain or delta-adjusted:

UnitMeansOn the API
DollarsDollars of stock dealers trade per $1 movegex, net_gex, max_abs_gex on the grid, history and reference reads
SharesShares of stock dealers trade per $1 movegex_shares on each reference book strike; everywhere else, convert (below)
Delta-adjusted dollarsThe strike's delta-adjusted exposure, in dollars per $1 movedelta_adj (null on rows captured before the field existed)
Delta-adjusted sharesThe same, in sharesConvert delta_adj (below)

The grid and history serve GEX in dollars only; the reference book also serves per-strike shares. The ITMatrixHQ Terminal lets you switch its grid between all four units.

Converting to shares. Divide the dollar figure by the underlying price the snapshot was valued at: its spot. If spot is null, use prior_close_spot from the same response. If both are null, there is no share figure: show it as unavailable, not as zero. Delta-adjusted shares work the same way: delta_adj ÷ spot. This is exactly how the terminal derives its share views; the reference book's gex_shares is likewise gex ÷ that capture's spot.

A worked example, from the GEX grid example (spot = 764.18):

FieldDollars (served)÷ spotShares
Strike $785 gex176396331.9÷ 764.18≈ 230,831 shares
Strike $785 delta_adj20865974.6÷ 764.18≈ 27,305 shares
net_gex-878059914.5÷ 764.18≈ −1,149,022 shares

So at that capture, dealers would trade about 230,831 SPY shares per $1 move to stay hedged at the $785 strike. Use the same response's spot for every row, so the rows stay consistent with each other and with the totals.

Time zones

Time-of-day inputs — at=2026-09-25T10:30, a bare date, HH:MM windows — are interpreted in America/New_York unless you pass tz with an IANA zone. Sessions are exchange sessions: "2026-09-25" means that trading day's regular session in New York.

Epoch-millisecond inputs are absolute and ignore tz.

Nulls are information

A value the API does not have is null (None in Python), not 0:

  • flip_point: null means the cumulative net GEX never crosses zero — not that it crosses at $0.
  • captured_at: null on a reference book means the book is unavailable for that session.
  • A missing price stays missing; nothing is interpolated or carried forward to fill it.

Zero is a real value when it appears. Keep the distinction in your own code: if value is None is not the same test as if not value.

Signs

Call GEX is positive and put GEX is negative. A positive net_gex means dealers are net long gamma at that snapshot. The sign describes hedging pressure, not market direction; do not read it as a forecast.

Integer precision

Protobuf bodies carry some fields as 64-bit integers. Python keeps them exact. The TypeScript SDK's friendly methods reject an integer outside JavaScript's safe range instead of rounding it; its lower-level wire methods return bigint.