Infoway Real-time Market Data API · AsyncAPI Specification

Infoway WebSocket Streaming API

Version 1.0.0

Real-time push of trades, order-book depth, candlesticks (K-line) and news over a single WebSocket connection. PROVENANCE: Infoway publishes NO AsyncAPI document. This document was DERIVED by API Evangelist from the provider's own WebSocket protocol reference — every protocol code, field name, type and example value below is taken verbatim from the pages listed in `x-provenance.sources`. Nothing was invented. Where the provider does not document something (for example an error channel schema), it is omitted rather than guessed.

View Spec View on GitHub stock-apiforex-apicrypto-apicommodities-apifutures-apimarket-datareal-time-datawebsocketfinancial-datafintechhistorical-dataAsyncAPIWebhooksEvents

Channels

session
One duplex WebSocket session. Every client frame carries an integer protocol `code` and a client generated `trace` id; every server frame echoes the `trace` on acknowledgements. A heartbeat (code 10010) must be sent at least once per minute or the server treats the connection as inactive and closes it.

Messages

subscribeTrade
Subscribe trades
subscribeTradeAck
subscribeTradeAck
tradePush
Trade push
unsubscribeTrade
unsubscribeTrade
subscribeDepth
subscribeDepth
subscribeDepthAck
subscribeDepthAck
depthPush
Order-book depth push
unsubscribeDepth
unsubscribeDepth
subscribeCandles
Subscribe K-line
subscribeCandlesAck
subscribeCandlesAck
candlePush
K-line push
unsubscribeCandles
unsubscribeCandles
unsubscribeAck
Unsubscribe acknowledgement (all types)
heartbeat
Heartbeat

Servers

wss
stock
wss://data.infoway.io/ws?business=stock&apikey=YourAPIKey — US, HK and China A-share equities.
wss
crypto
wss://data.infoway.io/ws?business=crypto&apikey=YourAPIKey — digital currencies.
wss
common
wss://data.infoway.io/ws?business=common&apikey=YourAPIKey — forex, commodities, futures.

AsyncAPI Specification

Raw ↑
asyncapi: 3.0.0
info:
  title: Infoway WebSocket Streaming API
  version: '1.0.0'
  description: >-
    Real-time push of trades, order-book depth, candlesticks (K-line) and news over a single WebSocket
    connection.


    PROVENANCE: Infoway publishes NO AsyncAPI document. This document was DERIVED by API Evangelist from the
    provider's own WebSocket protocol reference — every protocol code, field name, type and example value
    below is taken verbatim from the pages listed in `x-provenance.sources`. Nothing was invented. Where the
    provider does not document something (for example an error channel schema), it is omitted rather than
    guessed.
  contact:
    name: Infoway
    url: https://infoway.io/en
  externalDocs:
    description: WebSocket subscription reference
    url: https://docs.infoway.io/websocket-api/endpoints.md

x-provenance:
  generated: '2026-08-09'
  method: derived
  provider_publishes_asyncapi: false
  sources:
    - https://infoway.readme.io/reference/ws-subscription.md
    - https://infoway.readme.io/reference/subscribe-trade.md
    - https://infoway.readme.io/reference/unsubscribe-trade.md
    - https://infoway.readme.io/reference/subscribe-depth.md
    - https://infoway.readme.io/reference/unsubscribe-depth.md
    - https://infoway.readme.io/reference/subscribe-candles.md
    - https://infoway.readme.io/reference/unsubscribe-candles.md
    - https://infoway.readme.io/reference/heartbeat.md
    - https://docs.infoway.io/websocket-api/subscribe-and-unsubscribe/real-time-news.md
  fetched: '2026-08-09'
  http_status: 200

servers:
  stock:
    host: data.infoway.io
    pathname: /ws
    protocol: wss
    title: Equities stream
    description: 'wss://data.infoway.io/ws?business=stock&apikey=YourAPIKey — US, HK and China A-share equities.'
    security:
      - $ref: '#/components/securitySchemes/apiKeyQuery'
  crypto:
    host: data.infoway.io
    pathname: /ws
    protocol: wss
    title: Crypto stream
    description: 'wss://data.infoway.io/ws?business=crypto&apikey=YourAPIKey — digital currencies.'
    security:
      - $ref: '#/components/securitySchemes/apiKeyQuery'
  common:
    host: data.infoway.io
    pathname: /ws
    protocol: wss
    title: Forex, commodities and futures stream
    description: 'wss://data.infoway.io/ws?business=common&apikey=YourAPIKey — forex, commodities, futures.'
    security:
      - $ref: '#/components/securitySchemes/apiKeyQuery'

