The 0DTE Setup Classifier API: Iron Fly, Iron Condor, or Wait | FlashAlpha

The 0DTE Setup Classifier API: Iron Fly, Iron Condor, or Wait

The FlashAlpha 0DTE snapshot ships a rules-engine setup block that classifies today's chain into textbook plays - iron fly, iron condor, or wait - with a primary pick, alternatives, and explicit anti-setups (trades to avoid). Every verdict carries the exact conditions it met and failed, a confidence grade, and a strikes hint. This guide documents every rule so you can trade it or audit it. Growth plan.

T
Tomasz Dobrowolski Quant Engineer
Jun 14, 2026
22 min read
0DTE OptionsStrategy IronCondor IronFly API DeveloperGuide DealerPositioning RulesEngine

If you want an API that suggests a 0DTE options strategy, a rules-based iron condor or iron fly screener for same-day expiries, or a way to know which 0DTE trades to avoid right now, the setup block in GET /v1/flow/zero-dte/snapshot/{symbol} is it. It is part of the live 0DTE flow family - see the pillar, The Live 0DTE Flow API, for the full surface.

Not advice. The setup classifier is a deterministic labeling of market structure, not a recommendation to trade. It tells you which textbook setup the current regime resembles and why; sizing, risk, and the decision to enter are yours. The strikes hint is a structural suggestion derived from the walls and expected move, not an order.


The Setup Block

Inside the snapshot response, setup looks like this:

"setup": {
  "primary": {
    "name": "iron_fly",
    "display_name": "Iron Fly",
    "thesis": "Pin setup - spot 0.07% from magnet, positive gamma, walls bracket spot, pin score 71",
    "confidence": "high",
    "conditions_met": [
      "spot within 0.3% of magnet (0.07%)",
      "regime = positive_gamma",
      "pin_score > 65 (71)",
      "expected_move within wall band"
    ],
    "conditions_failed": [],
    "strikes_hint": {
      "short_call_strike": 601, "short_put_strike": 600,
      "long_call_strike": 603, "long_put_strike": 598,
      "wing_width_suggestion": 2
    },
    "risk_flags": []
  },
  "alternatives": [
    { "name": "iron_condor", "display_name": "Iron Condor", "confidence": "medium", "thesis": "Range setup - positive gamma, walls bracket spot; collect premium across the band" }
  ],
  "anti_setups": [
    { "name": "long_premium_lotto", "display_name": "Long Premium / Lotto",
      "thesis": "Avoid - positive gamma + tight walls = unlikely >1σ move into close",
      "conditions_failed": ["regime is positive_gamma (suppressive)", "remaining 1σ < 0.4% (0.34%)", "pin_score > 65 (71) counter-indicates breakout"] }
  ],
  "evaluator_version": "v1"
}
FieldWhat it means
primaryThe highest-confidence real setup the current state supports. Can be null if nothing qualifies and wait did not fire.
alternativesUp to two runner-up setups, ranked by confidence.
anti_setupsSetups the current conditions actively argue against - the trades to skip. This list is the one most traders underuse.
conditions_met / conditions_failedThe exact rule checks, with the live values inlined. This is the audit trail.
confidencehigh (zero failed conditions), medium (one), or low. A setup with more than one failed condition is not surfaced at all.
strikes_hintA suggested structure: short legs near spot, long wings near the expected-move bound, plus a wing-width suggestion.
evaluator_versionThe rule-set version (v1). Pin to it so a future rule change is a deliberate upgrade, not a silent one.

A rules-engine 0DTE setup, with its conditions, in every snapshot

Primary, alternatives, anti-setups, and a strikes hint. Growth plan.

Get API Access

Setup 1: Iron Fly (the Pin Play)

An iron fly sells the at-the-money straddle and buys wings for protection. It wants price glued to one strike into the close. The classifier surfaces it only when the chain is genuinely pinning. The conditions:

