mcpField
C
coingecko

coingecko

github.com/sendaifun数据与数据库130239 次安装13 周前更新
代码仓库

关于 coingecko

面向开发者的 CoinGecko Solana 链上 API 开发指南,介绍代币、流动性池、交易和市场数据的查询方式。内容覆盖价格、OHLCV、DEX 搜索及高级筛选,并包含 API 配置、限流和错误处理建议。

主要功能

  1. 01按地址查询单个或批量代币价格
  2. 02获取代币与流动性池详情
  3. 03查询趋势池、热门池及近期交易
  4. 04获取池的 OHLCV K 线数据
  5. 05搜索 DEX 和使用高级池筛选

适用场景

  1. 01构建 Solana 代币行情视图
  2. 02分析流动性池和交易活动
  3. 03为技术分析获取历史 K 线
  4. 04按流动性或成交量筛选交易池

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/sendaifun/skills --skill coingecko

安装后在 Claude Code 中输入/coingecko确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

docs/
troubleshooting.md
examples/integration/
full-client.ts
examples/ohlcv/
ohlcv-charts.ts
examples/pools/
pool-data.ts
examples/token-prices/
get-token-price.ts
examples/trades/
recent-trades.ts
resources/
api-reference.md
network-dex-ids.md
token-addresses.md
templates/
coingecko-client.ts

详细介绍

CoinGecko Solana API 开发指南

本指南全面介绍如何集成 CoinGecko 的 Solana 链上 API。可获取实时代币价格、DEX 池数据、OHLCV 图表、交易历史和市场分析,覆盖 1,700 多个去中心化交易所。

概述

CoinGecko 的 Solana API 提供:

  • 代币价格:通过合约地址获取实时价格(单个或批量)
  • 池数据:流动性池信息、热门池、顶级池
  • OHLCV 图表:用于技术分析的 K 线数据
  • 交易历史:任意池的近期交易
  • DEX 发现:列出所有在 Solana 上运行的 DEX
  • 搜索:按代币名称、符号或地址查找池
  • Megafilter:对池、代币和 DEX 进行高级筛选
主要功能
功能描述
250 多个网络支持 Solana 在内的多链
1,700 多个 DEXRaydium、Orca、Jupiter、Meteora、Pump.fun 等
1,500 多万种代币全面的代币覆盖
实时数据每 10–30 秒更新一次
历史数据OHLCV 图表和交易历史

快速开始

获取 API 密钥
  1. Demo API(免费):访问 coingecko.com/en/api
  2. Pro API(付费):访问 coingecko.com/en/api/pricing
环境设置
# .env file
COINGECKO_API_KEY=your_api_key_here
COINGECKO_API_TYPE=demo  # or 'pro'
API 配置
// Configuration for both Demo and Pro APIs
const CONFIG = {
  demo: {
    baseUrl: 'https://api.coingecko.com/api/v3/onchain',
    headerKey: 'x-cg-demo-api-key',
    rateLimit: 30, // calls per minute
  },
  pro: {
    baseUrl: 'https://pro-api.coingecko.com/api/v3/onchain',
    headerKey: 'x-cg-pro-api-key',
    rateLimit: 500, // calls per minute (varies by plan)
  },
};

const apiType = process.env.COINGECKO_API_TYPE || 'demo';
const apiKey = process.env.COINGECKO_API_KEY;

const BASE_URL = CONFIG[apiType].baseUrl;
const HEADER_KEY = CONFIG[apiType].headerKey;

// Solana network identifier
const NETWORK = 'solana';
获取代币价格基础示例
async function getTokenPrice(tokenAddress: string): Promise<number | null> {
  const url = `${BASE_URL}/simple/networks/${NETWORK}/token_price/${tokenAddress}`;

  const response = await fetch(url, {
    headers: {
      [HEADER_KEY]: apiKey,
      'Accept': 'application/json',
    },
  });

  if (!response.ok) {
    throw new Error(`API error: ${response.status}`);
  }

  const data = await response.json();
  return data.data?.attributes?.token_prices?.[tokenAddress] ?? null;
}

