GeckoTerminal API Guide: On-Chain DEX Data for Developers
GeckoTerminal API Guide: On-Chain DEX Data for Developers
GeckoTerminal, created by the team behind CoinGecko, provides comprehensive DEX analytics across 200+ blockchain networks and 1,500+ decentralized exchanges. Their free public API gives developers access to real-time on-chain market data.
This guide covers everything you need to integrate GeckoTerminal's API into your Solana applications.
🎯 What You'll Learn
- GeckoTerminal API overview and capabilities
- All available endpoints with examples
- How to fetch OHLCV candlestick data
- Rate limits and best practices
📡 API Overview
Key Features
- 200+ Networks: Solana, Ethereum, BSC, and many more
- 1,500+ DEXs: Raydium, Orca, Meteora, etc.
- 6M+ Tokens: Comprehensive token coverage
- Free to Use: No API key required (Beta)
- OHLCV Data: Historical candlestick charts
Base URL
https://api.geckoterminal.com/api/v2
Rate Limits
| Tier | Rate Limit |
|---|---|
| Free (GeckoTerminal) | 30 requests/minute |
| CoinGecko Paid Plans | 500 requests/minute |
Note: The same data is available through CoinGecko API's /onchain endpoints with higher rate limits for paid users.
🔗 Core Endpoints
Network Information
Get list of supported networks.
Endpoint: GET /networks
Example:
GET https://api.geckoterminal.com/api/v2/networks
Response:
{
"data": [
{
"id": "solana",
"type": "network",
"attributes": {
"name": "Solana",
"coingecko_asset_platform_id": "solana"
}
}
]
}
DEXs on a Network
Get list of DEXs on Solana.
Endpoint: GET /networks/{network}/dexes
Example:
GET https://api.geckoterminal.com/api/v2/networks/solana/dexes
Response:
{
"data": [
{
"id": "raydium",
"type": "dex",
"attributes": {
"name": "Raydium"
}
},
{
"id": "orca",
"type": "dex",
"attributes": {
"name": "Orca"
}
}
]
}
💹 Pool Endpoints
Get Pool by Address
Fetch detailed data for a specific pool.
Endpoint: GET /networks/{network}/pools/{address}
Example:
GET https://api.geckoterminal.com/api/v2/networks/solana/pools/7XawhbbxtsRcQA8KTkHT9f9nc6d69UwqCDh6U5EEbEmX
Response:
{
"data": {
"id": "solana_7XawhbbxtsRcQA8KTkHT9f9nc6d69UwqCDh6U5EEbEmX",
"type": "pool",
"attributes": {
"name": "SOL / USDC",
"address": "7XawhbbxtsRcQA8KTkHT9f9nc6d69UwqCDh6U5EEbEmX",
"base_token_price_usd": "198.50",
"quote_token_price_usd": "1.00",
"base_token_price_native_currency": "1",
"quote_token_price_native_currency": "0.00504",
"base_token_price_quote_token": "198.50",
"quote_token_price_base_token": "0.00504",
"pool_created_at": "2023-01-15T10:30:00Z",
"reserve_in_usd": "25000000",
"fdv_usd": "850000000",
"market_cap_usd": "750000000",
"price_change_percentage": {
"m5": "0.5",
"h1": "1.2",
"h6": "-0.8",
"h24": "5.5"
},
"transactions": {
"m5": { "buys": 15, "sells": 12, "buyers": 12, "sellers": 10 },
"h1": { "buys": 180, "sells": 165, "buyers": 145, "sellers": 130 },
"h24": { "buys": 4500, "sells": 4200, "buyers": 3200, "sellers": 2800 }
},
"volume_usd": {
"m5": "50000",
"h1": "850000",
"h6": "3500000",
"h24": "15000000"
}
},
"relationships": {
"base_token": {
"data": { "id": "solana_So111...", "type": "token" }
},
"quote_token": {
"data": { "id": "solana_EPjFW...", "type": "token" }
},
"dex": {
"data": { "id": "raydium", "type": "dex" }
}
}
}
}
Get Multiple Pools
Fetch up to 30 pools at once.
Endpoint: GET /networks/{network}/pools/multi/{addresses}
Example:
GET https://api.geckoterminal.com/api/v2/networks/solana/pools/multi/7XawhbbxtsRcQA8KTkHT9f9nc6d69UwqCDh6U5EEbEmX,ABC123...
Top Pools by Volume
Endpoint: GET /networks/{network}/pools
Query Parameters:
page: Page number (default: 1)sort: Sort field (h24_volume_usd_desc,h24_tx_count_desc)
Example:
GET https://api.geckoterminal.com/api/v2/networks/solana/pools?sort=h24_volume_usd_desc
🔥 Trending Endpoints
Trending Pools
Get pools trending by different time periods.
Endpoint: GET /networks/{network}/trending_pools
Query Parameters:
page: Page numberduration: Time period (5m,1h,6h,24h)
Example:
GET https://api.geckoterminal.com/api/v2/networks/solana/trending_pools?duration=1h
Response:
{
"data": [
{
"id": "solana_ABC123...",
"type": "pool",
"attributes": {
"name": "BONK / SOL",
"address": "ABC123...",
"base_token_price_usd": "0.00002345",
"volume_usd": {
"h1": "2500000",
"h24": "45000000"
}
}
}
]
}
Global Trending Pools
Trending across all networks.
Endpoint: GET /networks/trending_pools
🪙 Token Endpoints
Get Token Pools
Find all pools trading a specific token.
Endpoint: GET /networks/{network}/tokens/{address}/pools
Example:
GET https://api.geckoterminal.com/api/v2/networks/solana/tokens/JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN/pools
Get Token Info
Endpoint: GET /networks/{network}/tokens/{address}/info
Response:
{
"data": {
"id": "solana_JUPyiwr...",
"type": "token",
"attributes": {
"name": "Jupiter",
"symbol": "JUP",
"address": "JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN",
"decimals": 6,
"total_supply": "10000000000",
"price_usd": "0.89",
"fdv_usd": "8900000000",
"total_reserve_in_usd": "125000000",
"volume_usd": {
"h24": "85000000"
},
"market_cap_usd": "890000000"
}
}
}
Recently Updated Tokens
Endpoint: GET /networks/{network}/tokens
📊 OHLCV Data (Candlesticks)
Get historical price data for charting.
Get OHLCV
Endpoint: GET /networks/{network}/pools/{pool_address}/ohlcv/{timeframe}
Timeframes:
minute: 1-minute candleshour: 1-hour candlesday: 1-day candles
Query Parameters:
aggregate: Aggregate bars (e.g., 5 for 5-minute)before_timestamp: Get data before this Unix timestamplimit: Number of candles (max 1000)currency: Price currency (usdortoken)
Example (5-minute candles):
GET https://api.geckoterminal.com/api/v2/networks/solana/pools/7XawhbbxtsRcQA8KTkHT9f9nc6d69UwqCDh6U5EEbEmX/ohlcv/minute?aggregate=5&limit=100
Response:
{
"data": {
"id": "solana_7Xawh..._minute_5",
"type": "ohlcv",
"attributes": {
"ohlcv_list": [
[1699920000, "198.50", "199.00", "198.00", "198.75", "1500000"],
[1699920300, "198.75", "199.50", "198.25", "199.25", "1200000"]
]
}
},
"meta": {
"base": {
"address": "So111...",
"name": "Wrapped SOL",
"symbol": "SOL"
},
"quote": {
"address": "EPjFW...",
"name": "USD Coin",
"symbol": "USDC"
}
}
}
OHLCV Array Format:
[timestamp, open, high, low, close, volume]
Timeframe Examples
| Timeframe | Endpoint | Aggregate |
|---|---|---|
| 1 minute | /ohlcv/minute |
1 |
| 5 minutes | /ohlcv/minute |
5 |
| 15 minutes | /ohlcv/minute |
15 |
| 1 hour | /ohlcv/hour |
1 |
| 4 hours | /ohlcv/hour |
4 |
| 1 day | /ohlcv/day |
1 |
📜 Trade History
Get recent trades for a pool.
Endpoint: GET /networks/{network}/pools/{pool_address}/trades
Query Parameters:
trade_volume_in_usd_greater_than: Filter by minimum USD volume
Example:
GET https://api.geckoterminal.com/api/v2/networks/solana/pools/7XawhbbxtsRcQA8KTkHT9f9nc6d69UwqCDh6U5EEbEmX/trades?trade_volume_in_usd_greater_than=100
Response:
{
"data": [
{
"id": "solana_tx_signature...",
"type": "trade",
"attributes": {
"block_number": 235678901,
"tx_hash": "signature...",
"tx_from_address": "wallet...",
"from_token_amount": "10.5",
"to_token_amount": "2089.75",
"price_from_in_currency_token": "198.93",
"price_to_in_currency_token": "0.00502",
"price_from_in_usd": "198.93",
"price_to_in_usd": "1.00",
"volume_in_usd": "2089.75",
"kind": "buy",
"block_timestamp": "2024-01-15T10:30:45Z"
}
}
]
}
🔍 Search
Search for tokens and pools.
Endpoint: GET /search/pools
Query Parameters:
query: Search termnetwork: Filter by network (optional)page: Page number
Example:
GET https://api.geckoterminal.com/api/v2/search/pools?query=JUP&network=solana
🛠️ Integration Examples
Fetching OHLCV for Charts
async function getOHLCV(poolAddress, timeframe = 'hour', limit = 100) {
const url = `https://api.geckoterminal.com/api/v2/networks/solana/pools/${poolAddress}/ohlcv/${timeframe}?limit=${limit}`;
const response = await fetch(url);
const data = await response.json();
return data.data.attributes.ohlcv_list.map(candle => ({
timestamp: candle[0] * 1000, // Convert to milliseconds
open: parseFloat(candle[1]),
high: parseFloat(candle[2]),
low: parseFloat(candle[3]),
close: parseFloat(candle[4]),
volume: parseFloat(candle[5])
}));
}
Getting Trending Tokens
async function getTrendingPools(duration = '1h') {
const url = `https://api.geckoterminal.com/api/v2/networks/solana/trending_pools?duration=${duration}`;
const response = await fetch(url);
const data = await response.json();
return data.data.map(pool => ({
name: pool.attributes.name,
address: pool.attributes.address,
price: pool.attributes.base_token_price_usd,
volume24h: pool.attributes.volume_usd?.h24,
priceChange24h: pool.attributes.price_change_percentage?.h24
}));
}
Pool Discovery
async function findPoolsForToken(tokenAddress) {
const url = `https://api.geckoterminal.com/api/v2/networks/solana/tokens/${tokenAddress}/pools`;
const response = await fetch(url);
const data = await response.json();
// Sort by liquidity
return data.data.sort((a, b) => {
const liqA = parseFloat(a.attributes.reserve_in_usd || 0);
const liqB = parseFloat(b.attributes.reserve_in_usd || 0);
return liqB - liqA;
});
}
⚠️ Best Practices
1. Respect Rate Limits
class GeckoTerminalClient {
constructor() {
this.requestQueue = [];
this.processing = false;
}
async request(endpoint) {
return new Promise((resolve, reject) => {
this.requestQueue.push({ endpoint, resolve, reject });
this.processQueue();
});
}
async processQueue() {
if (this.processing || this.requestQueue.length === 0) return;
this.processing = true;
const { endpoint, resolve, reject } = this.requestQueue.shift();
try {
const response = await fetch(
`https://api.geckoterminal.com/api/v2${endpoint}`
);
resolve(await response.json());
} catch (error) {
reject(error);
}
// Wait 2 seconds between requests (30 req/min)
setTimeout(() => {
this.processing = false;
this.processQueue();
}, 2000);
}
}
2. Cache OHLCV Data
Historical data doesn't change - cache it:
const ohlcvCache = new Map();
async function getCachedOHLCV(poolAddress, timeframe) {
const cacheKey = `${poolAddress}_${timeframe}`;
if (ohlcvCache.has(cacheKey)) {
return ohlcvCache.get(cacheKey);
}
const data = await getOHLCV(poolAddress, timeframe);
ohlcvCache.set(cacheKey, data);
return data;
}
3. Handle Pagination
async function getAllTrendingPools(duration = '1h') {
const allPools = [];
let page = 1;
let hasMore = true;
while (hasMore) {
const url = `https://api.geckoterminal.com/api/v2/networks/solana/trending_pools?duration=${duration}&page=${page}`;
const response = await fetch(url);
const data = await response.json();
if (data.data.length === 0) {
hasMore = false;
} else {
allPools.push(...data.data);
page++;
}
await sleep(2000); // Respect rate limits
}
return allPools;
}
📚 Resources
Official Links
Related Tools
- DexScreener - Similar DEX data
- Birdeye - Solana analytics
🎓 Key Takeaways
- Free API - No API key required (30 req/min)
- OHLCV support - Great for building charts
- Multi-network - 200+ blockchains supported
- CoinGecko integration - Same data, higher limits
- Cache historical data - It doesn't change
- Use pagination - For complete data sets
GeckoTerminal's API is perfect for building analytics and charting applications. Now you have everything you need! 🚀