Skip to main content
GET

What it returns

The levels of the TOTAL snapshot (all expirations combined) over a time window, oldest first. One row per capture (15m), per hour (1h) or per session (close). Use it to see how flip, regime and walls moved. For the per-strike picture at one moment use /history/snapshot; for bulk data use /history/files. Costs 1 request against your daily quota. Read Historical data first for session dates, the close definition and point-in-time semantics.

Path parameters

string
required
bybit, deribit, okx, derive, combined or tradfi. all and combined with a TradFi ticker resolve to tradfi. Venue subsets such as deribit+derive return 400 history_not_available.
string
required
Symbol, for example BTC, QQQ. Case-insensitive.

Query parameters

string
ISO date or datetime, UTC. Inclusive. Default: end minus 30 days. Years 2020 to 2100 are accepted.
string
ISO date or datetime, UTC. Exclusive. Default: the end of the current 15-minute capture slot, so the newest capture is included. start after end returns 400 invalid_param.
string
default:"close"
15m (every capture), 1h (the last capture of each UTC hour) or close (the last capture of each session date).A longer window returns 400 range_too_large with max_window_days.
string
The opaque meta.next_cursor of the previous page. Pass the same exchange, coin, end and granularity as before. start is replaced by the cursor, so pages never overlap.

Pagination

A response has at most 5,000 rows. When there is more, meta.next_cursor is set (otherwise it is null); send it back as ?cursor= to get the next page. With the window limits above, 15m and 1h requests normally fit in one page; paging matters for long close ranges.

Response

array
One object per row. type is close only for the last capture of a completed session, otherwise intraday. oi_date is the session whose open interest the row used (see Historical data).The fields are schema_version, timestamp_utc, session_date, type, exchange, symbol, oi_date, then the levels fields: spot, flip, flip_count, regime, net_gex, abs_gex, call_gex, put_gex, call_oi_total, put_oi_total, p1_strike … a2_gex, s_price, s_gex, v_price, v_gex, max_pain, atm_iv. All are defined in the data dictionary. Rows are TOTAL, so there is no expiration or dte field and max_pain is always null. Missing values are null.
object
exchange and coin as requested, symbol, exchange_resolved, market, units, docs_url, granularity, start and end (as applied, ISO 8601 UTC Z), next_cursor, and your rate_limit.

Errors

error
Venue subset. The body includes valid_exchanges.
error
The window is longer than the granularity allows. The body includes max_window_days.
error
Unparseable start, end or cursor, start after end, a year outside 2020 to 2100, or an unknown granularity (the body includes valid_values).
error
Unknown venue, or a venue that does not match the coin’s market.
error
Your plan does not include this coin’s market.
An empty window is not an error: data is []. Check /history/coverage for where history starts.
The values above are illustrative and the response is shortened to one row.