const API_BASE = process.env.NEXT_PUBLIC_API_URL ?? ""; export interface RateData { symbol: string; markPrice: number; indexPrice: number; lastFundingRate: number; nextFundingTime: number; timestamp: number; } export interface RatesResponse { BTC: RateData; ETH: RateData; } export interface HistoryPoint { fundingTime: number; fundingRate: number; timestamp: string; } export interface HistoryResponse { BTC: HistoryPoint[]; ETH: HistoryPoint[]; } export interface AssetStats { mean7d: number; annualized: number; count: number; } export interface StatsResponse { BTC: AssetStats; ETH: AssetStats; combo: { mean7d: number; annualized: number }; } export interface SignalHistoryItem { id: number; symbol: string; rate: number; annualized: number; sent_at: string; message: string; } export interface SignalsHistoryResponse { items: SignalHistoryItem[]; } export interface SnapshotItem { ts: number; btc_rate: number; eth_rate: number; btc_price: number; eth_price: number; } export interface SnapshotsResponse { count: number; hours: number; data: SnapshotItem[]; } async function fetchAPI(path: string): Promise { const res = await fetch(`${API_BASE}${path}`, { cache: "no-store" }); if (!res.ok) throw new Error(`API error ${res.status}`); return res.json(); } export const api = { rates: () => fetchAPI("/api/rates"), history: () => fetchAPI("/api/history"), stats: () => fetchAPI("/api/stats"), health: () => fetchAPI<{ status: string }>("/api/health"), signalsHistory: () => fetchAPI("/api/signals/history"), snapshots: (hours = 24, limit = 5000) => fetchAPI(`/api/snapshots?hours=${hours}&limit=${limit}`), };