ConditionWhy it matters
regime = positive_gammaDealers are long gamma and damping moves - the suppressive regime an iron fly needs.
spot within 0.3% of the magnetThe body of the fly has to sit on the magnet; a distant magnet does not pin.
pin_score > 65The composite pin-risk score confirms a real magnet, not a coincidental high-OI strike.
expected move bounded by the wallsThe remaining 1σ move fits inside the call-wall / put-wall band, so a breakout through a wing is unlikely.
ATM IV not elevated vs 7DTE (ratio ≤ 1.10)Rich front-month IV warns of an event; the fly prefers a quiet term structure.

Confidence follows the failures directly: zero failed = high, one failed = medium, more than one = not surfaced. The strikes_hint places the short legs at the nearest strikes bracketing spot and the long wings at the first strikes beyond spot ± remaining-1σ. A risk_flag is added when the gamma flip sits below spot, warning you to exit if price leaves the wall band.

Setup 2: Iron Condor (the Range Play)

An iron condor sells out-of-the-money call and put spreads and profits if price stays inside a band. It is the wider, more forgiving cousin of the fly. Conditions:

ConditionWhy it matters
regime = positive_gammaSame suppressive backdrop - moves get absorbed, not amplified.
call wall and put wall clearly bracket spotThe walls define the range the condor sells inside.
walls ≥ 1σ apart (band ≥ 2× remaining 1σ)The band has to be wider than the expected move, or the short strikes are too close to be safe.

Zero failed conditions grades it high; one grades it medium. The strikes_hint puts the short legs at the walls and the long legs one strike beyond. When both an iron fly and an iron condor qualify, the higher-confidence one becomes primary and the other drops into alternatives - a tight pin favors the fly, a wider range favors the condor.

Setup 3: Wait (No Clear Edge)

wait is a first-class verdict, not an error. It fires only when no real setup reaches medium-or-better confidence, and it is the honest answer on a choppy, signal-poor day. A disciplined 0DTE poller treats primary.name == "wait" as "do nothing this poll, reassess next interval" - which is exactly the discipline most same-day P&L leaks come from skipping.

Anti-Setups: the Trades to Skip

The anti_setups array is the classifier's most distinctive output. Rather than only saying what to do, it flags what the current regime argues against, with the failed conditions spelled out. Three anti-setups can fire:

Anti-setupFires whenMeaning
long_premium_lottopositive gamma, remaining 1σ < 0.4%, pin score > 65Buying cheap lottery options is fighting a suppressive regime that says a big move into the close is unlikely.
short_premium_nakednegative gamma, spot within 1σ of the gamma flipSelling naked premium near a flip in an amplifying regime invites a vol-expansion blow-up.
pin_trade_low_scorepin score < 40There is no reliable magnet, so any pin-based trade is built on sand.

If your intended trade appears in anti_setups, the model is telling you the conditions are stacked against it. That does not forbid the trade - it tells you to size it as a fade of the prevailing structure, with eyes open.

Consuming the Setup in Code

Pull the snapshot, branch on the primary setup, and respect the anti-setups:

from flashalpha import FlashAlpha

fa = FlashAlpha("YOUR_KEY")
snap = fa.flow_zero_dte_snapshot("SPY")

if snap.get("body") is None:
    raise SystemExit(snap.get("message", "no 0DTE session"))

setup = snap["setup"]
p = setup["primary"]

if p and p["name"] != "wait" and p["confidence"] == "high":
    hint = p.get("strikes_hint") or {}
    print(f"PRIMARY: {p['display_name']} (high)")
    print(f"  thesis: {p['thesis']}")
    print(f"  legs:   SC {hint.get('short_call_strike')} / SP {hint.get('short_put_strike')}"
          f"  wings {hint.get('long_put_strike')}-{hint.get('long_call_strike')}")
    for r in p.get("risk_flags", []):
        print(f"  risk:   {r}")
else:
    print(f"No high-confidence setup (primary = {p['name'] if p else 'none'})")

