Every API here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for apis
7 MCP tools reach this
find_apisBrowse and filter every API in the catalog.
get_api_artifactsOne API's artifacts, grouped by type.
get_openapiThe primary OpenAPI for this API.
find_similar_apisAPIs that look like this one.
apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
resolveTurn a domain, URL or GitHub org into the provider it belongs to.
find_cohortsEvery scored population of providers in the catalog.
All 92 tools →
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/gammaflip-io:gammaflip-io-data-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we
store it to create your key and to recognise you if you sign in with another
provider. See our Privacy Policy and
Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: GammaFlip GEX Data API
version: 1.0.0
description: 'Programmatic access to Gamma Exposure (GEX) data for crypto options
(Bybit, Deribit, OKX, Derive, Binance) and US options (the `tradfi` exchange).
API access is a plan entitlement (`api_access`). The trial includes it
(50 requests/day); other plans with API access get 500 requests/day.
Only `/gex/...`, `/levels/...` and the `/history/...` query endpoints count
against the quota; `/exchanges`, `/coins`, `/expirations/...`, `/me` and
`/history/coverage` are free. History file downloads use a separate daily
bucket of file credits (trial 20, other plans 200). A `429` carries no
`Retry-After` header: use `X-RateLimit-Reset`, `X-History-Files-Reset` or `/me`.
All GEX values are USD per 1% move of the underlying. Field definitions:
https://docs.gammaflip.io/data-dictionary'
contact:
name: GammaFlip Support
email: admin@gammaflip.io
url: https://gammaflip.io
servers:
- url: https://api.gammaflip.io/api/v1
description: Production
security:
- ApiKeyAuth: []
tags:
- name: Data
paths:
/levels/{exchange}/{coin}:
get:
operationId: getLevels
summary: Levels for the latest snapshot
description: 'Where are we now: flip, regime, walls, totals, stability and volatility levels,
max pain and ATM IV for the latest snapshot, as one flat object. Small payload,
the first call for a script or an LLM agent. Counts as 1 request.'
tags:
- Data
parameters:
- $ref: '#/components/parameters/Exchange'
- $ref: '#/components/parameters/Coin'
- name: expiration
in: query
required: false
description: '`TOTAL` (default), an expiration code (`17OCT26`) or an ISO date (`2026-10-17`).'
schema:
type: string
default: TOTAL
- name: compare
in: query
required: false
description: 'Comma-separated `1d`, `7d`, `30d`. Adds `data.compare` with, for each period, the
last stored capture on or before the session date N days ago and its deltas to the
live levels. `TOTAL` only; venue subsets have no history. The reference date is
the New York date for TradFi and the UTC date for crypto.
'
schema:
type: string
example: 1d,7d,30d
responses:
'200':
description: Levels
content:
application/json:
schema:
type: object
required:
- data
- meta
properties:
data:
allOf:
- $ref: '#/components/schemas/Levels'
- type: object
properties:
expiration:
type: string
example: TOTAL
expiration_iso:
type:
- string
- 'null'
compare:
type: object
description: 'Only with `?compare=`. One key per requested period; `null` when
there is no history that far back. Each value is a history row plus
`delta` (live minus past for `spot`, `flip`, `net_gex`, `abs_gex`,
`p1_strike`, `n1_strike`, `s_price`, `v_price`; `null` when missing).
'
additionalProperties:
oneOf:
- type: 'null'
- allOf:
- $ref: '#/components/schemas/HistoryLevelsRow'
- type: object
properties:
delta:
type: object
additionalProperties:
type:
- number
- 'null'
meta:
$ref: '#/components/schemas/DataMeta'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
description: No data available
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
$ref: '#/components/responses/RateLimited'
'503':
description: TradFi data temporarily unavailable (`market_unavailable`)
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
/gex/term-oi/{exchange}/{coin}:
get:
operationId: getTermOi
summary: GEX term structure and Open Interest
description: 'Returns OI and GEX per expiration date, broken down by exchange.
Use `all` as `exchange` to get aggregated data across all exchanges.
This is the most common endpoint for building term-structure dashboards.
Counts as 1 request.'
tags:
- Data
parameters:
- $ref: '#/components/parameters/Exchange'
- $ref: '#/components/parameters/Coin'
responses:
'200':
description: Term structure data
content:
application/json:
schema:
type: object
required:
- data
- meta
properties:
data:
type: object
meta:
$ref: '#/components/schemas/DataMeta'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
description: No data available for this coin/exchange
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
$ref: '#/components/responses/RateLimited'
'503':
description: TradFi data temporarily unavailable (`market_unavailable`)
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
/gex/by-strike-enhanced/{exchange}/{coin}/{expiration}:
get:
operationId: getByStrikeEnhanced
summary: GEX by strike with key markers
description: 'Returns GEX data broken down by strike price, plus key markers (gamma flip, max
pain, positive/negative walls, max-volatility and max-stability price levels, spot
reference, aggregate totals) and a flat `levels` object.
Pass `TOTAL` as `expiration` to get all expirations combined. Use `view=levels`
for a compact response without per-strike arrays, or `range_pct` to trim the
strike arrays around spot. Counts as 1 request.'
tags:
- Data
parameters:
- $ref: '#/components/parameters/Exchange'
- $ref: '#/components/parameters/Coin'
- name: expiration
in: path
required: true
description: Expiration in `DDMMMYY` format (e.g., `25APR26`), an ISO date (`2026-04-25`) or `TOTAL` for all expirations.
schema:
type: string
example: 25APR26
- $ref: '#/components/parameters/View'
- $ref: '#/components/parameters/RangePct'
responses:
'200':
description: GEX by strike data
content:
application/json:
schema:
type: object
required:
- data
- meta
properties:
data:
type: object
description: 'With `view=full`: `gex_data`, `markers`, `metadata` and `levels`.
With `view=levels`: `levels` and `metadata` only.
'
properties:
levels:
$ref: '#/components/schemas/Levels'
meta:
$ref: '#/components/schemas/DataMeta'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
'404':
description: No data available
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
'429':
$ref: '#/components/responses/RateLimited'
'503':
description: TradFi data temporarily unavailable (`market_unavailable`)
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
components:
schemas:
HistoryLevelsRow:
type: object
description: 'One stored `TOTAL` snapshot. `type` is `close` only for the last capture of a
completed session. `oi_date` is the session whose open interest the row used.
The levels fields follow the `Levels` schema (`max_pain` is `null` for `TOTAL`, so always `null` in the levels series;
a single-expiration snapshot may set it).
'
allOf:
- type: object
properties:
schema_version:
type: integer
example: 1
timestamp_utc:
type: string
format: date-time
example: '2026-10-05T20:15:00Z'
session_date:
type: string
format: date
description: UTC date (crypto) or New York trading date (TradFi).
example: '2026-10-05'
type:
type: string
enum:
- intraday
- close
exchange:
type: string
example: tradfi
symbol:
type: string
example: QQQ
oi_date:
type:
- string
- 'null'
format: date
description: Session whose open interest was used.
example: '2026-10-02'
- $ref: '#/components/schemas/Levels'
DataMeta:
type: object
description: 'Self-describing `meta` of data responses (`/levels`, `/gex/...`). Keys are
additive; `exchange`, `coin` and `expiration` keep their existing values.
'
properties:
timestamp:
type: string
format: date-time
example: '2026-10-06T15:15:04.120000+00:00'
exchange:
type: string
description: The exchange as requested (lowercased).
example: all
coin:
type: string
example: QQQ
expiration:
type: string
description: Expiration code as used (`TOTAL` or `DDMMMYY`). Only on expiration-scoped endpoints.
example: TOTAL
expiration_iso:
type:
- string
- 'null'
description: Expiration as `YYYY-MM-DD`; `null` for `TOTAL`.
example: null
exchange_resolved:
type: string
description: Canonical venue after aliasing (`tradfi`, `deribit`, `combined`, `deribit+derive`, ...).
example: tradfi
market:
type: string
enum:
- crypto
- tradfi
symbol:
type: string
example: QQQ
as_of:
type:
- string
- 'null'
format: date-time
description: Time the data reflects. ISO 8601 UTC with `Z`, second precision.
example: '2026-10-06T15:15:00Z'
oi_as_of:
type:
- string
- 'null'
description: Session date (`YYYY-MM-DD`) of the open interest used.
example: '2026-10-05'
data_source:
type:
- string
- 'null'
description: '`live`, `eod`, ... (crypto is always `live`).'
example: live
is_live:
type:
- boolean
- 'null'
market_open:
type:
- boolean
- 'null'
description: Always `true` for crypto.
next_open:
type:
- string
- 'null'
description: Next market open (TradFi); `null` for crypto.
units:
type: string
example: USD per 1% move of the underlying
docs_url:
type: string
example: https://docs.gammaflip.io/data-dictionary
rate_limit:
$ref: '#/components/schemas/RateLimit'
Levels:
type: object
description: 'The levels of one GEX snapshot. GEX values are USD per 1% move of the
underlying; `call_gex` and `put_gex` are non-negative, `net_gex = call_gex - put_gex`.
Missing values are `null`. See the data dictionary.
'
properties:
spot:
type:
- number
- 'null'
description: Underlying price at capture.
flip:
type:
- number
- 'null'
description: Primary gamma-flip price (`flip_points[0]`), the net-gamma sign change nearest to spot.
flip_count:
type: integer
description: Number of zero crossings in the profile.
regime:
type:
- string
- 'null'
enum:
- positive
- negative
- null
description: '`positive` if `spot >= flip`.'
net_gex:
type:
- number
- 'null'
description: Sum of call_gex minus sum of put_gex.
abs_gex:
type:
- number
- 'null'
description: Sum of call_gex plus sum of put_gex.
call_gex:
type:
- number
- 'null'
put_gex:
type:
- number
- 'null'
call_oi_total:
type:
- number
- 'null'
description: Sum of call open interest in contracts.
put_oi_total:
type:
- number
- 'null'
description: Sum of put open interest in contracts.
p1_strike:
type:
- number
- 'null'
description: Strike with the largest positive net GEX.
p1_gex:
type:
- number
- 'null'
p2_strike:
type:
- number
- 'null'
p2_gex:
type:
- number
- 'null'
n1_strike:
type:
- number
- 'null'
description: Strike with the most negative net GEX.
n1_gex:
type:
- number
- 'null'
n2_strike:
type:
- number
- 'null'
n2_gex:
type:
- number
- 'null'
a1_strike:
type:
- number
- 'null'
description: Strike with the largest absolute GEX (call + put).
a1_gex:
type:
- number
- 'null'
a2_strike:
type:
- number
- 'null'
a2_gex:
type:
- number
- 'null'
s_price:
type:
- number
- 'null'
description: Max-stability level, the peak of the net-gamma profile (a price).
s_gex:
type:
- number
- 'null'
v_price:
type:
- number
- 'null'
description: Max-volatility level, the trough of the net-gamma profile (a price).
v_gex:
type:
- number
- 'null'
max_pain:
type:
- number
- 'null'
description: Per-expiration max-pain strike; `null` for TOTAL.
atm_iv:
type:
- number
- 'null'
description: ATM implied volatility as a decimal (0.18 = 18%).
RateLimit:
type: object
properties:
limit:
type: integer
example: 500
remaining:
type: integer
example: 487
reset:
type: string
format: date-time
example: '2026-04-15T00:00:00+00:00'
Error:
type: object
description: 'Standard error body. `error` is a stable slug safe to branch on; `message` is human-readable prose that may change and must not be parsed. Errors are never wrapped in the data/meta envelope used by successful responses. Some errors add hint fields.
'
required:
- error
- message
properties:
error:
type: string
enum:
- unauthorized
- subscription_required
- market_not_in_plan
- rate_limit_exceeded
- invalid_exchange
- invalid_pair
- invalid_expiration
- invalid_param
- no_data
- unsupported_coin
- market_unavailable
- history_not_available
- range_too_large
- no_snapshot
- no_file
- files_unavailable
- history_files_limit_exceeded
- method_not_allowed
example: invalid_exchange
message:
type: string
example: Exchange 'kraken' is not available.
current_tier:
type: string
description: With `subscription_required` and `market_not_in_plan`.
example: trial
valid_exchanges:
type: array
items:
type: string
description: With `invalid_exchange`, `invalid_pair` and `history_not_available`.
example:
- deribit
- bybit
- okx
- derive
- binance
- combined
nearest_expirations:
type: array
items:
type: string
description: With `invalid_expiration`; up to five ISO dates closest to the request (the earliest five if the value is not a date).
example:
- '2026-10-17'
- '2026-10-19'
valid_values:
type: array
items:
type: string
description: With `invalid_param` for `view`, `granularity`, `file` and `compare`.
example:
- full
- levels
max_value:
type: number
description: With `invalid_param` for `range_pct`.
example: 50
max_window_days:
type: integer
description: With `range_too_large`.
example: 31
nearest_timestamps:
type: array
items:
type: string
format: date-time
description: With `no_snapshot`; up to three capture times closest to `at`.
example:
- '2026-10-05T20:15:00Z'
- '2026-10-05T13:45:00Z'
market:
type: string
description: With `market_not_in_plan`; the market the requested coin belongs to.
enum:
- crypto
- tradfi
example: tradfi
markets_in_plan:
type: array
items:
type: string
description: With `market_not_in_plan`.
supported_crypto:
type: array
items:
type: string
description: With `unsupported_coin`; crypto coins listed by at least one exchange.
example:
- BTC
- ETH
- HYPE
- SOL
- XRP
supported_tradfi:
type: array
items:
type: string
description: With `unsupported_coin`; US tickers we track.
example:
- QQQ
- SPX
- SPY
rate_limit:
allOf:
- $ref: '#/components/schemas/RateLimit'
description: With `rate_limit_exceeded` and `history_files_limit_exceeded`; mirrors the X-RateLimit-* headers.
parameters:
RangePct:
name: range_pct
in: query
required: false
description: 'With `view=full`, keep only strikes within +/- this percent of spot in the
per-strike arrays. Number in (0, 50]. No effect with `view=levels`.
'
schema:
type: number
exclusiveMinimum: 0
maximum: 50
Exchange:
name: exchange
in: path
required: true
description: 'Crypto: `bybit`, `deribit`, `okx`, `derive`, `binance`, `all` / `combined`, or a `+`-joined
subset such as `deribit+derive`. TradFi tickers: `tradfi` (`all` and `combined`
are aliases). Use `/exchanges` for the live list.
'
schema:
type: string
examples:
- all
- deribit+derive
- tradfi
View:
name: view
in: query
required: false
description: '`full` (default) returns per-strike arrays, markers and metadata. `levels`
returns only `levels` and `metadata`.
'
schema:
type: string
enum:
- full
- levels
default: full
Coin:
name: coin
in: path
required: true
description: Symbol (case-insensitive), for example `BTC` or `QQQ`. Use `/coins` for the list.
schema:
type: string
example: BTC
responses:
Forbidden:
description: '`subscription_required` (the plan has no API access) or `market_not_in_plan`
(the plan does not include the coin''s market).
'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
Unauthorized:
description: 'Missing or invalid credential, or a credential that does not resolve to a user. Both return `unauthorized`.
'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
BadRequest:
description: '`invalid_exchange`, `invalid_pair`, `invalid_expiration` or `invalid_param`,
with hint fields (`valid_exchanges`, `nearest_expirations`, `valid_values`, `max_value`).
'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
RateLimited:
description: 'Daily rate limit exceeded. No `Retry-After` header is sent: use
`X-RateLimit-Reset` or `GET /me`.
'
headers:
X-RateLimit-Limit:
schema:
type: integer
X-RateLimit-Remaining:
schema:
type: integer
example: 0
X-RateLimit-Reset:
schema:
type: string
format: date-time
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
securitySchemes:
ApiKeyAuth:
type: apiKey
in: header
name: X-API-Key
description: 'API key prefixed with `gex_sk_`. Create one in your
[account dashboard](https://gammaflip.io/account).
'