Tensor WebSocket API

Subscription-based realtime stream of Tensor marketplace events. Channels include `newTransaction` (every confirmed marketplace action), `ammOrderUpdate` / `ammOrderUpdateAll` (TSwap and TAmm pool state), `tcompBidUpdate` / `tcompBidUpdateAll` (compressed-NFT collection bids), `ping`, and `unsubscribe`. Used to power floor-price feeds, sales bots, and order-book mirroring.

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/tensor-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

tensor-websocket-api-asyncapi.yml Raw ↑
asyncapi: 3.0.0
info:
  title: Tensor WebSocket API
  version: '1.0'
  description: |
    Realtime subscription stream for the Tensor Solana NFT marketplace. Clients open a
    single WebSocket connection authenticated with `x-tensor-api-key`, then send JSON
    subscribe/unsubscribe control frames addressing one of the channels below. The
    server publishes JSON event frames as marketplace state changes on-chain.

    Documented at https://dev.tensor.trade/reference.
servers:
  mainnet:
    host: api.mainnet.tensordev.io
    protocol: wss
    description: Mainnet WebSocket subscription endpoint.
    security:
    - $ref: '#/components/securitySchemes/ApiKeyAuth'
channels:
  newTransaction:
    address: newTransaction
    messages:
      transactionEvent:
        $ref: '#/components/messages/TransactionEvent'
    description: Every confirmed marketplace transaction (list, delist, buy, bid placed, bid accepted, bid cancelled).
  ammOrderUpdate:
    address: ammOrderUpdate
    messages:
      poolUpdate:
        $ref: '#/components/messages/PoolUpdate'
    description: Updates to a specific TSwap or TAmm pool the client subscribed to.
  ammOrderUpdateAll:
    address: ammOrderUpdateAll
    messages:
      poolUpdate:
        $ref: '#/components/messages/PoolUpdate'
    description: Updates across all TSwap / TAmm pools in subscribed collections.
  tcompBidUpdate:
    address: tcompBidUpdate
    messages:
      bidUpdate:
        $ref: '#/components/messages/BidUpdate'
    description: Updates to a specific compressed-NFT collection bid.
  tcompBidUpdateAll:
    address: tcompBidUpdateAll
    messages:
      bidUpdate:
        $ref: '#/components/messages/BidUpdate'
    description: Updates across all compressed-NFT collection bids for subscribed collections.
  ping:
    address: ping
    messages:
      ping:
        $ref: '#/components/messages/Ping'
    description: Keep-alive control frame. Server responds with `pong`.
  unsubscribe:
    address: unsubscribe
    messages:
      unsubscribe:
        $ref: '#/components/messages/Unsubscribe'
    description: Cancel one or more active subscriptions.
operations:
  receiveTransaction:
    action: receive
    channel:
      $ref: '#/channels/newTransaction'
  receiveAmmOrderUpdate:
    action: receive
    channel:
      $ref: '#/channels/ammOrderUpdate'
  receiveAmmOrderUpdateAll:
    action: receive
    channel:
      $ref: '#/channels/ammOrderUpdateAll'
  receiveTcompBidUpdate:
    action: receive
    channel:
      $ref: '#/channels/tcompBidUpdate'
  receiveTcompBidUpdateAll:
    action: receive
    channel:
      $ref: '#/channels/tcompBidUpdateAll'
  sendPing:
    action: send
    channel:
      $ref: '#/channels/ping'
  sendUnsubscribe:
    action: send
    channel:
      $ref: '#/channels/unsubscribe'
components:
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-tensor-api-key
  messages:
    TransactionEvent:
      name: TransactionEvent
      contentType: application/json
      payload:
        type: object
        properties:
          slot: { type: integer }
          signature: { type: string }
          mint: { type: string }
          txType: { type: string, enum: [List, Delist, Buy, Bid, BidCancel, BidAccept, PoolCreate, PoolEdit, PoolClose] }
          price: { type: string, description: 'Lamports.' }
          buyer: { type: string }
          seller: { type: string }
          collectionSlug: { type: string }
    PoolUpdate:
      name: PoolUpdate
      contentType: application/json
      payload:
        type: object
        properties:
          pool: { type: string }
          owner: { type: string }
          collectionSlug: { type: string }
          startingPrice: { type: string }
          delta: { type: string }
          poolType: { type: string }
          curveType: { type: string }
          nftsHeld: { type: integer }
          solBalance: { type: string }
    BidUpdate:
      name: BidUpdate
      contentType: application/json
      payload:
        type: object
        properties:
          bid: { type: string }
          bidder: { type: string }
          collectionSlug: { type: string }
          price: { type: string }
          quantity: { type: integer }
          margin: { type: string }
    Ping:
      name: Ping
      contentType: application/json
      payload:
        type: object
        properties:
          op: { type: string, const: ping }
    Unsubscribe:
      name: Unsubscribe
      contentType: application/json
      payload:
        type: object
        properties:
          op: { type: string, const: unsubscribe }
          channel: { type: string }
          target: { type: string, description: 'Slug, pool, bid, or mint depending on channel.' }