Every API here is available over the APIs.io API and to AI agents over MCP.
openapi: 3.2.0
info:
description: 'Options-analytics API (token surface). Auth: `Authorization: Bearer avmcp_` on every request; tokens are issued to any paid or trial plan from Basic, and each endpoint follows the same tier as the web app. Rate limits: 60/min and 1,000/hr per token, plus a monthly allowance per account measured in upstream data requests, by plan. The remaining counts come back in the X-RateLimit-* and X-Monthly-Budget-Remaining headers on every response, and GET /api/mcp/data/me/usage returns the month''s meter with a per-endpoint breakdown. IV values are percentage points unless a payload says otherwise (`iv_units`). The same endpoints power the ApexVol MCP server for AI assistants: `pipx install apexvol-mcp` (PyPI), setup at https://apexvol.com/mcp. Docs: https://apexvol.com/docs/api.'
title: ApexVol Options chain API
version: '1.30'
servers:
- url: https://apexvol.com
security:
- bearerAuth: []
tags:
- name: Options chain
paths:
/api/mcp/data/chain-at-time/{ticker}:
get:
description: 'Historical EOD chain snapshot for a past trade date — how the chain was priced on that day.
**Query parameters:** expiration (required, YYYY-MM-DD) · trade_date (required, YYYY-MM-DD)
**Response shape:**
```json
{
"success": true,
"data": {
"calls": [
{
"ask": 4.75,
"bid": 4.69,
"delta": 0.5747,
"epsilon": -0.0857,
"expiration": "2026-08-21",
"gamma": 0.0436,
"implied_vol": 0.0895,
"open_interest": 54326,
"rho": 0.0848,
"right": "C",
"strike": 775,
"theta": -0.3008,
"underlying_price": 776.07,
"vega": 0.4203,
"volume": 6045
},
{
"ask": 4.14,
"bid": 4.12,
"delta": 0.5315,
"epsilon": -0.0792,
"expiration": "2026-08-21",
"gamma": 0.0452,
"implied_vol": 0.0885,
"open_interest": 5227,
"rho": 0.0785,
"right": "C",
"strike": 776,
"theta": -0.2954,
"underlying_price": 776.07,
"vega": 0.4277,
"volume": 8446
},
{
"ask": 3.59,
"bid": 3.57,
"delta": 0.486,
"epsilon": -0.0724,
"expiration": "2026-08-21",
"gamma": 0.0462,
"implied_vol": 0.0874,
"open_interest": 5722,
"rho": 0.0718,
"right": "C",
"strike": 777,
"theta": -0.2877,
"underlying_price": 776.07,
"vega": 0.427,
"volume": 15012
}
],
"expiration": "2026-08-21",
"puts": [
{
"ask": 3.13,
"bid": 3.12,
"delta": -0.4253,
"epsilon": -0.0857,
"expiration": "2026-08-21",
"gamma": 0.0436,
"implied_vol": 0.09,
"open_interest": 6989,
"rho": -0.0637,
"right": "P",
"strike": 775,
"theta": -0.3008,
"underlying_price": 776.07,
"vega": 0.4203,
"volume": 17977
},
{
"ask": 3.55,
"bid": 3.53,
"delta": -0.4685,
"epsilon": -0.0792,
"expiration": "2026-08-21",
"gamma": 0.0452,
"implied_vol": 0.0889,
"open_interest": 1969,
"rho": -0.0702,
"right": "P",
"strike": 776,
"theta": -0.2954,
"underlying_price": 776.07,
"vega": 0.4277,
"volume": 8064
},
{
"ask": 4.0,
"bid": 3.98,
"delta": -0.514,
"epsilon": -0.0724,
"expiration": "2026-08-21",
"gamma": 0.0462,
"implied_vol": 0.0877,
"open_interest": 2999,
"rho": -0.0771,
"right": "P",
"strike": 777,
"theta": -0.2877,
"underlying_price": 776.07,
"vega": 0.427,
"volume": 8247
}
],
"ticker": "SPY",
"time_of_day": "EOD",
"trade_date": "2026-08-14",
"underlying_price": 776.07
}
}
```'
operationId: get_chain_at_time_by_ticker
parameters:
- in: path
name: ticker
required: true
schema:
type: string
- description: 'The expiration to fetch. Range: YYYY-MM-DD.'
in: query
name: expiration
required: true
schema:
format: date
type: string
- description: 'The day whose close to use. Range: YYYY-MM-DD, a past trading day.'
in: query
name: trade_date
required: true
schema:
format: date
type: string
- description: 'Strikes kept each side of spot under compact detail (0 keeps every strike). Range: 0 to 500.'
in: query
name: strikes_around
required: false
schema:
default: 20
maximum: 500
minimum: 0
type: integer
responses:
'200':
content:
application/json:
schema:
properties:
data:
$ref: '#/components/schemas/GetChainAtTimeByTickerResponse'
success:
type: boolean
type: object
description: 'Success: payload under `data` with `success: true`.'
'400':
description: A parameter is malformed; the error names it.
'401':
description: Missing, invalid, expired or revoked token.
'403':
description: The endpoint needs a higher plan than the token's owner has (required_tier in the body).
'404':
description: Unknown path (did_you_mean in the body) or a symbol with no listed options.
'424':
description: The data feed did not answer for this symbol; retry.
'429':
description: Per-token rate limit or the monthly allowance (budget_exceeded). Retry-After says how long, in seconds.
summary: Historical EOD chain snapshot for a past trade date — how the chain was priced…
tags:
- Options chain
/api/mcp/data/chain/{ticker}:
get:
description: 'Formatted options chain(s). {ticker, stock_price, expirations, chains, strike_window}. Defaults to the nearest expiration and a near-the-money strike window; strike_window.truncated tells you when rows were trimmed.
**Query parameters:** expiration (optional, YYYY-MM-DD; overrides num_expirations) · num_expirations (optional, default 1, max 10) · strikes_around (optional, default 20 strikes per side of the money; 0 = full chain)
**Response shape:**
```json
{
"success": true,
"data": {
"chains": {
"2026-09-09": [
{
"Call Ask": 4.55,
"Call Bid": 4.45,
"Delta Call": 0.6607,
"Delta Put": -0.3393,
"Epsilon Call": -0.0208,
"Epsilon Put": -0.0208,
"Extrinsic Call": 1.7,
"Extrinsic Put": 1.62,
"Gamma Call": 0.0509,
"Gamma Put": 0.0509,
"IV Call": 0.266,
"IV Put": 0.2645,
"IVx Call": 0.7382,
"IVx Put": 1.9192,
"OI Call": 5032,
"OI Put": 1774,
"Put Ask": 1.64,
"Put Bid": 1.61,
"Rho Call": 0.0202,
"Rho Put": -0.0109,
"Strike": 227.5,
"Theta Call": -0.2734,
"Theta Put": -0.2734,
"Vega Call": 0.1003,
"Vega Put": 0.1003,
"Volume Call": 5829,
"Volume Put": 17517
},
{
"Call Ask": 3.0,
"Call Bid": 2.92,
"Delta Call": 0.5266,
"Delta Put": -0.4734,
"Epsilon Call": -0.0166,
"Epsilon Put": -0.0166,
"Extrinsic Call": 2.66,
"Extrinsic Put": 2.62,
"Gamma Call": 0.0568,
"Gamma Put": 0.0568,
"IV Call": 0.258,
"IV Put": 0.2594,
"IVx Call": 1.155,
"IVx Put": 1.2679,
"OI Call": 20341,
"OI Put": 1454,
"Put Ask": 2.65,
"Put Bid": 2.58,
"Rho Call": 0.0162,
"Rho Put": -0.0153,
"Strike": 230.0,
"Theta Call": -0.2871,
"Theta Put": -0.2871,
"Vega Call": 0.1074,
"Vega Put": 0.1074,
"Volume Call": 34581,
"Volume Put": 35665
},
{
"Call Ask": 1.85,
"Call Bid": 1.81,
"Delta Call": 0.3856,
"Delta Put": -0.6144,
"Epsilon Call": -0.0122,
"Epsilon Put": -0.0122,
"Extrinsic Call": 1.83,
"Extrinsic Put": 1.75,
"Gamma Call": 0.0552,
"Gamma Put": 0.0552,
"IV Call": 0.2561,
"IV Put": 0.254,
"IVx Call": 1.7499,
"IVx Put": 0.7599,
"OI Call": 7568,
"OI Put": 226,
"Put Ask": 4.0,
"Put Bid": 3.9,
"Rho Call": 0.0119,
"Rho Put": -0.0199,
"Strike": 232.5,
"Theta Call": -0.2719,
"Theta Put": -0.2719,
"Vega Call": 0.1021,
"Vega Put": 0.1021,
"Volume Call": 46211,
"Volume Put": 24057
}
]
},
"data_type": "LIVE",
"expirations": [
"2026-09-09"
],
"stock_price": 230.3,
"strike_window": {
"note": "Chain trimmed to strikes nearest the money; pass strikes_around=0 for the full chain.",
"strikes_around": 20,
"truncated": true
},
"ticker": "NVDA"
}
}
```'
operationId: get_chain_by_ticker
parameters:
- in: path
name: ticker
required: true
schema:
type: string
- description: 'Which expiration to use. Defaults to the nearest one. Range: YYYY-MM-DD, a listed expiration.'
in: query
name: expiration
required: false
schema:
default: nearest
format: date
type: string
- description: 'How many expirations when expiration is not set. Range: 1 to 10.'
in: query
name: num_expirations
required: false
schema:
default: 1
maximum: 10
minimum: 1
type: integer
- description: 'Strikes per side of the money to keep. Range: 0 for the full chain.'
in: query
name: strikes_around
required: false
schema:
default: 20
type: integer
responses:
'200':
content:
application/json:
schema:
properties:
data:
$ref: '#/components/schemas/GetChainByTickerResponse'
success:
type: boolean
type: object
description: 'Success: payload under `data` with `success: true`.'
'400':
description: A parameter is malformed; the error names it.
'401':
description: Missing, invalid, expired or revoked token.
'403':
description: The endpoint needs a higher plan than the token's owner has (required_tier in the body).
'404':
description: Unknown path (did_you_mean in the body) or a symbol with no listed options.
'424':
description: The data feed did not answer for this symbol; retry.
'429':
description: Per-token rate limit or the monthly allowance (budget_exceeded). Retry-After says how long, in seconds.
summary: Formatted options chain(s)
tags:
- Options chain
/api/mcp/data/expirations/{ticker}:
get:
description: 'Available expiration dates.
**Query parameters:** —
**Response shape:**
```json
{
"success": true,
"data": {
"expirations": [
"2026-09-09",
"2026-09-11",
"2026-09-14"
]
}
}
```'
operationId: get_expirations_by_ticker
parameters:
- in: path
name: ticker
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
properties:
data:
$ref: '#/components/schemas/GetExpirationsByTickerResponse'
success:
type: boolean
type: object
description: 'Success: payload under `data` with `success: true`.'
'400':
description: A parameter is malformed; the error names it.
'401':
description: Missing, invalid, expired or revoked token.
'403':
description: The endpoint needs a higher plan than the token's owner has (required_tier in the body).
'404':
description: Unknown path (did_you_mean in the body) or a symbol with no listed options.
'424':
description: The data feed did not answer for this symbol; retry.
'429':
description: Per-token rate limit or the monthly allowance (budget_exceeded). Retry-After says how long, in seconds.
summary: Available expiration dates
tags:
- Options chain
/api/mcp/data/options-by-delta/{ticker}:
get:
description: 'The contract closest to a target delta: strike, actual delta, IV, bid/ask/mid. iv is the chain row''s decimal (0.2592) and is declared as iv_units: decimal; iv_pct carries the same value in percentage points (25.92).
**Query parameters:** delta (default 0.30), option_type ∈ call | put (default call), expiration (optional)
**Response shape:**
```json
{
"success": true,
"data": {
"actual_delta": 0.2609,
"ask": 1.08,
"bid": 1.05,
"expiration": "2026-09-09",
"iv": 0.2569,
"iv_pct": 25.69,
"iv_units": "decimal",
"mid": 1.065,
"option_type": "call",
"stock_price": 230.3,
"strike": 235.0,
"target_delta": 0.3,
"ticker": "NVDA"
}
}
```'
operationId: get_options_by_delta_by_ticker
parameters:
- in: path
name: ticker
required: true
schema:
type: string
- description: 'Target absolute delta. Range: 0.01 to 0.99.'
in: query
name: delta
required: false
schema:
default: 0.3
maximum: 0.99
minimum: 0.01
type: number
- description: 'Which side. Range: call or put.'
in: query
name: option_type
required: false
schema:
default: call
enum:
- call
- put
type: string
- description: 'Which expiration to use. Defaults to the nearest one. Range: YYYY-MM-DD, a listed expiration.'
in: query
name: expiration
required: false
schema:
default: nearest
format: date
type: string
responses:
'200':
content:
application/json:
schema:
properties:
data:
$ref: '#/components/schemas/GetOptionsByDeltaByTickerResponse'
success:
type: boolean
type: object
description: 'Success: payload under `data` with `success: true`.'
'400':
description: A parameter is malformed; the error names it.
'401':
description: Missing, invalid, expired or revoked token.
'403':
description: The endpoint needs a higher plan than the token's owner has (required_tier in the body).
'404':
description: Unknown path (did_you_mean in the body) or a symbol with no listed options.
'424':
description: The data feed did not answer for this symbol; retry.
'429':
description: Per-token rate limit or the monthly allowance (budget_exceeded). Retry-After says how long, in seconds.
summary: 'The contract closest to a target delta: strike, actual delta, IV, bid/ask/mid'
tags:
- Options chain
/api/mcp/data/search:
get:
description: 'Ticker search / validation over the platform''s coverage universe — resolve company names to symbols and check support before deeper calls.
**Query parameters:** q (required) · limit (default 8, max 20)
**Response shape:**
```json
{
"success": true,
"data": {
"count": 1,
"exact_match": null,
"query": "nvidia",
"results": [
{
"market_cap_tier": "Mega Cap",
"name": "NVIDIA Corporation",
"sector": "Technology",
"symbol": "NVDA"
}
],
"supported": false
}
}
```'
operationId: get_search
parameters:
- description: 'Company name or symbol fragment. Range: text.'
in: query
name: q
required: true
schema:
type: string
- description: 'Maximum matches. Range: 1 to 20.'
in: query
name: limit
required: false
schema:
default: 8
maximum: 20
minimum: 1
type: integer
responses:
'200':
content:
application/json:
schema:
properties:
data:
$ref: '#/components/schemas/GetSearchResponse'
success:
type: boolean
type: object
description: 'Success: payload under `data` with `success: true`.'
'400':
description: A parameter is malformed; the error names it.
'401':
description: Missing, invalid, expired or revoked token.
'403':
description: The endpoint needs a higher plan than the token's owner has (required_tier in the body).
'404':
description: Unknown path (did_you_mean in the body) or a symbol with no listed options.
'424':
description: The data feed did not answer for this symbol; retry.
'429':
description: Per-token rate limit or the monthly allowance (budget_exceeded). Retry-After says how long, in seconds.
summary: Ticker search / validation over the platform's coverage universe — resolve…
tags:
- Options chain
/api/mcp/data/stock/{ticker}:
get:
description: 'Current price (live quote mid) and company stats. Carries company_name from the coverage registry when the ticker is known; bid/ask are not part of this payload (price is the mid of the nearest-expiration parity quote).
**Query parameters:** —
**Response shape:**
```json
{
"success": true,
"data": {
"beta": "1.93",
"company_name": "NVIDIA Corporation",
"earnings_date": null,
"industry": "Technology",
"market_cap": "$5.56T",
"price": 230.3,
"sector": "Technology",
"volume": "6,443,150"
}
}
```'
operationId: get_stock_by_ticker
parameters:
- in: path
name: ticker
required: true
schema:
type: string
responses:
'200':
content:
application/json:
schema:
properties:
data:
$ref: '#/components/schemas/GetStockByTickerResponse'
success:
type: boolean
type: object
description: 'Success: payload under `data` with `success: true`.'
'400':
description: A parameter is malformed; the error names it.
'401':
description: Missing, invalid, expired or revoked token.
'403':
description: The endpoint needs a higher plan than the token's owner has (required_tier in the body).
'404':
description: Unknown path (did_you_mean in the body) or a symbol with no listed options.
'424':
description: The data feed did not answer for this symbol; retry.
'429':
description: Per-token rate limit or the monthly allowance (budget_exceeded). Retry-After says how long, in seconds.
summary: Current price (live quote mid) and company stats
tags:
- Options chain
components:
schemas:
GetChainAtTimeByTickerResponse:
properties:
calls:
items:
properties:
ask:
type: number
bid:
type: number
delta:
type: number
epsilon:
type: number
expiration:
type: string
gamma:
type: number
implied_vol:
type: number
open_interest:
type: integer
rho:
type: number
right:
type: string
strike:
type: integer
theta:
type: number
underlying_price:
type: number
vega:
type: number
volume:
type: integer
type: object
type: array
expiration:
type: string
puts:
items:
properties:
ask:
type: number
bid:
type: number
delta:
type: number
epsilon:
type: number
expiration:
type: string
gamma:
type: number
implied_vol:
type: number
open_interest:
type: integer
rho:
type: number
right:
type: string
strike:
type: integer
theta:
type: number
underlying_price:
type: number
vega:
type: number
volume:
type: integer
type: object
type: array
ticker:
type: string
time_of_day:
type: string
trade_date:
type: string
underlying_price:
type: number
type: object
GetStockByTickerResponse:
properties:
beta:
type: string
company_name:
type: string
earnings_date:
type:
- string
- 'null'
industry:
type: string
market_cap:
type: string
price:
type: number
sector:
type: string
volume:
type: string
type: object
GetSearchResponse:
properties:
count:
type: integer
exact_match:
type:
- string
- 'null'
query:
type: string
results:
items:
properties:
market_cap_tier:
type: string
name:
type: string
sector:
type: string
symbol:
type: string
type: object
type: array
supported:
type: boolean
type: object
GetChainByTickerResponse:
properties:
chains:
properties:
'2026-09-09':
items:
properties:
Call Ask:
type: number
Call Bid:
type: number
Delta Call:
type: number
Delta Put:
type: number
Epsilon Call:
type: number
Epsilon Put:
type: number
Extrinsic Call:
type: number
Extrinsic Put:
type: number
Gamma Call:
type: number
Gamma Put:
type: number
IV Call:
type: number
IV Put:
type: number
IVx Call:
type: number
IVx Put:
type: number
OI Call:
type: integer
OI Put:
type: integer
Put Ask:
type: number
Put Bid:
type: number
Rho Call:
type: number
Rho Put:
type: number
Strike:
type: number
Theta Call:
type: number
Theta Put:
type: number
Vega Call:
type: number
Vega Put:
type: number
Volume Call:
type: integer
Volume Put:
type: integer
type: object
type: array
type: object
data_type:
type: string
expirations:
items:
type: string
type: array
stock_price:
type: number
strike_window:
properties:
note:
type: string
strikes_around:
type: integer
truncated:
type: boolean
type: object
ticker:
type: string
type: object
GetOptionsByDeltaByTickerResponse:
properties:
actual_delta:
type: number
ask:
type: number
bid:
type: number
expiration:
type: string
iv:
type: number
iv_pct:
type: number
iv_units:
type: string
mid:
type: number
option_type:
type: string
stock_price:
type: number
strike:
type: number
target_delta:
type: number
ticker:
type: string
type: object
GetExpirationsByTickerResponse:
properties:
expirations:
items:
type: string
type: array
type: object
securitySchemes:
bearerAuth:
description: ApexVol API token (avmcp_...) from apexvol.com/account, API Access.
scheme: bearer
type: http