// Usage
const USDC = 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v';
const price = await getTokenPrice(USDC);
console.log(`USDC Price: $${price}`);

API 端点参考

简单代币价格

通过合约地址获取代币价格。

端点:GET /simple/networks/{network}/token_price/{addresses}

参数:

参数类型必填描述
networkstring是网络 ID(solana)
addressesstring是以逗号分隔的代币地址(Demo 最多 30 个,Pro 最多 100 个)
include_market_capboolean否包含市值数据
include_24hr_volboolean否包含 24 小时交易量
include_24hr_price_changeboolean否包含 24 小时价格变化百分比
async function getTokenPrices(addresses: string[]): Promise<Record<string, TokenPriceData>> {
  const addressList = addresses.join(',');
  const url = `${BASE_URL}/simple/networks/${NETWORK}/token_price/${addressList}`;

  const params = new URLSearchParams({
    include_market_cap: 'true',
    include_24hr_vol: 'true',
    include_24hr_price_change: 'true',
  });

  const response = await fetch(`${url}?${params}`, {
    headers: { [HEADER_KEY]: apiKey },
  });

  const data = await response.json();
  return data.data?.attributes || {};
}

按地址获取代币数据

获取详细的代币信息。

端点:GET /networks/{network}/tokens/{address}

参数:

参数类型必填描述
networkstring是网络 ID
addressstring是代币合约地址
includestring否包含 top_pools 以获取流动性数据
interface TokenData {
  address: string;
  name: string;
  symbol: string;
  decimals: number;
  image_url: string;
  price_usd: string;
  fdv_usd: string;
  market_cap_usd: string;
  total_supply: string;
  volume_usd: {
    h24: string;
  };
  price_change_percentage: {
    h24: string;
  };
}

async function getTokenData(address: string): Promise<TokenData> {
  const url = `${BASE_URL}/networks/${NETWORK}/tokens/${address}?include=top_pools`;

  const response = await fetch(url, {
    headers: { [HEADER_KEY]: apiKey },
  });

  const data = await response.json();
  return data.data?.attributes;
}

多代币数据

批量获取多个代币的数据。

端点:GET /networks/{network}/tokens/multi/{addresses}

async function getMultipleTokens(addresses: string[]): Promise<TokenData[]> {
  const addressList = addresses.join(',');
  const url = `${BASE_URL}/networks/${NETWORK}/tokens/multi/${addressList}`;

  const response = await fetch(url, {
    headers: { [HEADER_KEY]: apiKey },
  });

  const data = await response.json();
  return data.data?.map((item: any) => item.attributes) || [];
}

按地址获取池数据

获取详细的池信息。

端点:GET /networks/{network}/pools/{address}

参数:

参数类型必填描述
includestring否base_token、quote_token、dex
include_volume_breakdownboolean否按时间范围细分交易量
interface PoolData {
  address: string;
  name: string;
  pool_created_at: string;
  base_token_price_usd: string;
  quote_token_price_usd: string;
  base_token_price_native_currency: string;
  fdv_usd: string;
  market_cap_usd: string;
  reserve_in_usd: string;
  price_change_percentage: {
    m5: string;
    h1: string;
    h6: string;
    h24: string;
  };
  transactions: {
    m5: { buys: number; sells: number };
    h1: { buys: number; sells: number };
    h24: { buys: number; sells: number };
  };
  volume_usd: {
    m5: string;
    h1: string;
    h6: string;
    h24: string;
  };
}

async function getPoolData(poolAddress: string): Promise<PoolData> {
  const url = `${BASE_URL}/networks/${NETWORK}/pools/${poolAddress}`;

  const params = new URLSearchParams({
    include: 'base_token,quote_token,dex',
  });

  const response = await fetch(`${url}?${params}`, {
    headers: { [HEADER_KEY]: apiKey },
  });

  const data = await response.json();
  return data.data?.attributes;
}

