Граббінг даних з CoinGecko/CoinMarketCap

Проєктуємо та розробляємо блокчейн-рішення повного циклу: від архітектури смарт-контрактів до запуску DeFi-протоколів, NFT-маркетплейсів та криптобірж. Аудит безпеки, токеноміка, інтеграція з наявною інфраструктурою.
Показано 1 з 1Усі 1306 послуг
Граббінг даних з CoinGecko/CoinMarketCap
Простий
від 1 дня до 3 днів
Часті запитання

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

Етапи блокчейн-розробки

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1288
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1198
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    902
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1122
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    589
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    859

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

CoinGecko та CoinMarketCap — два основних агрегатори даних про ринок крипто: ціни, капітализація, обсяги, списки токенів, дані по біржах. Обидва надають API, але з різними обмеженнями, покриттям та якістю даних. Для більшості задач CoinGecko API переважніше: більш щедрий бесплатний тір та краще покриття DeFi-токенів.

CoinGecko API: що, як, скільки

Free tier (без ключа): 10-30 запитів/хвилину, немає SLA. Для тестування та MVP — достатньо. Demo tier (бесплатний ключ): 30 req/min, 10,000 req/місяць — практично те ж саме, але з ключем для відслідковування. Pro tier ($129/місяць): 500 req/min, історичні дані без обмежень, endpoint /coins/{id}/market_chart з діапазоном до 5 років.

Основні endpoints:

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',
        })
    }

    // Історичні дані (Pro)
    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 потрібен /coins/list (всі 15 000+ монет) та /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 вимагає ключ навіть для базових запитів. Бесплатний план — 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
    }
}

CMC дає більш точні дані по обсягах з крупних CEX, CoinGecko — краще для DeFi та long-tail токенів. Для production систем мониторингу цін — використовуємо обидва з fallback логікою.

Кешування та зберігання

Для price feed з оновленням кожну хвилину — Redis з TTL:

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> {
        // CoinGecko приймає до 250 ID за запрос
        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). Для інтенсивних time-series запитів — TimescaleDB hypertable.

Типові задачи

Price alert система: фоновий джоб кожну хвилину оновлює ціни топ-N токенів, перевіряє користувальницькі алерти (ціна вище/нижче порогу, X% зміна за Y годин).

Portfolio tracker: поточні ціни + історичні для розрахунку P&L. CoinGecko /coins/{id}/history?date=dd-mm-yyyy для стоимості на конкретну дату.

Token discovery: регулярний парсинг нових листингів через /coins/markets?order=id_asc&page=N з відслідковуванням появи нових ID.

Інтеграція займає 1-3 дні: API клієнт з rate limiting та retry, кеш у Redis, зберігання у PostgreSQL, фоновий воркер для оновлень.