{
"type": "subscribe",
"channel": "marketAttributes"
}{
"type": "subscribed",
"channel": "marketAttributes",
"id": "",
"contents": {
"isSnapshot": true,
"entries": [
{
"marketId": 0,
"marketDisplayName": "BTC-USD",
"offHoursInitialMarginFraction": "0.05",
"isOutsideRth": false,
"currentSettlementPrice": null,
"upperTradingBound": null,
"lowerTradingBound": null,
"nextUpperTradingBound": null,
"nextLowerTradingBound": null,
"isUpperInExpansionZone": null,
"isLowerInExpansionZone": null,
"upperZoneEnteredAt": null,
"upperExpectedExpansionAt": null,
"lowerZoneEnteredAt": null,
"lowerExpectedExpansionAt": null
},
{
"marketId": 12,
"marketDisplayName": "INTC-USD",
"offHoursInitialMarginFraction": "0.2",
"isOutsideRth": true,
"currentSettlementPrice": "150.25",
"upperTradingBound": "165.28",
"lowerTradingBound": "135.23",
"nextUpperTradingBound": "180.30",
"nextLowerTradingBound": "120.20",
"isUpperInExpansionZone": false,
"isLowerInExpansionZone": false,
"upperZoneEnteredAt": null,
"upperExpectedExpansionAt": null,
"lowerZoneEnteredAt": null,
"lowerExpectedExpansionAt": null
},
{
"marketId": 15,
"marketDisplayName": "TSLA-USD",
"offHoursInitialMarginFraction": "0.2",
"isOutsideRth": false,
"currentSettlementPrice": null,
"upperTradingBound": null,
"lowerTradingBound": null,
"nextUpperTradingBound": null,
"nextLowerTradingBound": null,
"isUpperInExpansionZone": null,
"isLowerInExpansionZone": null,
"upperZoneEnteredAt": null,
"upperExpectedExpansionAt": null,
"lowerZoneEnteredAt": null,
"lowerExpectedExpansionAt": null
}
]
}
}{
"type": "channel_data",
"channel": "marketAttributes",
"id": "",
"contents": {
"isSnapshot": false,
"entries": [
{
"marketId": 12,
"marketDisplayName": "INTC-USD",
"offHoursInitialMarginFraction": "0.2",
"isOutsideRth": true,
"currentSettlementPrice": "150.25",
"upperTradingBound": "180.30",
"lowerTradingBound": "135.23",
"nextUpperTradingBound": "210.35",
"nextLowerTradingBound": "120.20",
"isUpperInExpansionZone": false,
"isLowerInExpansionZone": false,
"upperZoneEnteredAt": null,
"upperExpectedExpansionAt": null,
"lowerZoneEnteredAt": null,
"lowerExpectedExpansionAt": null,
"boundEvent": "tradingBoundExpanded",
"boundSide": "upper",
"timestamp": 1753822800000000,
"marketSequenceNum": 4211
}
]
}
}Market attributes
Endpoint:
wss://api.arcus.xyz/v1/ws— one socket multiplexes every channel and RPC request. Click Connect, then send the example subscribe message below to start receiving data.
Per-market Regular Trading Hours / off-hours attribute state for every online market. 24/7 markets (crypto) are included with isOutsideRth: false — they never leave regular trading hours — and every other off-hours field null; they never produce streaming updates. Supersedes the marketAttributes entry variant on exchangeAttributeUpdates.
Every entry — snapshot and streaming alike — is the market’s COMPLETE current attribute block: marketId, marketDisplayName, offHoursInitialMarginFraction, isOutsideRth, currentSettlementPrice, both trading-band boundaries and next-level boundaries, and per-side expansion-zone state. Fields that do not currently apply are null, never omitted. Field semantics match GET /v1/markets.
Global channel — no id required. All subscribers receive the same stream.
On subscribe: one full block per online market (isSnapshot: true) — a complete bootstrap, no REST read needed. Streaming: a single-entry envelope with the affected market’s full post-event block on every RTH boundary crossing, VWAP seal, and off-hours bound event (isSnapshot: false). Because each update carries the full block — both sides’ bounds, not just the side an event fired on — clients replace their local entry for marketId wholesale; boundEvent annotates what fired — always present on delta entries (exitRth / enterRth on RTH boundary crossings, a bound-event name otherwise); boundSide is also always present on delta entries (null on RTH-transition / non-bound-event deltas).
{
"type": "subscribe",
"channel": "marketAttributes"
}{
"type": "subscribed",
"channel": "marketAttributes",
"id": "",
"contents": {
"isSnapshot": true,
"entries": [
{
"marketId": 0,
"marketDisplayName": "BTC-USD",
"offHoursInitialMarginFraction": "0.05",
"isOutsideRth": false,
"currentSettlementPrice": null,
"upperTradingBound": null,
"lowerTradingBound": null,
"nextUpperTradingBound": null,
"nextLowerTradingBound": null,
"isUpperInExpansionZone": null,
"isLowerInExpansionZone": null,
"upperZoneEnteredAt": null,
"upperExpectedExpansionAt": null,
"lowerZoneEnteredAt": null,
"lowerExpectedExpansionAt": null
},
{
"marketId": 12,
"marketDisplayName": "INTC-USD",
"offHoursInitialMarginFraction": "0.2",
"isOutsideRth": true,
"currentSettlementPrice": "150.25",
"upperTradingBound": "165.28",
"lowerTradingBound": "135.23",
"nextUpperTradingBound": "180.30",
"nextLowerTradingBound": "120.20",
"isUpperInExpansionZone": false,
"isLowerInExpansionZone": false,
"upperZoneEnteredAt": null,
"upperExpectedExpansionAt": null,
"lowerZoneEnteredAt": null,
"lowerExpectedExpansionAt": null
},
{
"marketId": 15,
"marketDisplayName": "TSLA-USD",
"offHoursInitialMarginFraction": "0.2",
"isOutsideRth": false,
"currentSettlementPrice": null,
"upperTradingBound": null,
"lowerTradingBound": null,
"nextUpperTradingBound": null,
"nextLowerTradingBound": null,
"isUpperInExpansionZone": null,
"isLowerInExpansionZone": null,
"upperZoneEnteredAt": null,
"upperExpectedExpansionAt": null,
"lowerZoneEnteredAt": null,
"lowerExpectedExpansionAt": null
}
]
}
}{
"type": "channel_data",
"channel": "marketAttributes",
"id": "",
"contents": {
"isSnapshot": false,
"entries": [
{
"marketId": 12,
"marketDisplayName": "INTC-USD",
"offHoursInitialMarginFraction": "0.2",
"isOutsideRth": true,
"currentSettlementPrice": "150.25",
"upperTradingBound": "180.30",
"lowerTradingBound": "135.23",
"nextUpperTradingBound": "210.35",
"nextLowerTradingBound": "120.20",
"isUpperInExpansionZone": false,
"isLowerInExpansionZone": false,
"upperZoneEnteredAt": null,
"upperExpectedExpansionAt": null,
"lowerZoneEnteredAt": null,
"lowerExpectedExpansionAt": null,
"boundEvent": "tradingBoundExpanded",
"boundSide": "upper",
"timestamp": 1753822800000000,
"marketSequenceNum": 4211
}
]
}
}Initial snapshot sent once on subscribe: one complete attribute block per online market, 24/7 crypto included (isSnapshot: true). Every field is present on every entry — null when it does not currently apply — so no REST bootstrap is needed.
Streaming update pushed on every RTH boundary crossing, VWAP seal, and off-hours bound event. The single entry is the affected market's full post-event attribute block — both sides' bounds, not just the side an event fired on — so clients replace their local entry for marketId wholesale. boundEvent annotates what fired — always present on delta entries (exitRth / enterRth on RTH boundary crossings, a bound-event name otherwise); boundSide is also always present on delta entries (null on RTH-transition / non-bound-event deltas).
Was this page helpful?