热门池

获取所有网络的热门池,或按网络筛选。

端点:GET /networks/trending_pools

参数:

参数类型默认值描述
includestringbase_token要包含的属性
pageinteger1页码
durationstring24h5m、1h、6h、24h
async function getTrendingPools(duration: '5m' | '1h' | '6h' | '24h' = '24h'): Promise<PoolData[]> {
  const url = `${BASE_URL}/networks/trending_pools`;

  const params = new URLSearchParams({
    include: 'base_token,quote_token,dex,network',
    duration,
    page: '1',
  });

  const response = await fetch(`${url}?${params}`, {
    headers: { [HEADER_KEY]: apiKey },
  });

  const data = await response.json();
  return data.data?.map((item: any) => item.attributes) || [];
}

// Filter for Solana pools
async function getSolanaTrendingPools(): Promise<PoolData[]> {
  const allPools = await getTrendingPools();
  return allPools.filter(pool => pool.network === 'solana');
}

网络中的顶级池

获取 Solana 上交易量最高的池。

端点:GET /networks/{network}/pools

async function getTopPools(page: number = 1): Promise<PoolData[]> {
  const url = `${BASE_URL}/networks/${NETWORK}/pools`;

  const params = new URLSearchParams({
    include: 'base_token,quote_token,dex',
    page: page.toString(),
  });

  const response = await fetch(`${url}?${params}`, {
    headers: { [HEADER_KEY]: apiKey },
  });

  const data = await response.json();
  return data.data?.map((item: any) => item.attributes) || [];
}

搜索池

按代币名称、符号或地址搜索池。

端点:GET /search/pools

参数:

参数类型描述
querystring搜索词(名称、符号、地址)
networkstring按网络筛选
pageinteger页码
async function searchPools(query: string): Promise<PoolData[]> {
  const url = `${BASE_URL}/search/pools`;

  const params = new URLSearchParams({
    query,
    network: NETWORK,
    include: 'base_token,quote_token,dex',
  });

  const response = await fetch(`${url}?${params}`, {
    headers: { [HEADER_KEY]: apiKey },
  });

  const data = await response.json();
  return data.data?.map((item: any) => item.attributes) || [];
}

// Search for SOL pools
const solPools = await searchPools('SOL');

池 OHLCV 图表

获取用于技术分析的 K 线数据。

端点:GET /networks/{network}/pools/{pool_address}/ohlcv/{timeframe}

时间范围:day、hour、minute

参数:

参数类型描述
aggregateintegerK 线聚合间隔(分钟级为 1、5、15;小时级为 1、4、12)
before_timestampinteger用于分页的 Unix 时间戳
limitintegerK 线数量(最多 1000)
currencystringusd 或 token
interface OHLCVData {
  timestamp: number;
  open: number;
  high: number;
  low: number;
  close: number;
  volume: number;
}

async function getPoolOHLCV(
  poolAddress: string,
  timeframe: 'day' | 'hour' | 'minute' = 'hour',
  aggregate: number = 1,
  limit: number = 100
): Promise<OHLCVData[]> {
  const url = `${BASE_URL}/networks/${NETWORK}/pools/${poolAddress}/ohlcv/${timeframe}`;

  const params = new URLSearchParams({
    aggregate: aggregate.toString(),
    limit: limit.toString(),
    currency: 'usd',
  });

  const response = await fetch(`${url}?${params}`, {
    headers: { [HEADER_KEY]: apiKey },
  });

  const data = await response.json();

  return data.data?.attributes?.ohlcv_list?.map((candle: number[]) => ({
    timestamp: candle[0],
    open: candle[1],
    high: candle[2],
    low: candle[3],
    close: candle[4],
    volume: candle[5],
  })) || [];
}

