Bitfinex · AsyncAPI Specification

Bitfinex WebSocket API v2

Version 2.0.0

AsyncAPI description of the Bitfinex public and authenticated WebSocket v2 API. The Bitfinex WebSocket API streams real-time market data and authenticated account information using a compact array-based message format. Clients subscribe to channels by sending a JSON envelope; the server responds with a `subscribed` confirmation containing a numeric `chanId`. All subsequent payloads on that channel are JSON arrays whose first element is the `chanId`. Heartbeats are sent every 15 seconds as `[CHANNEL_ID, "hb"]`. Source: https://docs.bitfinex.com/docs/ws-general and the public/auth channel reference pages.

View Spec View on GitHub CryptocurrencyPublic APIsAsyncAPIWebhooksEvents

Channels

/ticker
publish subscribeTicker
Subscribe / unsubscribe to a ticker channel.
Ticker channel. Provides a high-level overview of the state of the market for a specified trading pair or funding currency. Subscribe with `{ "event": "subscribe", "channel": "ticker", "symbol": "" }`. Trading symbols are prefixed with `t` (e.g. `tBTCUSD`); funding currencies are prefixed with `f` (e.g. `fUSD`).
/trades
publish subscribeTrades
Trades channel. Sends a message whenever a trade occurs on Bitfinex. Funding currencies emit `fte`/`ftu` messages with an additional PERIOD field.
/book
publish subscribeBook
Aggregated order book channel. Subscription parameters: `prec` (P0/P1/P2/P3/P4, default P0), `freq` (F0 realtime or F1 every 2s, default F0), `len` (1/25/100/250, default 25), and optional client-defined `subId`. For funding books the AMOUNT sign convention is inverted (negative = bid, positive = ask).
/book-raw
publish subscribeRawBook
Raw order book channel (PREC=R0). Tracks individual orders by ID rather than aggregated price levels. For trading pairs a PRICE of 0 means delete the order; for funding the same applies to the order entry.
/candles
publish subscribeCandles
Candles channel. Subscribe with a key of the form `trade:TIMEFRAME:SYMBOL` (or `trade:TIMEFRAME:SYMBOL:aAGGR:pPER_START:pEND` for funding). Supported timeframes: 1m, 5m, 15m, 30m, 1h, 3h, 6h, 12h, 1D, 1W, 14D, 1M.
/status
publish subscribeStatus
Platform status channel. Supports two key types: `deriv:SYMBOL` for derivatives status (e.g. `deriv:tBTCF0:USTF0`) and `liq:global` for the global liquidation feed.
/account
publish authenticateAccount
Authentication handshake and connection-level config.
Authenticated account information channel (CHAN_ID = 0). A single `auth` handshake on `wss://api.bitfinex.com/ws/2` subscribes the client to streams for orders, positions, wallets, trades, funding offers/loans/credits/trades, balance info, margin info, funding info and notifications. Optional `filter` array can restrict the streams delivered.

Messages

SubscribeTicker
Subscribe (ticker)
Subscribe to the ticker channel for a symbol.
SubscribeTrades
Subscribe (trades)
SubscribeBook
Subscribe (book)
SubscribeRawBook
Subscribe (raw book)
SubscribeCandles
Subscribe (candles)
SubscribeStatus
Subscribe (status)
Unsubscribe
Unsubscribe from a channel
ConfRequest
Connection configuration
Set per-connection feature flags. Sum the flag values to enable multiple features.
PingRequest
Application-level ping
AuthRequest
Authenticate
Authenticate the connection. `authSig` is an HMAC-SHA384 of `authPayload` keyed with the API secret. `authPayload` is conventionally `"AUTH" + authNonce`. Optional `filter` restricts which account streams are delivered. Optional `dms` enables the Dead-Man-Switch (value 4 cancels open orders on disconnect).
AuthSuccess
Authentication succeeded
AuthFailure
Authentication failed
Heartbeat
Channel heartbeat
[CHANNEL_ID, "hb"] - sent every 15 seconds of inactivity.
ChecksumMessage
Book checksum
[CHANNEL_ID, "cs", CHECKSUM] - emitted when OB_CHECKSUM is enabled.
TradingTickerMessage
Trading ticker
FundingTickerMessage
Funding ticker
TradesSnapshot
Trades snapshot
TradeUpdate
Trade executed / updated (te / tu)
FundingTradesSnapshot
Funding trades snapshot
FundingTradeUpdate
Funding trade executed / updated (fte / ftu)
TradingBookSnapshot
Aggregated trading book snapshot
TradingBookUpdate
Aggregated trading book update
FundingBookSnapshot
Aggregated funding book snapshot
FundingBookUpdate
Aggregated funding book update
TradingRawBookSnapshot
Raw trading book snapshot
TradingRawBookUpdate
Raw trading book update
FundingRawBookSnapshot
Raw funding book snapshot
FundingRawBookUpdate
Raw funding book update
CandlesSnapshot
Candles snapshot
CandleUpdate
Candle update
DerivativesStatusUpdate
Derivatives status update
LiquidationFeedUpdate
Liquidation feed update
OrderSnapshot
Order snapshot (os)
OrderNew
New order (on)
OrderUpdate
Order update (ou)
OrderCancel
Order cancel (oc)
PositionSnapshot
Position snapshot (ps)
PositionNew
Position new (pn)
PositionUpdate
Position update (pu)
PositionClose
Position close (pc)
WalletSnapshot
Wallet snapshot (ws)
WalletUpdate
Wallet update (wu)
AuthTradeExecuted
Trade executed (te) - account
AuthTradeUpdate
Trade update (tu) - account
FundingOfferSnapshot
Funding offers snapshot (fos)
FundingOfferNew
New funding offer (fon)
FundingOfferUpdate
Funding offer update (fou)
FundingOfferCancel
Funding offer cancel (foc)
FundingCreditSnapshot
Funding credits snapshot (fcs)
FundingCreditNew
New funding credit (fcn)
FundingCreditUpdate
Funding credit update (fcu)
FundingCreditClose
Funding credit close (fcc)
FundingLoanSnapshot
Funding loans snapshot (fls)
FundingLoanNew
New funding loan (fln)
FundingLoanUpdate
Funding loan update (flu)
FundingLoanClose
Funding loan close (flc)
FundingTradeExecuted
Funding trade executed (fte)
FundingTradeUpdateMsg
Funding trade update (ftu)
BalanceUpdate
Balance update (bu)
MarginInfoUpdate
Margin info update (miu)
FundingInfoUpdate
Funding info update (fiu)
Notification
Notification (n)