channels:
  session:
    address: /ws
    title: Market data session
    description: >-
      One duplex WebSocket session. Every client frame carries an integer protocol `code` and a client
      generated `trace` id; every server frame echoes the `trace` on acknowledgements. A heartbeat (code
      10010) must be sent at least once per minute or the server treats the connection as inactive and
      closes it.
    servers:
      - $ref: '#/servers/stock'
      - $ref: '#/servers/crypto'
      - $ref: '#/servers/common'
    messages:
      subscribeTrade:
        $ref: '#/components/messages/subscribeTrade'
      subscribeTradeAck:
        $ref: '#/components/messages/subscribeTradeAck'
      tradePush:
        $ref: '#/components/messages/tradePush'
      unsubscribeTrade:
        $ref: '#/components/messages/unsubscribeTrade'
      subscribeDepth:
        $ref: '#/components/messages/subscribeDepth'
      subscribeDepthAck:
        $ref: '#/components/messages/subscribeDepthAck'
      depthPush:
        $ref: '#/components/messages/depthPush'
      unsubscribeDepth:
        $ref: '#/components/messages/unsubscribeDepth'
      subscribeCandles:
        $ref: '#/components/messages/subscribeCandles'
      subscribeCandlesAck:
        $ref: '#/components/messages/subscribeCandlesAck'
      candlePush:
        $ref: '#/components/messages/candlePush'
      unsubscribeCandles:
        $ref: '#/components/messages/unsubscribeCandles'
      unsubscribeAck:
        $ref: '#/components/messages/unsubscribeAck'
      heartbeat:
        $ref: '#/components/messages/heartbeat'

operations:
  sendSubscribeTrade:
    action: send
    channel:
      $ref: '#/channels/session'
    title: Subscribe to real-time trades (code 10000)
    messages:
      - $ref: '#/channels/session/messages/subscribeTrade'
  receiveTrade:
    action: receive
    channel:
      $ref: '#/channels/session'
    title: Receive real-time trade push (code 10002)
    messages:
      - $ref: '#/channels/session/messages/tradePush'
  sendSubscribeDepth:
    action: send
    channel:
      $ref: '#/channels/session'
    title: Subscribe to order-book depth (code 10003)
    messages:
      - $ref: '#/channels/session/messages/subscribeDepth'
  receiveDepth:
    action: receive
    channel:
      $ref: '#/channels/session'
    title: Receive order-book depth push (code 10005)
    messages:
      - $ref: '#/channels/session/messages/depthPush'
  sendSubscribeCandles:
    action: send
    channel:
      $ref: '#/channels/session'
    title: Subscribe to K-line candles (code 10006)
    messages:
      - $ref: '#/channels/session/messages/subscribeCandles'
  receiveCandles:
    action: receive
    channel:
      $ref: '#/channels/session'
    title: Receive K-line candle push (code 10008)
    messages:
      - $ref: '#/channels/session/messages/candlePush'
  sendHeartbeat:
    action: send
    channel:
      $ref: '#/channels/session'
    title: Heartbeat (code 10010) — required at least once per minute
    messages:
      - $ref: '#/channels/session/messages/heartbeat'
  sendUnsubscribeTrade:
    action: send
    channel:
      $ref: '#/channels/session'
    title: Cancel all trade subscriptions (code 11000)
    messages:
      - $ref: '#/channels/session/messages/unsubscribeTrade'
  sendUnsubscribeDepth:
    action: send
    channel:
      $ref: '#/channels/session'
    title: Cancel all depth subscriptions (code 11001)
    messages:
      - $ref: '#/channels/session/messages/unsubscribeDepth'
  sendUnsubscribeCandles:
    action: send
    channel:
      $ref: '#/channels/session'
    title: Cancel K-line subscriptions (code 11002)
    messages:
      - $ref: '#/channels/session/messages/unsubscribeCandles'

