Skip to main content
The WebSocket API organizes its event streams into four channels. Two channels — quotes and states — deliver per-symbol events and require you to subscribe with an explicit list of ticker symbols. The other two — alerts.in_force and alerts.simultaneous_breaks — are account-wide streams that deliver all events globally; no symbol list is needed. Each channel requires the ws:connect scope on your key plus the channel-specific scope listed below.
Your key must have both ws:connect and the channel-specific scope to subscribe. If your key is missing a channel’s scope, that channel is silently excluded from the acknowledgment. Check the channels array in the subscribed response to confirm which subscriptions were accepted.

quotes

Delivers real-time price updates as trades occur for each symbol you subscribe to.
PropertyValue
Required scopeprices:read
Symbol list requiredYes
Event typequote

Event payload

{
  "type": "quote",
  "ts": "2026-04-10T14:35:00.887341+00:00",
  "seq": "7",
  "data": {
    "symbol": "AAPL",
    "price": 198.50,
    "volume": 1234567,
    "event_ts": "2026-04-10T14:35:00.712000+00:00"
  }
}
FieldTypeDescription
symbolstringUppercase ticker symbol
pricenumberTrade price
volumeintegerCumulative volume at the time of this update
event_tsstringISO 8601 timestamp of the originating market event

Subscribe

{
  "op": "subscribe",
  "topics": [
    { "channel": "quotes", "symbols": ["AAPL", "SPY", "QQQ"] }
  ]
}

Unsubscribe

You can unsubscribe from individual symbols without affecting others. Symbols you are still subscribed to continue delivering events.
{
  "op": "unsubscribe",
  "topics": [
    { "channel": "quotes", "symbols": ["QQQ"] }
  ]
}

states

Delivers real-time TFC state and setup updates for each symbol you subscribe to. A state event fires when a symbol’s candle state changes on any tracked timeframe — for example, when a daily 2U break occurs or a weekly 1 completes.
PropertyValue
Required scopestates:read
Symbol list requiredYes
Event typestate

Event payload

The data object contains the symbol’s current state snapshot at the time of the update. The exact fields reflect the same structure returned by the /states/{symbol} REST endpoint.
{
  "type": "state",
  "ts": "2026-04-10T14:35:01.004512+00:00",
  "seq": "12",
  "data": {
    "symbol": "AAPL"
  }
}
The full state payload includes TFC colors, candle IDs per timeframe, and active setup data. The structure matches the /states/{symbol} REST endpoint response. Refer to the REST states reference for field-level documentation.

Subscribe

{
  "op": "subscribe",
  "topics": [
    { "channel": "states", "symbols": ["AAPL", "NVDA"] }
  ]
}

Unsubscribe

{
  "op": "unsubscribe",
  "topics": [
    { "channel": "states", "symbols": ["NVDA"] }
  ]
}

alerts.in_force

Delivers a pushed event each time an in-force alert fires anywhere in the scan universe. This channel is account-wide — once subscribed, you receive every in-force alert without specifying symbols.
PropertyValue
Required scopealerts:read
Symbol list requiredNo
Event typealert.in_force
An in-force alert fires when price breaks the trigger level of a recognized setup, making the trade active. This corresponds to the same alerts surfaced in Mission Control’s alerts stream and delivered via push notifications.

Event payload

{
  "type": "alert.in_force",
  "ts": "2026-04-10T14:35:02.341800+00:00",
  "seq": "19",
  "data": {
    "symbol": "SPY",
    "timeframe": "Daily",
    "setup": "2-1-2U",
    "direction": "Up",
    "price": 561.40,
    "alert_ts": "2026-04-10T14:35:02.100000+00:00"
  }
}
The fields in data reflect the alert payload as produced by the StratAlerts alert engine. Field availability may vary by alert type and instrument. Always code defensively against missing keys.

Subscribe

No symbol list is needed. A single subscription receives all in-force alerts across every scanned instrument.
{
  "op": "subscribe",
  "topics": [
    { "channel": "alerts.in_force" }
  ]
}

Unsubscribe

{
  "op": "unsubscribe",
  "topics": [
    { "channel": "alerts.in_force" }
  ]
}

alerts.simultaneous_breaks

Delivers a pushed event each time a simultaneous break is detected — when multiple instruments break the same type of level in the same direction within a short time window. Like alerts.in_force, this is an account-wide channel with no symbol list.
PropertyValue
Required scopealerts:read
Symbol list requiredNo
Event typealert.simultaneous_break
Simultaneous breaks signal coordinated directional activity across multiple instruments and are surfaced separately in Mission Control. Subscribing to this channel lets you ingest those events programmatically.

Event payload

{
  "type": "alert.simultaneous_break",
  "ts": "2026-04-10T14:35:05.908211+00:00",
  "seq": "24",
  "data": {
    "direction": "Up",
    "timeframe": "Daily",
    "symbols": ["SPY", "QQQ", "IWM"],
    "break_ts": "2026-04-10T14:35:05.700000+00:00"
  }
}
The fields in data reflect the simultaneous break payload as produced by the alert engine. Field availability may vary. Always code defensively against missing keys.

Subscribe

{
  "op": "subscribe",
  "topics": [
    { "channel": "alerts.simultaneous_breaks" }
  ]
}

Unsubscribe

{
  "op": "unsubscribe",
  "topics": [
    { "channel": "alerts.simultaneous_breaks" }
  ]
}

Subscribing to multiple channels at once

You can subscribe to multiple channels in a single message. The server processes all topics and returns one acknowledgment listing every channel it accepted.
{
  "op": "subscribe",
  "topics": [
    { "channel": "quotes", "symbols": ["AAPL", "SPY"] },
    { "channel": "states", "symbols": ["AAPL"] },
    { "channel": "alerts.in_force" },
    { "channel": "alerts.simultaneous_breaks" }
  ]
}
Response:
{
  "type": "subscribed",
  "ts": "2026-04-10T14:35:00.123456+00:00",
  "seq": "1",
  "data": {
    "channels": ["quotes", "states", "alerts.in_force", "alerts.simultaneous_breaks"]
  }
}
Send all your subscriptions in one message immediately after connecting rather than as separate messages. This reduces round trips and ensures you do not miss events that fire during the gap between individual subscription requests.

Channel scope summary

ChannelScope requiredSymbol list
quotesws:connect + prices:readYes
statesws:connect + states:readYes
alerts.in_forcews:connect + alerts:readNo
alerts.simultaneous_breaksws:connect + alerts:readNo

WebSocket overview

Connection setup, authentication, close codes, and reconnection strategy.

Authentication

How to obtain an API key and understand which scopes each key carries.