curl --request GET \
--url https://api.gammaflip.io/api/v1/history/levels/{exchange}/{coin} \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.gammaflip.io/api/v1/history/levels/{exchange}/{coin}"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.gammaflip.io/api/v1/history/levels/{exchange}/{coin}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.gammaflip.io/api/v1/history/levels/{exchange}/{coin}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.gammaflip.io/api/v1/history/levels/{exchange}/{coin}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.gammaflip.io/api/v1/history/levels/{exchange}/{coin}")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gammaflip.io/api/v1/history/levels/{exchange}/{coin}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": [
{
"schema_version": 1,
"timestamp_utc": "2026-10-05T20:15:00Z",
"session_date": "2026-10-05",
"type": "intraday",
"exchange": "tradfi",
"symbol": "QQQ",
"oi_date": "2026-10-02",
"spot": 123,
"flip": 123,
"flip_count": 123,
"regime": "positive",
"net_gex": 123,
"abs_gex": 123,
"call_gex": 123,
"put_gex": 123,
"call_oi_total": 123,
"put_oi_total": 123,
"p1_strike": 123,
"p1_gex": 123,
"p2_strike": 123,
"p2_gex": 123,
"n1_strike": 123,
"n1_gex": 123,
"n2_strike": 123,
"n2_gex": 123,
"a1_strike": 123,
"a1_gex": 123,
"a2_strike": 123,
"a2_gex": 123,
"s_price": 123,
"s_gex": 123,
"v_price": 123,
"v_gex": 123,
"max_pain": 123,
"atm_iv": 123
}
],
"meta": {
"timestamp": "2023-11-07T05:31:56Z",
"exchange": "tradfi",
"coin": "QQQ",
"symbol": "QQQ",
"exchange_resolved": "tradfi",
"market": "crypto",
"units": "USD per 1% move of the underlying",
"docs_url": "https://docs.gammaflip.io/data-dictionary",
"granularity": "15m",
"start": "2023-11-07T05:31:56Z",
"end": "2023-11-07T05:31:56Z",
"next_cursor": "<string>",
"session_date": "2023-12-25",
"snapshot_at": "2023-11-07T05:31:56Z",
"rate_limit": {
"limit": 500,
"remaining": 487,
"reset": "2026-04-15T00:00:00+00:00"
}
}
}{
"error": "invalid_exchange",
"message": "Exchange 'kraken' is not available.",
"current_tier": "trial",
"valid_exchanges": [
"deribit",
"bybit",
"okx",
"derive",
"combined"
],
"nearest_expirations": [
"2026-10-17",
"2026-10-19"
],
"valid_values": [
"full",
"levels"
],
"max_value": 50,
"max_window_days": 31,
"nearest_timestamps": [
"2026-10-05T20:15:00Z",
"2026-10-05T13:45:00Z"
],
"market": "tradfi",
"markets_in_plan": [
"<string>"
],
"supported_crypto": [
"BTC",
"ETH",
"HYPE",
"SOL",
"XRP"
],
"supported_tradfi": [
"QQQ",
"SPX",
"SPY"
],
"rate_limit": {
"limit": 500,
"remaining": 487,
"reset": "2026-04-15T00:00:00+00:00"
}
}{
"error": "invalid_exchange",
"message": "Exchange 'kraken' is not available.",
"current_tier": "trial",
"valid_exchanges": [
"deribit",
"bybit",
"okx",
"derive",
"combined"
],
"nearest_expirations": [
"2026-10-17",
"2026-10-19"
],
"valid_values": [
"full",
"levels"
],
"max_value": 50,
"max_window_days": 31,
"nearest_timestamps": [
"2026-10-05T20:15:00Z",
"2026-10-05T13:45:00Z"
],
"market": "tradfi",
"markets_in_plan": [
"<string>"
],
"supported_crypto": [
"BTC",
"ETH",
"HYPE",
"SOL",
"XRP"
],
"supported_tradfi": [
"QQQ",
"SPX",
"SPY"
],
"rate_limit": {
"limit": 500,
"remaining": 487,
"reset": "2026-04-15T00:00:00+00:00"
}
}{
"error": "invalid_exchange",
"message": "Exchange 'kraken' is not available.",
"current_tier": "trial",
"valid_exchanges": [
"deribit",
"bybit",
"okx",
"derive",
"combined"
],
"nearest_expirations": [
"2026-10-17",
"2026-10-19"
],
"valid_values": [
"full",
"levels"
],
"max_value": 50,
"max_window_days": 31,
"nearest_timestamps": [
"2026-10-05T20:15:00Z",
"2026-10-05T13:45:00Z"
],
"market": "tradfi",
"markets_in_plan": [
"<string>"
],
"supported_crypto": [
"BTC",
"ETH",
"HYPE",
"SOL",
"XRP"
],
"supported_tradfi": [
"QQQ",
"SPX",
"SPY"
],
"rate_limit": {
"limit": 500,
"remaining": 487,
"reset": "2026-04-15T00:00:00+00:00"
}
}{
"error": "invalid_exchange",
"message": "Exchange 'kraken' is not available.",
"current_tier": "trial",
"valid_exchanges": [
"deribit",
"bybit",
"okx",
"derive",
"combined"
],
"nearest_expirations": [
"2026-10-17",
"2026-10-19"
],
"valid_values": [
"full",
"levels"
],
"max_value": 50,
"max_window_days": 31,
"nearest_timestamps": [
"2026-10-05T20:15:00Z",
"2026-10-05T13:45:00Z"
],
"market": "tradfi",
"markets_in_plan": [
"<string>"
],
"supported_crypto": [
"BTC",
"ETH",
"HYPE",
"SOL",
"XRP"
],
"supported_tradfi": [
"QQQ",
"SPX",
"SPY"
],
"rate_limit": {
"limit": 500,
"remaining": 487,
"reset": "2026-04-15T00:00:00+00:00"
}
}Levels time series
The TOTAL levels over a time window, oldest first: one row per capture (15m),
per UTC hour (1h) or per session (close). start is inclusive, end exclusive.
A response has at most 5,000 rows plus an opaque meta.next_cursor. Counts as 1 request.
See https://docs.gammaflip.io/history for session dates, the close definition and
point-in-time semantics.
curl --request GET \
--url https://api.gammaflip.io/api/v1/history/levels/{exchange}/{coin} \
--header 'X-API-Key: <api-key>'import requests
url = "https://api.gammaflip.io/api/v1/history/levels/{exchange}/{coin}"
headers = {"X-API-Key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-API-Key': '<api-key>'}};
fetch('https://api.gammaflip.io/api/v1/history/levels/{exchange}/{coin}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.gammaflip.io/api/v1/history/levels/{exchange}/{coin}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.gammaflip.io/api/v1/history/levels/{exchange}/{coin}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.gammaflip.io/api/v1/history/levels/{exchange}/{coin}")
.header("X-API-Key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gammaflip.io/api/v1/history/levels/{exchange}/{coin}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-API-Key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"data": [
{
"schema_version": 1,
"timestamp_utc": "2026-10-05T20:15:00Z",
"session_date": "2026-10-05",
"type": "intraday",
"exchange": "tradfi",
"symbol": "QQQ",
"oi_date": "2026-10-02",
"spot": 123,
"flip": 123,
"flip_count": 123,
"regime": "positive",
"net_gex": 123,
"abs_gex": 123,
"call_gex": 123,
"put_gex": 123,
"call_oi_total": 123,
"put_oi_total": 123,
"p1_strike": 123,
"p1_gex": 123,
"p2_strike": 123,
"p2_gex": 123,
"n1_strike": 123,
"n1_gex": 123,
"n2_strike": 123,
"n2_gex": 123,
"a1_strike": 123,
"a1_gex": 123,
"a2_strike": 123,
"a2_gex": 123,
"s_price": 123,
"s_gex": 123,
"v_price": 123,
"v_gex": 123,
"max_pain": 123,
"atm_iv": 123
}
],
"meta": {
"timestamp": "2023-11-07T05:31:56Z",
"exchange": "tradfi",
"coin": "QQQ",
"symbol": "QQQ",
"exchange_resolved": "tradfi",
"market": "crypto",
"units": "USD per 1% move of the underlying",
"docs_url": "https://docs.gammaflip.io/data-dictionary",
"granularity": "15m",
"start": "2023-11-07T05:31:56Z",
"end": "2023-11-07T05:31:56Z",
"next_cursor": "<string>",
"session_date": "2023-12-25",
"snapshot_at": "2023-11-07T05:31:56Z",
"rate_limit": {
"limit": 500,
"remaining": 487,
"reset": "2026-04-15T00:00:00+00:00"
}
}
}{
"error": "invalid_exchange",
"message": "Exchange 'kraken' is not available.",
"current_tier": "trial",
"valid_exchanges": [
"deribit",
"bybit",
"okx",
"derive",
"combined"
],
"nearest_expirations": [
"2026-10-17",
"2026-10-19"
],
"valid_values": [
"full",
"levels"
],
"max_value": 50,
"max_window_days": 31,
"nearest_timestamps": [
"2026-10-05T20:15:00Z",
"2026-10-05T13:45:00Z"
],
"market": "tradfi",
"markets_in_plan": [
"<string>"
],
"supported_crypto": [
"BTC",
"ETH",
"HYPE",
"SOL",
"XRP"
],
"supported_tradfi": [
"QQQ",
"SPX",
"SPY"
],
"rate_limit": {
"limit": 500,
"remaining": 487,
"reset": "2026-04-15T00:00:00+00:00"
}
}{
"error": "invalid_exchange",
"message": "Exchange 'kraken' is not available.",
"current_tier": "trial",
"valid_exchanges": [
"deribit",
"bybit",
"okx",
"derive",
"combined"
],
"nearest_expirations": [
"2026-10-17",
"2026-10-19"
],
"valid_values": [
"full",
"levels"
],
"max_value": 50,
"max_window_days": 31,
"nearest_timestamps": [
"2026-10-05T20:15:00Z",
"2026-10-05T13:45:00Z"
],
"market": "tradfi",
"markets_in_plan": [
"<string>"
],
"supported_crypto": [
"BTC",
"ETH",
"HYPE",
"SOL",
"XRP"
],
"supported_tradfi": [
"QQQ",
"SPX",
"SPY"
],
"rate_limit": {
"limit": 500,
"remaining": 487,
"reset": "2026-04-15T00:00:00+00:00"
}
}{
"error": "invalid_exchange",
"message": "Exchange 'kraken' is not available.",
"current_tier": "trial",
"valid_exchanges": [
"deribit",
"bybit",
"okx",
"derive",
"combined"
],
"nearest_expirations": [
"2026-10-17",
"2026-10-19"
],
"valid_values": [
"full",
"levels"
],
"max_value": 50,
"max_window_days": 31,
"nearest_timestamps": [
"2026-10-05T20:15:00Z",
"2026-10-05T13:45:00Z"
],
"market": "tradfi",
"markets_in_plan": [
"<string>"
],
"supported_crypto": [
"BTC",
"ETH",
"HYPE",
"SOL",
"XRP"
],
"supported_tradfi": [
"QQQ",
"SPX",
"SPY"
],
"rate_limit": {
"limit": 500,
"remaining": 487,
"reset": "2026-04-15T00:00:00+00:00"
}
}{
"error": "invalid_exchange",
"message": "Exchange 'kraken' is not available.",
"current_tier": "trial",
"valid_exchanges": [
"deribit",
"bybit",
"okx",
"derive",
"combined"
],
"nearest_expirations": [
"2026-10-17",
"2026-10-19"
],
"valid_values": [
"full",
"levels"
],
"max_value": 50,
"max_window_days": 31,
"nearest_timestamps": [
"2026-10-05T20:15:00Z",
"2026-10-05T13:45:00Z"
],
"market": "tradfi",
"markets_in_plan": [
"<string>"
],
"supported_crypto": [
"BTC",
"ETH",
"HYPE",
"SOL",
"XRP"
],
"supported_tradfi": [
"QQQ",
"SPX",
"SPY"
],
"rate_limit": {
"limit": 500,
"remaining": 487,
"reset": "2026-04-15T00:00:00+00:00"
}
}Authorizations
API key prefixed with gex_sk_. Create one in your
account dashboard.
Path Parameters
bybit, deribit, okx, derive, combined or tradfi. all and combined
with a TradFi ticker resolve to tradfi. Venue subsets such as deribit+derive
have no history: 400 history_not_available.
"deribit"
"combined"
"tradfi"
Symbol (case-insensitive), for example BTC or QQQ. Use /coins for the list.
"BTC"
Query Parameters
ISO date or datetime (UTC), inclusive. Default end minus 30 days. Years 2020 to 2100.
"2026-09-01"
ISO date or datetime (UTC), exclusive. Default now, floored to the 15-minute capture grid.
"2026-10-01"
15m (every capture, window up to 31 days), 1h (last capture of each UTC hour,
up to 180 days) or close (last capture of each session, unlimited).
15m, 1h, close The meta.next_cursor of the previous page. Repeat the other parameters.