Servers

wss
public api-pub.bitfinex.com/ws/2
Public market-data WebSocket. Used for ticker, trades, books, raw books, candles and derivatives/liquidation status channels. Subscription limit: 30 public channels per connection.
wss
auth api.bitfinex.com/ws/2
Authenticated WebSocket. Required for account streams (orders, positions, wallets, trades, funding offers/loans/credits/trades, balance, margin, funding info, notifications). Connection rate limit: 5 connections per 15 seconds.

AsyncAPI Specification

Raw ↑
asyncapi: 2.6.0
info:
  title: Bitfinex WebSocket API v2
  version: '2.0.0'
  description: |
    AsyncAPI description of the Bitfinex public and authenticated WebSocket v2 API.

    The Bitfinex WebSocket API streams real-time market data and authenticated
    account information using a compact array-based message format. Clients
    subscribe to channels by sending a JSON envelope; the server responds with
    a `subscribed` confirmation containing a numeric `chanId`. All subsequent
    payloads on that channel are JSON arrays whose first element is the
    `chanId`.

    Heartbeats are sent every 15 seconds as `[CHANNEL_ID, "hb"]`.

    Source: https://docs.bitfinex.com/docs/ws-general and the public/auth
    channel reference pages.
  contact:
    name: Bitfinex
    url: https://docs.bitfinex.com/docs
  license:
    name: Bitfinex Terms of Service
    url: https://www.bitfinex.com/legal/terms

defaultContentType: application/json

servers:
  public:
    url: api-pub.bitfinex.com/ws/2
    protocol: wss
    description: |
      Public market-data WebSocket. Used for ticker, trades, books,
      raw books, candles and derivatives/liquidation status channels.
      Subscription limit: 30 public channels per connection.
  auth:
    url: api.bitfinex.com/ws/2
    protocol: wss
    description: |
      Authenticated WebSocket. Required for account streams (orders,
      positions, wallets, trades, funding offers/loans/credits/trades,
      balance, margin, funding info, notifications). Connection rate
      limit: 5 connections per 15 seconds.

