Commercial offering - provisioned per client

FlashAlpha metrics, pushed in real time

One WebSocket. 500+ streamable metrics: GEX, dealer positioning, options flow, volatility, VRP, surfaces. Subscribe to a symbol, a metric, and a cadence, and receive a sequenced update each time that metric recomputes. No polling loops, no wasted calls.

From $4,500/mo, one commercial bundle: dedicated node, streaming compute, data licence, and 500 concurrent subscriptions included. Endpoint provisioned during onboarding. Internal use only, no redistribution. The REST API and Historical API remain self-serve on standard plans.

Push, not poll

The server recomputes your subscribed metrics on your cadence and pushes each new value to you. Your integration reacts to updates instead of burning a request budget asking whether anything changed.

Latest-wins delivery

Updates coalesce per subscription server-side. A slow consumer always receives the newest value, never a growing backlog. Every frame carries a per-subscription sequence number and a UTC timestamp so gaps are detectable.

Compute follows subscriptions

Nothing recomputes without a subscriber, and identical subscriptions share one recompute. The commercial tier adds dedicated streaming compute, so your subscription set never queues behind another client's.

How streaming works

A deliberately small protocol: one socket, JSON text frames, snake_case fields. You send requests; the server sends frames. Four moves cover the whole lifecycle.

1

Connect and authenticate

Open a WebSocket to your provisioned endpoint with your FlashAlpha API key - the same X-Api-Key you use against the REST API, sent as a handshake header (or ?api_key= for browser clients). Authentication happens before the upgrade, so a rejected key comes back as a readable HTTP 401 or 403, not a silent socket close.

WebSocket handshake
wss://<your-endpoint>/ws
// header: X-Api-Key: <your key>

// endpoint and entitlements are provisioned
// during commercial onboarding
2

Subscribe to (symbol, metric, cadence)

Each subscription is one triple: a ticker, a dotted metric id, and how often you want it recomputed. cadence_ms accepts 0 (continuous, as fast as the source allows) or any target from 100 to 60000 milliseconds. The server acks with a sub_id that tags every later frame for that subscription. Commercial plans include 500 concurrent subscriptions, expandable in blocks of 500.

You send / server acks
{ "action": "subscribe", "symbol": "SPY",
  "metric": "exposure.gex.net_gex", "cadence_ms": 1000 }

{ "type": "ack", "sub_id": "a1b2c3d4e5f6", "symbol": "SPY",
  "metric": "exposure.gex.net_gex", "cadence_ms": 1000 }
3

Receive sequenced updates

Every time the metric recomputes, an update frame arrives. seq increases monotonically per subscription so gaps and reordering are detectable; ts is Unix epoch milliseconds, UTC; value is always a JSON number, and non-finite results are dropped rather than sent as NaN. A heartbeat frame arrives roughly every 5 seconds while idle, as a liveness signal.

Server pushes
{ "type": "update", "sub_id": "a1b2c3d4e5f6",
  "symbol": "SPY", "metric": "exposure.gex.net_gex",
  "cadence_ms": 1000, "seq": 42,
  "ts": 1753165293123, "value": 2735133184.5 }

{ "type": "heartbeat", "ts": 1753165298123 }
4

Manage the lifecycle

Unsubscribe by sub_id when a stream is no longer needed. Errors arrive as frames with a machine-readable code (unknown_metric, invalid_cadence, no_capacity, ...) and do not close the connection. If the socket drops, reconnect and re-subscribe: subscriptions are per-connection and released on close.

Cleanup and errors
{ "action": "unsubscribe", "sub_id": "a1b2c3d4e5f6" }

{ "type": "error", "code": "unknown_metric",
  "message": "unknown metric; read the live catalog" }

What you can stream

500+ metrics across 12 groups, each mapped one-to-one to a field of the REST API, so the number you backtested is the number you stream. Metric ids are dotted: endpoint.method.field.

Exposure

Net GEX, gamma flip, call/put walls, DEX, VEX, CHEX, key levels, 0DTE magnet

exposure.gex.net_gex
Flow

Live flow-adjusted GEX, dealer risk, pin risk, intraday OI shift, signals

flow.dealer_risk.live_net_gex
Volatility

ATM IV, skew, term structure, butterfly, IV-RV spreads

volatility.skew_term.butterfly_25d
Surface

SVI parameters and surface diagnostics per expiry

surface.svi.atm_iv
VRP

Variance risk premium level and z-score

vrp.snapshot.z_score
Max pain

Max pain strike and distance from spot

maxpain.summary.max_pain_strike
Liquidity

Chain execution and liquidity scoring

liquidity.snapshot.chain_execution_score
Expected move

Straddle-implied expected move for the nearest expiry

expected_move.nearest.expected_move_pct
Strategies

Suitability scores for 10 systematic strategies

strategies.zero_dte.score
Earnings

Pre-earnings expected move and event timing

earnings.expected_move.days_to_event
Advanced volatility

Fair vol and variance diagnostics from the SVI surface

adv_volatility.snapshot.fair_vol
Stock

Quotes and summary fields for the underlying

stock.summary.mid

Metrics that only change once a day (realized and forecast volatility, spot-vol correlation, historical earnings and VRP series) intentionally stay on the REST API. What streams is what actually moves intraday. The live catalog is served by the streaming engine at runtime, so clients discover it instead of hardcoding a list.

Delivery mechanics

Engineered for honest real-time

The mechanics below are how the engine behaves, not marketing abstractions. We would rather you size your integration correctly on day one.

Per-subscription cadence

cadence_ms: 0 streams continuously, as fast as the data source allows; 100 to 60000 sets a target interval. Cadence is an upper bound on recompute frequency, not a latency guarantee.

