Інтеграція з 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.







