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

# Exchange attribute updates

> > **Endpoint:** `wss://api.testnet.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.

Exchange-wide attribute state, discriminated by entry `type`. Currently the only entry type is `"feeTierConfig"`, which carries the full fee tier table whenever an operator updates it via `PUT /internal/feetiers` or `POST /internal/feetiers/{level}`.

**Global channel — no `id` required.** All subscribers receive the same stream.

On subscribe: snapshot of the current fee tier table (one `feeTierConfig` entry, `isSnapshot: true`). Streaming: whenever the operator edits the fee tier config, go-core confirms the change and go-socks broadcasts a full table replacement (`isSnapshot: false`).

The equivalent REST read is `GET /v1/feetiers`.




## AsyncAPI

````yaml api-reference/asyncapi.yaml exchangeAttributeUpdates
id: exchangeAttributeUpdates
title: Exchange attribute updates
description: >
  > **Endpoint:** `wss://api.testnet.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.


  Exchange-wide attribute state, discriminated by entry `type`. Currently the
  only entry type is `"feeTierConfig"`, which carries the full fee tier table
  whenever an operator updates it via `PUT /internal/feetiers` or `POST
  /internal/feetiers/{level}`.


  **Global channel — no `id` required.** All subscribers receive the same
  stream.


  On subscribe: snapshot of the current fee tier table (one `feeTierConfig`
  entry, `isSnapshot: true`). Streaming: whenever the operator edits the fee
  tier config, go-core confirms the change and go-socks broadcasts a full table
  replacement (`isSnapshot: false`).


  The equivalent REST read is `GET /v1/feetiers`.
servers:
  - id: testnet
    protocol: wss
    host: api.testnet.arcus.xyz
    bindings: []
    variables: []
  - id: mainnet
    protocol: wss
    host: api.arcus.xyz
    bindings: []
    variables: []
