SiftingIO · AsyncAPI Specification

SiftingIO Live Stream

Version 1.0.0

WebSocket API for live market data. Connect to `wss://stream.sifting.io/ws/v1?key=sft_...` — the API key is passed as the `key` query parameter (the only WebSocket auth method). After connecting, send `subscribe` operations for the products and symbols you want; the server streams `tick` and `tvl` frames and replies to control operations with `ack` / `pong` / `error` frames. All frames are JSON text.

View Spec View on GitHub Financial market dataStocks/equitiesForexCryptocurrencyDeFi/on-chainCommoditiesSEC FilingsXBRLFundamentalsFintechQuant/trading infrastructureReal-Time StreamingWebSocketFIXFinancial DataMarket DataStocksDeFiReal-TimeREST APIMCP Serveragent-nativeAsyncAPIEventsWebSockets

Channels

stream
Single bidirectional channel carrying control ops and data frames.

Messages

Auth
Auth
Subscribe
Subscribe
Unsubscribe
Unsubscribe
Ping
Ping
Ack
Ack
Pong
Pong
Tick
Tick
Price update.
TVL
TVL update
ErrorFrame
Error

Servers

wss
production
Production live stream. Append `?key=sft_...` to authenticate.

AsyncAPI Specification

Raw ↑
asyncapi: 3.0.0
info:
  title: SiftingIO Live Stream
  version: "1.0.0"
  description: |
    WebSocket API for live market data. Connect to
    `wss://stream.sifting.io/ws/v1?key=sft_...` — the API key is passed as the
    `key` query parameter (the only WebSocket auth method).

    After connecting, send `subscribe` operations for the products and symbols
    you want; the server streams `tick` and `tvl` frames and replies to control
    operations with `ack` / `pong` / `error` frames. All frames are JSON text.
  license:
    name: MIT
  contact:
    name: SiftingIO
    url: https://sifting.io/docs

servers:
  production:
    host: stream.sifting.io
    pathname: /ws/v1
    protocol: wss
    description: Production live stream. Append `?key=sft_...` to authenticate.

channels:
  stream:
    address: /ws/v1
    title: Live stream
    description: Single bidirectional channel carrying control ops and data frames.
    messages:
      auth:
        $ref: "#/components/messages/Auth"
      subscribe:
        $ref: "#/components/messages/Subscribe"
      unsubscribe:
        $ref: "#/components/messages/Unsubscribe"
      ping:
        $ref: "#/components/messages/Ping"
      ack:
        $ref: "#/components/messages/Ack"
      pong:
        $ref: "#/components/messages/Pong"
      tick:
        $ref: "#/components/messages/Tick"
      tvl:
        $ref: "#/components/messages/TVL"
      error:
        $ref: "#/components/messages/ErrorFrame"

operations:
  subscribe:
    action: send
    channel:
      $ref: "#/channels/stream"
    title: Subscribe to symbols
    messages:
      - $ref: "#/channels/stream/messages/subscribe"
  unsubscribe:
    action: send
    channel:
      $ref: "#/channels/stream"
    title: Unsubscribe from symbols
    messages:
      - $ref: "#/channels/stream/messages/unsubscribe"
  authenticate:
    action: send
    channel:
      $ref: "#/channels/stream"
    title: Authenticate (alternative to the key query param)
    messages:
      - $ref: "#/channels/stream/messages/auth"
  ping:
    action: send
    channel:
      $ref: "#/channels/stream"
    title: Application-level ping
    messages:
      - $ref: "#/channels/stream/messages/ping"
  receiveFrames:
    action: receive
    channel:
      $ref: "#/channels/stream"
    title: Server frames
    messages:
      - $ref: "#/channels/stream/messages/ack"
      - $ref: "#/channels/stream/messages/pong"
      - $ref: "#/channels/stream/messages/tick"
      - $ref: "#/channels/stream/messages/tvl"
      - $ref: "#/channels/stream/messages/error"

components:
  messages:
    Auth:
      name: auth
      title: Auth
      payload:
        $ref: "#/components/schemas/AuthOp"
    Subscribe:
      name: subscribe
      title: Subscribe
      payload:
        $ref: "#/components/schemas/SubscribeOp"
    Unsubscribe:
      name: unsubscribe
      title: Unsubscribe
      payload:
        $ref: "#/components/schemas/SubscribeOp"
    Ping:
      name: ping
      title: Ping
      payload:
        $ref: "#/components/schemas/PingOp"
    Ack:
      name: ack
      title: Ack
      payload:
        $ref: "#/components/schemas/AckFrame"
    Pong:
      name: pong
      title: Pong
      payload:
        $ref: "#/components/schemas/PongFrame"
    Tick:
      name: tick
      title: Tick
      summary: Price update.
      payload:
        $ref: "#/components/schemas/TickFrame"
    TVL:
      name: tvl
      title: TVL update
      payload:
        $ref: "#/components/schemas/TVLFrame"
    ErrorFrame:
      name: error
      title: Error
      payload:
        $ref: "#/components/schemas/ErrorFrame"

  schemas:
    Product:
      type: string
      enum: [cex, dex, fx, us, tvl]
      description: Subscribable product channel.

    AuthOp:
      type: object
      required: [op, key]
      properties:
        op: { const: auth }
        key: { type: string }

    SubscribeOp:
      type: object
      required: [op, product, symbols]
      properties:
        op: { type: string, enum: [subscribe, unsubscribe] }
        product: { $ref: "#/components/schemas/Product" }
        symbols:
          type: array
          items: { type: string }

    PingOp:
      type: object
      required: [op]
      properties:
        op: { const: ping }

    AckFrame:
      type: object
      required: [f]
      properties:
        f: { const: ack }
      additionalProperties: true

    PongFrame:
      type: object
      required: [f]
      properties:
        f: { const: pong }

    TickFrame:
      type: object
      required: [f, s, t]
      properties:
        f: { const: tick }
        s: { type: string, description: Symbol. }
        p: { type: string, description: Trade price. }
        P: { type: string, description: Trade size. }
        b: { type: string, description: Bid price. }
        B: { type: string, description: Bid size. }
        a: { type: string, description: Ask price. }
        A: { type: string, description: Ask size. }
        t:
          {
            type: integer,
            format: int64,
            description: "Unix epoch milliseconds.",
          }
        class: { type: string, description: Asset class tag. }

    TVLFrame:
      type: object
      required: [f, s, t]
      properties:
        f: { const: tvl }
        s: { type: string }
        usd: { type: string }
        r0: { type: string }
        r1: { type: string }
        n: { type: integer }
        t: { type: integer, format: int64 }

    ErrorFrame:
      type: object
      required: [f, code]
      properties:
        f: { const: error }
        code: { type: string }
        message: { type: string }
        limit: { type: integer }

Work with this as data

Every AsyncAPI spec 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 asyncapi

4 MCP tools reach this
  • find_asyncapisBrowse and filter every AsyncAPI spec in the catalog.
  • 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 AsyncAPI spec
curl "https://apis.io/api/v1/asyncapis/siftingio-asyncapi"
All asyncapi
curl "https://apis.io/api/v1/asyncapis?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.