dxFeed dxLink WebSocket API

dxLink is dxFeed's WebSocket protocol for real-time market data streaming with multiplexed virtual channels, authorization, and FEED/DOM (order book) service channels. The protocol is publicly specified as an AsyncAPI 2.4 document in the dxFeed/dxLink GitHub repository, with a live demo server (wss://demo.dxfeed.com/dxlink-ws) and an interactive debug console; client SDKs exist for JavaScript, Java, .NET, C++, and Swift.

AsyncAPI Specification

dxfeed-dxlink-asyncapi.yml Raw ↑
asyncapi: 2.4.0
defaultContentType: application/json
info:
  title: dxLink WebSocket
  version: 1.0.2
  description: |
    ## Overview
    dxLink.WebSocket is a WebSocket-based protocol that allows you to receive market data from dxFeed services.

    ## Terminology
    - **Connection** - an instance of the WebSocket connection
    - **Client** - a side that initiates the connection
    - **Server** - a side that accepts the connection
    - **Message** - a frame of data sent over the WebSocket connection
    - **Channel** - an independent virtual connection within a single WebSocket connection
    - **Service** - a source that provides data

    ## Communication
    WebSocket doesn't provide built-in multi-channel support, so we have implemented it ourselves.
    We provide the ability to work in virtual isolated channels within a single WebSocket connection.

    ***In the AsyncAPI specification, one channel displays one specific WebSocket connection, so don't confuse the AsyncAPI channels with ours in this case.***

    ## Messages
    All messages are JSON objects with the following structure:
    ```json
    {
      "type": "<MESSAGE_TYPE>",
      "channel": <CHANNEL_ID>
      // ...other fields
    }
    ```
    - The `type` field is a string that contains the message type
    - The `channel` field is a number that contains the ID of the channel to which the message belongs
    - Other fields are the message's `payload`

    The main channel performs the exchange of protocol messages that pertain to the entire connection (not to a specific channel). This main channel is identified by a channel ID `0`.

    ## Error Handling
    If an error occurs, the server will send an `ERROR` message to the client.
    The client does not need to respond to the error message, as it is for informational purposes only.

    The server can send the following error types:
    - `UNSUPPORTED_PROTOCOL` - The server does not support the protocol version.
    - `TIMEOUT` - the server did not receive the expected message within the allotted time period and considered that the connection was lost.
    - `UNAUTHORIZED` - the client was not authorized for that action.
    - `INVALID_MESSAGE` - the server was unable to parse the received message(s).
    - `BAD_ACTION` - the server detected a protocol violation in the previously received message(s).
    - `UNKNOWN` - an error occurred that does not fit into any of the previously described types.

    Example of an error message:
    ```json
    {
      "type": "ERROR",
      "channel": 0,
      "error": "TIMEOUT",
      "message": "The timeout has been reached. The message was last received 60 seconds ago."
    }
    ```

    ## Connection
    The connection is established by sending a WebSocket connection request to the server.

    After the connection is established, the client must send the `SETUP` message to the server within the connection timeout period. The server will then respond with the `SETUP` message containing its own settings.
    
    The `version` field contains the protocol version. The format is typically `<protocol-version>-<client-implementation>/<client-version>` (e.g., `"0.1-js/1.0.0"`).

    ```json
    {
      "type": "SETUP",
      "channel": 0,
      "keepaliveTimeout": 60,
      "acceptKeepaliveTimeout": 60,
      "version": "0.1-js/1.0.0"
    }
    ```

    ## Authentication
    The authentication is performed by sending the `AUTH` message to the server after the `SETUP` exchange.
    If the server requires authentication, it will send an `AUTH_STATE` message with `UNAUTHORIZED` state.
    Authentication may not be required for all servers.
    ```json
    {
      "type": "AUTH",
      "channel": 0,
      "token": "token#123"
    }
    ```

    The server will notify the client with the `AUTH_STATE` message. The `state` field is set to `AUTHORIZED` or `UNAUTHORIZED`.
    ```json
    {
      "type": "AUTH_STATE",
      "channel": 0,
      "state": "AUTHORIZED"
    }
    ```

    ## Connection Maintenance
    To prevent the connection from being closed due to inactivity:
    - The client must send any message to the server before the server's `keepaliveTimeout` expires. The server's `keepaliveTimeout` is sent in the `SETUP` message from the server.
    - The server must send any message to the client before the client's `keepaliveTimeout` expires. The client's `keepaliveTimeout` is sent in the `SETUP` message from the client.
    If a client or server does not send any other messages, they can use the special message `KEEPALIVE`. Otherwise, the other side will close the connection.

    ```json
    {
      "type": "KEEPALIVE",
      "channel": 0
    }
    ```

    ## Channel
    The channel is a virtual connection created by the client and isolated from other channels.
    The channel can be used to receive data from one of dxFeed's services.
    
    Channel lifecycle:
    1. The client sends a `CHANNEL_REQUEST` message with the desired `service` and channel number
    2. The server responds with a `CHANNEL_OPENED` message
    3. The client and server exchange service-specific messages on this channel
    4. The client sends a `CHANNEL_CANCEL` message to close the channel
    5. The server responds with a `CHANNEL_CLOSED` message
    
    The client should use only odd channel numbers to send channel requests on the service channels.

    ## `FEED` service
    `FEED` - provides real-time access to the market events.

    To open a channel, the client must send the `CHANNEL_REQUEST` message to the server with the `service` field set to `FEED`.
    The server will respond with the `CHANNEL_OPENED` message.

    ```json
    {
      "type": "CHANNEL_REQUEST",
      "channel": 1,
      "service": "FEED",
      "parameters": {
        "contract": "AUTO"
      }
    }
    ```

    ### Subscribe
    To subscribe to data, the client must send the `FEED_SUBSCRIPTION` message to the server with the `add` field set to the desired symbol.
    ```json
    {
      "type": "FEED_SUBSCRIPTION",
      "channel": 1,
      "add": [{ "symbol": "AAPL", "type": "Quote" }]
    }
    ```

    ### Unsubscribe
    To unsubscribe from data, the client must send the `FEED_SUBSCRIPTION` message to the server with the `remove` field set to the desired symbol.
    Or send the `FEED_SUBSCRIPTION` message with the `reset` field set to `true`, which will unsubscribe from all symbols.
    ```json
    {
      "type": "FEED_SUBSCRIPTION",
      "channel": 1,
      "remove": [{ "symbol": "AAPL", "type": "Quote" }]
    }
    ```

    ### Data
    The server will send the `FEED_DATA` message to the client with the `data` field set to the received events.
    ```json
    {
      "type": "FEED_DATA",
      "channel": 1,
      "data": [
        {
          "eventSymbol": "AAPL",
          "eventType": "Quote",
          "bidPrice": 123.45,
          "askPrice": 123.46,
          "bidSize": 100,
          "askSize": 200
        }
      ]
    }
    ```

    ### Configuration
    To configure the service, the client must send a `FEED_SETUP` message to the server with the acceptable configuration.
    ```json
    {
      "type": "FEED_SETUP",
      "channel": 1,
      "acceptAggregationPeriod": 10,
      "acceptDataFormat": "COMPACT",
      "acceptEventFields": {
        "Quote": ["eventType", "eventSymbol", "bidPrice", "askPrice", "bidSize", "askSize"]
      }
    }
    ```
    The server will notify the client with the `FEED_CONFIG` message containing the actual configuration.
    ```json
    {
      "type": "FEED_CONFIG",
      "channel": 1,
      "aggregationPeriod": 10,
      "dataFormat": "COMPACT",
      "eventFields": {
        "Quote": ["eventType", "eventSymbol", "bidPrice", "askPrice", "bidSize", "askSize"]
      }
    }
    ```

    ## `DOM` service

    `DOM` - provides real-time access to depth of market service.

    To open a channel, the client must send the `CHANNEL_REQUEST` message to the server with the `service` field set to `DOM` and desired parameters.
    The server will respond with the `CHANNEL_OPENED` message.

    ```json
    {
      "type": "CHANNEL_REQUEST",
      "channel": 1,
      "service": "DOM",
      "parameters": {
        "symbol": "AAPL",
        "sources": ["ntv"]
      }
    }
    ```

    ### Configure
    To start receiving the snapshot, the client must send the `DOM_SETUP` message first.
    ```json
    {
      "type": "DOM_SETUP",
      "channel": 1,
    }
    ```

    ### Snapshot
    The server will send the `DOM_SNAPSHOT` message to the client with the snapshot of the depth of market for desired symbol and sources.
    ```json
    {
      "type": "DOM_SNAPSHOT",
      "channel": 1,
      "time": 1710262466056,
      "bids": [
        { "price": 172.33, "size": 376 },
        { "price": 172.32, "size": 381 },
        { "price": 172.31, "size": 405 },
        { "price": 172.3, "size": 388 },
        { "price": 172.29, "size": 356 }
      ],
      "asks": [
        { "price": 172.34, "size": 165 },
        { "price": 172.35, "size": 301 },
        { "price": 172.36, "size": 300 },
        { "price": 172.37, "size": 490 },
        { "price": 172.38, "size": 608 }
      ]
    }
    ```

    ### Configuration
    To start receiving snapshots and configure the service, the client must send a `DOM_SETUP` message to the server with the acceptable configuration.
    ```json
    {
      "type": "DOM_SETUP",
      "channel": 1,
      "acceptAggregationPeriod": 10,
      "acceptDepthLimit": 5,
      "acceptDataFormat": "FULL",
      "acceptOrderFields": ["price", "size"]
    }
    ```
    The server will notify the client with the `DOM_CONFIG` message containing the actual configuration.
    ```json
    {
      "type": "DOM_CONFIG",
      "channel": 1,
      "aggregationPeriod": 10,
      "depthLimit": 5,
      "dataFormat": "FULL",
      "orderFields": ["price", "size"]
    }
    ```

    ## Example
    Real-world example of the protocol exchange:

    ```
    CONNECTED
    // Connection establishment
    CLIENT -> { "type": "SETUP", "channel": 0, "keepaliveTimeout": 60, "acceptKeepaliveTimeout": 60, "version": "1.0.0" }
    SERVER <- { "type": "SETUP", "channel": 0, "keepaliveTimeout": 60, "acceptKeepaliveTimeout": 60, "version": "1.0.0" }

    // Indicates that authorization is required
    SERVER <- { "type": "AUTH_STATE", "channel": 0, "state": "UNAUTHORIZED" }

    // Authorization
    CLIENT -> { "type": "AUTH", "channel": 0, "token": "token#123" }
    SERVER <- { "type": "AUTH_STATE", "channel": 0, "state": "AUTHORIZED" }

    // Request a new channel for Quote events
    CLIENT -> {
      "type": "CHANNEL_REQUEST",
      "channel": 1,
      "service": "FEED",
      "parameters": { "contract": "AUTO" }
    }
    SERVER <- {
      "type": "CHANNEL_OPENED",
      "channel": 1,
      "service": "FEED",
      "parameters": { "contract": "AUTO" }
    }

    // Subscribe to Quote events
    CLIENT -> {
      "type": "FEED_SUBSCRIPTION",
      "channel": 1,
      "add": [{ "symbol": "AAPL", "type": "Quote" }]
    }

    // Receive Quotes
    SERVER <- {
      "type": "FEED_CONFIG",
      "channel": 1,
      "eventFields": {
        "Quote": ["eventSymbol", "eventType", "bidPrice", "askPrice", "bidSize", "askSize"]
      }
    }
    SERVER <- {
      "type": "FEED_DATA",
      "channel": 1,
      "data": [
        {
          "eventSymbol": "AAPL",
          "eventType": "Quote",
          "bidPrice": 123.45,
          "askPrice": 123.46,
          "bidSize": 100,
          "askSize": 200
        }
      ]
    }

    // Close channel
    CLIENT -> {
      "type": "CHANNEL_CANCEL",
      "channel": 1
    }
    SERVER <- {
      "type": "CHANNEL_CLOSED",
      "channel": 1
    }

    // Request a new channel for Candle events
    CLIENT -> {
      "type": "CHANNEL_REQUEST",
      "channel": 3,
      "service": "FEED",
      "parameters": { "contract": "AUTO" }
    }
    SERVER <- {
      "type": "CHANNEL_OPENED",
      "channel": 3,
      "service": "FEED",
      "parameters": { "contract": "AUTO" }
    }

    // Subscribe to Candle events with time
    CLIENT -> {
      "type": "FEED_SUBSCRIPTION",
      "channel": 3,
      "add": [{ "symbol": "AAPL{=d}", "type": "Candle", "fromTime": 1666600000000 }]
    }

    // Receive Candle snapshot
    SERVER <- {
      "type": "FEED_CONFIG",
      "channel": 3,
      "eventFields": {
        "Candle": ["eventSymbol", "eventType", "eventFlags", "open", "close"]
      }
    }
    SERVER <- {
      "type": "FEED_DATA",
      "channel": 3,
      "data": [
        {
          "eventSymbol": "AAPL{=d}",
          "eventType": "Candle",
          "eventFlags": 0,
          "open": 123.45,
          "close": 123.46
        }
      ]
    }

    ...

    // Close channel
    CLIENT -> {
      "type": "CHANNEL_CANCEL",
      "channel": 3
    }
    SERVER <- {
      "type": "CHANNEL_CLOSED",
      "channel": 3
    }
    DISCONNECTED
    ```

