שילוב API של CoinMarketCap: שמירה במטמון וטיפול בשגיאות
לעתים קרובות אנו נתקלים בפרויקטים הדורשים נתוני שוק קריפטו בזמן אמת, אך ללא שמירה אגרסיבית במטמון, התוכנית החינמית של 10,000 קרדיטים בחודש מתכלה תוך כמה ימים. בקשה אחת לציטוטים של עשרה מטבעות עולה 10 קרדיטים. עדכון מחירים כל דקה היה מדלדל את המכסה תוך 16 שעות. בפרויקט אגרגטור DeFi, ללא שמירה במטמון, המכסה נעלמה תוך יום — לאחר הגדרת Redis עם TTL של 60 שניות, הצריכה ירדה פי 10, וחסכה ללקוח כ-500 דולר בחודש בתוכניות בתשלום. לצוות שלנו יש ניסיון של 10+ שנים ב-web3 ויותר מ-50 פרויקטים שהושלמו, כך שאנו מבטיחים שילוב יציב. בואו נפרק שילוב טיפוסי שעובד תחת עומס ואינו דורש תעריפים יקרים.
הגדרת לקוח CoinMarketCap
הרשמה בpro.coinmarketcap.com מעניקה לך מפתח API מיידית. כתובת בסיס: 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 ייחודי (מספר שלם) לכל מטבע — זה אמין יותר מאשר טיקרים, שעלולים להיות כפולים. מיפוי הטיקר->מזהה CMC מתקבל דרך 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 } } ונשמר במטמון ליום אחד.
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 и кэширование מדוע שמירה במטמון היא קריטית עבור API של CoinMarketCap
כל בקשה צורכת קרדיטים. בקשה אחת של /v1/cryptocurrency/map עם 10 סמלים עולה 10 קרדיטים. עם 10,000 קרדיטים בחודש, זה רק 1,000 בקשות. שמירה במטמון של Redis יכולה להפחית את הצריכה פי 10. החיסכון בקרדיטים של API יכול להגיע ל-70% — זה מאות דולרים בחודש עבור פרויקטים בתדירות גבוהה. TTL מומלצים:
| סוג נתונים | TTL | דוגמת שימוש |
|---|---|---|
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 и кэширование |
60 שניות | הצגת מחירים באתר |
quotes |
300 שניות | רשימת 100 המטבעות המובילים |
quotes/latest |
86400 שניות | מיפוי טיקר -> מזהה CMC |
listings/latest (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
} טיפול נכון במגבלת קצב
שגיאות 1008 (מגבלת דקה) ו-1009 (מגבלת שעה) דורשות השהיה אקספוננציאלית. השהיה ראשונית של שנייה אחת, מכפיל 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 (הרשאות לא מספקות) — ודא שלמפתח יש גישה לנקודת הקצה המבוקשת.
נקודות קצה ועלויות בקשות
| נקודת קצה | קרדיטים / בקשה |
|---|---|
cryptocurrency/map (סמל אחד) | 1 |
historical (N סמלים) | N |
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 } (100 מטבעות) | 1 |
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 } } } (5000 מטבעות) | 50 |
/quotes/latest (מטא-דאטה) | 1 |
/quotes/latest (OHLCV) | 1 / נקודת נתונים |
/listings/latest | 1 |
יעיל יותר להשתמש בנקודת הקצה /listings/latest לנתונים בכמות גדולה. נקודות קצה נוספות:
-
/info— המרת מטבעות. -
/historical— המטבעות המובילים לפי קטגוריה (DeFi, NFT).
ניטור שימוש בקרדיטים
מעקב אחר יתרת הקרדיטים הוא קריטי עבור פרויקטים בתוכנית החינמית. השימוש הנוכחי זמין דרך /global-metrics/latest — הוא מחזיר listings, /v1/tools/price-conversion, ותאריך העדכון. אנו ממליצים לבדוק כל 6 שעות ולשלוח הודעת Telegram כאשר הקרדיטים הנותרים יורדים מתחת ל-20% מהמכסה.
עבור פרויקטים בעומס גבוה, הפרד מפתחות API לפי סביבה: אחד לייצור, אחר לבדיקות. זה מונע מבקשות בדיקה לצרוך קרדיטים. לפי ציטוט במאמר, תיעוד CoinMarketCap, תוכניות בתשלום מתחילות ב-79 דולר לחודש (Hobbyist, 40,000 קרדיטים) ועולות עד 399 דולר לחודש (Startup, 200,000 קרדיטים). שמירה נכונה במטמון מאפשרת לרוב פרויקטי ה-MVP להישאר בתוכנית החינמית של 10,000 קרדיטים.
מה כלול בשילוב מפתח ביד
כאשר אתה מזמין שילוב API של CoinMarketCap, אתה מקבל:
- פיתוח לקוח עם טיפוסי TypeScript מלאים.
- מיפוי מטבעות דרך
/v1/cryptocurrency/categoryעם שמירה יומית במטמון. - הגדרת שמירה במטמון של Redis עם TTL אופטימלי למקרה השימוש שלך.
- טיפול במגבלת קצב עם השהיה אקספוננציאלית והתראות.
- תיעוד והדרכת צוות (עד שעתיים אונליין).
- חודש אחד של תמיכה לאחר ההשקה.
תהליך שילוב מפתח ביד
- קבל מפתח API והגדר את הלקוח עם טיפוסים.
- מפה מטבעות: הבא
/v1/key/infoושמור במטמון ליום. - הגדר שמירה במטמון של Redis עם TTL אופטימליים.
- יישם טיפול במגבלת קצב עם השהיה.
- תעד ומסור לצוות.
צור קשר כדי להעריך את הפרויקט שלך. הזמן שילוב API של CoinMarketCap ושכח ממגבלות. החיסכון בקרדיטים של API יכול להגיע ל-70% — זה מאות דולרים בחודש. יישום מפתח ביד אורך 2–3 ימים.







