Recipe, one Python file
Unusual flow today
The session's unusual options prints for a name, with volume against open interest. Reads the options flow for one symbol and prints the summary line (call and put volume, premium and the sentiment read) followed by the unusual rows, sorted by premium. Volume far above open interest is what marks a print as unusual; the script shows both so the reader can judge.
What it prints
The output,
as captured.
Run against the live API on 2026-09-09 with a real token. Traders who want the day's notable prints in a terminal instead of a scrolling tape.
NVDA flow (EOD), spot 225.86
calls 1,301,297 contracts / $189.3M puts 727,464 / $172.8M put/call 0.5590299524243889 BULLISH
Market is closed. Showing end-of-day data from the most recent trading session.
type strike expiry dte volume OI vol/OI premium $M
PUT 227.5 2026-09-09 0 81,398 4,679 17.4 21.41
PUT 230.0 2026-09-09 0 38,724 5,545 7.0 17.81
PUT 225.0 2026-09-09 0 120,529 8,372 14.4 15.79
CALL 227.5 2026-09-11 2 54,393 24,169 2.3 11.91
CALL 227.5 2026-09-09 0 123,348 5,522 22.3 11.72
PUT 230.0 2026-09-11 2 16,058 6,617 2.4 9.15
CALL 225.0 2026-09-09 0 38,042 4,665 8.2 8.10
PUT 225.0 2026-09-11 2 29,453 9,162 3.2 8.00
PUT 235.0 2026-09-09 0 8,563 661 13.0 7.98
PUT 227.5 2026-09-11 2 15,759 6,309 2.5 6.38
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"]
SYMBOL = "NVDA"
d = get(f"/flow/{SYMBOL}", limit=10, detail="compact")
s = d.get("summary") or {}
print(f"{SYMBOL} flow ({d.get('data_freshness')}), spot {d.get('stock_price')}")
print(f"calls {s.get('total_call_volume', 0):,.0f} contracts / ${s.get('total_call_premium', 0)/1e6:,.1f}M "
f"puts {s.get('total_put_volume', 0):,.0f} / ${s.get('total_put_premium', 0)/1e6:,.1f}M "
f"put/call {s.get('put_call_ratio')} {s.get('sentiment')}")
if d.get("message"):
print(d["message"])
print()
rows = sorted(d.get("unusual_activity") or [], key=lambda r: -(r.get("premium") or 0))
print(f"{'type':5}{'strike':>8}{'expiry':>12}{'dte':>5}{'volume':>9}{'OI':>8}{'vol/OI':>8}{'premium $M':>12}")
for r in rows[:10]:
print(f"{r['type']:5}{r['strike']:>8,.1f}{r['expiration']:>12}{r['dte']:>5}{r['volume']:>9,.0f}"
f"{r['oi']:>8,.0f}{r['volume_oi_ratio']:>8.1f}{r['premium']/1e6:>12.2f}")
if not rows:
print("no rows flagged unusual in this session")
How it works
- 1. One call
- GET /flow/NVDA?limit=10 caps the row lists under compact detail; the summary block is always whole.
- 2. Read the summary
- Total call and put premium and the sentiment label come first.
- 3. List the prints
- unusual_activity rows carry strike, expiry, volume, open interest and premium.
Schedule it
- cron
0 15,17,19 * * 1-5 APEXVOL_API_TOKEN=avmcp_... python3 flow_unusual_today.py
11:00, 13:00, 15:00 New York, weekdays. Times in the crontab are UTC.- Claude Code
/loop 1h python3 flow_unusual_today.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-flow-unusual-today.
What unusual options activity is there in NVDA today, and what is the call versus put premium split?
The assistant calls get_options_flow 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.