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.