channels:
  /ticker:
    description: |
      Ticker channel. Provides a high-level overview of the state of
      the market for a specified trading pair or funding currency.
      Subscribe with `{ "event": "subscribe", "channel": "ticker", "symbol": "<SYMBOL>" }`.
      Trading symbols are prefixed with `t` (e.g. `tBTCUSD`); funding
      currencies are prefixed with `f` (e.g. `fUSD`).
    servers:
      - public
    bindings:
      ws:
        bindingVersion: '0.1.0'
    subscribe:
      operationId: receiveTicker
      summary: Receive ticker snapshot, updates and heartbeats.
      message:
        oneOf:
          - $ref: '#/components/messages/TradingTickerMessage'
          - $ref: '#/components/messages/FundingTickerMessage'
          - $ref: '#/components/messages/Heartbeat'
    publish:
      operationId: subscribeTicker
      summary: Subscribe / unsubscribe to a ticker channel.
      message:
        oneOf:
          - $ref: '#/components/messages/SubscribeTicker'
          - $ref: '#/components/messages/Unsubscribe'

  /trades:
    description: |
      Trades channel. Sends a message whenever a trade occurs on
      Bitfinex. Funding currencies emit `fte`/`ftu` messages with an
      additional PERIOD field.
    servers:
      - public
    bindings:
      ws:
        bindingVersion: '0.1.0'
    subscribe:
      operationId: receiveTrades
      message:
        oneOf:
          - $ref: '#/components/messages/TradesSnapshot'
          - $ref: '#/components/messages/TradeUpdate'
          - $ref: '#/components/messages/FundingTradesSnapshot'
          - $ref: '#/components/messages/FundingTradeUpdate'
          - $ref: '#/components/messages/Heartbeat'
    publish:
      operationId: subscribeTrades
      message:
        oneOf:
          - $ref: '#/components/messages/SubscribeTrades'
          - $ref: '#/components/messages/Unsubscribe'

  /book:
    description: |
      Aggregated order book channel. Subscription parameters:
      `prec` (P0/P1/P2/P3/P4, default P0), `freq` (F0 realtime or F1
      every 2s, default F0), `len` (1/25/100/250, default 25),
      and optional client-defined `subId`. For funding books the
      AMOUNT sign convention is inverted (negative = bid, positive
      = ask).
    servers:
      - public
    bindings:
      ws:
        bindingVersion: '0.1.0'
    subscribe:
      operationId: receiveBook
      message:
        oneOf:
          - $ref: '#/components/messages/TradingBookSnapshot'
          - $ref: '#/components/messages/TradingBookUpdate'
          - $ref: '#/components/messages/FundingBookSnapshot'
          - $ref: '#/components/messages/FundingBookUpdate'
          - $ref: '#/components/messages/ChecksumMessage'
          - $ref: '#/components/messages/Heartbeat'
    publish:
      operationId: subscribeBook
      message:
        oneOf:
          - $ref: '#/components/messages/SubscribeBook'
          - $ref: '#/components/messages/Unsubscribe'

  /book-raw:
    description: |
      Raw order book channel (PREC=R0). Tracks individual orders by
      ID rather than aggregated price levels. For trading pairs a
      PRICE of 0 means delete the order; for funding the same applies
      to the order entry.
    servers:
      - public
    bindings:
      ws:
        bindingVersion: '0.1.0'
    subscribe:
      operationId: receiveRawBook
      message:
        oneOf:
          - $ref: '#/components/messages/TradingRawBookSnapshot'
          - $ref: '#/components/messages/TradingRawBookUpdate'
          - $ref: '#/components/messages/FundingRawBookSnapshot'
          - $ref: '#/components/messages/FundingRawBookUpdate'
          - $ref: '#/components/messages/ChecksumMessage'
          - $ref: '#/components/messages/Heartbeat'
    publish:
      operationId: subscribeRawBook
      message:
        oneOf:
          - $ref: '#/components/messages/SubscribeRawBook'
          - $ref: '#/components/messages/Unsubscribe'

  /candles:
    description: |
      Candles channel. Subscribe with a key of the form
      `trade:TIMEFRAME:SYMBOL` (or
      `trade:TIMEFRAME:SYMBOL:aAGGR:pPER_START:pEND` for funding).
      Supported timeframes: 1m, 5m, 15m, 30m, 1h, 3h, 6h, 12h, 1D,
      1W, 14D, 1M.
    servers:
      - public
    bindings:
      ws:
        bindingVersion: '0.1.0'
    subscribe:
      operationId: receiveCandles
      message:
        oneOf:
          - $ref: '#/components/messages/CandlesSnapshot'
          - $ref: '#/components/messages/CandleUpdate'
          - $ref: '#/components/messages/Heartbeat'
    publish:
      operationId: subscribeCandles
      message:
        oneOf:
          - $ref: '#/components/messages/SubscribeCandles'
          - $ref: '#/components/messages/Unsubscribe'

  /status:
    description: |
      Platform status channel. Supports two key types:
      `deriv:SYMBOL` for derivatives status (e.g.
      `deriv:tBTCF0:USTF0`) and `liq:global` for the global
      liquidation feed.
    servers:
      - public
    bindings:
      ws:
        bindingVersion: '0.1.0'
    subscribe:
      operationId: receiveStatus
      message:
        oneOf:
          - $ref: '#/components/messages/DerivativesStatusUpdate'
          - $ref: '#/components/messages/LiquidationFeedUpdate'
          - $ref: '#/components/messages/Heartbeat'
    publish:
      operationId: subscribeStatus
      message:
        oneOf:
          - $ref: '#/components/messages/SubscribeStatus'
          - $ref: '#/components/messages/Unsubscribe'

  /account:
    description: |
      Authenticated account information channel (CHAN_ID = 0).
      A single `auth` handshake on `wss://api.bitfinex.com/ws/2`
      subscribes the client to streams for orders, positions,
      wallets, trades, funding offers/loans/credits/trades,
      balance info, margin info, funding info and notifications.
      Optional `filter` array can restrict the streams delivered.
    servers:
      - auth
    bindings:
      ws:
        bindingVersion: '0.1.0'
    subscribe:
      operationId: receiveAccount
      summary: All account-stream messages on CHAN_ID = 0.
      message:
        oneOf:
          - $ref: '#/components/messages/AuthSuccess'
          - $ref: '#/components/messages/AuthFailure'
          - $ref: '#/components/messages/OrderSnapshot'
          - $ref: '#/components/messages/OrderNew'
          - $ref: '#/components/messages/OrderUpdate'
          - $ref: '#/components/messages/OrderCancel'
          - $ref: '#/components/messages/PositionSnapshot'
          - $ref: '#/components/messages/PositionNew'
          - $ref: '#/components/messages/PositionUpdate'
          - $ref: '#/components/messages/PositionClose'
          - $ref: '#/components/messages/WalletSnapshot'
          - $ref: '#/components/messages/WalletUpdate'
          - $ref: '#/components/messages/AuthTradeExecuted'
          - $ref: '#/components/messages/AuthTradeUpdate'
          - $ref: '#/components/messages/FundingOfferSnapshot'
          - $ref: '#/components/messages/FundingOfferNew'
          - $ref: '#/components/messages/FundingOfferUpdate'
          - $ref: '#/components/messages/FundingOfferCancel'
          - $ref: '#/components/messages/FundingCreditSnapshot'
          - $ref: '#/components/messages/FundingCreditNew'
          - $ref: '#/components/messages/FundingCreditUpdate'
          - $ref: '#/components/messages/FundingCreditClose'
          - $ref: '#/components/messages/FundingLoanSnapshot'
          - $ref: '#/components/messages/FundingLoanNew'
          - $ref: '#/components/messages/FundingLoanUpdate'
          - $ref: '#/components/messages/FundingLoanClose'
          - $ref: '#/components/messages/FundingTradeExecuted'
          - $ref: '#/components/messages/FundingTradeUpdateMsg'
          - $ref: '#/components/messages/BalanceUpdate'
          - $ref: '#/components/messages/MarginInfoUpdate'
          - $ref: '#/components/messages/FundingInfoUpdate'
          - $ref: '#/components/messages/Notification'
          - $ref: '#/components/messages/Heartbeat'
    publish:
      operationId: authenticateAccount
      summary: Authentication handshake and connection-level config.
      message:
        oneOf:
          - $ref: '#/components/messages/AuthRequest'
          - $ref: '#/components/messages/ConfRequest'
          - $ref: '#/components/messages/PingRequest'

