asyncapi: 3.0.0 info: title: Finage WebSocket Market Data Stream version: 1.0.0 description: >- Finage streams real-time market prices (US stocks, global stocks, forex, crypto, CFD indices, and ETFs) over WebSocket. Each customer is assigned a dedicated WebSocket URL (subdomain + port) shown in the Finage dashboard; connections authenticate with a token (socket key) query parameter. After connecting, the server sends two status messages ("authorizing", then "connected to the adapter") before streaming price updates. This AsyncAPI was derived by API Evangelist from Finage's WebSocket documentation (https://finage.co.uk/docs/websocket) and the published message-type models (https://api.finage.co.uk/op/v1/wstype/list); all message payload examples are verbatim from that source. contact: name: Finage Support email: support@finage.co.uk url: https://finage.co.uk externalDocs: description: Finage WebSocket documentation url: https://finage.co.uk/docs/websocket x-apievangelist: generated: '2026-07-22' method: derived source: https://finage.co.uk/docs/websocket + https://api.finage.co.uk/op/v1/wstype/list servers: production: host: '{subdomain}.finage.ws:{port}' protocol: wss description: >- Your assigned WebSocket URL (subdomain and port) is shown in the Finage dashboard under the WebSocket section. Streams are divided into subdomains per market section for stability. Authenticate by appending ?token={socket key}. Documented error messages: "401 - invalid socket key", "401 - use your socket key to connect", "401 - please upgrade your package to access this market". variables: subdomain: description: Stream subdomain assigned to your account (shown in dashboard). port: description: Port of your assigned stream server (shown in dashboard). channels: prices: address: / description: >- Single streaming channel. On connect the server sends ConnectionStatus messages, then real-time price update messages whose shape depends on the subscribed market (Finage message-type models Type2-Type10). messages: connectionStatus: $ref: '#/components/messages/connectionStatus' forexQuoteWithChange: $ref: '#/components/messages/forexQuoteWithChange' cryptoTradeWithChange: $ref: '#/components/messages/cryptoTradeWithChange' stockQuote: $ref: '#/components/messages/stockQuote' cryptoTrade: $ref: '#/components/messages/cryptoTrade' forexQuote: $ref: '#/components/messages/forexQuote' stockQuoteWithChange: $ref: '#/components/messages/stockQuoteWithChange' etfQuoteWithChange: $ref: '#/components/messages/etfQuoteWithChange' operations: receivePrices: action: receive channel: $ref: '#/channels/prices' summary: Receive real-time price updates for subscribed symbols. components: messages: connectionStatus: name: ConnectionStatus summary: Connection lifecycle status messages sent after connecting. payload: type: object properties: status_code: type: integer message: type: string id: type: string examples: - name: authorizing payload: status_code: 200 message: authorizing id: e0fb1b68-1905-48e3-9fd2-d482bf5e1f0a - name: connected payload: status_code: 200 message: connected to the adapter id: e0fb1b68-1905-48e3-9fd2-d482bf5e1f0a forexQuoteWithChange: name: Type2Model summary: Forex quote with daily change (Finage Type2Model). payload: type: object properties: s: {type: string, description: Symbol} a: {type: number, description: Ask price} b: {type: number, description: Bid price} dd: {type: string, description: Daily difference} dc: {type: string, description: Daily change percent} ppms: {type: boolean, description: Price per millisecond flag} t: {type: integer, description: Timestamp (ms)} examples: - payload: s: ZAR/EUR a: 0.05103271 b: 0.05100465 dd: '0.0002' dc: '0.4016' ppms: false t: 1680703141685 cryptoTradeWithChange: name: Type3Model summary: Crypto trade with daily change (Finage Type3Model). payload: type: object properties: s: {type: string, description: Symbol} p: {type: string, description: Price} q: {type: string, description: Quantity} dc: {type: string, description: Daily change percent} dd: {type: string, description: Daily difference} t: {type: integer, description: Timestamp (ms)} examples: - payload: s: DOGEUSD p: '0.09649316' q: '22434.12483106' dc: '1.4147' dd: '0.0014' t: 1680704192819 stockQuote: name: Type4Model summary: US stock quote (Finage Type4Model). payload: type: object properties: s: {type: string, description: Symbol} ap: {type: number, description: Ask price} bp: {type: number, description: Bid price} as: {type: integer, description: Ask size} bs: {type: integer, description: Bid size} t: {type: integer, description: Timestamp (ms)} examples: - payload: s: TSLA ap: 189.3 bp: 189.27 as: 3 bs: 1 t: 1714403004431 cryptoTrade: name: Type5Model summary: Crypto trade (Finage Type5Model). payload: type: object properties: s: {type: string, description: Symbol} p: {type: string, description: Price} q: {type: string, description: Quantity} t: {type: integer, description: Timestamp (ms)} examples: - payload: s: HBARUSD p: '0.06648169' q: '340082.47302549' t: 1680704234267 forexQuote: name: Type6Model summary: Forex quote (Finage Type6Model). payload: type: object properties: s: {type: string, description: Symbol} a: {type: number, description: Ask price} b: {type: number, description: Bid price} t: {type: integer, description: Timestamp (ms)} examples: - payload: s: EUR/USD a: 1.09229 b: 1.09227 t: 1680705338000 stockQuoteWithChange: name: Type8Model summary: Stock quote with daily change (Finage Type8Model). payload: type: object properties: s: {type: string, description: Symbol} a: {type: number, description: Ask price} as: {type: integer, description: Ask size} b: {type: number, description: Bid price} bs: {type: integer, description: Bid size} dc: {type: number, description: Daily change percent} dd: {type: number, description: Daily difference} t: {type: integer, description: Timestamp (ms)} examples: - payload: s: GOOGL a: 167.989804 as: 13 b: 167.970446 bs: 4 dc: -1.9556 dd: -3.2851 t: 1714403502895 etfQuoteWithChange: name: Type10Model summary: ETF quote with daily change (Finage Type10Model). payload: type: object properties: s: {type: string, description: Symbol} a: {type: number, description: Ask price} as: {type: integer, description: Ask size} b: {type: number, description: Bid price} bs: {type: integer, description: Bid size} dc: {type: number, description: Daily change percent} dd: {type: number, description: Daily difference} ppms: {type: boolean, description: Price per millisecond flag} t: {type: integer, description: Timestamp (ms)} examples: - payload: s: QQQ a: 458.610865 as: 1 b: 458.549806 bs: 1 dc: -0.4196 dd: -1.924 ppms: true t: 1725449608827