Gemini WebSocket API

The production Gemini WebSocket API at wss://ws.gemini.com: request/response methods, market data streams (book ticker, partial and differential depth, trades), authenticated account streams for orders, balances and positions, prediction-market contract lifecycle, and combo RFQ messages. Published as AsyncAPI 3.0.0 with 21 channels and 22 operations.

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/gemini-websocket-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

AsyncAPI Specification

gemini-trust-websocket-asyncapi.yml Raw ↑
asyncapi: 3.0.0
info:
  title: Gemini WebSocket API
  version: 0.10.7
  description: |
    Machine-readable contract for the production Gemini WebSocket API at
    `wss://ws.gemini.com`.

    This specification models the shared JSON request/response envelope, market
    data streams, authenticated order/balance/position streams (including terminal
    Prediction Markets settlement details), WebSocket order management methods,
    and Prediction Markets combo RFQ streams/methods that
    are documented in the Gemini API docs.

    The combo RFQ streams and methods are available in production for beta testing.
    Quoting requires an eligible account with the required capabilities.

    Symbols may be spot/derivatives symbols such as `btcusd` or prediction
    market instrument symbols such as `GEMI-BTC05M2606011000-UP`, depending on
    the product surface.
  contact:
    name: Gemini API Support
defaultContentType: application/json
x-gemini-coverage:
  legend:
    machine-readable: Request, response, or event payload fields are modeled in this spec.
    partial: The documented request or event is modeled, but at least one result payload is intentionally broad because the docs do not enumerate its fields.
    docs-only: The surface is documented for humans but not modeled in this spec.
  streams:
    - name: "{symbol}@bookTicker"
      status: machine-readable
      auth: public
      docs: /websocket/streams#book-ticker
    - name: "{symbol}@depth5"
      status: machine-readable
      auth: public
      docs: /websocket/streams#l2-partial-depth-streams
    - name: "{symbol}@depth10"
      status: machine-readable
      auth: public
      docs: /websocket/streams#l2-partial-depth-streams
    - name: "{symbol}@depth20"
      status: machine-readable
      auth: public
      docs: /websocket/streams#l2-partial-depth-streams
    - name: "{symbol}@depth5@100ms"
      status: machine-readable
      auth: public
      docs: /websocket/streams#l2-partial-depth-streams
    - name: "{symbol}@depth10@100ms"
      status: machine-readable
      auth: public
      docs: /websocket/streams#l2-partial-depth-streams
    - name: "{symbol}@depth20@100ms"
      status: machine-readable
      auth: public
      docs: /websocket/streams#l2-partial-depth-streams
    - name: "{symbol}@depth"
      status: machine-readable
      auth: public
      docs: /websocket/streams#l2-differential-depth-streams
    - name: "{symbol}@depth@100ms"
      status: machine-readable
      auth: public
      docs: /websocket/streams#l2-differential-depth-streams
    - name: "{symbol}@trade"
      status: machine-readable
      auth: public
      docs: /websocket/streams#trade-stream
    - name: orders@account
      status: machine-readable
      auth: authenticated
      docs: /websocket/streams#order-events
    - name: orders@session
      status: machine-readable
      auth: authenticated
      docs: /websocket/streams#order-events
    - name: balances@account
      status: machine-readable
      auth: authenticated
      docs: /websocket/streams#balance-updates
    - name: balances@account@1s
      status: machine-readable
      auth: authenticated
      docs: /websocket/streams#balance-updates
    - name: positions@account
      status: machine-readable
      auth: authenticated
      docs: /prediction-markets/websocket/streams#position-updates
    - name: positions@account@1s
      status: machine-readable
      auth: authenticated
      docs: /prediction-markets/websocket/streams#position-updates
    - name: contractStatus
      status: machine-readable
      auth: public
      docs: /websocket/streams#contract-status
    - name: requestForQuote
      status: machine-readable
      auth: public
      docs: /prediction-markets/combos-rfq/websocket-streams#requestforquote
      notes: Combo RFQ WebSocket surface is available in production for beta testing; quoting requires an eligible account with the required capabilities.
    - name: requestForQuote@account
      status: machine-readable
      auth: authenticated
      docs: /prediction-markets/combos-rfq/websocket-streams#requestforquoteaccount
      notes: Combo RFQ WebSocket surface is available in production for beta testing; quoting requires an eligible account with the required capabilities.
    - name: requestForQuote@session
      status: machine-readable
      auth: authenticated
      docs: /prediction-markets/combos-rfq/websocket-streams#requestforquotesession
      notes: Combo RFQ WebSocket surface is available in production for beta testing; quoting requires an eligible account with the required capabilities.
  methods:
    - name: conninfo
      status: partial
      auth: public
      docs: /websocket/playground#method-conninfo
      notes: Request envelope is modeled; result fields are not enumerated in the docs.
    - name: ping
      status: partial
      auth: public
      docs: /websocket/playground#method-ping
      notes: Request envelope is modeled; result fields are not enumerated in the docs.
    - name: time
      status: partial
      auth: public
      docs: /websocket/playground#method-time
      notes: Request envelope is modeled; result fields are not enumerated in the docs.
    - name: SUBSCRIBE
      status: machine-readable
      auth: conditional
      docs: /prediction-markets/websocket/playground#method-subscribe
    - name: subscribe
      status: machine-readable
      auth: conditional
      docs: /trading/websocket/playground#method-subscribe
    - name: UNSUBSCRIBE
      status: machine-readable
      auth: conditional
      docs: /prediction-markets/websocket/playground#method-unsubscribe
    - name: unsubscribe
      status: machine-readable
      auth: conditional
      docs: /trading/websocket/playground#method-unsubscribe
    - name: LIST_SUBSCRIPTIONS
      status: machine-readable
      auth: conditional
      docs: /prediction-markets/websocket/playground#method-list_subscriptions
    - name: list_subscriptions
      status: machine-readable
      auth: conditional
      docs: /trading/websocket/playground#method-list_subscriptions
    - name: depth
      status: machine-readable
      auth: public
      docs: /websocket/playground#method-depth
    - name: order.place
      status: partial
      auth: authenticated
      docs: /websocket/playground#method-order.place
      notes: Request payload is modeled; rely on `orderUpdate` events for authoritative lifecycle state.
    - name: order.cancel
      status: partial
      auth: authenticated
      docs: /websocket/playground#method-order.cancel
      notes: Request payload is modeled; rely on `orderUpdate` events for authoritative lifecycle state.
    - name: order.cancel_all
      status: partial
      auth: authenticated
      docs: /websocket/playground#method-order.cancel_all
      notes: Request payload is modeled; result fields are not enumerated in the docs.
    - name: order.cancel_session
      status: partial
      auth: authenticated
      docs: /websocket/playground#method-order.cancel_session
      notes: Request payload is modeled; result fields are not enumerated in the docs.
    - name: rfq.submit_quote
      status: machine-readable
      auth: authenticated
      docs: /prediction-markets/combos-rfq/quote-methods#rfqsubmit_quote
      notes: Combo RFQ WebSocket surface is available in production for beta testing; quoting requires an eligible account with the required capabilities.
    - name: rfq.withdraw_quote
      status: machine-readable
      auth: authenticated
      docs: /prediction-markets/combos-rfq/quote-methods#rfqwithdraw_quote
      notes: Combo RFQ WebSocket surface is available in production for beta testing; quoting requires an eligible account with the required capabilities.
    - name: rfq.confirm_quote
      status: machine-readable
      auth: authenticated
      docs: /prediction-markets/combos-rfq/quote-methods#rfqconfirm_quote
      notes: Combo RFQ WebSocket surface is available in production for beta testing; quoting requires an eligible account with the required capabilities.