components:
  securitySchemes:
    apiKeyQuery:
      type: httpApiKey
      name: apikey
      in: query
      description: >-
        The API key is supplied on the connection URL as the `apikey` query parameter. Note the casing
        differs from the REST surface, which uses an `apiKey` request header.

  schemas:
    Trade:
      type: object
      properties:
        s: {type: string, description: Symbol, examples: ['BTCUSDT']}
        p: {type: string, description: Last price, examples: ['103482.94']}
        t: {type: integer, format: int64, description: Trade timestamp (ms), examples: [1747552358393]}
        td: {type: integer, description: 'Trade direction: 0 default, 1 buy, 2 sell', examples: [2]}
        v: {type: string, description: Volume, examples: ['0.00096']}
        vw: {type: string, description: Turnover, examples: ['99.3436224']}
    Depth:
      type: object
      properties:
        s: {type: string, description: Symbol, examples: ['BTCUSDT']}
        t: {type: integer, format: int64, description: Timestamp (ms), examples: [1747553102161]}
        a:
          type: array
          description: 'Ask side: a two-element array — [prices[], quantities[]].'
          items: {type: array, items: {type: string}}
        b:
          type: array
          description: 'Bid side: a two-element array — [prices[], quantities[]].'
          items: {type: array, items: {type: string}}
    Candle:
      type: object
      properties:
        s: {type: string, description: Symbol, examples: ['BTCUSDT']}
        o: {type: string, description: Open}
        h: {type: string, description: High}
        l: {type: string, description: Low}
        c: {type: string, description: Close}
        v: {type: string, description: Volume}
        vw: {type: string, description: Turnover}
        pca: {type: string, description: Change amount, examples: ['0.00']}
        pfr: {type: string, description: Change percent, examples: ['0.00%']}
        t: {type: integer, format: int64, description: Candle timestamp}
        ty: {type: integer, description: 'K-line type (see klineType enum 1..12)'}
    Ack:
      type: object
      required: [code, trace, msg]
      properties:
        code: {type: integer, description: Response protocol code}
        trace: {type: string, description: Echo of the client trace id}
        msg: {type: string, examples: ['ok']}

  messages:
    subscribeTrade:
      name: subscribeTrade
      title: Subscribe trades
      payload:
        type: object
        required: [code, trace, data]
        properties:
          code: {type: integer, const: 10000}
          trace: {type: string, description: Client-generated traceable id}
          data:
            type: object
            required: [codes]
            properties:
              codes: {type: string, description: Comma-separated symbols, examples: ['BTCUSDT']}
      examples:
        - name: subscribe
          payload:
            code: 10000
            trace: 423afec425004bd8a5e02e1ba5f9b2b0
            data: {codes: BTCUSDT}
    subscribeTradeAck:
      name: subscribeTradeAck
      payload:
        allOf:
          - $ref: '#/components/schemas/Ack'
          - properties: {code: {const: 10001}}
    tradePush:
      name: tradePush
      title: Trade push
      payload:
        type: object
        properties:
          code: {type: integer, const: 10002}
          data: {$ref: '#/components/schemas/Trade'}
    unsubscribeTrade:
      name: unsubscribeTrade
      payload:
        type: object
        required: [code, trace]
        properties:
          code: {type: integer, const: 11000}
          trace: {type: string}
    subscribeDepth:
      name: subscribeDepth
      payload:
        type: object
        required: [code, trace, data]
        properties:
          code: {type: integer, const: 10003}
          trace: {type: string}
          data:
            type: object
            required: [codes]
            properties:
              codes: {type: string}
    subscribeDepthAck:
      name: subscribeDepthAck
      payload:
        allOf:
          - $ref: '#/components/schemas/Ack'
          - properties: {code: {const: 10004}}
    depthPush:
      name: depthPush
      title: Order-book depth push
      payload:
        type: object
        properties:
          code: {type: integer, const: 10005}
          data: {$ref: '#/components/schemas/Depth'}
    unsubscribeDepth:
      name: unsubscribeDepth
      payload:
        type: object
        required: [code, trace]
        properties:
          code: {type: integer, const: 11001}
          trace: {type: string}
    subscribeCandles:
      name: subscribeCandles
      title: Subscribe K-line
      payload:
        type: object
        required: [code, trace, data]
        properties:
          code: {type: integer, const: 10006}
          trace: {type: string}
          data:
            type: object
            required: [arr]
            properties:
              arr:
                type: array
                items:
                  type: object
                  required: [type, codes]
                  properties:
                    type:
                      type: integer
                      description: >-
                        K-line type: 1=1m, 2=5m, 3=15m, 4=30m, 5=1h, 6=2h, 7=4h, 8=1d, 9=1w, 10=1mo,
                        11=1q, 12=1y
                    codes: {type: string, description: Comma-separated symbols}
      examples:
        - name: subscribe-1m-btc
          payload:
            code: 10006
            trace: 423afec425004bd8a5e02e1ba5f9b2b0
            data:
              arr:
                - {type: 1, codes: BTCUSDT}
    subscribeCandlesAck:
      name: subscribeCandlesAck
      payload:
        allOf:
          - $ref: '#/components/schemas/Ack'
          - properties: {code: {const: 10007}}
    candlePush:
      name: candlePush
      title: K-line push
      payload:
        type: object
        properties:
          code: {type: integer, const: 10008}
          data: {$ref: '#/components/schemas/Candle'}
    unsubscribeCandles:
      name: unsubscribeCandles
      payload:
        type: object
        required: [code, trace]
        properties:
          code: {type: integer, const: 11002}
          trace: {type: string}
    unsubscribeAck:
      name: unsubscribeAck
      title: Unsubscribe acknowledgement (all types)
      payload:
        allOf:
          - $ref: '#/components/schemas/Ack'
          - properties: {code: {const: 11010}}
    heartbeat:
      name: heartbeat
      title: Heartbeat
      payload:
        type: object
        required: [code, trace]
        properties:
          code: {type: integer, const: 10010}
          trace: {type: string}
      examples:
        - name: heartbeat
          payload:
            code: 10010
            trace: 423afec425004bd8a5e02e1ba5f9b2b0

x-additional-surfaces:
  news:
    description: >-
      A separate news stream exists on the same socket: subscribe with code 10020 (ack 10021, push 10022),
      keyed by a single `lang` value (en, zh-Hans, zh-Hant, ja, ko, de, fr, es, pt). It requires a plan with
      the news entitlement (`newsFlag=1`) and permits only ONE connection per API key. Not modelled above
      because the provider documents the push payload only in the Chinese docs tree.
    source: https://docs.infoway.io/websocket-api/subscribe-and-unsubscribe/real-time-news.md

x-limits:
  note: >-
    Connection and subscription ceilings are per plan — see
    rate-limits/infoway-real-time-market-data-api-rate-limits.yml. All subscription frames combined
    (including heartbeats) are capped at 60 per minute; exceeding it drops the connection.