Сбор данных CoinGecko и CoinMarketCap: парсинг, API, кеширование

Парсинг данных с CoinGecko / CoinMarketCap При интеграции DeFi-приложения с внешними price feeds разработчики сталкиваются с rate limits, лагами обновления и неполнотой данных. Парсинг данных CoinGecko и CoinMarketCap API — два основных подхода для сбора крипто-данных, каждый со своими ограничени

Направления блокчейн-разработки

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1452
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1309
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1005
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1270
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    719
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    1011

Парсинг данных с CoinGecko / CoinMarketCap

При интеграции DeFi-приложения с внешними price feeds разработчики сталкиваются с rate limits, лагами обновления и неполнотой данных. Парсинг данных CoinGecko и CoinMarketCap API — два основных подхода для сбора крипто-данных, каждый со своими ограничениями и качеством покрытия. Разберём, как построить устойчивую систему сбора крипто-данных, используя оба источника с fallback, кеширование в Redis и базу PostgreSQL. Обратитесь к нам за консультацией — поможем выбрать оптимальную архитектуру под ваш проект.

Почему стоит объединять CoinGecko и CoinMarketCap?

CoinGecko API предпочтительнее для DeFi-токенов и long-tail активов: у него более щедрый бесплатный tier и лучшее покрытие. CoinMarketCap даёт более точные объёмы с крупных CEX. Для production price feed мы используем оба с fallback логикой — это снижает риск при отказе одного источника. CoinGecko в 1.5 раза лучше покрывает DeFi токены, чем CoinMarketCap, особенно на Ethereum и Polygon. Согласно документации CoinGecko API, базовая частота обновления данных — 1–10 секунд.

Параметр CoinGecko CoinMarketCap
Требуется ключ? Опционально (бесплатный без ключа) Обязательно даже для базовых запросов
Бесплатный лимит 10-30 req/min (без ключа) 10 000 кредитов/мес
Максимальный ID за запрос 250 100
Исторические данные До 5 лет в Pro До года (в платном плане)
Задержка данных ~1-10 сек для цен ~1-5 сек

Как настроить стабильный сбор данных при ограничениях API?

Мы используем Redis для кеширования с TTL 1-2 минуты — это снижает нагрузку на API в 5-10 раз. Пример клиента с автоматическим retry при 429-статусе:

const COINGECKO_BASE = 'https://api.coingecko.com/api/v3' // Pro: 'https://pro-api.coingecko.com/api/v3' class CoinGeckoClient { constructor(private apiKey?: string) {} private async request<T>(path: string, params?: Record<string, string>): Promise<T> { const url = new URL(`${COINGECKO_BASE}${path}`) if (params) Object.entries(params).forEach(([k, v]) => url.searchParams.set(k, v)) if (this.apiKey) url.searchParams.set('x_cg_pro_api_key', this.apiKey) const res = await fetch(url.toString()) if (res.status === 429) { const retryAfter = res.headers.get('Retry-After') await sleep((parseInt(retryAfter || '60') + 1) * 1000) return this.request(path, params) // retry } if (!res.ok) throw new Error(`CoinGecko ${res.status}: ${await res.text()}`) return res.json() } async getSimplePrice( ids: string[], vsCurrencies: string[] = ['usd'], includeMarketCap = false, include24hVol = false, include24hChange = false ) { return this.request<Record<string, Record<string, number>>>('/simple/price', { ids: ids.join(','), vs_currencies: vsCurrencies.join(','), include_market_cap: String(includeMarketCap), include_24hr_vol: String(include24hVol), include_24hr_change: String(include24hChange), }) } async getMarkets(page = 1, perPage = 250) { return this.request<CoinMarketData[]>('/coins/markets', { vs_currency: 'usd', order: 'market_cap_desc', per_page: String(perPage), page: String(page), sparkline: 'false', }) } async getMarketChart(coinId: string, days: number | 'max') { return this.request<MarketChart>(`/coins/${coinId}/market_chart`, { vs_currency: 'usd', days: String(days), interval: days === 'max' || days > 90 ? 'daily' : 'hourly', }) } } 

Как получить полный список монет с контрактными адресами?

Для матчинга contract address → CoinGecko ID нужен endpoint /coins/list?include_platform=true. Кешируем эти данные на 24 часа, так как они меняются редко:

