DexScreener API Guide: Token Data, Pairs, and Market Intelligence
DexScreener API Guide: Token Data, Pairs, and Market Intelligence
DexScreener is one of the most popular platforms for tracking decentralized exchange data. Their free API provides access to token prices, trading pairs, volume data, and more across 80+ blockchains including Solana.
This guide covers everything you need to know to integrate DexScreener's API into your applications.
🎯 What You'll Learn
- DexScreener API overview and capabilities
- All available endpoints with examples
- Rate limits and best practices
- Practical integration patterns
📡 API Overview
Key Features
- Multi-chain support: 80+ blockchains
- Real-time data: Prices updated constantly
- Free to use: No API key required
- Comprehensive: Tokens, pairs, profiles, boosts
Base URL
https://api.dexscreener.com
No Authentication Required
DexScreener's API is completely free and doesn't require an API key. Just make HTTP GET requests to the endpoints.
🔗 API Endpoints
Rate Limits
| Endpoint Category | Rate Limit |
|---|---|
| Token/Pair Data | 300 requests/minute |
| Profiles/Boosts | 60 requests/minute |
💹 Token and Pair Endpoints
Get Token Pairs by Address
Fetch all trading pairs for a specific token.
Endpoint: GET /token-pairs/v1/{chainId}/{tokenAddress}
Parameters:
chainId: Blockchain identifier (e.g.,solana)tokenAddress: Token's mint address
Example:
GET https://api.dexscreener.com/token-pairs/v1/solana/JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN
Response:
[
{
"chainId": "solana",
"dexId": "raydium",
"url": "https://dexscreener.com/solana/...",
"pairAddress": "ABC123...",
"baseToken": {
"address": "JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN",
"name": "Jupiter",
"symbol": "JUP"
},
"quoteToken": {
"address": "So11111111111111111111111111111111111111112",
"name": "Wrapped SOL",
"symbol": "SOL"
},
"priceNative": "0.0045",
"priceUsd": "0.89",
"txns": {
"h24": { "buys": 5420, "sells": 4890 },
"h6": { "buys": 1200, "sells": 1100 },
"h1": { "buys": 180, "sells": 165 },
"m5": { "buys": 15, "sells": 12 }
},
"volume": {
"h24": 12500000,
"h6": 3200000,
"h1": 450000,
"m5": 35000
},
"priceChange": {
"h24": 5.5,
"h6": 2.1,
"h1": 0.3,
"m5": -0.1
},
"liquidity": {
"usd": 8500000,
"base": 9500000,
"quote": 42500
},
"fdv": 890000000,
"marketCap": 890000000,
"pairCreatedAt": 1699920000000
}
]
Get Multiple Tokens
Fetch data for multiple tokens at once (up to 30).
Endpoint: GET /tokens/v1/{chainId}/{tokenAddresses}
Parameters:
chainId: Blockchain identifiertokenAddresses: Comma-separated token addresses (max 30)
Example:
GET https://api.dexscreener.com/tokens/v1/solana/So11111111111111111111111111111111111111112,EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
Get Pair by Address
Fetch specific pair data using the pair address.
Endpoint: GET /latest/dex/pairs/{chainId}/{pairId}
Parameters:
chainId: Blockchain identifierpairId: Pool/pair address
Example:
GET https://api.dexscreener.com/latest/dex/pairs/solana/7XawhbbxtsRcQA8KTkHT9f9nc6d69UwqCDh6U5EEbEmX
Response:
{
"schemaVersion": "1.0.0",
"pairs": [
{
"chainId": "solana",
"dexId": "raydium",
"pairAddress": "7XawhbbxtsRcQA8KTkHT9f9nc6d69UwqCDh6U5EEbEmX",
"baseToken": { ... },
"quoteToken": { ... },
"priceNative": "200.50",
"priceUsd": "200.50",
"liquidity": { ... },
"volume": { ... }
}
]
}
🔍 Search Endpoint
Search for tokens or pairs by name, symbol, or address.
Endpoint: GET /latest/dex/search
Parameters:
q: Search query (token name, symbol, or address)
Example:
GET https://api.dexscreener.com/latest/dex/search?q=JUP
Response:
{
"schemaVersion": "1.0.0",
"pairs": [
{
"chainId": "solana",
"dexId": "raydium",
"baseToken": {
"address": "JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN",
"name": "Jupiter",
"symbol": "JUP"
},
...
}
]
}
Search Tips
- Search by symbol:
?q=SOL - Search by name:
?q=jupiter - Search by address:
?q=JUPyiwrYJFskUPi... - Search by pair:
?q=SOL/USDC
🚀 Boost and Profile Endpoints
These endpoints return tokens that have paid for promotion on DexScreener.
Latest Boosted Tokens
Endpoint: GET /token-boosts/latest/v1
Rate Limit: 60 requests/minute
Response:
{
"url": "https://dexscreener.com/...",
"chainId": "solana",
"tokenAddress": "ABC123...",
"amount": 50,
"totalAmount": 200,
"icon": "https://...",
"description": "...",
"links": [
{ "type": "website", "url": "https://..." },
{ "type": "twitter", "url": "https://..." }
]
}
Top Boosted Tokens
Get tokens with the most active boosts.
Endpoint: GET /token-boosts/top/v1
Latest Token Profiles
Endpoint: GET /token-profiles/latest/v1
Response:
{
"url": "https://dexscreener.com/...",
"chainId": "solana",
"tokenAddress": "ABC123...",
"icon": "https://...",
"header": "https://...",
"description": "Token description here",
"links": [
{ "type": "website", "label": "Official Site", "url": "https://..." }
]
}
Community Takeovers
Tokens where the community has "taken over" the token profile.
Endpoint: GET /community-takeovers/latest/v1
📊 Orders Endpoint
Check if a token has paid orders (ads, boosts).
Endpoint: GET /orders/v1/{chainId}/{tokenAddress}
Example:
GET https://api.dexscreener.com/orders/v1/solana/JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN
Response:
[
{
"type": "tokenProfile",
"status": "approved",
"paymentTimestamp": 1699920000
}
]
📈 Understanding Response Data
Price Fields
| Field | Description |
|---|---|
priceNative |
Price in terms of quote token |
priceUsd |
Price in USD |
Volume Fields
| Field | Description |
|---|---|
volume.m5 |
5-minute volume in USD |
volume.h1 |
1-hour volume in USD |
volume.h6 |
6-hour volume in USD |
volume.h24 |
24-hour volume in USD |
Transaction Fields
| Field | Description |
|---|---|
txns.m5.buys |
Buy transactions in last 5 min |
txns.m5.sells |
Sell transactions in last 5 min |
txns.h1.buys |
Buy transactions in last hour |
txns.h24.buys |
Buy transactions in last 24 hours |
Liquidity Fields
| Field | Description |
|---|---|
liquidity.usd |
Total liquidity in USD |
liquidity.base |
Base token amount in pool |
liquidity.quote |
Quote token amount in pool |
Market Cap Fields
| Field | Description |
|---|---|
fdv |
Fully Diluted Valuation |
marketCap |
Circulating Market Cap |
🛠️ Integration Examples
Fetching Token Price
async function getTokenPrice(tokenAddress) {
const response = await fetch(
`https://api.dexscreener.com/token-pairs/v1/solana/${tokenAddress}`
);
const pairs = await response.json();
if (pairs.length === 0) {
return null;
}
// Get the pair with highest liquidity
const mainPair = pairs.reduce((best, pair) =>
(pair.liquidity?.usd || 0) > (best.liquidity?.usd || 0) ? pair : best
);
return {
priceUsd: parseFloat(mainPair.priceUsd),
priceNative: parseFloat(mainPair.priceNative),
liquidity: mainPair.liquidity?.usd,
volume24h: mainPair.volume?.h24
};
}
Batch Token Lookup
async function getMultipleTokens(tokenAddresses) {
// DexScreener allows up to 30 tokens per request
const chunks = [];
for (let i = 0; i < tokenAddresses.length; i += 30) {
chunks.push(tokenAddresses.slice(i, i + 30));
}
const results = [];
for (const chunk of chunks) {
const addresses = chunk.join(',');
const response = await fetch(
`https://api.dexscreener.com/tokens/v1/solana/${addresses}`
);
const data = await response.json();
results.push(...data);
// Respect rate limits
await sleep(200);
}
return results;
}
Search Implementation
async function searchTokens(query) {
const response = await fetch(
`https://api.dexscreener.com/latest/dex/search?q=${encodeURIComponent(query)}`
);
const data = await response.json();
// Filter for Solana tokens only
return data.pairs.filter(pair => pair.chainId === 'solana');
}
⚠️ Best Practices
1. Handle Rate Limits
class DexScreenerClient {
constructor() {
this.lastRequestTime = 0;
this.minRequestInterval = 200; // 300 req/min = 1 per 200ms
}
async request(endpoint) {
const now = Date.now();
const timeSinceLastRequest = now - this.lastRequestTime;
if (timeSinceLastRequest < this.minRequestInterval) {
await sleep(this.minRequestInterval - timeSinceLastRequest);
}
this.lastRequestTime = Date.now();
return fetch(`https://api.dexscreener.com${endpoint}`);
}
}
2. Cache Responses
Token data doesn't change every second. Cache appropriately:
const priceCache = new Map();
const CACHE_TTL = 10000; // 10 seconds
async function getCachedPrice(tokenAddress) {
const cached = priceCache.get(tokenAddress);
if (cached && Date.now() - cached.timestamp < CACHE_TTL) {
return cached.data;
}
const price = await getTokenPrice(tokenAddress);
priceCache.set(tokenAddress, {
data: price,
timestamp: Date.now()
});
return price;
}
3. Use the Right Endpoint
| Need | Endpoint |
|---|---|
| All pairs for a token | /token-pairs/v1/{chain}/{token} |
| Specific pair data | /latest/dex/pairs/{chain}/{pair} |
| Multiple tokens | /tokens/v1/{chain}/{tokens} |
| Find tokens | /latest/dex/search |
4. Handle Missing Data
Not all tokens have complete data:
const price = pair.priceUsd || pair.priceNative || 'N/A';
const volume = pair.volume?.h24 ?? 0;
const liquidity = pair.liquidity?.usd ?? 0;
🔗 Chain Identifiers
| Chain | ID |
|---|---|
| Solana | solana |
| Ethereum | ethereum |
| BSC | bsc |
| Arbitrum | arbitrum |
| Base | base |
| Polygon | polygon |
📚 Resources
Official Links
Related Tools
- GeckoTerminal - Similar DEX data
- Birdeye - Solana-focused analytics
🎓 Key Takeaways
- No API key needed - Just make requests
- Rate limits exist - 300 or 60 requests/minute
- Batch when possible - Up to 30 tokens per request
- Cache responses - Data doesn't change every second
- Handle missing data - Not all fields are always present
- Use search wisely - Works for symbols, names, addresses
DexScreener's API is a powerful tool for building trading applications. Now you have everything you need to integrate it! 🚀