Інтеграція CoinMarketCap API: кешування та обробка помилок
Ми часто стикаємося з проєктами, де дані крипторинку потрібні в реальному часі, але без агресивного кешування безкоштовний план у 10 000 кредитів/місяць закінчується за пару днів. Один запит котирувань для десяти монет — це 10 кредитів. Якщо оновлювати ціни щохвилини, ліміт вичерпається за 16 годин. В одному з проєктів для DeFi-агрегатора без кешування ліміт вилітав за добу — після налаштування Redis з TTL 60 секунд витрати знизилися в 10 разів, що заощадило клієнту близько $500 на місяць на платних тарифах. Наша команда має 10+ років досвіду в web3 та більше 50 реалізованих проєктів, тому ми гарантуємо стабільну інтеграцію. Розберемо типову інтеграцію, яка працює під навантаженням і не потребує дорогих тарифів.
Налаштування клієнта CoinMarketCap API
Реєстрація на pro.coinmarketcap.com дає ключ миттєво. Базовий URL: https://pro-api.coinmarketcap.com/v1/. Для тестування використовуйте sandbox: https://sandbox-api.coinmarketcap.com/v1/ (ключ b54bcf4d-1bca-4e8e-9a24-22ff2c3d462c, дані фіктивні).
import axios, { AxiosInstance } from 'axios' class CoinMarketCapClient { private client: AxiosInstance constructor(apiKey: string, sandbox = false) { this.client = axios.create({ baseURL: sandbox ? 'https://sandbox-api.coinmarketcap.com/v1/' : 'https://pro-api.coinmarketcap.com/v1/', headers: { 'X-CMC_PRO_API_KEY': apiKey, 'Accept': 'application/json', }, }) } async getQuotes(symbols: string[]): Promise<Record<string, CmcQuote>> { const res = await this.client.get('/cryptocurrency/quotes/latest', { params: { symbol: symbols.join(','), convert: 'USD', }, }) return res.data.data } async getListings(limit = 100, start = 1): Promise<CmcListing[]> { const res = await this.client.get('/cryptocurrency/listings/latest', { params: { limit, start, convert: 'USD', sort: 'market_cap' }, }) return res.data.data } } Структура даних та мапінг монет
CoinMarketCap присвоює кожній монеті унікальний CMC ID (ціле число) — це надійніше ніж тікери, які можуть дублюватися. Мапінг тікер → CMC ID отримуємо через /v1/cryptocurrency/map і кешуємо на добу.
interface CmcQuote { id: number name: string symbol: string slug: string quote: { USD: { price: number volume_24h: number percent_change_24h: number market_cap: number } } } const idMap: Record<string, number> = { 'BTC': 1, 'ETH': 1027 } // отримання через /map і кешування Чому кешування таке важливе для CoinMarketCap API?
Кожен запит витрачає кредити. Один quotes з 10 символами — 10 кредитів. При 10 000 кредитів на місяць це всього 1000 запитів. Кешування з Redis дозволяє знизити витрати в 10 разів. Економія на API-кредитах може досягати 70% — це сотні доларів щомісяця для проєктів з високою частотою оновлення. Рекомендовані TTL:
| Тип даних | TTL | Приклад використання |
|---|---|---|
quotes/latest |
60 с | Відображення цін на сайті |
listings/latest |
300 с | Список топ-100 монет |
cryptocurrency/map |
86400 с | Мапінг тікер → CMC ID |
historical (OHLCV) |
3600 с | Графіки за день |
import { createClient } from 'redis' const redis = createClient({ url: process.env.REDIS_URL }) await redis.connect() async function getCachedQuotes( symbols: string[], ttlSeconds = 60 ): Promise<Record<string, CmcQuote>> { const cacheKey = `cmc:quotes:${symbols.sort().join(',')}` const cached = await redis.get(cacheKey) if (cached) { return JSON.parse(cached) } const fresh = await cmcClient.getQuotes(symbols) await redis.setEx(cacheKey, ttlSeconds, JSON.stringify(fresh)) return fresh } Як обробляти rate limit правильно?
Помилки 1008 (хвилинний ліміт) і 1009 (годинний ліміт) потребують експоненціального backoff. Початкова пауза 1 с, множник 2, максимум 5 спроб. Обробка кодів:
function handleCmcError(errorCode: number): void { if ([1008, 1009].includes(errorCode)) { throw new RateLimitError('CoinMarketCap rate limit exceeded') } if (errorCode === 1006) { alertTeam('CMC monthly credits exhausted') } } // Повторна спроба з backoff for (let attempt = 1; attempt <= 5; attempt++) { try { return await cmcClient.getQuotes(symbols) } catch (err) { if (err instanceof RateLimitError) { await new Promise(resolve => setTimeout(resolve, 1000 * Math.pow(2, attempt))) } else { throw err } } } Додаткові поради щодо обробки помилок
- Помилка 1006 (вичерпання кредитів) — негайно повідомте команду.
- Помилка 1007 (недійсний ключ) — перевірте API-ключ.
- Помилка 1010 (недостатньо прав) — переконайтеся, що ключ має доступ до запитуваного ендпоінту.
Ендпоінти та вартість запитів
| Ендпоінт | Кредитів/запит |
|---|---|
/quotes/latest (1 символ) | 1 |
/quotes/latest (N символів) | N |
/listings/latest (100 монет) | 1 |
/listings/latest (5000 монет) | 50 |
/info (метадані) | 1 |
/historical (OHLCV) | 1 / точка |
/global-metrics/latest | 1 |
Вигідніше використовувати listings для масового отримання даних. Додаткові ендпоінти:
-
/v1/tools/price-conversion— конвертація валют. -
/v1/cryptocurrency/category— топ монет за категоріями (DeFi, NFT).
Моніторинг витрати кредитів
Контроль балансу кредитів критичний для проєктів на безкоштовному тарифі. Поточну витрату можна отримати через ендпоінт /v1/key/info — він повертає creditsUsed, creditsLeft та дату оновлення. Рекомендуємо налаштувати перевірку раз на 6 годин і надсилати сповіщення в Telegram, коли залишок падає нижче 20% ліміту.
Для високонавантажених проєктів варто розділити ключі за середовищами: окремий ключ для production і окремий для staging. Це виключає витрату кредитів на тестові запити. За даними документації CoinMarketCap, промислові плани коштують від $79/місяць (Hobbyist, 40 000 кредитів) до $399/місяць (Startup, 200 000 кредитів). Правильне кешування дозволяє покрити потреби більшості MVP-проєктів безкоштовним планом у 10 000 кредитів.
Що входить в інтеграцію під ключ
При замовленні інтеграції CoinMarketCap API ви отримуєте:
- Розробку клієнта з повною типізацією на TypeScript.
- Мапінг монет через
/cryptocurrency/mapз кешуванням на добу. - Налаштування кешування Redis з оптимальними TTL під ваш сценарій.
- Обробку rate limit з експоненціальним backoff і сповіщеннями.
- Документацію та навчання команди (до 2 годин онлайн).
- Місяць підтримки після впровадження.
Процес інтеграції під ключ
- Отримання ключа та налаштування клієнта з типізацією.
- Мапінг монет: отримання
/cryptocurrency/mapі кешування на добу. - Налаштування кешування Redis з оптимальними TTL.
- Реалізація обробки rate limit з backoff.
- Документування та передача команді.
Зв'яжіться з нами, щоб ми оцінили ваш проєкт. Замовте інтеграцію CoinMarketCap API і забудьте про ліміти. Економія на API-кредитах може досягати 70% — це сотні доларів щомісяця. Реалізація під ключ займає 2–3 дні.







