Розробка REST та WebSocket API для крипто-даних

Розробка API для доступу до зібраних даних Ми розробляємо REST та WebSocket API для доступу до зібраних крипто-даних. Історичні транзакції, funding rates, gas prices — усе це має бути доступне з мінімальною затримкою та стабільною продуктивністю. Наш досвід у блокчейн-розробці дозволяє створювати

Напрямки блокчейн-розробки

Часті запитання

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1452
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1309
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1005
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1270
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    719
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    1011

Розробка API для доступу до зібраних даних

Ми розробляємо REST та WebSocket API для доступу до зібраних крипто-даних. Історичні транзакції, funding rates, gas prices — усе це має бути доступне з мінімальною затримкою та стабільною продуктивністю. Наш досвід у блокчейн-розробці дозволяє створювати API, які витримують навантаження понад 2000 запитів на секунду та не розкривають зайвого.

Які проблеми вирішує правильно спроектоване API?

Сирі дані з бірж та блокчейнів — це хаос. Без продуманого API ви зіткнетеся з трьома типовими проблемами: нестабільна пагінація при додаванні нових записів, висока затримка при time-series запитах та відсутність контролю доступу. Ми вирішуємо їх через cursor-пагінацію (стабільніша за offset у 100% випадків), багаторівневе кешування та API-ключі з rate limiting.

Архітектура API

Використовуємо Fastify (Node.js) для REST та WebSocket, Redis для кешу та rate limiting, PostgreSQL або ClickHouse для зберігання даних. Стандартні практики: версіонування через URL (/v1/), ISO 8601 для часу, поле ?fields= для вибору колонок.

REST ендпоінти проектуємо під конкретні сценарії: funding rates, транзакції, новини. Кожен ендпоінт підтримує cursor-пагінацію, яка стабільна під час вставки нових даних — на відміну від offset-пагінації.

Приклад валідації за допомогою Zod:

Приклад валідації Zod
import { z } from "zod"; const FundingRatesQuerySchema = z.object({ symbol: z.string().regex(/^[A-Z]+-[A-Z]+$/, "Invalid symbol format"), exchange: z.enum(["binance", "bybit", "okx", "hyperliquid"]).optional(), from: z.coerce.date(), to: z.coerce.date(), limit: z.coerce.number().min(1).max(1000).default(100), cursor: z.string().optional(), }); 

Раннє повернення 400 з детальними помилками економить час клієнтів.

Ендпоінт Опис Метод
/v1/funding-rates Історичні ставки фінансування GET
/v1/transactions/{chain}/{address} Історичні транзакції за адресою GET
/v1/news Новинарна стрічка за тегами GET
/v1/gas/history Історія газових цін GET
/v1/stream Real-time потік даних WebSocket

Багаторівневе кешування критичне для крипто-даних

Крипто-дані поділяються на історичні (незмінні) та real-time. Історичні можна кешувати надовго, real-time — лише на секунди. Ми використовуємо три рівні:

Рівень Що кешує TTL
CDN Статичні історичні дані 1 година
Redis Результати частих запитів 30 с – 5 хв
База даних (read replica) Все інше

Redis-кеш будується за ключем запиту. Приклад:

async function getFundingRates(query: FundingRatesQuery): Promise<FundingRateRecord[]> { const cacheKey = `fr:${query.symbol}:${query.exchange ?? "all"}:${query.from.getTime()}:${query.to.getTime()}`; const cached = await redis.get(cacheKey); if (cached) return JSON.parse(cached); const data = await db.queryFundingRates(query); const ttl = query.to < new Date(Date.now() - 3600_000) ? 3600 : 30; await redis.setEx(cacheKey, ttl, JSON.stringify(data)); return data; } 

Для time-series запитів у PostgreSQL використовуємо покриваючі індекси:

CREATE INDEX CONCURRENTLY idx_funding_rates_lookup ON funding_rates (symbol, exchange, settled_at DESC) INCLUDE (funding_rate, mark_price); 