components:
  messages:
    # ---- Connection / control envelopes ----
    SubscribeTicker:
      name: SubscribeTicker
      title: Subscribe (ticker)
      summary: Subscribe to the ticker channel for a symbol.
      payload:
        type: object
        required: [event, channel, symbol]
        properties:
          event: { type: string, const: subscribe }
          channel: { type: string, const: ticker }
          symbol: { type: string, description: 'Trading pair (tBTCUSD) or funding currency (fUSD)' }
          subId: { type: string }
      examples:
        - payload:
            event: subscribe
            channel: ticker
            symbol: tBTCUSD

    SubscribeTrades:
      name: SubscribeTrades
      title: Subscribe (trades)
      payload:
        type: object
        required: [event, channel, symbol]
        properties:
          event: { type: string, const: subscribe }
          channel: { type: string, const: trades }
          symbol: { type: string }
          subId: { type: string }

    SubscribeBook:
      name: SubscribeBook
      title: Subscribe (book)
      payload:
        type: object
        required: [event, channel, symbol]
        properties:
          event: { type: string, const: subscribe }
          channel: { type: string, const: book }
          symbol: { type: string }
          prec:
            type: string
            enum: [P0, P1, P2, P3, P4]
            default: P0
          freq:
            type: string
            enum: [F0, F1]
            default: F0
          len:
            type: string
            enum: ['1', '25', '100', '250']
            default: '25'
          subId: { type: string }

    SubscribeRawBook:
      name: SubscribeRawBook
      title: Subscribe (raw book)
      payload:
        type: object
        required: [event, channel, symbol, prec]
        properties:
          event: { type: string, const: subscribe }
          channel: { type: string, const: book }
          symbol: { type: string }
          prec: { type: string, const: R0 }
          len:
            type: string
            enum: ['1', '25', '100', '250']
            default: '25'
          subId: { type: string }

    SubscribeCandles:
      name: SubscribeCandles
      title: Subscribe (candles)
      payload:
        type: object
        required: [event, channel, key]
        properties:
          event: { type: string, const: subscribe }
          channel: { type: string, const: candles }
          key:
            type: string
            description: 'trade:TIMEFRAME:SYMBOL[:aAGGR:pPER_START:pEND]'
            example: 'trade:1m:tBTCUSD'

    SubscribeStatus:
      name: SubscribeStatus
      title: Subscribe (status)
      payload:
        type: object
        required: [event, channel, key]
        properties:
          event: { type: string, const: subscribe }
          channel: { type: string, const: status }
          key:
            type: string
            description: 'Either deriv:SYMBOL (e.g. deriv:tBTCF0:USTF0) or liq:global.'

    Unsubscribe:
      name: Unsubscribe
      title: Unsubscribe from a channel
      payload:
        type: object
        required: [event, chanId]
        properties:
          event: { type: string, const: unsubscribe }
          chanId: { type: integer }

    ConfRequest:
      name: ConfRequest
      title: Connection configuration
      summary: |
        Set per-connection feature flags. Sum the flag values to
        enable multiple features.
      payload:
        type: object
        required: [event, flags]
        properties:
          event: { type: string, const: conf }
          flags:
            type: integer
            description: |
              Bitmask of feature flags:
                * 32768  (TIMESTAMP)   - prepend MTS to every event
                * 65536  (SEQ_ALL)     - add sequence numbers
                * 131072 (OB_CHECKSUM) - emit checksum per book iteration
                * 536870912 (BULK_UPDATES) - multiple book updates per msg

    PingRequest:
      name: PingRequest
      title: Application-level ping
      payload:
        type: object
        required: [event]
        properties:
          event: { type: string, const: ping }
          cid: { type: integer }

    AuthRequest:
      name: AuthRequest
      title: Authenticate
      summary: |
        Authenticate the connection. `authSig` is an HMAC-SHA384 of
        `authPayload` keyed with the API secret. `authPayload` is
        conventionally `"AUTH" + authNonce`. Optional `filter`
        restricts which account streams are delivered. Optional `dms`
        enables the Dead-Man-Switch (value 4 cancels open orders on
        disconnect).
      payload:
        type: object
        required: [event, apiKey, authSig, authNonce, authPayload]
        properties:
          event: { type: string, const: auth }
          apiKey: { type: string }
          authSig:
            type: string
            description: HMAC-SHA384 hex digest of authPayload signed with the API secret.
          authNonce:
            type: string
            description: Strictly increasing integer (<= 9007199254740991) as string.
          authPayload:
            type: string
            description: Typically `"AUTH" + authNonce`.
          filter:
            type: array
            items:
              type: string
              enum:
                - trading
                - trading-tBTCUSD
                - funding
                - funding-fUSD
                - wallet
                - wallet-exchange
                - wallet-trading
                - wallet-deposit
                - algo
                - balance
                - notify
          dms:
            type: integer
            description: '4 = cancel all open orders on disconnect.'
          calc:
            type: integer

    AuthSuccess:
      name: AuthSuccess
      title: Authentication succeeded
      payload:
        type: object
        properties:
          event: { type: string, const: auth }
          status: { type: string, const: OK }
          chanId: { type: integer, const: 0 }
          userId: { type: integer }
          authId: { type: string }
          caps: { type: object }

    AuthFailure:
      name: AuthFailure
      title: Authentication failed
      payload:
        type: object
        properties:
          event: { type: string, const: auth }
          status: { type: string, const: FAILED }
          msg: { type: string }
          code: { type: integer }

    # ---- Public channel payloads ----
    Heartbeat:
      name: Heartbeat
      title: Channel heartbeat
      summary: '[CHANNEL_ID, "hb"] - sent every 15 seconds of inactivity.'
      payload:
        type: array
        minItems: 2
        maxItems: 2
        items:
          - { type: integer, description: CHANNEL_ID }
          - { type: string, const: hb }

    ChecksumMessage:
      name: ChecksumMessage
      title: Book checksum
      summary: '[CHANNEL_ID, "cs", CHECKSUM] - emitted when OB_CHECKSUM is enabled.'
      payload:
        type: array
        minItems: 3
        maxItems: 3
        items:
          - { type: integer, description: CHANNEL_ID }
          - { type: string, const: cs }
          - { type: integer, description: Signed CRC32 of the book state. }

    TradingTickerMessage:
      name: TradingTickerMessage
      title: Trading ticker
      payload:
        type: array
        minItems: 2
        maxItems: 2
        items:
          - { type: integer, description: CHANNEL_ID }
          - $ref: '#/components/schemas/TradingTickerArray'

    FundingTickerMessage:
      name: FundingTickerMessage
      title: Funding ticker
      payload:
        type: array
        minItems: 2
        maxItems: 2
        items:
          - { type: integer, description: CHANNEL_ID }
          - $ref: '#/components/schemas/FundingTickerArray'

    TradesSnapshot:
      name: TradesSnapshot
      title: Trades snapshot
      payload:
        type: array
        items:
          - { type: integer, description: CHANNEL_ID }
          - type: array
            items:
              $ref: '#/components/schemas/TradeArray'

    TradeUpdate:
      name: TradeUpdate
      title: Trade executed / updated (te / tu)
      payload:
        type: array
        minItems: 3
        maxItems: 3
        items:
          - { type: integer, description: CHANNEL_ID }
          - { type: string, enum: [te, tu] }
          - $ref: '#/components/schemas/TradeArray'

    FundingTradesSnapshot:
      name: FundingTradesSnapshot
      title: Funding trades snapshot
      payload:
        type: array
        items:
          - { type: integer, description: CHANNEL_ID }
          - type: array
            items:
              $ref: '#/components/schemas/FundingTradeArray'

    FundingTradeUpdate:
      name: FundingTradeUpdate
      title: Funding trade executed / updated (fte / ftu)
      payload:
        type: array
        minItems: 3
        maxItems: 3
        items:
          - { type: integer, description: CHANNEL_ID }
          - { type: string, enum: [fte, ftu] }
          - $ref: '#/components/schemas/FundingTradeArray'

    TradingBookSnapshot:
      name: TradingBookSnapshot
      title: Aggregated trading book snapshot
      payload:
        type: array
        items:
          - { type: integer, description: CHANNEL_ID }
          - type: array
            items:
              $ref: '#/components/schemas/BookEntryTrading'

    TradingBookUpdate:
      name: TradingBookUpdate
      title: Aggregated trading book update
      payload:
        type: array
        minItems: 2
        maxItems: 2
        items:
          - { type: integer, description: CHANNEL_ID }
          - $ref: '#/components/schemas/BookEntryTrading'

    FundingBookSnapshot:
      name: FundingBookSnapshot
      title: Aggregated funding book snapshot
      payload:
        type: array
        items:
          - { type: integer, description: CHANNEL_ID }
          - type: array
            items:
              $ref: '#/components/schemas/BookEntryFunding'

    FundingBookUpdate:
      name: FundingBookUpdate
      title: Aggregated funding book update
      payload:
        type: array
        minItems: 2
        maxItems: 2
        items:
          - { type: integer, description: CHANNEL_ID }
          - $ref: '#/components/schemas/BookEntryFunding'

    TradingRawBookSnapshot:
      name: TradingRawBookSnapshot
      title: Raw trading book snapshot
      payload:
        type: array
        items:
          - { type: integer, description: CHANNEL_ID }
          - type: array
            items:
              $ref: '#/components/schemas/RawBookEntryTrading'

    TradingRawBookUpdate:
      name: TradingRawBookUpdate
      title: Raw trading book update
      payload:
        type: array
        minItems: 2
        maxItems: 2
        items:
          - { type: integer, description: CHANNEL_ID }
          - $ref: '#/components/schemas/RawBookEntryTrading'

    FundingRawBookSnapshot:
      name: FundingRawBookSnapshot
      title: Raw funding book snapshot
      payload:
        type: array
        items:
          - { type: integer, description: CHANNEL_ID }
          - type: array
            items:
              $ref: '#/components/schemas/RawBookEntryFunding'

    FundingRawBookUpdate:
      name: FundingRawBookUpdate
      title: Raw funding book update
      payload:
        type: array
        minItems: 2
        maxItems: 2
        items:
          - { type: integer, description: CHANNEL_ID }
          - $ref: '#/components/schemas/RawBookEntryFunding'

    CandlesSnapshot:
      name: CandlesSnapshot
      title: Candles snapshot
      payload:
        type: array
        items:
          - { type: integer, description: CHANNEL_ID }
          - type: array
            items:
              $ref: '#/components/schemas/CandleArray'

    CandleUpdate:
      name: CandleUpdate
      title: Candle update
      payload:
        type: array
        minItems: 2
        maxItems: 2
        items:
          - { type: integer, description: CHANNEL_ID }
          - $ref: '#/components/schemas/CandleArray'

    DerivativesStatusUpdate:
      name: DerivativesStatusUpdate
      title: Derivatives status update
      payload:
        type: array
        minItems: 2
        maxItems: 2
        items:
          - { type: integer, description: CHANNEL_ID }
          - $ref: '#/components/schemas/DerivStatusArray'

    LiquidationFeedUpdate:
      name: LiquidationFeedUpdate
      title: Liquidation feed update
      payload:
        type: array
        minItems: 2
        maxItems: 2
        items:
          - { type: integer, description: CHANNEL_ID }
          - type: array
            items:
              $ref: '#/components/schemas/LiquidationEntry'

    # ---- Authenticated account messages ----
    OrderSnapshot:
      name: OrderSnapshot
      title: Order snapshot (os)
      payload:
        type: array
        minItems: 3
        maxItems: 3
        items:
          - { type: integer, const: 0 }
          - { type: string, const: os }
          - type: array
            items:
              $ref: '#/components/schemas/OrderArray'

    OrderNew:
      name: OrderNew
      title: New order (on)
      payload:
        $ref: '#/components/schemas/OrderMessageEnvelope'

    OrderUpdate:
      name: OrderUpdate
      title: Order update (ou)
      payload:
        $ref: '#/components/schemas/OrderMessageEnvelope'

    OrderCancel:
      name: OrderCancel
      title: Order cancel (oc)
      payload:
        $ref: '#/components/schemas/OrderMessageEnvelope'

    PositionSnapshot:
      name: PositionSnapshot
      title: Position snapshot (ps)
      payload:
        type: array
        minItems: 3
        maxItems: 3
        items:
          - { type: integer, const: 0 }
          - { type: string, const: ps }
          - type: array
            items:
              $ref: '#/components/schemas/PositionArray'

    PositionNew:
      name: PositionNew
      title: Position new (pn)
      payload:
        $ref: '#/components/schemas/PositionMessageEnvelope'

    PositionUpdate:
      name: PositionUpdate
      title: Position update (pu)
      payload:
        $ref: '#/components/schemas/PositionMessageEnvelope'

    PositionClose:
      name: PositionClose
      title: Position close (pc)
      payload:
        $ref: '#/components/schemas/PositionMessageEnvelope'

    WalletSnapshot:
      name: WalletSnapshot
      title: Wallet snapshot (ws)
      payload:
        type: array
        minItems: 3
        maxItems: 3
        items:
          - { type: integer, const: 0 }
          - { type: string, const: ws }
          - type: array
            items:
              $ref: '#/components/schemas/WalletArray'

    WalletUpdate:
      name: WalletUpdate
      title: Wallet update (wu)
      payload:
        type: array
        minItems: 3
        maxItems: 3
        items:
          - { type: integer, const: 0 }
          - { type: string, const: wu }
          - $ref: '#/components/schemas/WalletArray'

    AuthTradeExecuted:
      name: AuthTradeExecuted
      title: Trade executed (te) - account
      payload:
        type: array
        minItems: 3
        maxItems: 3
        items:
          - { type: integer, const: 0 }
          - { type: string, const: te }
          - $ref: '#/components/schemas/AuthTradeArray'

    AuthTradeUpdate:
      name: AuthTradeUpdate
      title: Trade update (tu) - account
      payload:
        type: array
        minItems: 3
        maxItems: 3
        items:
          - { type: integer, const: 0 }
          - { type: string, const: tu }
          - $ref: '#/components/schemas/AuthTradeArray'

    FundingOfferSnapshot:
      name: FundingOfferSnapshot
      title: Funding offers snapshot (fos)
      payload:
        type: array
        minItems: 3
        maxItems: 3
        items:
          - { type: integer, const: 0 }
          - { type: string, const: fos }
          - type: array
            items:
              $ref: '#/components/schemas/FundingOfferArray'

    FundingOfferNew:
      name: FundingOfferNew
      title: New funding offer (fon)
      payload:
        $ref: '#/components/schemas/FundingOfferMessageEnvelope'

    FundingOfferUpdate:
      name: FundingOfferUpdate
      title: Funding offer update (fou)
      payload:
        $ref: '#/components/schemas/FundingOfferMessageEnvelope'

    FundingOfferCancel:
      name: FundingOfferCancel
      title: Funding offer cancel (foc)
      payload:
        $ref: '#/components/schemas/FundingOfferMessageEnvelope'

    FundingCreditSnapshot:
      name: FundingCreditSnapshot
      title: Funding credits snapshot (fcs)
      payload:
        type: array
        minItems: 3
        maxItems: 3
        items:
          - { type: integer, const: 0 }
          - { type: string, const: fcs }
          - type: array
            items:
              $ref: '#/components/schemas/FundingCreditArray'

    FundingCreditNew:
      name: FundingCreditNew
      title: New funding credit (fcn)
      payload:
        $ref: '#/components/schemas/FundingCreditMessageEnvelope'

    FundingCreditUpdate:
      name: FundingCreditUpdate
      title: Funding credit update (fcu)
      payload:
        $ref: '#/components/schemas/FundingCreditMessageEnvelope'

    FundingCreditClose:
      name: FundingCreditClose
      title: Funding credit close (fcc)
      payload:
        $ref: '#/components/schemas/FundingCreditMessageEnvelope'

    FundingLoanSnapshot:
      name: FundingLoanSnapshot
      title: Funding loans snapshot (fls)
      payload:
        type: array
        minItems: 3
        maxItems: 3
        items:
          - { type: integer, const: 0 }
          - { type: string, const: fls }
          - type: array
            items:
              $ref: '#/components/schemas/FundingLoanArray'

    FundingLoanNew:
      name: FundingLoanNew
      title: New funding loan (fln)
      payload:
        $ref: '#/components/schemas/FundingLoanMessageEnvelope'

    FundingLoanUpdate:
      name: FundingLoanUpdate
      title: Funding loan update (flu)
      payload:
        $ref: '#/components/schemas/FundingLoanMessageEnvelope'

    FundingLoanClose:
      name: FundingLoanClose
      title: Funding loan close (flc)
      payload:
        $ref: '#/components/schemas/FundingLoanMessageEnvelope'

    FundingTradeExecuted:
      name: FundingTradeExecuted
      title: Funding trade executed (fte)
      payload:
        type: array
        minItems: 3
        maxItems: 3
        items:
          - { type: integer, const: 0 }
          - { type: string, const: fte }
          - $ref: '#/components/schemas/AuthFundingTradeArray'

    FundingTradeUpdateMsg:
      name: FundingTradeUpdateMsg
      title: Funding trade update (ftu)
      payload:
        type: array
        minItems: 3
        maxItems: 3
        items:
          - { type: integer, const: 0 }
          - { type: string, const: ftu }
          - $ref: '#/components/schemas/AuthFundingTradeArray'

    BalanceUpdate:
      name: BalanceUpdate
      title: Balance update (bu)
      payload:
        type: array
        minItems: 3
        maxItems: 3
        items:
          - { type: integer, const: 0 }
          - { type: string, const: bu }
          - type: array
            minItems: 2
            maxItems: 2
            items:
              - { type: number, description: AUM - total assets under management. }
              - { type: number, description: AUM_NET - assets minus liabilities. }

    MarginInfoUpdate:
      name: MarginInfoUpdate
      title: Margin info update (miu)
      payload:
        type: array
        minItems: 3
        maxItems: 3
        items:
          - { type: integer, const: 0 }
          - { type: string, const: miu }
          - oneOf:
              - $ref: '#/components/schemas/MarginInfoBase'
              - $ref: '#/components/schemas/MarginInfoSym'

    FundingInfoUpdate:
      name: FundingInfoUpdate
      title: Funding info update (fiu)
      payload:
        type: array
        minItems: 3
        maxItems: 3
        items:
          - { type: integer, const: 0 }
          - { type: string, const: fiu }
          - $ref: '#/components/schemas/FundingInfoSym'

    Notification:
      name: Notification
      title: Notification (n)
      payload:
        type: array
        minItems: 3
        maxItems: 3
        items:
          - { type: integer, const: 0 }
          - { type: string, const: n }
          - $ref: '#/components/schemas/NotificationArray'

  schemas:
    # ---- Public channel array schemas ----
    TradingTickerArray:
      type: array
      minItems: 10
      maxItems: 10
      description: |
        [BID, BID_SIZE, ASK, ASK_SIZE, DAILY_CHANGE,
         DAILY_CHANGE_RELATIVE, LAST_PRICE, VOLUME, HIGH, LOW]
      items:
        - { type: number, description: BID - highest current bid price. }
        - { type: number, description: BID_SIZE - sum of top-25 bid sizes. }
        - { type: number, description: ASK - lowest current ask price. }
        - { type: number, description: ASK_SIZE - sum of top-25 ask sizes. }
        - { type: number, description: DAILY_CHANGE - 24h price delta. }
        - { type: number, description: DAILY_CHANGE_RELATIVE - 24h percent change. }
        - { type: number, description: LAST_PRICE - last traded price. }
        - { type: number, description: VOLUME - 24h volume. }
        - { type: number, description: HIGH - 24h high. }
        - { type: number, description: LOW - 24h low. }

    FundingTickerArray:
      type: array
      minItems: 16
      maxItems: 16
      description: |
        [FRR, BID, BID_PERIOD, BID_SIZE, ASK, ASK_PERIOD, ASK_SIZE,
         DAILY_CHANGE, DAILY_CHANGE_RELATIVE, LAST_PRICE, VOLUME,
         HIGH, LOW, _PLACEHOLDER, _PLACEHOLDER, FRR_AMOUNT_AVAILABLE]
      items:
        - { type: number, description: FRR - Flash Return Rate. }
        - { type: number, description: BID - highest bid rate. }
        - { type: integer, description: BID_PERIOD (days). }
        - { type: number, description: BID_SIZE. }
        - { type: number, description: ASK - lowest ask rate. }
        - { type: integer, description: ASK_PERIOD (days). }
        - { type: number, description: ASK_SIZE. }
        - { type: number, description: DAILY_CHANGE. }
        - { type: number, description: DAILY_CHANGE_RELATIVE. }
        - { type: number, description: LAST_PRICE. }
        - { type: number, description: VOLUME. }
        - { type: number, description: HIGH. }
        - { type: number, description: LOW. }
        - { type: 'null' }
        - { type: 'null' }
        - { type: number, description: FRR_AMOUNT_AVAILABLE. }

    TradeArray

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