Интеграция с Token Terminal API
Token Terminal агрегирует финансовые метрики DeFi-протоколов по модели, знакомой из традиционных финансов: revenue, P/E ratio, price-to-sales, TVL, active users. Источник данных — on-chain события и субграфы The Graph, нормализованные в единую схему. API предоставляет исторические данные и текущие snapshots по 100+ протоколам.
Интеграция нужна в двух типичных сценариях: исследовательский дашборд с сравнением протоколов и инвестиционный инструмент с метриками оценки.
Структура API и ключевые эндпоинты
Token Terminal предоставляет REST API с ключом (API key в заголовке Authorization: Bearer <key>).
Основные эндпоинты:
GET /v2/projects — список всех протоколов
GET /v2/projects/{project_id} — метрики одного протокола
GET /v2/projects/{project_id}/timeseries — исторические данные
GET /v2/categories — агрегаты по категориям (DEX, lending и т.д.)
Ключевые поля в ответе проекта:
| Поле | Описание |
|---|---|
revenue |
Annualized protocol revenue (не путать с trading volume) |
fees |
Gross fees (revenue + LP rewards) |
tvl |
Total Value Locked |
ps |
Price-to-Sales ratio |
pe |
Price-to-Earnings ratio |
dau |
Daily active users (on-chain) |
market_cap_circulating |
Market cap по circulating supply |
Важное разграничение: Token Terminal использует protocol revenue (доля, идущая протоколу, а не LP) как аналог net income. Для Uniswap без активированного fee switch revenue = 0, все fees идут LP. Это делает P/E Uniswap бесконечным по их методологии.
Пример запроса и обработки данных
const BASE_URL = 'https://api.tokenterminal.com/v2'
async function getProtocolMetrics(projectId: string) {
const response = await fetch(`${BASE_URL}/projects/${projectId}`, {
headers: {
'Authorization': `Bearer ${process.env.TOKEN_TERMINAL_API_KEY}`
}
})
if (!response.ok) throw new Error(`API error: ${response.status}`)
const data = await response.json()
return {
revenue30d: data.data.revenue_30d,
fees30d: data.data.fees_30d,
tvl: data.data.tvl,
ps: data.data.ps,
pe: data.data.pe
}
}
// Исторические данные для графика
async function getTimeseries(projectId: string, metric: string, days: number) {
const params = new URLSearchParams({
metric,
granularity: 'daily',
from: new Date(Date.now() - days * 86400000).toISOString()
})
const response = await fetch(
`${BASE_URL}/projects/${projectId}/timeseries?${params}`,
{ headers: { 'Authorization': `Bearer ${process.env.TOKEN_TERMINAL_API_KEY}` } }
)
return response.json()
}
Rate limits и кэширование
Free tier: 100 запросов/день. Paid plans: от 10,000 до unlimited. Для дашборда с несколькими пользователями обязательно кэшировать ответы на сервере — запросы от разных клиентов к одним данным не должны умножать API-вызовы.
Рекомендуемая схема кэширования: Redis с TTL 15 минут для текущих метрик, 24 часа для исторических данных прошлых дней (они не изменятся). При превышении лимита — exponential backoff, не retry loop.
Интеграция занимает 1 день: подключение API, кэш-слой, TypeScript типы из response schema.