address: /v1/ws?channel=exchangeAttributeUpdates
parameters: []
bindings: []
operations:
  - &ref_3
    id: subscribeExchangeAttributes
    title: Subscribe exchange attributes
    type: receive
    messages:
      - &ref_5
        id: subscribe
        contentType: application/json
        payload:
          - name: Subscribe to the exchange attribute updates channel
            type: object
            properties:
              - name: type
                type: string
                description: subscribe
                required: true
              - name: channel
                type: string
                description: exchangeAttributeUpdates
                required: true
              - name: snapshot
                type: boolean
                description: >-
                  When false, suppress the initial state 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-160>
            channel:
              type: string
              const: exchangeAttributeUpdates
              x-parser-schema-id: <anonymous-schema-161>
            snapshot:
              type: boolean
              description: >-
                When false, suppress the initial state snapshot on subscribe and
                stream only live updates. Defaults to true.
              default: true
              x-parser-schema-id: <anonymous-schema-162>
          x-parser-schema-id: SubscribeExchangeAttributeUpdatesPayload
        title: Subscribe to the exchange attribute updates channel
        example: |-
          {
            "type": "subscribe",
            "channel": "exchangeAttributeUpdates"
          }
        bindings: []
        extensions:
          - id: x-parser-unique-object-id
            value: subscribe
    bindings: []
    extensions: &ref_2
      - id: x-parser-unique-object-id
        value: exchangeAttributeUpdates
  - &ref_4
    id: receiveExchangeAttributes
    title: Receive exchange 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-5>
                  channel:
                    type: string
                    description: Channel name.
                    x-parser-schema-id: <anonymous-schema-6>
                  id:
                    type: string
                    description: >-
                      Channel id (market or address). Absent for global
                      channels.
                    x-parser-schema-id: <anonymous-schema-7>
                  contents:
                    type: object
                    additionalProperties: true
                    description: Channel-specific payload. Schema varies by channel.
                    properties: {}
                    x-parser-schema-id: <anonymous-schema-8>
                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; false for
                          streaming updates triggered by operator fee tier
                          edits.
                        x-parser-schema-id: <anonymous-schema-165>
                      entries:
                        type: array
                        items:
                          type: object
                          description: >
                            A discriminated-union entry in the
                            exchangeAttributeUpdates stream. Currently the only
                            defined `type` is `"feeTierConfig"`.
                          required:
                            - type
                          properties:
                            type:
                              type: string
                              enum:
                                - feeTierConfig
                              description: >-
                                Discriminator. `"feeTierConfig"` carries the
                                full fee tier table.
                              x-parser-schema-id: <anonymous-schema-167>
                            tiers:
                              type: array
                              items:
                                type: object
                                description: >-
                                  One tier row in a feeTierConfig exchange
                                  attribute entry.
                                required:
                                  - level
                                  - name
                                  - volumeThreshold
                                  - makerFeeBps
                                  - takerFeeBps
                                properties:
                                  level:
                                    type: integer
                                    format: uint8
                                    description: >
                                      Tier level index (0=Base, 1=Bronze,
                                      2=Silver, 3=Gold, 4=Platinum, 5=VIP,
                                      6=Max).
                                    x-parser-schema-id: <anonymous-schema-169>
                                  name:
                                    type: string
                                    description: >-
                                      Human-readable tier name (e.g. "Base",
                                      "Gold").
                                    x-parser-schema-id: <anonymous-schema-170>
                                  volumeThreshold:
                                    type: integer
                                    format: int64
                                    description: >
                                      30-day notional volume threshold in
                                      USD×1e6 required to reach this tier.
                                      Always 0 for the base tier.
                                    x-parser-schema-id: <anonymous-schema-171>
                                  makerFeeBps:
                                    type: integer
                                    format: int32
                                    description: >
                                      Maker fee rate in ppm — parts-per-million
                                      of notional (e.g. 200 = 0.02% = 2 bps).
                                      Negative values indicate a maker rebate.
                                    x-parser-schema-id: <anonymous-schema-172>
                                  takerFeeBps:
                                    type: integer
                                    format: int32
                                    description: >
                                      Taker fee rate in ppm — parts-per-million
                                      of notional (e.g. 500 = 0.05% = 5 bps).
                                      Always ≥ 0.
                                    x-parser-schema-id: <anonymous-schema-173>
                                x-parser-schema-id: ExchangeAttributesFeeTierTier
                              description: >
                                Present when `type` is `"feeTierConfig"`. Full
                                replacement of the exchange fee tier table,
                                sorted ascending by level.
                              x-parser-schema-id: <anonymous-schema-168>
                          x-parser-schema-id: ExchangeAttributesEntry
                        x-parser-schema-id: <anonymous-schema-166>
                    x-parser-schema-id: <anonymous-schema-164>
                x-parser-schema-id: <anonymous-schema-163>
            x-parser-schema-id: ExchangeAttributesUpdatePayload
            name: Exchange Attributes Snapshot
            description: >
              Initial snapshot sent once on subscribe. Contains one
              `feeTierConfig` entry with the complete current fee tier table
              (`isSnapshot: true`).
        headers: []
        jsonPayloadSchema: &ref_1
          allOf: *ref_0
          x-parser-schema-id: ExchangeAttributesUpdatePayload
        title: Exchange Attributes Snapshot
        description: >
          Initial snapshot sent once on subscribe. Contains one `feeTierConfig`
          entry with the complete current fee tier table (`isSnapshot: true`).
        example: |-
          {
            "type": "subscribed",
            "channel": "exchangeAttributeUpdates",
            "id": "",
            "contents": {
              "isSnapshot": true,
              "entries": [
                {
                  "type": "feeTierConfig",
                  "tiers": [
                    {
                      "level": 0,
                      "name": "Base",
                      "volumeThreshold": 0,
                      "makerFeeBps": 200,
                      "takerFeeBps": 500
                    },
                    {
                      "level": 1,
                      "name": "Bronze",
                      "volumeThreshold": 100000000000,
                      "makerFeeBps": 150,
                      "takerFeeBps": 450
                    }
                  ]
                }
              ]
            }
          }
        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: ExchangeAttributesUpdatePayload
            name: Exchange Attributes Update
            description: >
              Streaming update pushed whenever an operator edits the exchange
              fee tier config. Always carries the full updated table in a single
              `feeTierConfig` entry (`isSnapshot: false`). Clients should
              replace their local copy atomically.
        headers: []
        jsonPayloadSchema: *ref_1
        title: Exchange Attributes Update
        description: >
          Streaming update pushed whenever an operator edits the exchange fee
          tier config. Always carries the full updated table in a single
          `feeTierConfig` entry (`isSnapshot: false`). Clients should replace
          their local copy atomically.
        example: |-
          {
            "type": "channel_data",
            "channel": "exchangeAttributeUpdates",
            "id": "",
            "contents": {
              "isSnapshot": false,
              "entries": [
                {
                  "type": "feeTierConfig",
                  "tiers": [
                    {
                      "level": 0,
                      "name": "Base",
                      "volumeThreshold": 0,
                      "makerFeeBps": 200,
                      "takerFeeBps": 500
                    }
                  ]
                }
              ]
            }
          }
        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: exchangeAttributeUpdates
securitySchemes: []

````