# Respect the anti-setups
for anti in setup.get("anti_setups", []):
    print(f"AVOID: {anti['display_name']} - {anti['thesis']}")
# The setup block rides inside the snapshot response
curl -H "X-Api-Key: YOUR_KEY" \
  "https://lab.flashalpha.com/v1/flow/zero-dte/snapshot/SPY" | jq '.setup'
$ setup is a field on the snapshot - no separate call needed

Read the Conditions, Not Just the Label

The same display_name can mean different things depending on which conditions carried it. An iron fly graded medium with "atm IV elevated vs 7DTE" in conditions_failed is a pin trade with an event-risk caveat - very different from a clean high. Always read conditions_met and conditions_failed before sizing. The classifier is built to be transparent precisely so you do not have to trust a black-box label.

API Access and Pricing

The setup block is part of GET /v1/flow/zero-dte/snapshot/{symbol}, on the Growth plan and higher - no separate endpoint or call.

PlanPrice0DTE Snapshot + SetupRate Limit
Free$0No5 req/day
Basicfrom $63/moNo100 req/day
Growthfrom $239/moYes2,500 req/day
Alphafrom $1,199/moYesUnlimited

Try it in the interactive API playground or the snapshot endpoint docs.

Frequently Asked Questions

Yes. The setup block in GET /v1/flow/zero-dte/snapshot/{symbol} runs a rules engine over today's chain and returns a primary setup (iron fly, iron condor, or wait), ranked alternatives, and explicit anti-setups, each with the exact conditions it met or failed, a confidence grade, and a suggested strike structure. It is a deterministic classification of market structure, not trade advice. It is on the Growth plan.
Both need a positive-gamma regime with the walls bracketing spot. The iron fly additionally needs price within 0.3% of the magnet and a pin score above 65 - a tight pin. The iron condor needs the walls at least 1σ apart - a wider, calmer range. When both qualify, the higher-confidence one becomes the primary and the other moves to alternatives. A tight pin favors the fly; a wide quiet band favors the condor.
Anti-setups are trades the current regime argues against, returned with the failed conditions spelled out. Three can fire: long premium / lotto (avoid buying cheap options when positive gamma and a tight pin make a big move unlikely), short premium naked (avoid selling naked premium near a gamma flip in a negative-gamma regime), and pin trade with a low pin score (no reliable magnet). If your intended trade appears here, you are fading the prevailing structure.
Confidence is a direct function of failed conditions: zero failed conditions is high, one is medium, and a setup with more than one failed condition is not surfaced at all. Because every condition is returned with its live value, you can see exactly which check pulled a setup down from high to medium and decide whether that caveat matters for your trade.
The setup block is part of the 0DTE snapshot endpoint, so it is on the Growth plan (from $239/mo, 2,500 requests/day) and Alpha (from $1,199/mo, unlimited). There is no separate endpoint or extra call - it rides inside every snapshot response. Free and Basic do not include the flow family.

The 0DTE setup classifier turns a regime read into a labeled, auditable trade idea: an iron fly when the chain is pinning tight, an iron condor when the walls hold a wide range, a wait when there is no edge - plus the anti-setups that tell you what to skip. Every verdict ships the conditions, values, confidence, and a strike structure that produced it, so you are never trusting a black box. Read the conditions, respect the anti-setups, pin the evaluator version, and you have a transparent rules engine riding inside every snapshot call.

Live Market Pulse

Get fast visibility into market shifts with full-chain analytics over low-latency REST and MCP polling.

Intelligent Screening

Screen millions of option pairs per second using your custom EV rules, filters, and setups.

Export-Ready

Export structured signals to your own execution stack or broker integration - FlashAlpha delivers the analytics, you keep control of order routing.

Join the Community

Discord

Engage in real time conversations with us!

Twitter / X

Follow us for real-time updates and insights!

GitHub

Explore our open-source SDK, examples, and analytics resources!