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 Strategies API
version: '1.30'
servers:
- url: https://apexvol.com
security:
- bearerAuth: []
tags:
- name: Strategies
paths:
/api/mcp/data/analyze-strategy:
post:
description: 'Analyzes custom legs: net premium and Greeks, max profit/loss, breakevens, probability of profit, and the P&L curve. Fetches live spot when stock_price is omitted.
**Request body:** JSON: ticker, legs [{type CALL|PUT, action BUY|SELL, strike, expiration, premium, quantity?, delta?, theta?, vega?, iv?}] — required; stock_price?, name?
**Response shape:**
```json
{
"success": true,
"data": {
"breakevens": [
752.48,
787.52
],
"legs_summary": [
{
"action": "SELL",
"expiration": "2026-10-09",
"iv": 0.1365,
"premium": 6.36,
"quantity": 1,
"strike": 755.0,
"type": "PUT"
},
{
"action": "SELL",
"expiration": "2026-10-09",
"iv": 0.1084,
"premium": 4.785,
"quantity": 1,
"strike": 785.0,
"type": "CALL"
},
{
"action": "BUY",
"expiration": "2026-10-09",
"iv": 0.1062,
"premium": 3.275,
"quantity": 1,
"strike": 790.0,
"type": "CALL"
}
],
"max_loss": -248.0,
"max_profit": 252.0,
"net_delta": -0.0256,
"net_premium": -252.0,
"net_theta": 0.0232,
"net_vega": -0.1904,
"pnl_curve": [
[
600.0,
-248.0
],
[
603.5152,
-248.0
],
[
607.0303,
-248.0
]
],
"probability_of_profit": 41.7,
"risk_reward_ratio": 1.0161,
"stock_price": 770.25,
"strategy_name": "Iron condor from /build-strategy",
"ticker": "SPY"
}
}
```'
operationId: post_analyze_strategy
requestBody:
content:
application/json:
schema:
properties:
expiration:
description: 'The expiration for legs that do not name one. Range: YYYY-MM-DD, a listed expiration. Default: listing nearest 30 days.'
format: date
type: string
legs:
description: 'The legs. A leg without a premium is priced from the live chain (theoretical mid, with its Greeks and IV); a strike not listed on that expiration is a 400 naming the nearest. Range: array of {type CALL|PUT, action BUY|SELL, strike, quantity?, expiration?, premium?, delta?, theta?, vega?, iv?}.'
items:
type: object
type: array
name:
description: 'A label for the result. Range: text.'
type: string
stock_price:
default: live
description: 'Override spot. Range: dollars.'
type: number
ticker:
description: 'The underlying. Range: symbol.'
type: string
required:
- ticker
- legs
type: object
required: true
responses:
'200':
content:
application/json:
schema:
properties:
data:
$ref: '#/components/schemas/PostAnalyzeStrategyResponse'
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: 'Analyzes custom legs: net premium and Greeks, max profit/loss, breakevens…'
tags:
- Strategies
/api/mcp/data/build-strategy:
post:
description: 'Builds a strategy from live chain data. Returns the legs (strike, premium, Greeks) plus full analysis (net premium/Greeks, max profit/loss, breakevens, POP, P&L curve).
**Request body:** JSON: ticker, strategy_type (required); expiration, dte (default 30), width (default 5), target_delta (default 0.30)
**Response shape:**
```json
{
"success": true,
"data": {
"analysis": {
"breakevens": [
750.5426,
784.4574
],
"legs_summary": [
{
"action": "BUY",
"expiration": "2026-10-23",
"iv": 0.1478,
"premium": 5.2712,
"quantity": 1,
"strike": 748.0,
"type": "PUT"
},
{
"action": "SELL",
"expiration": "2026-10-23",
"iv": 0.1415,
"premium": 6.3543,
"quantity": 1,
"strike": 753.0,
"type": "PUT"
},
{
"action": "SELL",
"expiration": "2026-10-23",
"iv": 0.1123,
"premium": 4.1813,
"quantity": 1,
"strike": 782.0,
"type": "CALL"
}
],
"max_loss": -254.26,
"max_profit": 245.74,
"net_delta": -0.023,
"net_premium": -245.74,
"net_theta": 0.0387,
"net_vega": -0.1297,
"pnl_curve": [
[
598.4,
-254.26
],
[
601.8949,
-254.26
],
[
605.3899,
-254.26
]
],
"probability_of_profit": 40.7,
"risk_reward_ratio": 0.9665,
"stock_price": 764.41,
"strategy_name": "Iron Condor",
"ticker": "SPY"
},
"created_at": "2026-09-24T14:43:08.842078",
"legs": [
{
"action": "BUY",
"delta": -0.2496,
"expiration": "2026-10-23",
"iv": 0.1478,
"premium": 5.2712,
"quantity": 1,
"strike": 748.0,
"theta": -0.2281,
"type": "PUT",
"vega": 0.6937
},
{
"action": "SELL",
"delta": -0.3001,
"expiration": "2026-10-23",
"iv": 0.1415,
"premium": 6.3543,
"quantity": 1,
"strike": 753.0,
"theta": -0.2324,
"type": "PUT",
"vega": 0.7404
},
{
"action": "SELL",
"delta": 0.2936,
"expiration": "2026-10-23",
"iv": 0.1123,
"premium": 4.1813,
"quantity": 1,
"strike": 782.0,
"theta": -0.1821,
"type": "CALL",
"vega": 0.7549
}
],
"name": "Iron Condor",
"stock_price": 764.41,
"ticker": "SPY"
}
}
```'
operationId: post_build_strategy
requestBody:
content:
application/json:
schema:
properties:
dte:
default: 30
description: 'Target days to expiration. Range: days.'
type: integer
expiration:
description: 'Expiration; dte is used when absent. Range: YYYY-MM-DD.'
format: date
type: string
strategy_type:
description: 'Which structure. Range: iron_condor, credit_spread, straddle, strangle and others.'
type: string
target_delta:
default: 0.3
description: 'Short-strike delta. Range: 0.05 to 0.50.'
maximum: 0.5
minimum: 0.05
type: number
ticker:
description: 'The underlying. Range: symbol.'
type: string
width:
default: 5
description: 'Wing width. Range: dollars.'
type: number
required:
- ticker
- strategy_type
type: object
required: true
responses:
'200':
content:
application/json:
schema:
properties:
data:
$ref: '#/components/schemas/PostBuildStrategyResponse'
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: Builds a strategy from live chain data
tags:
- Strategies
/api/mcp/data/optimize-strategy:
post:
description: 'Grid-searches strikes (iron_condor and credit_spread) and returns the winning strategy with its analysis.
**Request body:** JSON: ticker, strategy_type (required); target ∈ max_profit | min_loss | risk_reward | probability (default max_profit; other values optimize net credit)
**Response shape:**
```json
{
"success": true,
"data": {
"analysis": {
"breakevens": [
743.435,
793.565
],
"legs_summary": [
{
"action": "SELL",
"expiration": "2026-10-09",
"iv": 0.1433,
"premium": 5.155,
"quantity": 1,
"strike": 749.0,
"type": "PUT"
},
{
"action": "SELL",
"expiration": "2026-10-09",
"iv": 0.1064,
"premium": 3.805,
"quantity": 1,
"strike": 788.0,
"type": "CALL"
},
{
"action": "BUY",
"expiration": "2026-10-09",
"iv": 0.1014,
"premium": 0.985,
"quantity": 1,
"strike": 804.0,
"type": "CALL"
}
],
"max_loss": -1943.5,
"max_profit": 556.5,
"net_delta": -0.0046,
"net_premium": -556.5,
"net_theta": 0.1098,
"net_vega": -0.6744,
"pnl_curve": [
[
579.2,
-1943.5
],
[
583.0949,
-1943.5
],
[
586.9899,
-1943.5
]
],
"probability_of_profit": 49.4,
"risk_reward_ratio": 0.2863,
"stock_price": 770.25,
"strategy_name": "Iron Condor",
"ticker": "SPY"
},
"created_at": "2026-09-08T08:07:39.442751",
"legs": [
{
"action": "SELL",
"delta": -0.2475,
"expiration": "2026-10-09",
"iv": 0.1433,
"premium": 5.155,
"quantity": 1,
"strike": 749.0,
"theta": -0.1721,
"type": "PUT",
"vega": 0.7443
},
{
"action": "SELL",
"delta": 0.2561,
"expiration": "2026-10-09",
"iv": 0.1064,
"premium": 3.805,
"quantity": 1,
"strike": 788.0,
"theta": -0.121,
"type": "CALL",
"vega": 0.7869
},
{
"action": "BUY",
"delta": 0.1014,
"expiration": "2026-10-09",
"iv": 0.1014,
"premium": 0.985,
"quantity": 1,
"strike": 804.0,
"theta": -0.0655,
"type": "CALL",
"vega": 0.4502
}
],
"name": "Iron Condor",
"optimization_target": "max_profit",
"stock_price": 770.25,
"ticker": "SPY"
}
}
```'
operationId: post_optimize_strategy
requestBody:
content:
application/json:
schema:
properties:
strategy_type:
description: 'Which structure. Range: iron_condor or credit_spread.'
enum:
- iron_condor
- credit_spread
type: string
target:
default: max_profit
description: 'What to optimize. Range: max_profit, min_loss, risk_reward, probability.'
enum:
- max_profit
- min_loss
- risk_reward
- probability
type: string
ticker:
description: 'The underlying. Range: symbol.'
type: string
required:
- ticker
- strategy_type
type: object
required: true
responses:
'200':
content:
application/json:
schema:
properties:
data:
$ref: '#/components/schemas/PostOptimizeStrategyResponse'
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: Grid-searches strikes (iron_condor and credit_spread) and returns the winning…
tags:
- Strategies
/api/mcp/data/pop:
post:
description: 'Probability of profit for a set of option legs (N(d2)-based).
**Request body:** JSON body: legs (required: option_type, action, strike, iv, premium, quantity) · stock_price (required) · days_to_exp (required)
**Response shape:**
```json
{
"success": true,
"data": {
"legs_count": 4,
"probability_of_profit": 41.7
}
}
```'
operationId: post_pop
requestBody:
content:
application/json:
schema:
properties:
days_to_exp:
description: 'Days to expiration. Range: days.'
type: integer
legs:
description: 'The legs. Range: array of {option_type, action, strike, iv, premium, quantity}.'
items:
type: object
type: array
stock_price:
description: 'Spot. Range: dollars.'
type: number
required:
- legs
- stock_price
- days_to_exp
type: object
required: true
responses:
'200':
content:
application/json:
schema:
properties:
data:
$ref: '#/components/schemas/PostPopResponse'
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: Probability of profit for a set of option legs (N(d2)-based)
tags:
- Strategies
/api/mcp/data/simulate-chain:
post:
description: 'Black-Scholes what-if: re-price a chain at a hypothetical stock price, DTE, and IV shift. Pass chain rows from GET /chain, or just ticker (+ optional expiration) and the server fetches the chain.
**Request body:** JSON body: sim_price (required) · sim_dte (required) · iv_adjustment (percent, default 0) · chain (rows, optional) · ticker/expiration (used when chain omitted) · strikes_around (default 20)
**Response shape:**
```json
{
"success": true,
"data": {
"chain": [
{
"Call Ask": 17.7104,
"Call Bid": 17.6704,
"Delta Call": 0.9877,
"Delta Put": -0.0188,
"Gamma Call": 0.004,
"Gamma Put": 0.0053,
"IV Call": 0.0612,
"IV Put": 0.0663,
"IVx Call": 0.1324,
"IVx Put": 0.0076,
"Put Ask": 0.0694,
"Put Bid": 0.0494,
"Strike": 769.0,
"Theta Call": -0.112,
"Theta Put": -0.0179,
"Vega Call": 0.0414,
"Vega Put": 0.0599
},
{
"Call Ask": 16.7084,
"Call Bid": 16.6884,
"Delta Call": 0.9852,
"Delta Put": -0.0222,
"Gamma Call": 0.0048,
"Gamma Put": 0.0063,
"IV Call": 0.0596,
"IV Put": 0.0646,
"IVx Call": 0.1334,
"IVx Put": 0.0089,
"Put Ask": 0.0796,
"Put Bid": 0.0596,
"Strike": 770.0,
"Theta Call": -0.1137,
"Theta Put": -0.0199,
"Vega Call": 0.0486,
"Vega Put": 0.0688
},
{
"Call Ask": 15.7199,
"Call Bid": 15.6999,
"Delta Call": 0.9816,
"Delta Put": -0.0282,
"Gamma Call": 0.0059,
"Gamma Put": 0.0078,
"IV Call": 0.0584,
"IV Put": 0.0639,
"IVx Call": 0.1349,
"IVx Put": 0.0115,
"Put Ask": 0.1005,
"Put Bid": 0.0805,
"Strike": 771.0,
"Theta Call": -0.116,
"Theta Put": -0.024,
"Vega Call": 0.0586,
"Vega Put": 0.0841
}
],
"expiration": "2026-09-08",
"iv_adjustment": 5,
"sim_dte": 10,
"sim_price": 785.65
}
}
```'
operationId: post_simulate_chain
requestBody:
content:
application/json:
schema:
properties:
chain:
description: 'Rows to re-price. Range: rows from /chain.'
type: string
expiration:
default: nearest
description: 'Which expiration to fetch. Range: YYYY-MM-DD.'
format: date
type: string
iv_adjustment:
default: 0
description: 'Shift applied to every IV. Range: IV points.'
type: number
sim_dte:
description: 'Days to expiration in the scenario. Range: days.'
type: integer
sim_price:
description: 'Hypothetical spot. Range: dollars.'
type: number
strikes_around:
default: 20
description: 'Strikes per side. Range: 0 for all.'
type: integer
ticker:
description: 'Fetch the chain when rows are omitted. Range: symbol.'
type: string
required:
- sim_price
- sim_dte
type: object
required: true
responses:
'200':
content:
application/json:
schema:
properties:
data:
$ref: '#/components/schemas/PostSimulateChainResponse'
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: 'Black-Scholes what-if: re-price a chain at a hypothetical stock price, DTE, and…'
tags:
- Strategies
components:
schemas:
PostSimulateChainResponse:
properties:
chain:
items:
properties:
Call Ask:
type: number
Call Bid:
type: number
Delta Call:
type: number
Delta 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
Put Ask:
type: number
Put Bid:
type: number
Strike:
type: number
Theta Call:
type: number
Theta Put:
type: number
Vega Call:
type: number
Vega Put:
type: number
type: object
type: array
expiration:
type: string
iv_adjustment:
type: integer
sim_dte:
type: integer
sim_price:
type: number
type: object
PostAnalyzeStrategyResponse:
properties:
breakevens:
items:
type: number
type: array
legs_summary:
items:
properties:
action:
type: string
expiration:
type: string
iv:
type: number
premium:
type: number
quantity:
type: integer
strike:
type: number
type:
type: string
type: object
type: array
max_loss:
type: number
max_profit:
type: number
net_delta:
type: number
net_premium:
type: number
net_theta:
type: number
net_vega:
type: number
pnl_curve:
items:
items:
type: number
type: array
type: array
probability_of_profit:
type: number
risk_reward_ratio:
type: number
stock_price:
type: number
strategy_name:
type: string
ticker:
type: string
type: object
PostOptimizeStrategyResponse:
properties:
analysis:
properties:
breakevens:
items:
type: number
type: array
legs_summary:
items:
properties:
action:
type: string
expiration:
type: string
iv:
type: number
premium:
type: number
quantity:
type: integer
strike:
type: number
type:
type: string
type: object
type: array
max_loss:
type: number
max_profit:
type: number
net_delta:
type: number
net_premium:
type: number
net_theta:
type: number
net_vega:
type: number
pnl_curve:
items:
items:
type: number
type: array
type: array
probability_of_profit:
type: number
risk_reward_ratio:
type: number
stock_price:
type: number
strategy_name:
type: string
ticker:
type: string
type: object
created_at:
type: string
legs:
items:
properties:
action:
type: string
delta:
type: number
expiration:
type: string
iv:
type: number
premium:
type: number
quantity:
type: integer
strike:
type: number
theta:
type: number
type:
type: string
vega:
type: number
type: object
type: array
name:
type: string
optimization_target:
type: string
stock_price:
type: number
ticker:
type: string
type: object
PostBuildStrategyResponse:
properties:
analysis:
properties:
breakevens:
items:
type: number
type: array
legs_summary:
items:
properties:
action:
type: string
expiration:
type: string
iv:
type: number
premium:
type: number
quantity:
type: integer
strike:
type: number
type:
type: string
type: object
type: array
max_loss:
type: number
max_profit:
type: number
net_delta:
type: number
net_premium:
type: number
net_theta:
type: number
net_vega:
type: number
pnl_curve:
items:
items:
type: number
type: array
type: array
probability_of_profit:
type: number
risk_reward_ratio:
type: number
stock_price:
type: number
strategy_name:
type: string
ticker:
type: string
type: object
created_at:
type: string
legs:
items:
properties:
action:
type: string
delta:
type: number
expiration:
type: string
iv:
type: number
premium:
type: number
quantity:
type: integer
strike:
type: number
theta:
type: number
type:
type: string
vega:
type: number
type: object
type: array
name:
type: string
stock_price:
type: number
ticker:
type: string
type: object
PostPopResponse:
properties:
legs_count:
type: integer
probability_of_profit:
type: number
type: object
securitySchemes:
bearerAuth:
description: ApexVol API token (avmcp_...) from apexvol.com/account, API Access.
scheme: bearer
type: http