// Get hourly candles
const hourlyCandles = await getPoolOHLCV(poolAddress, 'hour', 1, 24);

// Get 5-minute candles
const fiveMinCandles = await getPoolOHLCV(poolAddress, 'minute', 5, 100);

最近交易

获取池的最近交易。

端点:GET /networks/{network}/pools/{pool_address}/trades

interface TradeData {
  block_number: number;
  block_timestamp: string;
  tx_hash: string;
  tx_from_address: string;
  from_token_amount: string;
  to_token_amount: string;
  price_from_in_currency_token: string;
  price_to_in_currency_token: string;
  price_from_in_usd: string;
  price_to_in_usd: string;
  kind: 'buy' | 'sell';
  volume_in_usd: string;
}

async function getRecentTrades(poolAddress: string): Promise<TradeData[]> {
  const url = `${BASE_URL}/networks/${NETWORK}/pools/${poolAddress}/trades`;

  const response = await fetch(url, {
    headers: { [HEADER_KEY]: apiKey },
  });

  const data = await response.json();
  return data.data?.map((item: any) => item.attributes) || [];
}

列出 Solana 上的 DEX

获取 Solana 上的所有去中心化交易所。

端点:GET /networks/{network}/dexes

interface DexData {
  id: string;
  name: string;
}

async function getSolanaDexes(): Promise<DexData[]> {
  const url = `${BASE_URL}/networks/${NETWORK}/dexes`;

  const response = await fetch(url, {
    headers: { [HEADER_KEY]: apiKey },
  });

  const data = await response.json();
  return data.data?.map((item: any) => ({
    id: item.id,
    name: item.attributes.name,
  })) || [];
}

Megafilter(高级)

对跨网络、DEX 和代币的池进行高级筛选。

端点:GET /pools/megafilter

参数:

参数类型描述
networksstring按网络筛选
dexesstring按 DEX 筛选
sortstring排序方式(例如,pool_created_at_desc)
min_reserve_in_usdnumber最低流动性
min_h24_volume_usdnumber最低 24 小时交易量
async function getMegafilterPools(options: {
  dexes?: string[];
  minLiquidity?: number;
  minVolume?: number;
  sort?: string;
}): Promise<PoolData[]> {
  const url = `${BASE_URL}/pools/megafilter`;

  const params = new URLSearchParams({
    networks: NETWORK,
    page: '1',
  });

  if (options.dexes) {
    params.set('dexes', options.dexes.join(','));
  }
  if (options.minLiquidity) {
    params.set('min_reserve_in_usd', options.minLiquidity.toString());
  }
  if (options.minVolume) {
    params.set('min_h24_volume_usd', options.minVolume.toString());
  }
  if (options.sort) {
    params.set('sort', options.sort);
  }

  const response = await fetch(`${url}?${params}`, {
    headers: { [HEADER_KEY]: apiKey },
  });

  const data = await response.json();
  return data.data?.map((item: any) => item.attributes) || [];
}

// Get newest Pump.fun pools
const pumpfunPools = await getMegafilterPools({
  dexes: ['pump-fun'],
  sort: 'pool_created_at_desc',
});

// Get high-volume Raydium pools
const raydiumPools = await getMegafilterPools({
  dexes: ['raydium'],
  minVolume: 100000,
  minLiquidity: 50000,
});

常见 Solana DEX 标识符

DEXID描述
RaydiumraydiumSolana 上领先的 AMM
Orcaorca易于使用的 DEX
Jupiterjupiter带有池的聚合器
Meteorameteora动态 AMM
Pump.funpump-funMeme 币发行平台
OpenBookopenbook订单簿 DEX
Lifinitylifinity主动型做市商
Phoenixphoenix链上订单簿

常见代币地址

