> ## Documentation Index
> Fetch the complete documentation index at: https://docs.arcus.xyz/llms.txt
> Use this file to discover all available pages before exploring further.

# 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).




## AsyncAPI

````yaml api-reference/asyncapi.yaml marketAttributes
id: marketAttributes
title: Market attributes
description: >
  > **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).
servers:
  - id: mainnet
    protocol: wss
    host: api.arcus.xyz
    bindings: []
    variables: []
  - id: testnet
    protocol: wss
    host: api.testnet.arcus.xyz
    bindings: []
    variables: []
address: /v1/ws?channel=marketAttributes
parameters: []
bindings: []
operations:
  - &ref_3
    id: subscribeMarketAttributes
    title: Subscribe market attributes
    type: receive
    messages:
      - &ref_5
        id: subscribe
        contentType: application/json
        payload:
          - name: Subscribe to the market attributes channel
            type: object
            properties:
              - name: type
                type: string
                description: subscribe
                required: true
              - name: channel
                type: string
                description: marketAttributes
                required: true
              - name: snapshot
                type: boolean
                description: >-
                  When false, suppress the initial per-market snapshot on
                  subscribe and stream only live updates. Defaults to true.
                required: false
        headers: []
        jsonPayloadSchema:
          type: object
          required:
            - type
            - channel
          properties:
            type:
              type: string
              const: subscribe
              x-parser-schema-id: <anonymous-schema-231>
            channel:
              type: string
              const: marketAttributes
              x-parser-schema-id: <anonymous-schema-232>
            snapshot:
              type: boolean
              description: >-
                When false, suppress the initial per-market snapshot on
                subscribe and stream only live updates. Defaults to true.
              default: true
              x-parser-schema-id: <anonymous-schema-233>
          x-parser-schema-id: SubscribeMarketAttributesPayload
        title: Subscribe to the market attributes channel
        example: |-
          {
            "type": "subscribe",
            "channel": "marketAttributes"
          }
        bindings: []
        extensions:
          - id: x-parser-unique-object-id
            value: subscribe
    bindings: []
    extensions: &ref_2
      - id: x-parser-unique-object-id
        value: marketAttributes
  - &ref_4
    id: receiveMarketAttributes
    title: Receive market attributes
    type: send
    messages:
      - &ref_6
        id: snapshot
        contentType: application/json
        payload:
          - allOf: &ref_0
              - type: object
                description: Common envelope for all server-pushed channel messages.
                required:
                  - type
                  - channel
                properties:
                  type:
                    type: string
                    enum:
                      - subscribed
                      - channel_data
                    description: >-
                      `subscribed` for the initial snapshot; `channel_data` for
                      updates.
                    x-parser-schema-id: <anonymous-schema-7>
                  channel:
                    type: string
                    description: Channel name.
                    x-parser-schema-id: <anonymous-schema-8>
                  id:
                    type: string
                    description: >-
                      Channel id (market or address). Absent for global
                      channels.
                    x-parser-schema-id: <anonymous-schema-9>
                  contents:
                    type: object
                    additionalProperties: true
                    description: Channel-specific payload. Schema varies by channel.
                    properties: {}
                    x-parser-schema-id: <anonymous-schema-10>
                x-parser-schema-id: ChannelDataEnvelope
              - type: object
                properties:
                  contents:
                    type: object
                    required:
                      - isSnapshot
                      - entries
                    properties:
                      isSnapshot:
                        type: boolean
                        description: >
                          True for the subscribe-time snapshot (one entry per
                          RTH market); false for streaming updates (one entry
                          for the affected market).
                        x-parser-schema-id: <anonymous-schema-236>
                      entries:
                        type: array
                        items:
                          type: object
                          description: >
                            One market's complete RTH / off-hours attribute
                            block. Every attribute field is present on every
                            entry — `null` when it does not currently apply
                            (in-RTH markets carry null bounds; a side not in its
                            expansion zone carries null zone timestamps). Field
                            semantics match the fields of the same names on `GET
                            /v1/markets`. The `boundEvent` / `boundSide` /
                            `timestamp` / `marketSequenceNum` annotations appear
                            only on streaming updates, never on snapshot
                            entries.
                          required:
                            - marketId
                            - marketDisplayName
                            - offHoursInitialMarginFraction
                            - isOutsideRth
                            - currentSettlementPrice
                            - upperTradingBound
                            - lowerTradingBound
                            - nextUpperTradingBound
                            - nextLowerTradingBound
                            - isUpperInExpansionZone
                            - isLowerInExpansionZone
                            - upperZoneEnteredAt
                            - upperExpectedExpansionAt
                            - lowerZoneEnteredAt
                            - lowerExpectedExpansionAt
                          properties:
                            marketId:
                              type: integer
                              description: Numeric market id.
                              x-parser-schema-id: <anonymous-schema-238>
                            marketDisplayName:
                              type: string
                              description: Market ticker.
                              example: INTC-USD
                              x-parser-schema-id: <anonymous-schema-239>
                            offHoursInitialMarginFraction:
                              type: string
                              description: >
                                Initial margin fraction the engine enforces
                                outside the market's RTH window (maintenance
                                margin is not uplifted off-hours).
                              example: '0.2'
                              x-parser-schema-id: <anonymous-schema-240>
                            isOutsideRth:
                              type: boolean
                              description: >
                                Current Regular Trading Hours state. Always
                                `false` for 24/7 markets (crypto), which never
                                leave regular trading hours. `null` while the
                                server has not yet learned an RTH market's state
                                (briefly after a deploy).
                              nullable: true
                              x-parser-schema-id: <anonymous-schema-241>
                            currentSettlementPrice:
                              type: string
                              description: >
                                Sealed VWAP settlement price (decimal USD)
                                anchoring the off-hours trading band. `null`
                                in-RTH (no anchor).
                              example: '150.25'
                              nullable: true
                              x-parser-schema-id: <anonymous-schema-242>
                            upperTradingBound:
                              type: string
                              description: >
                                Actual upper boundary (decimal USD) of the
                                off-hours band: anchor + anchor ×
                                initialMarginFraction × bandMultiplier, where
                                the multiplier walks the 0.5×→1×→2×→4× ladder
                                independently per side. `null` in-RTH.
                              example: '165.28'
                              nullable: true
                              x-parser-schema-id: <anonymous-schema-243>
                            lowerTradingBound:
                              type: string
                              description: >-
                                Actual lower boundary of the off-hours band.
                                `null` in-RTH.
                              example: '135.23'
                              nullable: true
                              x-parser-schema-id: <anonymous-schema-244>
                            nextUpperTradingBound:
                              type: string
                              description: >
                                Boundary the upper band moves to if it expands
                                one level (equals `upperTradingBound` at the 4×
                                ceiling). `null` in-RTH.
                              example: '180.30'
                              nullable: true
                              x-parser-schema-id: <anonymous-schema-245>
                            nextLowerTradingBound:
                              type: string
                              description: >-
                                Boundary the lower band moves to if it expands
                                one level. `null` in-RTH.
                              example: '120.20'
                              nullable: true
                              x-parser-schema-id: <anonymous-schema-246>
                            isUpperInExpansionZone:
                              type: boolean
                              description: >
                                Whether the upper side is in its expansion zone
                                (its 1-hour impact-price EWMA is holding within
                                90% of the boundary). `null` in-RTH.
                              nullable: true
                              x-parser-schema-id: <anonymous-schema-247>
                            isLowerInExpansionZone:
                              type: boolean
                              description: >-
                                Whether the lower side is in its expansion zone.
                                `null` in-RTH.
                              nullable: true
                              x-parser-schema-id: <anonymous-schema-248>
                            upperZoneEnteredAt:
                              type: integer
                              format: int64
                              description: >
                                Unix seconds the upper side entered its
                                expansion zone. `null` when not in the zone.
                              nullable: true
                              x-parser-schema-id: <anonymous-schema-249>
                            upperExpectedExpansionAt:
                              type: integer
                              format: int64
                              description: >
                                Earliest Unix seconds the upper bound can expand
                                (zoneEnteredAt

                                + one hour; not a guarantee — the EWMA must
                                still be in the zone when the hour completes).
                                `null` when not in the zone.
                              nullable: true
                              x-parser-schema-id: <anonymous-schema-250>
                            lowerZoneEnteredAt:
                              type: integer
                              format: int64
                              description: >-
                                Unix seconds the lower side entered its
                                expansion zone. `null` when not in the zone.
                              nullable: true
                              x-parser-schema-id: <anonymous-schema-251>
                            lowerExpectedExpansionAt:
                              type: integer
                              format: int64
                              description: >-
                                Earliest Unix seconds the lower bound can
                                expand. `null` when not in the zone.
                              nullable: true
                              x-parser-schema-id: <anonymous-schema-252>
                            boundEvent:
                              type: string
                              enum:
                                - exitRth
                                - enterRth
                                - expansionZoneEntered
                                - expansionZoneExited
                                - tradingBoundExpanded
                              description: >
                                Event annotation for streaming updates. Omitted
                                only on snapshot entries — always present on
                                delta entries, since every update frame is
                                either an RTH transition or a bound event.
                                `exitRth` (market leaves regular trading hours)
                                / `enterRth` (market re-enters) — the block
                                itself carries the resulting state, so there is
                                no separate bound-price field for these.
                                `expansionZoneEntered` (side's impact-price EWMA
                                crossed within 90% of its boundary, starting the
                                1-hour expansion clock), `expansionZoneExited`
                                (EWMA relaxed out; clock reset),
                                `tradingBoundExpanded` (clock completed; band
                                widened one level on the 0.5×→1×→2×→4× ladder —
                                the new boundary IS the block's
                                `upperTradingBound` / `lowerTradingBound`).
                              x-parser-schema-id: <anonymous-schema-253>
                            boundSide:
                              type: string
                              enum:
                                - upper
                                - lower
                              description: >
                                Which band edge fired on bound-event deltas
                                ("upper" / "lower"). Null on snapshot entries
                                and on RTH-transition (`exitRth` / `enterRth`)
                                deltas.
                              x-parser-schema-id: <anonymous-schema-254>
                            timestamp:
                              type: integer
                              format: int64
                              description: >-
                                Event time in Unix microseconds (streaming
                                updates only).
                              x-parser-schema-id: <anonymous-schema-255>
                            marketSequenceNum:
                              type: integer
                              format: int64
                              description: >
                                Per-market transaction sequence number
                                (streaming updates only). Entries emitted by one
                                engine transaction share this value — it
                                identifies the transaction, not the entry, so do
                                not dedup by it alone.
                              x-parser-schema-id: <anonymous-schema-256>
                          x-parser-schema-id: MarketAttributesEntry
                        x-parser-schema-id: <anonymous-schema-237>
                    x-parser-schema-id: <anonymous-schema-235>
                x-parser-schema-id: <anonymous-schema-234>
            x-parser-schema-id: MarketAttributesChannelPayload
            name: Market Attributes Snapshot
            description: >
              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.
        headers: []
        jsonPayloadSchema: &ref_1
          allOf: *ref_0
          x-parser-schema-id: MarketAttributesChannelPayload
        title: Market Attributes Snapshot
        description: >
          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.
        example: |-
          {
            "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
                }
              ]
            }
          }
        bindings: []
        extensions:
          - id: x-parser-unique-object-id
            value: snapshot
      - &ref_7
        id: update
        contentType: application/json
        payload:
          - allOf: *ref_0
            x-parser-schema-id: MarketAttributesChannelPayload
            name: Market Attributes Update
            description: >
              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).
        headers: []
        jsonPayloadSchema: *ref_1
        title: Market Attributes Update
        description: >
          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).
        example: |-
          {
            "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
                }
              ]
            }
          }
        bindings: []
        extensions:
          - id: x-parser-unique-object-id
            value: update
    bindings: []
    extensions: *ref_2
sendOperations:
  - *ref_3
receiveOperations:
  - *ref_4
sendMessages:
  - *ref_5
receiveMessages:
  - *ref_6
  - *ref_7
extensions:
  - id: x-parser-unique-object-id
    value: marketAttributes
securitySchemes: []

````