x-gemini-authentication:
  timing: websocket-upgrade
  alternatives:
    - scheme: geminiApiKeySignature
      summary: HMAC-signed, account-scoped Gemini API key headers.
    - scheme: geminiOAuthBearer
      summary: OAuth 2.0 bearer token in the Authorization header.
  notes:
    - Authentication, when required, is supplied during the initial WebSocket upgrade; clients cannot authenticate or rotate credentials after the connection opens.
    - Browser WebSocket clients cannot send custom upgrade headers for authenticated streams and methods; use a non-browser client or server-side proxy.
    - Public streams and utility methods do not require authentication. Account/session streams, order methods, and combo RFQ quote methods require one of the listed authentication alternatives.
servers:
  production:
    host: ws.gemini.com
    protocol: wss
    pathname: /
    description: Production WebSocket API.
  sandbox:
    host: ws.sandbox.gemini.com
    protocol: wss
    pathname: /
    description: Sandbox environment.
channels:
  connection:
    address: /
    title: WebSocket connection
    description: |
      JSON request/response control plane over a single WebSocket connection.
      Authentication, when required, is supplied during the WebSocket upgrade.
    messages:
      conninfoRequest:
        $ref: '#/components/messages/ConninfoRequest'
      pingRequest:
        $ref: '#/components/messages/PingRequest'
      timeRequest:
        $ref: '#/components/messages/TimeRequest'
      subscribeRequest:
        $ref: '#/components/messages/SubscribeRequest'
      unsubscribeRequest:
        $ref: '#/components/messages/UnsubscribeRequest'
      listSubscriptionsRequest:
        $ref: '#/components/messages/ListSubscriptionsRequest'
      depthRequest:
        $ref: '#/components/messages/DepthRequest'
      orderPlaceRequest:
        $ref: '#/components/messages/OrderPlaceRequest'
      orderCancelRequest:
        $ref: '#/components/messages/OrderCancelRequest'
      orderCancelAllRequest:
        $ref: '#/components/messages/OrderCancelAllRequest'
      orderCancelSessionRequest:
        $ref: '#/components/messages/OrderCancelSessionRequest'
      rfqSubmitQuoteRequest:
        $ref: '#/components/messages/RfqSubmitQuoteRequest'
      rfqWithdrawQuoteRequest:
        $ref: '#/components/messages/RfqWithdrawQuoteRequest'
      rfqConfirmQuoteRequest:
        $ref: '#/components/messages/RfqConfirmQuoteRequest'
      genericSuccessResponse:
        $ref: '#/components/messages/GenericSuccessResponse'
      listSubscriptionsResponse:
        $ref: '#/components/messages/ListSubscriptionsResponse'
      depthResponse:
        $ref: '#/components/messages/DepthResponse'
      orderActionResponse:
        $ref: '#/components/messages/OrderActionResponse'
      rfqSubmitQuoteResponse:
        $ref: '#/components/messages/RfqSubmitQuoteResponse'
      rfqWithdrawQuoteResponse:
        $ref: '#/components/messages/RfqWithdrawQuoteResponse'
      rfqConfirmQuoteResponse:
        $ref: '#/components/messages/RfqConfirmQuoteResponse'
      errorResponse:
        $ref: '#/components/messages/ErrorResponse'
  bookTicker:
    address: "{symbol}@bookTicker"
    messages:
      bookTicker:
        $ref: '#/components/messages/BookTicker'
    parameters:
      symbol:
        $ref: '#/components/parameters/symbol'
  depth5:
    address: "{symbol}@depth5"
    messages:
      orderBookSnapshot:
        $ref: '#/components/messages/OrderBookSnapshot'
    parameters:
      symbol:
        $ref: '#/components/parameters/symbol'
  depth10:
    address: "{symbol}@depth10"
    messages:
      orderBookSnapshot:
        $ref: '#/components/messages/OrderBookSnapshot'
    parameters:
      symbol:
        $ref: '#/components/parameters/symbol'
  depth20:
    address: "{symbol}@depth20"
    messages:
      orderBookSnapshot:
        $ref: '#/components/messages/OrderBookSnapshot'
    parameters:
      symbol:
        $ref: '#/components/parameters/symbol'
  depth5Fast:
    address: "{symbol}@depth5@100ms"
    messages:
      orderBookSnapshot:
        $ref: '#/components/messages/OrderBookSnapshot'
    parameters:
      symbol:
        $ref: '#/components/parameters/symbol'
  depth10Fast:
    address: "{symbol}@depth10@100ms"
    messages:
      orderBookSnapshot:
        $ref: '#/components/messages/OrderBookSnapshot'
    parameters:
      symbol:
        $ref: '#/components/parameters/symbol'
  depth20Fast:
    address: "{symbol}@depth20@100ms"
    messages:
      orderBookSnapshot:
        $ref: '#/components/messages/OrderBookSnapshot'
    parameters:
      symbol:
        $ref: '#/components/parameters/symbol'
  depth:
    address: "{symbol}@depth"
    messages:
      depthUpdate:
        $ref: '#/components/messages/DepthUpdate'
    parameters:
      symbol:
        $ref: '#/components/parameters/symbol'
  depthFast:
    address: "{symbol}@depth@100ms"
    messages:
      depthUpdate:
        $ref: '#/components/messages/DepthUpdate'
    parameters:
      symbol:
        $ref: '#/components/parameters/symbol'
  trade:
    address: "{symbol}@trade"
    messages:
      trade:
        $ref: '#/components/messages/Trade'
    parameters:
      symbol:
        $ref: '#/components/parameters/symbol'
  ordersAccount:
    address: orders@account
    messages:
      orderUpdate:
        $ref: '#/components/messages/OrderUpdate'
  ordersSession:
    address: orders@session
    messages:
      orderUpdate:
        $ref: '#/components/messages/OrderUpdate'
  balancesAccount:
    address: balances@account
    messages:
      balanceUpdate:
        $ref: '#/components/messages/BalanceUpdate'
  balancesAccountSnapshot:
    address: balances@account@1s
    messages:
      balanceUpdate:
        $ref: '#/components/messages/BalanceUpdate'
  positionsAccount:
    address: positions@account
    messages:
      positionReport:
        $ref: '#/components/messages/PositionReport'
  positionsAccountSnapshot:
    address: positions@account@1s
    messages:
      positionReport:
        $ref: '#/components/messages/PositionReport'
  contractStatus:
    address: contractStatus
    messages:
      contractStatus:
        $ref: '#/components/messages/ContractStatus'
  requestForQuote:
    address: requestForQuote
    messages:
      requestForQuote:
        $ref: '#/components/messages/RfqPublicEvent'
  requestForQuoteAccount:
    address: requestForQuote@account
    messages:
      requestForQuote:
        $ref: '#/components/messages/RfqPrivateDelivery'
  requestForQuoteSession:
    address: requestForQuote@session
    messages:
      requestForQuote:
        $ref: '#/components/messages/RfqPrivateDelivery'