async function buildTokenAddressIndex(): Promise<Map<string, string>> { const coins = await client.request<CoinWithPlatforms[]>( '/coins/list', { include_platform: 'true' } ) const index = new Map<string, string>() // 'chain:address' → coingecko_id for (const coin of coins) { for (const [platform, address] of Object.entries(coin.platforms || {})) { if (address) { index.set(`${platform}:${address.toLowerCase()}`, coin.id) } } } return index } 

CoinMarketCap API

CMC API требует ключ даже для базовых запросов. Бесплатный plan — 10 000 кредитов/месяц (1 кредит ≈ 1 запрос). Пример запроса последних котировок:

class CoinMarketCapClient { private headers = { 'X-CMC_PRO_API_KEY': process.env.CMC_API_KEY!, 'Accept': 'application/json', } async getLatestQuotes(symbols: string[]): Promise<CMCQuoteResponse> { const res = await fetch( `https://pro-api.coinmarketcap.com/v1/cryptocurrency/quotes/latest?symbol=${symbols.join(',')}`, { headers: this.headers } ) const data = await res.json() if (data.status.error_code !== 0) { throw new Error(`CMC error: ${data.status.error_message}`) } return data } } 

Архитектура и стек

Для production-grade системы мы используем микросервис на Node.js/TypeScript, который фоново собирает данные с обоих API. Redis выступает как кеш первого уровня с TTL, а PostgreSQL — как долговременное хранилище. Для мониторинга и алертов поднимаем Grafana + Prometheus, отслеживаем количество запросов, задержки и частоту ошибок.

Сравнение тарифов CoinGecko

Уровень Запросы/мин Цена Исторические данные
Бесплатный 10-30 $0 До 1 года (ограниченно)
Pro 500 $129/мес До 5 лет
Enterprise кастом кастом Полный доступ

Кеширование и хранение

Для price feed с обновлением каждую минуту — Redis с TTL 120 секунд и батчевым обновлением по 250 ID:

class PriceCache { constructor(private redis: RedisClient, private client: CoinGeckoClient) {} async getPrice(coinId: string): Promise<number> { const cached = await this.redis.get(`price:${coinId}`) if (cached) return parseFloat(cached) const prices = await this.client.getSimplePrice([coinId]) const price = prices[coinId]?.usd if (price) await this.redis.setEx(`price:${coinId}`, 60, String(price)) return price } async refreshPrices(coinIds: string[]): Promise<void> { const chunks = chunk(coinIds, 250) for (const ids of chunks) { const prices = await this.client.getSimplePrice(ids, ['usd'], true, true, true) const pipeline = this.redis.pipeline() for (const [id, data] of Object.entries(prices)) { pipeline.setEx(`price:${id}`, 120, JSON.stringify(data)) } await pipeline.exec() } } } 

Исторические данные — PostgreSQL с индексом по (coin_id, timestamp). Для интенсивных временных запросов используем TimescaleDB.

Процесс работы

  1. Анализ — оцениваем количество токенов, частоту обновления, бюджет на API.
  2. Проектирование — выбираем стек (Node.js, Redis, PostgreSQL), проектируем схему БД и архитектуру кеша.
  3. Реализация — пишем клиенты с retry, rate limiting, кешированием; настраиваем батчевые обновления.
  4. Тестирование — проверяем под нагрузкой (имитируем rate limit, обрыв соединения).
  5. Деплой — разворачиваем в Docker на вашем сервере или облаке.
  6. Мониторинг — настраиваем Grafana дашборд с метриками: latency, cache hit ratio, error rate.
  7. Поддержка — в течение месяца после запуска помогаем с инцидентами и донастройкой.

Типичные ошибки при интеграции

  • Игнорирование rate limit → блокировка IP. Решение: использовать очередь с задержками.
  • Отсутствие fallback при отказе одного API → потеря данных. Решение: объединять оба источника с приоритетом.
  • Хранение всех данных в одной таблице без партиционирования → медленные запросы. Решение: TimescaleDB для временных рядов.
  • Кеширование без TTL → устаревшие цены. Решение: Redis TTL 60-120 секунд.

Что входит в работу

  • Архитектура под ваш объём данных (от 100 до 10 000 токенов)
  • Реализация API-клиентов с retry, rate limiting, логгированием
  • Redis-кеш с оптимальным TTL
  • PostgreSQL/TimescaleDB для истории
  • Фоновые воркеры для автоматического обновления
  • Документация по эксплуатации и дашборд Grafana
  • Поддержка в течение месяца после запуска
  • Обучение вашей команды работе с системой

Закажите настройку price feed — подберём решение под вашу задачу. Получите консультацию по интеграции уже сегодня. Наш опыт — более 5 лет в крипто-разработке, 30+ проектов.