servers:
  demo:
    url: wss://demo.dxfeed.com/dxlink-ws
    protocol: dxlink-ws
    description: Demo server

channels:
  /:
    description: The main entry point to receive and send messages.
    bindings:
      ws:
        method: GET
    subscribe:
      message:
        oneOf:
          - $ref: "#/components/messages/ErrorMessage"
          - $ref: "#/components/messages/SetupMessage"
          - $ref: "#/components/messages/KeepaliveMessage"
          - $ref: "#/components/messages/AuthStateMessage"
          - $ref: "#/components/messages/ChannelOpenedMessage"
          - $ref: "#/components/messages/ChannelClosedMessage"
          - $ref: "#/components/messages/FeedConfigMessage"
          - $ref: "#/components/messages/FeedDataMessage"
          - $ref: "#/components/messages/DomConfigMessage"
          - $ref: "#/components/messages/DomSnapshotMessage"
    publish:
      message:
        oneOf:
          - $ref: "#/components/messages/ErrorMessage"
          - $ref: "#/components/messages/SetupMessage"
          - $ref: "#/components/messages/AuthMessage"
          - $ref: "#/components/messages/KeepaliveMessage"
          - $ref: "#/components/messages/FeedChannelRequestMessage"
          - $ref: "#/components/messages/DomChannelRequestMessage"
          - $ref: "#/components/messages/ChannelCancelMessage"
          - $ref: "#/components/messages/FeedSetupMessage"
          - $ref: "#/components/messages/FeedSubscriptionMessage"
          - $ref: "#/components/messages/DomSetupMessage"