operations:
  sendRequests:
    action: send
    channel:
      $ref: '#/channels/connection'
    x-gemini-auth:
      required: conditional
      timing: websocket-upgrade
      notes: Public utility methods, public stream subscriptions, and the depth request work without authentication. Order management, combo RFQ quote methods, and subscriptions to authenticated stream names require an already-authenticated WebSocket connection; see each coverage entry's `auth` value.
    messages:
      - $ref: '#/channels/connection/messages/conninfoRequest'
      - $ref: '#/channels/connection/messages/pingRequest'
      - $ref: '#/channels/connection/messages/timeRequest'
      - $ref: '#/channels/connection/messages/subscribeRequest'
      - $ref: '#/channels/connection/messages/unsubscribeRequest'
      - $ref: '#/channels/connection/messages/listSubscriptionsRequest'
      - $ref: '#/channels/connection/messages/depthRequest'
      - $ref: '#/channels/connection/messages/orderPlaceRequest'
      - $ref: '#/channels/connection/messages/orderCancelRequest'
      - $ref: '#/channels/connection/messages/orderCancelAllRequest'
      - $ref: '#/channels/connection/messages/orderCancelSessionRequest'
      - $ref: '#/channels/connection/messages/rfqSubmitQuoteRequest'
      - $ref: '#/channels/connection/messages/rfqWithdrawQuoteRequest'
      - $ref: '#/channels/connection/messages/rfqConfirmQuoteRequest'
  receiveResponses:
    action: receive
    channel:
      $ref: '#/channels/connection'
    x-gemini-auth:
      required: conditional
      timing: websocket-upgrade
      notes: The response envelope is shared by public and authenticated methods. Authentication requirements are modeled on authenticated request messages and private stream receive operations.
    messages:
      - $ref: '#/channels/connection/messages/genericSuccessResponse'
      - $ref: '#/channels/connection/messages/listSubscriptionsResponse'
      - $ref: '#/channels/connection/messages/depthResponse'
      - $ref: '#/channels/connection/messages/orderActionResponse'
      - $ref: '#/channels/connection/messages/rfqSubmitQuoteResponse'
      - $ref: '#/channels/connection/messages/rfqWithdrawQuoteResponse'
      - $ref: '#/channels/connection/messages/rfqConfirmQuoteResponse'
      - $ref: '#/channels/connection/messages/errorResponse'
  receiveBookTicker:
    action: receive
    channel:
      $ref: '#/channels/bookTicker'
    messages:
      - $ref: '#/channels/bookTicker/messages/bookTicker'
  receivePartialDepth:
    action: receive
    channel:
      $ref: '#/channels/depth10'
    messages:
      - $ref: '#/channels/depth10/messages/orderBookSnapshot'
  receivePartialDepth5:
    action: receive
    channel:
      $ref: '#/channels/depth5'
    messages:
      - $ref: '#/channels/depth5/messages/orderBookSnapshot'
  receivePartialDepth20:
    action: receive
    channel:
      $ref: '#/channels/depth20'
    messages:
      - $ref: '#/channels/depth20/messages/orderBookSnapshot'
  receivePartialDepth5Fast:
    action: receive
    channel:
      $ref: '#/channels/depth5Fast'
    messages:
      - $ref: '#/channels/depth5Fast/messages/orderBookSnapshot'
  receivePartialDepth10Fast:
    action: receive
    channel:
      $ref: '#/channels/depth10Fast'
    messages:
      - $ref: '#/channels/depth10Fast/messages/orderBookSnapshot'
  receivePartialDepth20Fast:
    action: receive
    channel:
      $ref: '#/channels/depth20Fast'
    messages:
      - $ref: '#/channels/depth20Fast/messages/orderBookSnapshot'
  receiveDifferentialDepth:
    action: receive
    channel:
      $ref: '#/channels/depthFast'
    messages:
      - $ref: '#/channels/depthFast/messages/depthUpdate'
  receiveDifferentialDepthStandard:
    action: receive
    channel:
      $ref: '#/channels/depth'
    messages:
      - $ref: '#/channels/depth/messages/depthUpdate'
  receiveTrades:
    action: receive
    channel:
      $ref: '#/channels/trade'
    messages:
      - $ref: '#/channels/trade/messages/trade'
  receiveOrderUpdates:
    action: receive
    channel:
      $ref: '#/channels/ordersAccount'
    security:
      - $ref: '#/components/securitySchemes/geminiApiKeySignature'
      - $ref: '#/components/securitySchemes/geminiOAuthBearer'
    x-gemini-auth:
      required: true
      timing: websocket-upgrade
      alternatives: [geminiApiKeySignature, geminiOAuthBearer]
    messages:
      - $ref: '#/channels/ordersAccount/messages/orderUpdate'
  receiveSessionOrderUpdates:
    action: receive
    channel:
      $ref: '#/channels/ordersSession'
    security:
      - $ref: '#/components/securitySchemes/geminiApiKeySignature'
      - $ref: '#/components/securitySchemes/geminiOAuthBearer'
    x-gemini-auth:
      required: true
      timing: websocket-upgrade
      alternatives: [geminiApiKeySignature, geminiOAuthBearer]
    messages:
      - $ref: '#/channels/ordersSession/messages/orderUpdate'
  receiveBalanceUpdates:
    action: receive
    channel:
      $ref: '#/channels/balancesAccount'
    security:
      - $ref: '#/components/securitySchemes/geminiApiKeySignature'
      - $ref: '#/components/securitySchemes/geminiOAuthBearer'
    x-gemini-auth:
      required: true
      timing: websocket-upgrade
      alternatives: [geminiApiKeySignature, geminiOAuthBearer]
    messages:
      - $ref: '#/channels/balancesAccount/messages/balanceUpdate'
  receiveBalanceSnapshots:
    action: receive
    channel:
      $ref: '#/channels/balancesAccountSnapshot'
    security:
      - $ref: '#/components/securitySchemes/geminiApiKeySignature'
      - $ref: '#/components/securitySchemes/geminiOAuthBearer'
    x-gemini-auth:
      required: true
      timing: websocket-upgrade
      alternatives: [geminiApiKeySignature, geminiOAuthBearer]
    messages:
      - $ref: '#/channels/balancesAccountSnapshot/messages/balanceUpdate'
  receivePositionReports:
    action: receive
    channel:
      $ref: '#/channels/positionsAccount'
    security:
      - $ref: '#/components/securitySchemes/geminiApiKeySignature'
      - $ref: '#/components/securitySchemes/geminiOAuthBearer'
    x-gemini-auth:
      required: true
      timing: websocket-upgrade
      alternatives: [geminiApiKeySignature, geminiOAuthBearer]
    messages:
      - $ref: '#/channels/positionsAccount/messages/positionReport'
  receivePositionReportSnapshots:
    action: receive
    channel:
      $ref: '#/channels/positionsAccountSnapshot'
    security:
      - $ref: '#/components/securitySchemes/geminiApiKeySignature'
      - $ref: '#/components/securitySchemes/geminiOAuthBearer'
    x-gemini-auth:
      required: true
      timing: websocket-upgrade
      alternatives: [geminiApiKeySignature, geminiOAuthBearer]
    messages:
      - $ref: '#/channels/positionsAccountSnapshot/messages/positionReport'
  receiveContractStatus:
    action: receive
    channel:
      $ref: '#/channels/contractStatus'
    messages:
      - $ref: '#/channels/contractStatus/messages/contractStatus'
  receiveRfqPublicEvents:
    action: receive
    channel:
      $ref: '#/channels/requestForQuote'
    messages:
      - $ref: '#/channels/requestForQuote/messages/requestForQuote'
  receiveRfqPrivateDeliveries:
    action: receive
    channel:
      $ref: '#/channels/requestForQuoteAccount'
    security:
      - $ref: '#/components/securitySchemes/geminiApiKeySignature'
      - $ref: '#/components/securitySchemes/geminiOAuthBearer'
    x-gemini-auth:
      required: true
      timing: websocket-upgrade
      alternatives: [geminiApiKeySignature, geminiOAuthBearer]
      capabilities: [view_orders]
    messages:
      - $ref: '#/channels/requestForQuoteAccount/messages/requestForQuote'
  receiveRfqSessionDeliveries:
    action: receive
    channel:
      $ref: '#/channels/requestForQuoteSession'
    security:
      - $ref: '#/components/securitySchemes/geminiApiKeySignature'
      - $ref: '#/components/securitySchemes/geminiOAuthBearer'
    x-gemini-auth:
      required: true
      timing: websocket-upgrade
      alternatives: [geminiApiKeySignature, geminiOAuthBearer]
      capabilities: [view_orders]
    messages:
      - $ref: '#/channels/requestForQuoteSession/messages/requestForQuote'
