Meteora DAMM v1 API
Meteora DAMM v1 is the Dynamic AMM, Meteora's original constant-product pool program on Solana, at Eo7WjKq67rjJQSZxS6z3YkapzY3eMj6Xy8X5EQVn5UaB. It runs stable pools for pegged assets, LST pools for staked SOL, and full-range pools whose idle reserves can earn extra yield through Meteora's Dynamic Vaults. Bitquery reads its swaps, prices, candles, traders and reserves over GraphQL, WebSocket, Kafka and gRPC.
Meteora files DAMM v1 under legacy products. The pools that exist keep trading, and the deepest of them are still meaningful markets for staked SOL and stablecoins, but new DAMM v1 pools are no longer being created: new launches go to DAMM v2, and Dynamic Bonding Curve graduations now migrate into DAMM v2 as well. Plan integrations around the pools that exist rather than around pool creation.
"DYN" was our shorthand, not a Meteora product name. The program, the URL and every query here are unchanged; only the naming now matches Meteora's own documentation.
The Trading API answers most questions on this page fastest. Trading.Trades returns MEV-filtered swaps with USD price, market cap and supply on every row, and Trading.Pairs gives pre-aggregated OHLC per pool down to one second. Filter either with Market: { Protocol: { is: "amm" } } and Network: { is: "Solana" } for DAMM v1.
Drop to the chain-level cubes for pool reserves and for history older than about 30 days.
To query or stream data via GraphQL outside the Bitquery IDE, you need to generate an API access token.
Follow the steps here to create one: How to generate Bitquery API token ➤
What is the Meteora DAMM v1 program ID on Solana?
The Dynamic AMM program is Eo7WjKq67rjJQSZxS6z3YkapzY3eMj6Xy8X5EQVn5UaB on Solana mainnet, and Meteora uses the same address on devnet. Two related programs sit beside it: Dynamic Vault at 24Uqj9JCLxUeoC3hGfh5W3s9FM9uCHDS2SG3LYwBpyTi, which earns yield on idle reserves, and Farming at FarmuwXPWXvefWUeqFAa5w6rifLkq5X6E8bimYvrhCB1.
Eo7WjKq67rjJQSZxS6z3YkapzY3eMj6Xy8X5EQVn5UaB
In the Trading cubes DAMM v1 is Market.Protocol amm. In the Solana chain-level cubes the rows carry Dex.ProtocolName amm and Dex.ProtocolFamily Meteora. Method names on this program are camelCase, as on DLMM: swaps are swap, liquidity moves are addBalanceLiquidity and removeBalanceLiquidity. DAMM v2 and DBC use snake_case instead, so do not copy method spellings between Meteora pages.
Meteora runs four trading programs on Solana, each with its own Bitquery page:
| Meteora program | Program ID | Protocol name | Bitquery page |
|---|---|---|---|
| DAMM v1, the legacy Dynamic AMM | Eo7WjKq67rjJQSZxS6z3YkapzY3eMj6Xy8X5EQVn5UaB | amm | This page |
| DAMM v2, constant-product pools with position NFTs | cpamdpZCGKUy5JxQXB4dcpGPiikHawvSWAd6mEn1sGG | cp_amm | Meteora DAMM v2 API |
| DLMM, concentrated liquidity in price bins | LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo | lb_clmm | Meteora DLMM API |
| Dynamic Bonding Curve, launches that graduate to a DAMM pool | dbcij3LWUppWqq96dh6gJWwBifmcGfLSB5D4DuSMaqN | dynamic_bonding_curve | Meteora DBC API |
Does Meteora have an API?
Yes, for pool-level data. Meteora publishes a free REST DAMM v1 Data API at https://damm-api.meteora.ag, limited to 10 requests a second with no key, covering pool state and related vault data. It has no per-swap trade endpoint, no per-wallet swap history and no streaming. Bitquery reads the same activity from the chain: swaps as individual rows with the trader and a USD price, reserves after every liquidity change, and history back to mid-2024.
Which DAMM v1 pools are still active
Since new pools are not being created, the useful starting point is a ranking of the pools that exist. This returns the busiest DAMM v1 markets over the last 24 hours by USD volume.
{
Trading {
Pairs(
limit: { count: 25 }
orderBy: { descendingByField: "usd" }
where: {
Market: { Protocol: { is: "amm" }, Network: { is: "Solana" } }
Price: { IsQuotedInUsd: true }
Interval: { Time: { Duration: { eq: 3600 } } }
Block: { Time: { since_relative: { hours_ago: 24 } } }
}
) {
Market {
Address
}
Token {
Symbol
Address
}
QuoteToken {
Symbol
}
usd: sum(of: Volume_Usd)
}
}
}
The examples below use JitoSOL (J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn), whose WSOL pool ERgpKaq59Nnfm9YRVAAhnq16cZhHxGcDoDWCzXbhiaNw is the deepest DAMM v1 market and one of the LST pools the program was built for.
Meteora DAMM v1 trades in real time
Stream every decoded DAMM v1 swap with the trader, both amounts and the USD price.
subscription {
Trading {
Trades(
where: {
Pair: { Market: { Protocol: { is: "amm" }, Network: { is: "Solana" } } }
}
) {
Block {
Time
}
Side
Price
PriceInUsd
Trader {
Address
}
Amounts {
Base
Quote
}
AmountsInUsd {
Base
Quote
}
TransactionHeader {
Hash
}
Pair {
Market {
Address
Protocol
}
Token {
Symbol
Address
}
QuoteToken {
Symbol
Address
}
}
}
}
}
Add Pair: { Token: { Address: { is: "<mint>" } } } to follow one token. For the lowest latency the same swaps are on the Kafka topic solana.dextrades.proto and the gRPC DEX trades topic; filter on ProtocolName amm in the consumer.
Latest price of a token on Meteora DAMM v1
Trading.Pairs returns the latest interval for the pool with OHLC, average price and volume already computed. Price: { IsQuotedInUsd: true } matters: every market publishes each interval twice, once in USD and once in the quote token.
{
Trading {
Pairs(
limit: { count: 1 }
orderBy: { descending: Block_Time }
where: {
Token: { Address: { is: "J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn" } }
Market: { Protocol: { is: "amm" }, Network: { is: "Solana" } }
Price: { IsQuotedInUsd: true }
Interval: { Time: { Duration: { eq: 60 } } }
}
) {
Block {
Time
}
Token {
Symbol
Address
}
QuoteToken {
Symbol
}
Market {
Address
}
Price {
Ohlc {
Open
High
Low
Close
}
Average {
Mean
}
}
Volume {
Usd
Base
}
}
}
}
This is the price on DAMM v1. For a token's price across every venue, weighted to its deepest market, drop the protocol filter and add Ranking: { Position: { eq: 1 } } as described in most accurate token price. On a legacy program the two often differ, because the token's main market has usually moved elsewhere.
Real-time price feed of a token on Meteora DAMM v1
The same filter as a subscription, at one-second intervals.
subscription {
Trading {
Pairs(
where: {
Token: { Address: { is: "J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn" } }
Market: { Protocol: { is: "amm" }, Network: { is: "Solana" } }
Price: { IsQuotedInUsd: true }
Interval: { Time: { Duration: { eq: 1 } } }
}
) {
Block {
Time
}
Token {
Symbol
}
QuoteToken {
Symbol
}
Market {
Address
}
Price {
Ohlc {
Open
High
Low
Close
}
}
Volume {
Usd
}
}
}
}
Meteora DAMM v1 OHLC API
Candles come pre-built from Trading.Pairs. Set Interval.Time.Duration in seconds: 1, 60 or 3600.
{
Trading {
Pairs(
limit: { count: 30 }
orderBy: { descending: Block_Time }
where: {
Token: { Address: { is: "J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn" } }
Market: { Protocol: { is: "amm" }, Network: { is: "Solana" } }
Price: { IsQuotedInUsd: true }
Interval: { Time: { Duration: { eq: 3600 } } }
}
) {
Block {
Time
}
Market {
Address
}
QuoteToken {
Symbol
}
Price {
Ohlc {
Open
High
Low
Close
}
}
Volume {
Usd
Base
Quote
}
}
}
}
Top traders of a token on Meteora DAMM v1
Ranks wallets by USD volume over the last 24 hours, one row per wallet, with the USD each bought and sold.
Run this as a query, not a subscription. Aggregates over WebSocket return partial results.
query TopTraders($token: String) {
Trading {
Trades(
limit: { count: 100 }
orderBy: { descendingByField: "volumeUsd" }
where: {
Pair: {
Market: { Protocol: { is: "amm" }, Network: { is: "Solana" } }
Token: { Address: { is: $token } }
}
Block: { Time: { since_relative: { hours_ago: 24 } } }
}
) {
Trader {
Address
}
volumeUsd: sum(of: AmountsInUsd_Base)
bought: sum(of: AmountsInUsd_Base, if: { Side: { is: "Buy" } })
sold: sum(of: AmountsInUsd_Base, if: { Side: { is: "Sell" } })
buys: count(if: { Side: { is: "Buy" } })
sells: count(if: { Side: { is: "Sell" } })
trades: count
}
}
}
{
"token": "J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn"
}