1. API
  2. Recipes
  3. 0DTE levels

Recipe, one Python file

0DTE levels

Today's SPY expiration: gamma regime, flip, walls, max pain and the expected range, ready to paste on a chart. Reads the 0DTE analytics for SPY and prints the levels a day trader marks first: the net gamma regime, the flip level, the call and put walls, max pain, and the one standard deviation range from the at-the-money straddle. It also prints the feed's IV forecast against the implied figure and the historical hit rate of the expected move.

1Endpoint it calls
ProPlan and above, from $55/mo
2026-09-08Output captured

What it prints

The output,
as captured.

Run against the live API on 2026-09-08 with a real token. Intraday index traders who want the day's levels without opening a dashboard.

python3 zero_dte_levels.pystdout, 2026-09-08
SPY 0DTE 2026-09-08  status LIVE
gamma regime   negative (net -1,331.68)
flip           none
call wall      770.00
put wall       765.00
max pain       770.00
expected range 764.69 to 769.79 (0.33% from the ATM straddle)
ATM IV         15.4%  put/call OI 2.4
IV forecast    IV 5.5pts above the feed's forecast: favor selling
EM hit rate    68.3% over 101 days (reliable)

The script

One file,
requests and nothing else.

Set APEXVOL_API_TOKEN from Account, then API Access, and run it. The token is the only configuration.

zero_dte_levels.pyPython 3.10+, pip install requests
import os
import sys

import requests

# One token, any paid or trial plan: Account, then API Access.
TOKEN = os.environ.get("APEXVOL_API_TOKEN") or sys.exit("set APEXVOL_API_TOKEN")
BASE = os.environ.get("APEXVOL_API_URL", "https://apexvol.com") + "/api/mcp/data"
S = requests.Session()
S.headers["Authorization"] = f"Bearer {TOKEN}"


def get(path, **params):
    r = S.get(BASE + path, params=params, timeout=90)
    body = r.json()
    if not body.get("success"):
        sys.exit(f"{path}: HTTP {r.status_code}: {body.get('error')}")
    return body["data"]


d = get("/zero-dte/SPY", strikes_around=5)
lv = d.get("key_levels") or {}
m = d.get("metrics") or {}
reg = d.get("gamma_regime") or {}
fc = d.get("iv_forecast") or {}
hit = d.get("em_hit_rate") or {}

fmt = lambda v: f"{v:,.2f}" if isinstance(v, (int, float)) else "none"
print(f"SPY 0DTE {d.get('expiration')}  status {d.get('data_status')}")
print(f"gamma regime   {reg.get('regime')} (net {fmt(reg.get('total_net_gex'))})")
print(f"flip           {fmt(lv.get('gamma_flip'))}")
print(f"call wall      {fmt(lv.get('call_wall'))}")
print(f"put wall       {fmt(lv.get('put_wall'))}")
print(f"max pain       {fmt(lv.get('max_pain'))}")
print(f"expected range {fmt(lv.get('em_lower'))} to {fmt(lv.get('em_upper'))} ({m.get('expected_move')}% from the ATM straddle)")
print(f"ATM IV         {m.get('atm_iv')}%  put/call OI {m.get('put_call_ratio')}")
print(f"IV forecast    {fc.get('signal')}")
print(f"EM hit rate    {hit.get('hit_rate')}% over {hit.get('total_days')} days ({hit.get('assessment')})")

How it works

1. One call
GET /zero-dte/SPY?strikes_around=5 keeps the payload small; drop the parameter for the whole chain.
2. Print the levels
key_levels carries the walls, max pain and the expected-move bounds; gamma_regime the sign of net gamma.
3. Check the forecast
iv_forecast compares the at-the-money implied vol with the feed's forecast for the day.

Schedule it

cron
32 13 * * 1-5 APEXVOL_API_TOKEN=avmcp_... python3 zero_dte_levels.py
09:32 New York, weekdays. Times in the crontab are UTC.
Claude Code
/loop 15m python3 zero_dte_levels.py
Runs it on an interval inside a session, and the assistant reads the output each time.

The same job, no code

Ask an assistant
with the MCP server.

Connect the ApexVol MCP server and this recipe is one prompt. It ships in the client's prompt picker as recipe-zero-dte-levels.

In Claude, Cursor or ChatGPTthrough the MCP server
You

Give me today's SPY 0DTE levels: gamma regime, flip, call and put walls, max pain and the expected range.

The assistant calls get_zero_dte and answers from the same JSON the script prints.

Set it up in:

Under the hood

1 endpoint,
one token.

Each card opens the endpoint's page: parameters and bounds, every field, a real response and a console that runs it on your ticker.

Access

Plan
Pro and above. Every endpoint follows the tier of its web feature; the chips on the cards say which.
Cost
Measured in upstream data requests against the monthly allowance, not calls; a batch call counts one rate-limit unit and one data request per symbol. GET /api/mcp/data/me/usage shows the meter.
Reference
The rate-limits guide, the conventions and the error model. The whole API as one Markdown file: /llms-full.txt.

Included with
every paid plan.

From $55 a month. Create a token under Account, then API Access, and this script runs as it is.

Real market data, not a sandbox. See it live on AAPL.

7 days free, cancel anytime Card required · no charge for 7 days
Start trial →