The Liquidity Pools API enables monitoring of new pool creation events and liquidity additions and removals across DeFi protocols including Raydium, Orca, and Meteora on Solana.
WebSocket Endpoint
wss://api.nolimitnodes.com/socket?apikey=YOUR_API_KEY
Subscribe
{
"method" : "dataSubscribe" ,
"params" : {
"referenceId" : "LIQUIDITY_POOLS" ,
"streams" : [
{
"stream" : "liquidityPoolsSubscribe" ,
"params" : {
"amm" : "Raydium" ,
"token1" : "So11111111111111111111111111111111111111112" ,
"token2" : "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"
}
}
]
},
"id" : 1
}
Filter Parameters
Filter by AMM/protocol name (e.g., "Raydium", "Orca", "Meteora", "PumpSwap").
Filter by first token mint address.
Filter by second token mint address.
Filter by specific pool address.
Filter by pool creator wallet address.
Filter by AMM program ID.
All filter parameters are optional. Omit all to receive every liquidity pool event.
Subscription Confirmation
{
"status" : "Subscribed to liquidityPools" ,
"subscription_id" : "8fe99234-3b7d-40e4-af71-19edc85fb0cc" ,
"stream" : "liquidityPoolsSubscribe" ,
"reference_id" : "LIQUIDITY_POOLS"
}
Pool Event Response
{
"method" : "liquidityPoolsSubscribe" ,
"subscription_id" : "8fe99234-3b7d-40e4-af71-19edc85fb0cc" ,
"result" : {
"amm" : "PumpSwap" ,
"token1" : "So11111111111111111111111111111111111111112" ,
"token2" : "7Pnqg1S6MYrL6AP1ZXcToTHfdBbTB77ze6Y33qBBpump" ,
"pool" : "FBZSQpAYGQJpmRT8L33QnGwv6bCaTx6XCjmTPVCw3gdZ" ,
"creator" : "2FMmrPvtxiRmxWYbBBrMUoXDcgQ1hmgsnHDtfDCnvunLBmafRRPjSjqbnywdxpMDU9Bdzq5md41uPF71ntvFqtvT" ,
"transaction_signature" : "2FMmrPvtxiRmxWYbBBrMUoXDcgQ1hmgsnHDtfDCnvunLBmafRRPjSjqbnywdxpMDU9Bdzq5md41uPF71ntvFqtvT" ,
"block_num" : 366963118 ,
"block_time" : 1757930744 ,
"program_id" : "pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA" ,
"type" : "liquidity_pool_creation"
}
}
Response Fields
Protocol name (e.g., "PumpSwap", "Raydium", "Orca", "Meteora").
First token mint address in the pool pair.
Second token mint address in the pool pair.
Pool creator wallet address.
Solana transaction signature.
Block number where the pool was created.
Unix timestamp of the block.
Event type (e.g., "liquidity_pool_creation").
amm — The DeFi protocol that created the pool (Raydium, Orca, Meteora, PumpSwap).
pool — The on-chain address of the liquidity pool.
creator — The wallet address that initiated the pool creation transaction.
Token Pair
token1 / token2 — The two token mint addresses that form the trading pair in the pool.
Transaction Details
transaction_signature — The full Solana transaction signature for on-chain verification.
block_num / block_time — Block number and timestamp for ordering and time-based analysis.
program_id — The program ID of the AMM, useful for filtering by protocol.
Unsubscribe
Request
{
"method" : "dataUnsubscribe" ,
"params" : {
"subscriptionIds" : [ "8fe99234-3b7d-40e4-af71-19edc85fb0cc" ],
"referenceId" : "UNSUB_REF"
}
}
Response
{
"status" : "Unsubscribed" ,
"unsubscribed_ids" : [ "8fe99234-3b7d-40e4-af71-19edc85fb0cc" ],
"reference_id" : "UNSUB_REF"
}
Code Examples
const WebSocket = require ( "ws" );
class LiquidityPoolMonitor {
constructor ( apiKey ) {
this . apiKey = apiKey ;
this . ws = null ;
this . pools = {};
this . ammStats = {};
}
connect () {
this . ws = new WebSocket (
`wss://api.nolimitnodes.com/socket?apikey= ${ this . apiKey } `
);
this . setupHandlers ();
}
setupHandlers () {
this . ws . on ( "open" , () => {
console . log ( "Connected to Liquidity Pool stream" );
this . subscribe ();
});
this . ws . on ( "message" , ( data ) => {
const message = JSON . parse ( data );
if ( message . method === "liquidityPoolsSubscribe" ) {
this . processPoolEvent ( message . result );
} else {
console . log ( "Info:" , JSON . stringify ( message ));
}
});
this . ws . on ( "error" , ( error ) => {
console . error ( "WebSocket error:" , error . message );
});
this . ws . on ( "close" , () => {
console . log ( "Connection closed. Reconnecting in 5s..." );
setTimeout (() => this . connect (), 5000 );
});
}
subscribe ( filters = {}) {
this . ws . send (
JSON . stringify ({
method: "dataSubscribe" ,
params: {
referenceId: "LIQUIDITY_POOLS" ,
streams: [
{
stream: "liquidityPoolsSubscribe" ,
params: filters ,
},
],
},
id: 1 ,
})
);
}
processPoolEvent ( pool ) {
// Track pools by AMM
if ( ! this . ammStats [ pool . amm ]) {
this . ammStats [ pool . amm ] = { count: 0 , pools: [] };
}
this . ammStats [ pool . amm ]. count ++ ;
this . ammStats [ pool . amm ]. pools . push ( pool . pool );
// Store pool data
this . pools [ pool . pool ] = {
amm: pool . amm ,
token1: pool . token1 ,
token2: pool . token2 ,
creator: pool . creator ,
block: pool . block_num ,
time: pool . block_time ,
type: pool . type ,
};
const timestamp = new Date ( pool . block_time * 1000 ). toISOString ();
console . log ( ` \n [ ${ timestamp } ] New Pool [ ${ pool . amm } ]` );
console . log ( ` Pool: ${ pool . pool } ` );
console . log ( ` Token1: ${ pool . token1 . slice ( 0 , 12 ) } ...` );
console . log ( ` Token2: ${ pool . token2 . slice ( 0 , 12 ) } ...` );
console . log ( ` Creator: ${ pool . creator . slice ( 0 , 12 ) } ...` );
console . log ( ` Block: ${ pool . block_num } | Program: ${ pool . program_id } ` );
console . log ( ` Type: ${ pool . type } ` );
// Show AMM stats
console . log ( ` [ ${ pool . amm } total pools: ${ this . ammStats [ pool . amm ]. count } ]` );
}
}
// Usage
const monitor = new LiquidityPoolMonitor ( "YOUR_API_KEY" );
monitor . connect ();
Best Practices
Risk Assessment & Due Diligence
Verify the token pair addresses before interacting with newly created pools.
Check whether pool creators have a history of creating and abandoning pools.
Be cautious of pools with unknown or unverified tokens — cross-reference with token metadata.
Monitor for pools created by the same creator in rapid succession, which may indicate automated activity.
Track pool creation frequency per AMM to understand protocol growth and adoption trends.
Monitor which token pairs are most commonly paired to identify market demand.
Compare pool creation patterns across Raydium, Orca, Meteora, and PumpSwap for protocol-level analysis.
Use block_time to build time-series data for pool creation rates.
Real-time Monitoring & Alerts
Set up alerts for pools containing tokens on your watchlist using token1 and token2 filters.
Monitor specific creators using the creator filter to track known deployers.
Use the amm filter to focus on specific protocols when building protocol-specific dashboards.
Implement reconnection logic with exponential backoff to ensure continuous monitoring.