Shared recompute, deduplicated

N subscribers to the same (symbol, metric, cadence) share one recompute, and metrics of the same symbol share one chain hydration and Greeks pass. Costs scale with distinct compute keys, not raw subscriber count.

Backpressure by design

One pending-update slot per subscription, latest wins. If your consumer stalls, you skip intermediate values instead of accumulating a queue, and you can detect the skip from seq.

Subscribe to what you need

A focused set of 10 to 50 metrics at a 1-second cadence behaves far better than the whole catalog at continuous. During onboarding we size your dedicated compute to the subscription set you actually plan to run.

A client in 20 lines

No SDK required: any WebSocket library works. Your endpoint URL is provisioned during onboarding.

Python (websockets 14+)
import asyncio, json, os, websockets

API_KEY  = os.environ["FA_API_KEY"]
ENDPOINT = "wss://<your-endpoint>/ws"

async def main():
    async with websockets.connect(
        ENDPOINT,
        additional_headers={"X-Api-Key": API_KEY},
        max_size=None,
    ) as ws:
        for metric in ["exposure.gex.net_gex",
                       "exposure.gex.gamma_flip",
                       "flow.live.live_gex"]:
            await ws.send(json.dumps({
                "action": "subscribe", "symbol": "SPY",
                "metric": metric, "cadence_ms": 1000}))
        async for raw in ws:
            f = json.loads(raw)
            if f["type"] == "update":
                print(f["metric"], f["value"], f["seq"])

asyncio.run(main())
Node (ws)
const WebSocket = require('ws');

const ws = new WebSocket('wss://<your-endpoint>/ws', {
  headers: { 'X-Api-Key': process.env.FA_API_KEY }
});

ws.on('unexpected-response', (_req, res) => {
  console.error(`handshake refused: HTTP ${res.statusCode}`);
});

ws.on('open', () => {
  for (const metric of ['exposure.gex.net_gex',
                        'flow.live.live_gex']) {
    ws.send(JSON.stringify({ action: 'subscribe',
      symbol: 'SPY', metric, cadence_ms: 1000 }));
  }
});

ws.on('message', (raw) => {
  const f = JSON.parse(raw);
  if (f.type === 'update')
    console.log(f.metric, f.value, 'seq=' + f.seq);
});

Backtest on history, go live on streaming

Streaming metrics map one-to-one to REST API fields, and the Historical API replays those same fields point-in-time since 2017. Validate the signal on years of history, then subscribe to the identical metric definition live. No re-derivation, no live-versus-backtest drift.

ResearchHistorical API, point-in-time replay since 2017
ProductionREST API, request/response on your schedule
Real timeStreaming, the same metrics pushed as they recompute
Commercial tier

Streaming

from $4,500 /mo

One bundled tier, no add-on menu: dedicated node, streaming compute, and data licensing scoped to your requirement. We provision your endpoint with your engineering team, typically within days, not procurement quarters. Additional streaming capacity is added in blocks of 500 subscriptions at $1,500/mo per block.

  • Real-time WebSocket streaming across the full catalog, 500 concurrent subscriptions included
  • Dedicated node and streaming compute sized to your workload
  • Commercial licence for your desk's internal research and trading
  • Engineering onboarding, direct line to the team that built it
  • Expand capacity in blocks of 500 subscriptions, $1,500/mo per block
Contact us about streaming

Or email [email protected] - we answer within one business day.

Internal use only. FlashAlpha-derived data may not be redistributed, embedded for third parties, published to subscribers, or white-labelled.

FAQ

Streaming, honestly answered

Is FlashAlpha streaming available today?

Yes, in commercial early access. Streaming is offered as a commercial bundle from $4,500/mo with 500 concurrent subscriptions included: your streaming endpoint, key entitlements, and dedicated node and streaming compute are provisioned per client during onboarding. Contact us to get set up.

How is streaming different from REST polling?

REST answers when you ask; streaming pushes when the data changes. Over a single WebSocket you subscribe to (symbol, metric, cadence) triples and the server sends a sequenced, timestamped update frame each time that metric is recomputed. No polling loops, no per-request quotas, no wasted calls on unchanged values, and delivery coalesces so a slow consumer always receives the newest value rather than a growing backlog.

What can I stream?

Over 400 metrics across 12 groups: exposure (GEX, DEX, VEX, CHEX, levels), options flow, volatility, advanced volatility, SVI surfaces, VRP, max pain, liquidity, expected move, 0DTE strategies, earnings positioning, and stock quotes. Metric ids are dotted, e.g. exposure.gex.net_gex or flow.live.live_gex. Metrics that only change once a day (realized vol, historical VRP series) intentionally stay on the REST API; what streams is what actually moves intraday. The live catalog is served by the streaming engine at runtime, so clients discover it rather than hardcoding a list.

Do you guarantee update latency?

Cadence is a target, not a latency SLA. You choose a per-subscription cadence from continuous down to once a minute, and actual delivery depends on how much compute your subscription set needs. The commercial tier includes dedicated streaming compute sized to your workload during onboarding, so your subscriptions never queue behind another client.

Can I get streaming on a standard self-serve plan?

Streaming is currently a commercial offering from $4,500/mo, provisioned per client with dedicated compute. Standard self-serve plans (Free, Basic, Growth, Alpha) are REST-based. If you are an existing subscriber interested in streaming, contact us.

Does historical data stream?

No. Streaming is live delivery. For research and backtesting, the FlashAlpha Historical API replays the same metric definitions point-in-time since 2017 with response shapes identical to the live REST API. The intended workflow: validate a strategy on history over REST, then consume the same metrics live over streaming.