All tutorials

2026-03-27

How to Stream Meteora DEX Trades and Pool Data in Real-Time

Meteora is a Solana DEX with three pool types: Dynamic AMM (DAMM), Dynamic AMM V2 (DAMM2), and DLMM (Dynamic Liquidity Market Maker). The Sailfish SDK streams trades and pool events across all three in real-time. This guide shows how to set it up.

Meteora Pool Types

  • MeteoraDyn (DAMM) — Original dynamic AMM with variable fees based on market volatility.
  • MeteoraDynV2 (DAMM2) — V2 dynamic AMM with improved fee mechanics.
  • MeteoraDlmm — Concentrated liquidity using discrete price bins, similar to Trader Joe's Liquidity Book.

Stream All Meteora Trades

import { Sailfish, SailfishTier, Trade } from "sailfish-sdk";

const sailfish = new Sailfish({
  tier: SailfishTier.free({ apiKey: "YOUR_API_KEY" }),
  filter: {
    token_addresses: [],
    pool_addresses: [],
    dex_types: ["MeteoraDyn", "MeteoraDynV2", "MeteoraDlmm"],
  },
  callbacks: {
    onTrade: (trade: Trade) => {
      console.log(`Meteora trade: ${trade.base_amount} @ ${trade.price}`);
      console.log(`Pool: ${trade.pool_address}`);
    },
  },
});

sailfish.swim();

Filter by Pool Type

To focus on DLMM concentrated liquidity pools only:

filter: {
  token_addresses: [],
  pool_addresses: [],
  dex_types: ["MeteoraDlmm"],
},

Or only dynamic AMM pools (both versions):

dex_types: ["MeteoraDyn", "MeteoraDynV2"],

Detect New Meteora Pools

callbacks: {
  onPoolInit: (poolInit) => {
    console.log(`New Meteora pool: ${poolInit.pool_address}`);
    console.log(`Type: ${poolInit.pool_type}`);
    console.log(`Tokens: ${poolInit.token_0_mint} / ${poolInit.token_1_mint}`);
  },
},

Pool inits are currently available for MeteoraDyn and MeteoraDynV2. DLMM pool inits are coming soon.

Get Pool Metadata

const poolInfo = await sailfish.fetchPoolInfo("METEORA_POOL_ADDRESS");

console.log(`Pool type: ${poolInfo.pool_type}`);
console.log(`Base: ${poolInfo.base_token.symbol} (${poolInfo.base_token.decimals} decimals)`);
console.log(`Quote: ${poolInfo.quote_token.symbol}`);

Pool info is cached automatically -- repeated lookups for the same address don't hit the network.

Use TradeRaw for High-Frequency Processing

TradeRaw gives raw token amounts with no PoolInfo lookup -- lower latency for high-frequency processing:

callbacks: {
  onTradeRaw: (tradeRaw) => {
    if (tradeRaw.pool_type === "MeteoraDlmm") {
      console.log(`DLMM raw: ${tradeRaw.token_amount_in} ${tradeRaw.token_address_in}`);
      console.log(`       -> ${tradeRaw.token_amount_out} ${tradeRaw.token_address_out}`);
    }
  },
},

Query Historic Meteora Trades

import { SailfishApi, SailfishTier } from "sailfish-sdk";

const api = new SailfishApi({ tier: SailfishTier.free({ apiKey: "YOUR_API_KEY" }) });

const trades = await api.fetchTrades({
  pool_address: "METEORA_POOL_ADDRESS",
  limit: 100,
});

for (const trade of trades) {
  console.log(`Slot ${trade.index.tick}: ${trade.base_amount} @ ${trade.price}`);
}

You can also query by token address or block range. For visual exploration, use the free Historic Trade Data tool.

Compare Meteora with Other DEXs

const sailfish = new Sailfish({
  tier: SailfishTier.free({ apiKey: "YOUR_API_KEY" }),
  filter: {
    token_addresses: ["TOKEN_MINT"],
    pool_addresses: [],
    dex_types: [], // empty = all DEXs
  },
  callbacks: {
    onTradeRaw: (tradeRaw) => {
      console.log(`${tradeRaw.pool_type}: ${tradeRaw.price}`);
    },
  },
});

sailfish.swim();

Useful for cross-DEX price comparison and arbitrage detection.

Resources