components:
  securitySchemes:
    geminiApiKeySignature:
      type: httpApiKey
      name: X-GEMINI-APIKEY
      in: header
      description: |
        Account-scoped Gemini API key supplied during the WebSocket upgrade.
        This scheme represents the full Gemini HMAC-signed header set. A valid
        handshake also includes `X-GEMINI-NONCE`, `X-GEMINI-PAYLOAD`, and
        `X-GEMINI-SIGNATURE`; `X-GEMINI-PAYLOAD` is `base64(string(nonce))`,
        and `X-GEMINI-SIGNATURE` is `hex(hmac_sha384(payload, api_secret))`.
        Only account-scoped keys with time-based nonces are accepted; master or
        group keys are rejected with HTTP 401.
      x-gemini-required-headers:
        - X-GEMINI-APIKEY
        - X-GEMINI-NONCE
        - X-GEMINI-PAYLOAD
        - X-GEMINI-SIGNATURE
      x-gemini-key-scope: account
      x-gemini-nonce: time-based
      x-gemini-signature-algorithm: HMAC-SHA384
    geminiOAuthBearer:
      type: http
      scheme: bearer
      bearerFormat: Gemini OAuth 2.0 access token
      description: |
        OAuth 2.0 access token supplied as `Authorization: Bearer <access_token>`
        during the WebSocket upgrade. The token must include scopes/capabilities
        for the private streams or methods used on the connection.
  parameters:
    symbol:
      description: |
        Exchange symbol. For trading markets this may be a symbol like `btcusd`.
        For prediction markets this is an instrument symbol such as
        `GEMI-BTC05M2606011000-UP`.
  messages:
    ConninfoRequest:
      name: ConninfoRequest
      title: conninfo request
      payload:
        $ref: '#/components/schemas/ConninfoRequest'
    PingRequest:
      name: PingRequest
      title: ping request
      payload:
        $ref: '#/components/schemas/PingRequest'
    TimeRequest:
      name: TimeRequest
      title: time request
      payload:
        $ref: '#/components/schemas/TimeRequest'
    SubscribeRequest:
      name: SubscribeRequest
      title: subscribe request
      payload:
        $ref: '#/components/schemas/SubscribeRequest'
    UnsubscribeRequest:
      name: UnsubscribeRequest
      title: unsubscribe request
      payload:
        $ref: '#/components/schemas/UnsubscribeRequest'
    ListSubscriptionsRequest:
      name: ListSubscriptionsRequest
      title: list subscriptions request
      payload:
        $ref: '#/components/schemas/ListSubscriptionsRequest'
    DepthRequest:
      name: DepthRequest
      title: depth request
      payload:
        $ref: '#/components/schemas/DepthRequest'
    OrderPlaceRequest:
      name: OrderPlaceRequest
      title: order.place request
      x-gemini-auth:
        required: true
        timing: websocket-upgrade
        alternatives: [geminiApiKeySignature, geminiOAuthBearer]
        roles: [Trader]
      payload:
        $ref: '#/components/schemas/OrderPlaceRequest'
    OrderCancelRequest:
      name: OrderCancelRequest
      title: order.cancel request
      x-gemini-auth:
        required: true
        timing: websocket-upgrade
        alternatives: [geminiApiKeySignature, geminiOAuthBearer]
        roles: [Trader]
      payload:
        $ref: '#/components/schemas/OrderCancelRequest'
    OrderCancelAllRequest:
      name: OrderCancelAllRequest
      title: order.cancel_all request
      x-gemini-auth:
        required: true
        timing: websocket-upgrade
        alternatives: [geminiApiKeySignature, geminiOAuthBearer]
        roles: [Trader]
      payload:
        $ref: '#/components/schemas/OrderCancelAllRequest'
    OrderCancelSessionRequest:
      name: OrderCancelSessionRequest
      title: order.cancel_session request
      x-gemini-auth:
        required: true
        timing: websocket-upgrade
        alternatives: [geminiApiKeySignature, geminiOAuthBearer]
        roles: [Trader]
      payload:
        $ref: '#/components/schemas/OrderCancelSessionRequest'
    RfqSubmitQuoteRequest:
      name: RfqSubmitQuoteRequest
      title: rfq.submit_quote request
      x-gemini-auth:
        required: true
        timing: websocket-upgrade
        alternatives: [geminiApiKeySignature, geminiOAuthBearer]
        capabilities: [place_orders]
      payload:
        $ref: '#/components/schemas/RfqSubmitQuoteRequest'
    RfqWithdrawQuoteRequest:
      name: RfqWithdrawQuoteRequest
      title: rfq.withdraw_quote request
      x-gemini-auth:
        required: true
        timing: websocket-upgrade
        alternatives: [geminiApiKeySignature, geminiOAuthBearer]
        capabilities: [cancel_orders]
      payload:
        $ref: '#/components/schemas/RfqWithdrawQuoteRequest'
    RfqConfirmQuoteRequest:
      name: RfqConfirmQuoteRequest
      title: rfq.confirm_quote request
      x-gemini-auth:
        required: true
        timing: websocket-upgrade
        alternatives: [geminiApiKeySignature, geminiOAuthBearer]
        capabilities: [place_orders]
      payload:
        $ref: '#/components/schemas/RfqConfirmQuoteRequest'
    GenericSuccessResponse:
      name: GenericSuccessResponse
      title: generic success response
      payload:
        $ref: '#/components/schemas/GenericSuccessResponse'
    ListSubscriptionsResponse:
      name: ListSubscriptionsResponse
      title: list subscriptions response
      payload:
        $ref: '#/components/schemas/ListSubscriptionsResponse'
    DepthResponse:
      name: DepthResponse
      title: depth response
      payload:
        $ref: '#/components/schemas/DepthResponse'
    OrderActionResponse:
      name: OrderActionResponse
      title: order action response
      payload:
        $ref: '#/components/schemas/OrderActionResponse'
    RfqSubmitQuoteResponse:
      name: RfqSubmitQuoteResponse
      title: rfq.submit_quote response
      payload:
        $ref: '#/components/schemas/RfqSubmitQuoteResponse'
    RfqWithdrawQuoteResponse:
      name: RfqWithdrawQuoteResponse
      title: rfq.withdraw_quote response
      payload:
        $ref: '#/components/schemas/RfqWithdrawQuoteResponse'
    RfqConfirmQuoteResponse:
      name: RfqConfirmQuoteResponse
      title: rfq.confirm_quote response
      payload:
        $ref: '#/components/schemas/RfqConfirmQuoteResponse'
    ErrorResponse:
      name: ErrorResponse
      title: error response
      payload:
        $ref: '#/components/schemas/ErrorResponse'
    BookTicker:
      name: BookTicker
      title: book ticker
      payload:
        $ref: '#/components/schemas/BookTicker'
    OrderBookSnapshot:
      name: OrderBookSnapshot
      title: order book snapshot
      payload:
        $ref: '#/components/schemas/OrderBookSnapshot'
    DepthUpdate:
      name: DepthUpdate
      title: L2 differential depth update
      payload:
        $ref: '#/components/schemas/DepthUpdate'
    Trade:
      name: Trade
      title: trade
      payload:
        $ref: '#/components/schemas/Trade'
    OrderUpdate:
      name: OrderUpdate
      title: order update
      payload:
        $ref: '#/components/schemas/OrderUpdate'
    BalanceUpdate:
      name: BalanceUpdate
      title: balance update
      payload:
        $ref: '#/components/schemas/BalanceUpdate'
    PositionReport:
      name: PositionReport
      title: position report
      payload:
        $ref: '#/components/schemas/PositionReport'
    ContractStatus:
      name: ContractStatus
      title: contract status
      payload:
        $ref: '#/components/schemas/ContractStatus'
    RfqPublicEvent:
      name: RfqPublicEvent
      title: public request-for-quote event
      payload:
        $ref: '#/components/schemas/RfqPublicEvent'
    RfqPrivateDelivery:
      name: RfqPrivateDelivery
      title: private request-for-quote delivery
      payload:
        $ref: '#/components/schemas/RfqPrivateDelivery'
  schemas:
    CorrelationId:
      description: Client-chosen id, echoed on the matching response.
      oneOf:
        - type: string
        - type: integer
    NanosecondTimestamp:
      type: integer
      format: int64
      description: |
        Unix timestamp in nanoseconds. Values exceed JavaScript's safe integer
        range; JavaScript clients that need exact values should parse
        losslessly.
    MillisecondTimestamp:
      type: integer
      format: int64
      description: Unix timestamp in milliseconds.
    DecimalString:
      type: string
      description: Decimal value encoded as a string.
    PriceLevel:
      type: array
      description: |
        `[price, quantity]` tuple; both values are decimal strings. A quantity
        of zero removes that price level in differential depth updates.
      items:
        type: string
      minItems: 2
      maxItems: 2
    RequestBase:
      type: object
      required: [id, method]
      properties:
        id:
          $ref: '#/components/schemas/CorrelationId'
        method:
          type: string
      additionalProperties: true
    ConninfoRequest:
      allOf:
        - $ref: '#/components/schemas/RequestBase'
        - type: object
          required: [method]
          properties:
            method:
              type: string
              const: conninfo
            params:
              type: object
              additionalProperties: true
    PingRequest:
      allOf:
        - $ref: '#/components/schemas/RequestBase'
        - type: object
          required: [method]
          properties:
            method:
              type: string
              const: ping
            params:
              type: object
              additionalProperties: true
    TimeRequest:
      allOf:
        - $ref: '#/components/schemas/RequestBase'
        - type: object
          required: [method]
          properties:
            method:
              type: string
              const: time
            params:
              type: object
              ad

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