Интеграция 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 дня.







