Recipe, one Python file
Watchlist IV rank screen
Your watchlist ranked by IV rank in one call, with the names worth selling premium on at the top. One batch call returns IV rank, IV percentile and the current 30-day implied vol for up to 25 symbols. The script sorts the list, flags the names above 50 and below 20, and prints what each one's implied vol is against its own year.
What it prints
The output,
as captured.
Run against the live API on 2026-09-08 with a real token. Anyone running a premium-selling or premium-buying list who checks it every morning.
IV rank IV pct IV 30d 52w low 52w high read
COIN 55.9 58.0 66.1 49.5 79.2 rich: lean to selling
CRWD 52.4 76.0 50.0 32.6 65.9 rich: lean to selling
NFLX 46.7 75.0 33.1 26.3 41.0 middle: no edge
SMCI 43.7 61.0 71.9 51.9 97.7 middle: no edge
MU 30.5 35.0 61.1 43.6 101.1 middle: no edge
AMD 22.2 41.0 50.0 41.0 81.7 middle: no edge
PLTR 17.5 36.0 46.3 43.0 61.9 cheap: lean to buying
TSLA 15.5 37.0 41.0 37.5 60.0 cheap: lean to buying
NVDA 14.8 18.0 34.4 32.0 48.4 cheap: lean to buying
AVGO 6.1 9.0 37.4 36.3 54.6 cheap: lean to buying
IV rank places today's 30-day implied vol inside its 52-week range; percentile is the share of days below it.
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.
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"]
WATCHLIST = "NVDA,AMD,TSLA,AVGO,MU,PLTR,COIN,NFLX,CRWD,SMCI"
data = get("/batch/iv-rank", tickers=WATCHLIST)
rows = sorted(data["results"].items(), key=lambda kv: -(kv[1].get("iv_rank") or 0))
print(f"{'':7}{'IV rank':>8}{'IV pct':>8}{'IV 30d':>8}{'52w low':>9}{'52w high':>10} read")
for sym, d in rows:
rank = d.get("iv_rank") or 0
read = "rich: lean to selling" if rank >= 50 else ("cheap: lean to buying" if rank <= 20 else "middle: no edge")
print(f"{sym:7}{rank:>8.1f}{(d.get('iv_percentile') or 0):>8.1f}{d['current_iv']:>8.1f}"
f"{d['iv_min_52w']:>9.1f}{d['iv_max_52w']:>10.1f} {read}")
for sym, err in data["errors"].items():
print(f"{sym:7} {err}")
print()
print("IV rank places today's 30-day implied vol inside its 52-week range; percentile is the share of days below it.")
How it works
- 1. Batch the list
- GET /batch/iv-rank?tickers=... spends one rate-limit unit for the whole watchlist.
- 2. Sort and flag
- IV rank above 50 leans to selling, below 20 to buying; the percentile says how often the year was lower.
- 3. Act on the tails
- The rest of the list is a no-edge day; the script only argues about the ends.
Schedule it
- cron
35 13 * * 1-5 APEXVOL_API_TOKEN=avmcp_... python3 watchlist_iv_rank_screen.py
09:35 New York, weekdays. Times in the crontab are UTC.- Claude Code
/loop 1h python3 watchlist_iv_rank_screen.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-watchlist-iv-rank-screen.
Rank my watchlist by IV rank and tell me which names are expensive or cheap against their own year: NVDA, AMD, TSLA, AVGO, MU, PLTR, COIN, NFLX, CRWD, SMCI.
The assistant calls get_iv_rank 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
- Premium 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/usageshows 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.