Developer

DexScreener API Guide: Pairs, Boosts & Trading Bots

Every DexScreener endpoint for pairs, prices, liquidity, profiles, boosts and search, with current rate limits and Solana bot integration patterns.

DexScreener API Guide: Pairs, Boosts & Trading Bots article cover
In this article
  1. 🎯 What You'll Learn
  2. 📡 API Overview
  3. 🔗 API Endpoints
  4. 💹 Token and Pair Endpoints
  5. 🔍 Search Endpoint
  6. 🚀 Boost and Profile Endpoints
  7. 📊 Orders Endpoint
  8. 📈 Understanding Response Data
  9. 🛠️ Integration Examples
  10. ⚠️ Best Practices
  11. 🔗 Chain Identifiers
  12. 📚 Resources
  13. 🎓 Key Takeaways

DexScreener is one of the most popular platforms for tracking decentralized exchange data. Its API exposes token pairs, liquidity, activity, profiles, boosts, and market context across many chains, including Solana.

This guide focuses on endpoint-level developer intent: how to query pairs and tokens, understand response fields, respect the separate rate-limit groups, and build a resilient DexScreener trading bot integration. In ScreenerBot, DexScreener supports discovery and market filtering; direct Solana pool reserves remain the source for trading and P&L prices.


🎯 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 CategoryRate Limit
Token/Pair Data300 requests/minute
Profiles/Boosts60 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 identifier
  • tokenAddresses: 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 identifier
  • pairId: 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

FieldDescription
priceNativePrice in terms of quote token
priceUsdPrice in USD

Volume Fields

FieldDescription
volume.m55-minute volume in USD
volume.h11-hour volume in USD
volume.h66-hour volume in USD
volume.h2424-hour volume in USD

Transaction Fields

FieldDescription
txns.m5.buysBuy transactions in last 5 min
txns.m5.sellsSell transactions in last 5 min
txns.h1.buysBuy transactions in last hour
txns.h24.buysBuy transactions in last 24 hours

Liquidity Fields

FieldDescription
liquidity.usdTotal liquidity in USD
liquidity.baseBase token amount in pool
liquidity.quoteQuote token amount in pool

Market Cap Fields

FieldDescription
fdvFully Diluted Valuation
marketCapCirculating 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

NeedEndpoint
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

ChainID
Solanasolana
Ethereumethereum
BSCbsc
Arbitrumarbitrum
Basebase
Polygonpolygon

📚 Resources


🎓 Key Takeaways

  1. No API key needed - Just make requests
  2. Rate limits exist - 300 or 60 requests/minute
  3. Batch when possible - Up to 30 tokens per request
  4. Cache responses - Data doesn't change every second
  5. Handle missing data - Not all fields are always present
  6. 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! 🚀

View all research