Developers · REST reference
Developer API
REST JSON over HTTPS. Reads the same live artifacts as the Discord scanner. Traders using Cursor / Claude / VS Code want Confluence Pro MCP ($99/mo) — not this REST doc.
Endpoints
GET /health
No auth. Service + market status.
GET /v1/levels/spy · GET /v1/rails/spy · …/qqq · …/spx
Gamma Rails — live 0DTE dealer map from the Tradier chain.
Symbols: SPY always; QQQ when CONFLUENCE_QQQ=1 (default on);
SPX when CONFLUENCE_SPX=1 (on in production) and
gex_tradier.py --symbol SPX has written artifacts.
API symbol is SPX (Tradier root) — not SPXW. Tape stays SPY-only.
{
"product": "Gamma Rails",
"symbol": "SPY",
"underlying_price": 621.45,
"regime": "negative_gamma",
"gamma_flip": 622.0,
"call_wall": 625.0,
"put_wall": 618.0,
"max_pain": 620.0,
"magnet": 620.0,
"net_gex": -1.2e9,
"net_dex": -450000000
}
GET /v1/gex/spy/profile
Gamma Rails / Desk Bundle / Pro / Developer. Self-computed per-strike GEX/DEX/IV histogram (Tradier chain + ORATS greeks) — the Decision Desk GEX map. Strikes banded ±2.5% of spot.
{
"product": "Gamma Rails",
"symbol": "SPY",
"underlying_price": 621.45,
"regime": "neg_gamma",
"gamma_flip": 622.0,
"call_wall": 625.0,
"put_wall": 618.0,
"net_gex": -12.4,
"net_dex": -450.2,
"band_pct": 0.025,
"strike_count": 32,
"strikes": [
{ "strike": 615, "net_gex": -1.2e8, "net_dex": -2.1e7, "call_iv": 0.18, "put_iv": 0.22 }
]
}
GET /v1/dex/spy/profile
Self-computed per-strike dealer delta (DEX) from ORATS delta × OI. Labeled as a dealer-delta proxy — not SqueezeMetrics DPI.
GET /v1/vex/spy/profile · GET /v1/chex/spy/profile
Self-computed vanna (VEX) and charm (CHEX) profiles via Black–Scholes from chain IV
(Tradier does not publish vanna/charm). Method bs_vanna_charm_v1.
GET /v1/pin/spy
Local pin probability (heuristic_v1) — OI concentration + proximity to magnet/max-pain + time-of-day lock-in.
{
"pin": 0.62,
"state": "locking",
"magnet": 620.0,
"breakdown": { "oi_top3_pct": 0.41, "proximity": 0.88, "time_mult": 0.9 }
}
GET /v1/exposure/spy/sheet
One-shot sheet: walls/flip + net GEX/DEX/VEX/CHEX + pin + top GEX peaks. FA-style category, your math.
GET /v1/skew/spy
Same chain source — call vs put mid-IV strip near spot (skew proxy). Used by the Decision Desk IV panel.
{
"symbol": "SPY",
"underlying_price": 621.45,
"atm": { "strike": 621, "call_iv": 0.17, "put_iv": 0.19, "skew_25d_proxy": 0.02 },
"points": [{ "strike": 618, "call_iv": 0.18, "put_iv": 0.21, "skew_25d_proxy": 0.03 }]
}
GET /v1/tape/spy
Confluence Tape — live classified options flow (5-minute slope + session cumulative). Plain-English field guide: How to read Confluence Tape.
{
"product": "Confluence Tape",
"tape_product": "Confluence Tape",
"confluence_tape": -1250000,
"tape_5m": -340000,
"quadrant": "bearish (call- / put+)",
"ofi": -0.18,
"ofi_5m": -0.31,
"stale": false,
"updated_at": "2026-07-13 10:15:02 ET"
}
We do not expose third-party proprietary flow names in the public API.
GET /v1/stream/desk?symbol=SPY&key=…
SSE push (Phase 2). Server-Sent Events for desk clients. Emits hello,
rails, tape (SPY), alert (SPY), and ping every ~5s when
fingerprints change. EventSource cannot set headers — pass the API key as ?key= (stream routes only).
Connection auto-closes after ~30 minutes; reconnect from the client.
const es = new EventSource(
"https://api.0dteconfluence.com/v1/stream/desk?symbol=SPY&key=cfl_…"
);
es.addEventListener("rails", (e) => console.log(JSON.parse(e.data)));
GET /v1/replay/today?limit=40&min_score=6
Alert replay (Phase 2). Chronological graded candidates from scan_candidates.jsonl
— self-serve timeline, not a rented backtest. When scan_bars.json is present, rows include
forward underlying MFE/MAE (30-min horizon) for context. Bundle / Pro / Developer.
{
"kind": "alert_replay",
"symbol": "SPY",
"count": 3,
"excursion_source": "scan_bars.json",
"events": [
{
"ts": "…",
"grade": "A+",
"score": 7,
"direction": "PUT",
"setup": "fade at call_wall",
"spot": 621.2,
"mfe_pts": 1.45,
"mae_pts": -0.62
}
],
"disclaimer": "Self-serve replay … not a third-party backtest."
}
JavaScript SDK
Zero-build browser helper: sdk/confluence-client.js
(ESM). Same routes as the Python MCP client — pass your key, call fetch-wrapped methods.
import { ConfluenceClient } from "./sdk/confluence-client.js";
const api = new ConfluenceClient("cfl_your_key_here");
const health = await api.health();
const rails = await api.getRails("SPY");
const pin = await api.getPin("SPY");
const replay = await api.getReplayToday(40, 6);
// SSE (key in query — EventSource cannot set headers)
const es = new EventSource(api.streamDeskUrl("SPY"));
es.addEventListener("rails", (e) => console.log(JSON.parse(e.data)));
POST /v1/webhooks/rails · DELETE /v1/webhooks/rails
Gamma Rails ($19), Desk Bundle ($79), or Developer ($99) keys. Register your HTTPS endpoint to receive push JSON (no polling).
curl -s -X POST https://api.0dteconfluence.com/v1/webhooks/rails \
-H "X-API-Key: cfl_your_rails_key" \
-H "Content-Type: application/json" \
-d '{"url":"https://your-server.com/rails","secret":"optional_hmac","events":["morning","refresh"]}'
Outbound events
| Event | When | Header |
|---|---|---|
morning | ~9:00 ET after morning desk refresh | X-Confluence-Event: morning |
refresh | Wall/flip/magnet changes, or every 15m in RTH | X-Confluence-Event: refresh |
Body matches GET /v1/rails/spy plus "event" and "ts". If you set secret, verify X-Confluence-Signature: sha256=<hmac> (HMAC-SHA256 of raw JSON body).
Remove: DELETE /v1/webhooks/rails with the same API key.
POST /v1/webhooks/alerts · DELETE /v1/webhooks/alerts
Developer only. Push graded A+/B JSON when the scanner posts. Polling /v1/alerts/* always works on Developer.
curl -s -X POST https://api.0dteconfluence.com/v1/webhooks/alerts \
-H "X-API-Key: cfl_…" -H "Content-Type: application/json" \
-d '{"url":"https://your.app/hooks/alerts"}'
GET /v1/enrich/spy?direction=PUT&strike=625&setup=fade_call_wall
Positioning context at a rail — DEX lean, pin score, OI build, GEX shift since open.
| Param | Required | Values |
|---|---|---|
direction | yes | CALL or PUT |
strike | yes | Wall strike (e.g. 625) |
setup | no | Setup tag from grader |
level_name | no | e.g. call_wall |
GET /v1/alerts/latest
Last graded A+/B candidate from the live scanner (same payload shape as Discord, minus embed formatting). Developer + Pro.
GET /v1/alerts/history?limit=20&min_score=6
Session alert log — A+/B only, newest first.
| Param | Default | Notes |
|---|---|---|
limit | 20 | Max 100 |
min_score | 6 | Confluence score floor (0–8) |
{
"count": 2,
"min_score": 6,
"alerts": [ { "grade": "A+", "direction": "PUT", "score": 7, "spot": 621.2 } ]
}
GET /v1/market/clock
Session state — open/half-day, force-flat, lane ends, event-day flag. Developer + Pro.
{
"status": "open",
"date": "2026-07-18",
"force_flat": "15:45",
"last_entry": "15:15",
"lane1_aplus_end": "11:10",
"lane2_auto_end": "14:00",
"event_day": false,
"half_day": false
}
GET /v1/morning/desk
Today’s morning-desk card (same content as Discord #morning-desk) after the ~9:00 ET refresh. Returns morning_desk_unavailable if nothing posted yet. Developer + Pro.
{
"date": "2026-07-18",
"posted_at": "2026-07-18T09:00:12-04:00",
"card": "…markdown card…",
"one_line": "neg-gamma · fade 625 / support 618 · …",
"rails": { "gamma_flip": 622, "call_wall": 625, "put_wall": 618 },
"iv_rank": 34,
"regime": "negative_gamma"
}
Key tiers (Stripe products)
These are not the same as Discord alert membership ($49). See developers.html.
| Stripe product | Price | API key tier | Access |
|---|---|---|---|
| Gamma Rails | $19/mo | rails | /v1/rails/spy, GEX/DEX/VEX/CHEX/pin/exposure + skew + morning/refresh webhooks |
| Confluence Tape | $29/mo | tape | /v1/tape/spy only (+ Discord #tape — not via REST) |
| Desk Bundle | $79/mo | bundle | Rails + GEX profile + skew + tape + clock + morning. Powers the Decision Desk |
| Robinhood Pro MCP | $99/mo | pro | Alerts + rails + GEX/skew + tape + enrich + clock + morning — MCP + Decision Desk |
| Developer API | $99/mo | developer | All /v1/* including enrich, alerts history, market clock, morning desk |
Buying Developer ($99) includes rails + tape + enrich — you do not need the $19 and $29 plans.
Robinhood Pro ($99) is a different product at the same price: MCP + Discord + desk with live Alert strip for traders — not a substitute for the Developer REST key. Same backend tier pro; see home.
Your API key is issued at checkout (shown once on the success page). Auth with X-API-Key or Authorization: Bearer.
Subscribe
Get an API key on the Developers page. Checkout maps to the Developer API plan ($99/mo).