代币地址
USDCEPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
USDTEs9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB
SOL(Wrapped)So11111111111111111111111111111111111111112
JUPJUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN
BONKDezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263
WIFEKpQGSJtjMFqKZ9KQanSqYXRcF8fBopzLHYxdM65zcjm
PYTHHZ1JovNiVvGrGNiiYvEozEVgZ58xaU3RKwX8eACQBCt3
RAY4k3Dyjzvzp8eMZWUXbBCjEvwSkkk59S5iCNLY3QrkX6R
ORCAorcaEKTdK7LKz57vaAYr9QeNsVEPfiu6QeMU1kektZE

速率限制

方案每分钟调用次数每个请求的地址数量上限
Demo(免费)3030
Analyst50050
Lite50050
Pro1,000100
Enterprise自定义自定义
速率限制处理
class RateLimiter {
  private calls: number[] = [];
  private maxCalls: number;
  private windowMs: number = 60000; // 1 minute

  constructor(maxCallsPerMinute: number) {
    this.maxCalls = maxCallsPerMinute;
  }

  async waitForSlot(): Promise<void> {
    const now = Date.now();
    this.calls = this.calls.filter(t => now - t < this.windowMs);

    if (this.calls.length >= this.maxCalls) {
      const oldestCall = this.calls[0];
      const waitTime = this.windowMs - (now - oldestCall);
      await new Promise(resolve => setTimeout(resolve, waitTime));
    }

    this.calls.push(Date.now());
  }
}

// Usage
const rateLimiter = new RateLimiter(30); // Demo API

async function fetchWithRateLimit(url: string): Promise<any> {
  await rateLimiter.waitForSlot();
  const response = await fetch(url, {
    headers: { [HEADER_KEY]: apiKey },
  });
  return response.json();
}

错误处理

async function safeApiCall<T>(url: string): Promise<T | null> {
  try {
    const response = await fetch(url, {
      headers: { [HEADER_KEY]: apiKey },
    });

    if (response.status === 401) {
      throw new Error('Invalid API key');
    }
    if (response.status === 429) {
      throw new Error('Rate limit exceeded - wait before retrying');
    }
    if (response.status === 404) {
      console.warn('Resource not found');
      return null;
    }
    if (!response.ok) {
      throw new Error(`API error: ${response.status}`);
    }

    return response.json();
  } catch (error) {
    console.error('CoinGecko API error:', error);
    throw error;
  }
}
常见错误代码
代码含义解决方案
401API 密钥无效检查 API 密钥
429超出速率限制等待后重试,或升级方案
404未找到资源检查地址/网络 ID
500+服务端错误使用指数退避策略重试

最佳实践

安全
  • 切勿将 API 密钥提交到 git
  • 使用环境变量
  • 定期轮换密钥
  • 为开发和生产环境使用不同的密钥
性能
  • 尽可能批量请求代币数据
  • 缓存经常访问的数据
  • 为 OHLCV 使用合适的时间范围
  • 针对速率限制实现请求队列
数据质量
  • 核实市值数据(未经验证时可能为 null)
  • 在信任价格前检查池的流动性
  • 使用多个时间范围进行价格分析
  • 监控最近交易时间戳以了解活跃度

资源


技能结构

coingecko/
├── SKILL.md                      # This file
├── resources/
│   ├── api-reference.md          # Complete API endpoint reference
│   ├── network-dex-ids.md        # Solana network and DEX identifiers
│   └── token-addresses.md        # Common Solana token addresses
├── examples/
│   ├── token-prices/
│   │   └── get-token-price.ts    # Token price examples
│   ├── pools/
│   │   └── pool-data.ts          # Pool data examples
│   ├── ohlcv/
│   │   └── ohlcv-charts.ts       # OHLCV chart examples
│   ├── trades/
│   │   └── recent-trades.ts      # Trade history examples
│   └── integration/
│       └── full-client.ts        # Complete client example
├── templates/
│   └── coingecko-client.ts       # Production-ready client template
└── docs/
    └── troubleshooting.md        # Common issues and solutions

评论

支持 Markdown