Для аналітики (агрегації, середні) ClickHouse швидший за PostgreSQL у 5–10 разів. Redis кеш знижує затримку до 50 разів у порівнянні з прямими запитам до БД.

Реалізація real-time потоку

WebSocket-сервер на Fastify підписує клієнтів на канали подій. Heartbeat кожні 30 секунд відсікає завислі з'єднання.

fastify.get("/v1/stream", { websocket: true }, (socket, req) => { const subscriptions = parseSubscriptions(req.query); const unsubscribers = subscriptions.map((sub) => eventBus.on(sub.channel, (data) => { if (socket.readyState === WebSocket.OPEN) { socket.send(JSON.stringify({ channel: sub.channel, data })); } }) ); socket.on("message", (msg) => { const cmd = JSON.parse(msg.toString()); if (cmd.type === "subscribe") { /* ... */ } if (cmd.type === "unsubscribe") { /* ... */ } if (cmd.type === "ping") socket.send(JSON.stringify({ type: "pong" })); }); socket.on("close", () => unsubscribers.forEach(unsub => unsub())); }); 

Безпека та контроль доступу

Використовуємо API-ключі замість JWT — вони простіші в управлінні. Rate limiting на основі sliding window з Lua-скриптом у Redis:

local key = KEYS[1] local limit = tonumber(ARGV[1]) local window = tonumber(ARGV[2]) local now = tonumber(ARGV[3]) redis.call("ZREMRANGEBYSCORE", key, 0, now - window) local count = redis.call("ZCARD", key) if count >= limit then return 0 end redis.call("ZADD", key, now, now) redis.call("EXPIRE", key, window / 1000) return 1 

У відповідях клієнт бачить заголовки X-RateLimit-* — може адаптувати свою поведінку.

Моніторинг та observability

Для production API необхідний збір метрик у реальному часі. Ми підключаємо Prometheus з набором стандартних лічильників: кількість запитів за методом та маршрутом, P50/P95/P99 latency, відсоток помилок (4xx та 5xx), поточна кількість WebSocket-з'єднань. Grafana-дашборд показує навантаження у розрізі ендпоінтів — одразу видно, який запит почав гальмувати.

Алертинг налаштовуємо через Alertmanager: P99 latency вище 500 мс, error rate вище 1%, Redis недоступний, черга WebSocket-подій зростає. Така система дозволяє виявляти вузькі місця до того, як клієнти помічають деградацію. Середній час реакції на інцидент при налаштованому моніторингу — до 2 хвилин. Ми гарантуємо 99.9% аптайм для production-контурів.

Структуроване логування (JSON) через pino дає можливість агрегувати помилки за типом запиту та API-ключем. Це критично при налагодженні: видно, хто і що запитує, де пагінація ламається, чому клієнт отримує 400 замість 200. Логи відправляються в Loki або Elasticsearch — залежно від інфраструктури. Retention політика: детальні логи 7 днів, агреговані метрики — 90 днів.

Склад розробки API під ключ

  • Проектування схеми ендпоінтів та пагінації
  • Реалізація REST + WebSocket на Fastify
  • Інтеграція з Redis та ClickHouse/PostgreSQL
  • Аутентифікація через API-ключі та rate limiting
  • Написання OpenAPI документації
  • Моніторинг з Prometheus та Grafana (P99 latency, request rate)

Термін розробки — 4–7 тижнів залежно від кількості джерел даних та вимог до продуктивності. Вартість розробки базового API становить від $8,000, комплексні рішення — до $25,000. Ми маємо 5+ років досвіду в блокчейн-розробці та виконали понад 30 проектів у сфері API. На всі роботи надається гарантія якості.

За даними CoinGecko, обсяг ринку крипто-даних зростає на 40% щорічно. Пишіть — оцінимо ваш проект та запропонуємо конкретну архітектуру.