components:
  messages:
    ErrorMessage:
      summary: Error notification.
      description: |
        Receiving an error message does not require any action and is for informational purposes only.
      payload:
        allOf:
          - $ref: "#/components/schemas/Message"
          - type: object
            properties:
              type:
                const: ERROR
              error:
                description: |
                  Error type. Possible values:
                  - UNSUPPORTED_PROTOCOL - does not support the protocol version
                  - TIMEOUT - did not receive the expected message within the allotted time period and considered that the connection was lost
                  - UNAUTHORIZED - the client was not authorized
                  - INVALID_MESSAGE - when trying to process a received message(s), was unable to parse it correctly
                  - BAD_ACTION - the server has detected a protocol violation in the previously received message(s).
                  - UNKNOWN - an error occurred that does not fit into any of the previously described types.
                type: string
                enum:
                  - UNSUPPORTED_PROTOCOL
                  - TIMEOUT
                  - UNAUTHORIZED
                  - INVALID_MESSAGE
                  - BAD_ACTION
                  - UNKNOWN
              message:
                description: Contains the description or reason for the error.
                type: string
            required: [channel, type, error, message]
      examples:
        - summary: Timeout error
          payload:
            {
              "channel": 0,
              "type": "ERROR",
              "error": "TIMEOUT",
              "message": "The timeout has been reached. The message was last received 60 seconds ago.",
            }
        - summary: Invalid message error
          payload:
            {
              "channel": 0,
              "type": "ERROR",
              "error": "INVALID_MESSAGE",
              "message": "The message is not valid JSON.",
            }

    SetupMessage:
      summary: Allows setting up connection.
      description: |
        The first message the client must send to the server after a successful connection.
      payload:
        allOf:
          - $ref: "#/components/schemas/Message"
          - type: object
            properties:
              channel:
                const: 0
              type:
                const: SETUP
              keepaliveTimeout:
                description: Time to disconnect the sender if no messages are received (in seconds).
                type: number
              acceptKeepaliveTimeout:
                description: The desired time to disconnect the receiver if no messages are received (in seconds).
                type: number
              version:
                description: Protocol version.
                type: string
                example: "0.1-js/1.0.0"
            required: [channel, type, version]
      examples:
        - summary: Client setup message.
          payload:
            {
              "channel": 0,
              "type": "SETUP",
              "keepaliveTimeout": 60,
              "acceptKeepaliveTimeout": 60,
              "version": "0.1-js/1.0.0",
            }
        - summary: Server setup message.
          payload:
            {
              "channel": 0,
              "type": "SETUP",
              "keepaliveTimeout": 60,
              "acceptKeepaliveTimeout": 60,
              "version": "0.1-123-123",
            }

    KeepaliveMessage:
      summary: Allows the connection to stay alive.
      description: |
        The client must send any messages to the server at least once before the timeout is reached (see `SETUP` message). Otherwise, the server will close the connection.
        The server must send any messages to the client at least once before the timeout is reached (see `SETUP` message). Otherwise, the client should close the connection.
      payload:
        allOf:
          - $ref: "#/components/schemas/Message"
          - type: object
            properties:
              channel:
                const: 0
              type:
                const: KEEPALIVE
            required: [channel, type]
      examples:
        - summary: Keepalive message
          payload: { "channel": 0, "type": "KEEPALIVE" }

    AuthMessage:
      summary: Allows the client to authorize.
      description: |
        The client must send this message to the server after the connection is established and the `SETUP` is sent.
        The server will notify with the `AUTH_STATE` message or close the connection if the authorization is unsuccessful.
      payload:
        allOf:
          - $ref: "#/components/schemas/Message"
          - type: object
            properties:
              channel:
                const: 0
              type:
                const: AUTH
              token:
                description: Authorization token.
                type: string
            required: [channel, type, token]
      examples:
        - summary: Authorization
          payload: { "channel": 0, "type": "AUTH", "token": "token#123" }

    AuthStateMessage:
      summary: Notification of authorization state.
      description: |
        The server will send this message with an `UNAUTHORIZED state` to notify that authorization is required.
        The server will send this message with an `AUTHORIZED state` to notify that authorization was successful or not required.
      payload:
        allOf:
          - $ref: "#/components/schemas/Message"
          - type: object
            properties:
              channel:
                const: 0
              type:
                const: AUTH_STATE
              state:
                description: |
                  Authorization state. Possible values:
                  - `AUTHORIZED` - authorization is successful
                  - `UNAUTHORIZED` - authorization failed
                type: string
                enum:
                  - AUTHORIZED
                  - UNAUTHORIZED
            required: [channel, type, state]
      examples:
        - summary: Authorization successful.
          payload: { "channel": 0, "type": "AUTH_STATE", "state": "AUTHORIZED" }
        - summary: Authorization required.
          payload:
            { "channel": 0, "type": "AUTH_STATE", "state": "UNAUTHORIZED" }

    FeedChannelRequestMessage:
      summary: Allows the client to request the feed channel.
      description: |
        The client can send this message to the server to open a channel for two-way communication with the service.
        The server will notify the client with the `CHANNEL_OPENED` message.
      payload:
        allOf:
          - $ref: "#/components/schemas/Message"
          - type: object
            properties:
              type:
                const: CHANNEL_REQUEST
              service:
                description: |
                  Operated service. Possible values:
                  - `FEED` - the feed service offers the ability to receive real-time updates about the trading information such as quotes, last traded price, volumes, and others.
                enum:
                  - FEED
              parameters:
                description: Parameters of the feed service.
                type: object
                properties:
                  contract:
                    $ref: "#/components/schemas/FeedContract"
                required: [contract]
            required: [channel, type, service, parameters]
      examples:
        - summary: Feed channel request with AUTO contract.
          payload:
            {
              "channel": 1,
              "type": "CHANNEL_REQUEST",
              "service": "FEED",
              "parameters": { "contract": "AUTO" },
            }
    DomChannelRequestMessage:
      summary: Allows the client to request the dom channel.
      description: |
        The client can send this message to the server to open a channel for two-way communication with the service.
        The server will notify the client with the `CHANNEL_OPENED` message.
      payload:
        allOf:
          - $ref: "#/components/schemas/Message"
          - type: object
            properties:
              type:
                const: CHANNEL_REQUEST
              service:
                description: |
                  Operated service. Possible values:
                  - `DOM` - the dom service offers the ability to receive real-time updates about the depth of market.
                enum:
                  - DOM
              parameters:
                description: Parameters of the dom service.
                type: object
                properties:
                  symbol:
                    type: string
                  sources:
                    type: array
                    items:
                      description: Order source.
                      examples: ["ntv"]
                      type: string
                required: [symbol, sources]
            required: [channel, type, service, parameters]
      examples:
        - summary: Dom channel request.
          payload:
            {
              "channel": 1,
              "type": "CHANNEL_REQUEST",
              "service": "DOM",
              "parameters": { "symbol": "AAPL", "sources": ["ntv"] },
            }

    ChannelOpenedMessage:
      summary: Notification of the opened channel.
      description: |
        The server will send this message to the client after the `CHANNEL_REQUEST` message is received.
      payload:
        allOf:
          - $ref: "#/components/schemas/Message"
          - type: object
            properties:
              type:
                const: CHANNEL_OPENED
              service:
                enum:
                  - FEED
                  - DOM
              parameters:
                description: Parameters of operated channel.
                type: object
                required: []
            required: [channel, type, service, parameters]
      examples:
        - summary: Feed channel opened with AUTO contract.
          payload:
            {
              "channel": 1,
              "type": "CHANNEL_OPENED",
              "service": "FEED",
              "parameters": { "contract": "AUTO" },
            }
        - summary: Dom channel opened.
          payload:
            {
              "channel": 1,
              "type": "CHANNEL_OPENED",
              "service": "DOM",
              "parameters": { "symbol": "AAPL", "sources": ["ntv"] },
            }

    ChannelClosedMessage:
      summary: Notification of the closed channel.
      description: |
        The server will send this message to the client after the `CHANNEL_CANCEL` message is received or if the server decides to close the channel.
      payload:
        allOf:
          - $ref: "#/components/schemas/Message"
          - type: object
            properties:
              type:
                const: CHANNEL_CLOSED
            required: [channel, type]
      examples:
        - summary: Channel closed
          payload: { "channel": 1, "type": "CHANNEL_CLOSED" }

    ChannelCancelMessage:
      summary: Allows the client to cancel channel requests.
      description: |
        The client can send this message to the server to close the channel.
        Once the client has sent this message, the client can forget about the channel.
      payload:
        allOf:
          - $ref: "#/components/schemas/Message"
          - type: object
            properties:
              type:
                const: CHANNEL_CANCEL
            required: [channel, type]
      examples:
        - summary: Close channel
          payload: { "channel": 1, "type": "CHANNEL_CANCEL" }

    FeedSetupMessage:
      summary: Allows the client to configure the `FEED` service.
      description: |
        The client can send this message to the server after opening a channel with the `FEED` service.
        The server will notify the client of the application with the `FEED_CONFIG` message.
      payload:
        allOf:
          - $ref: "#/components/schemas/Message"
          - type: object
            properties:
              type:
                const: FEED_SETUP
              acceptAggregationPeriod:
                description: Desired aggregation period of events (in seconds).
                type: number
              acceptEventFields:
                $ref: "#/components/schemas/FeedEventFields"
              acceptDataFormat:
                $ref: "#/components/schemas/FeedDataFormat"
            required: [channel, type]
      examples:
        - summary: Feed setup compact format with fields.
          payload:
            {
              "channel": 1,
              "type": "FEED_SETUP",
              "acceptAggregationPeriod": 1,
              "acceptEventFields":
                {
                  "Quote":
                    [
                      "eventType",
                      "eventSymbol",
                      "bidPrice",
                      "askPrice",
                      "bidSize",
                      "askSize",
                    ],
                },
              "acceptDataFormat": "COMPACT",
            }
        - summary: Feed setup full format.
          payload:
            {
              "channel": 1,
              "type": "FEED_SETUP",
              "acceptAggregationPeriod": 1,
              "acceptDataFormat": "FULL",
            }

    FeedConfigMessage:
      summary: Notification of the `FEED` service configuration.
      description: |
        The server can send this message to the client after receiving the `FEED_SETUP` message.
        The server can send this message to the client if the `FEED` service configuration has changed.
        Parameters are lazy therefore the server may not send the notification immediately, but before the first `FEED_DATA` is sent.
      payload:
        allOf:
          - $ref: "#/components/schemas/Message"
          - type: object
            properties:
              type:
                const: FEED_CONFIG
              aggregationPeriod:
                type: number
              dataFormat:
                $ref: "#/components/schemas/FeedDataFormat"
              eventFields:
                $ref: "#/components/schemas/FeedEventFields"
            required: [channel, type, aggregationPeriod, dataFormat]
      examples:
        - summary: Feed config.
          payload:
            {
              "channel": 1,
              "type": "FEED_CONFIG",
              "aggregationPeriod": 1,
              "eventFields":
                {
                  "Quote":
                    [
                      "eventType",
                      "eventSymbol",
                      "bidPrice",
                      "askPrice",
                      "bidSize",
                      "askSize",
                    ],
                },
              "dataFormat": "COMPACT",
            }

    FeedSubscriptionMessage:
      summary: Allows the client to manage their subscriptions in the `FEED` service.
      description: |
        The client can send this message to the server after opening a channel with the `FEED` service.
      payload:
        allOf:
          - $ref: "#/components/schemas/Message"
          - type: object
            properties:
              type:
                const: FEED_SUBSCRIPTION
              add:
                description: Operation to add subscription objects.
                type: array
                minItems: 1
                items:
                  $ref: "#/components/schemas/FeedSubscription"
              remove:
                description: Operation to remove subscription objects.
                type: array
                minItems: 1
                items:
                  $ref: "#/components/schemas/FeedSubscription"
              reset:
                description: Remove all subscription objects when it's `true`.
                type: boolean
            required: [channel, type]
      examples:
        - summary: Feed add subscription.
          payload:
            {
              "channel": 1,
              "type": "FEED_SUBSCRIPTION",
              "add": [{ "type": "Quote", "symbol": "AAPL" }],
            }
        - summary: Feed remove subscription.
          payload:
            {
              "channel": 1,
              "type": "FEED_SUBSCRIPTION",
              "remove": [{ "type": "Quote", "symbol": "AAPL" }],
            }
        - summary: Feed reset subscription
          payload: { "channel": 1, "type": "FEED_SUBSCRIPTION", "reset": true }

    FeedDataMessage:
      summary: Contains the data of subscribed market events.
      description: |
        The server can send this message to the client after receiving the `FEED_SUBSCRIPTION` message.
        The server will send data in the format that was described in the `FEED_CONFIG` message.
      payload:
        allOf:
          - $ref: "#/components/schemas/Message"
          - type: object
            properties:
              type:
                const: FEED_DATA
              events:
                description: Batch of events.
                oneOf:
                  - description: |
                      List of events in full mode.
                      Empty fields are omitted from the json.
                    type: array
                    items:
                      $ref: "#/components/schemas/FeedEvent"
                    examples:
                      - [
                          {
                            "eventSymbol": "AAPL",
                            "eventType": "Quote",
                            "askPrice": 123,
                            "bidPrice": 123,
                          },
                          {
                            "eventSymbol": "AAPL",
                            "eventType": "Quote",
                            "askPrice": 321,
                            "bidPrice": 321,
                          },
                        ]
                  - description: |
                      List of events in compact mode.
                      El

# --- truncated at 32 KB (65 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/dxfeed/refs/heads/main/asyncapi/dxfeed-dxlink-asyncapi.yml