REST API
Base URL: https://aeonfeed.com/v1. All responses are JSON, and CORS is open (*). The REST API is for occasional lookups. For anything real-time, use the WebSocket.
GET /v1/health
{ "status": "ok", "version": "0.1.0", "protocol": "v1", "uptime_s": 86400, "connections": 412, "exchanges_live": 12, "time": 1731400000123 }GET /v1/exchanges
{ "data": [ { "id": "binance", "name": "Binance", "pairs": 98, "live": true } ] }GET /v1/pairs
{ "data": [ { "symbol": "BTCUSDT", "base": "BTC", "quote": "USDT", "exchanges": ["binance", "bybit", "okx"] } ] }GET /v1/tickers
The latest cross-exchange aggregate for every pair. Items have the same shape as agg:*.
{ "data": [ { "s": "BTCUSDT", "p": 97012.3, "bb": 97014.0, "bbx": "kraken", "bbq": 0.42, "ba": 97011.8, "bax": "bybit", "baq": 1.37, "sp": -0.0023, "n": 11, "ch": 1.84, "v": 1834455120, "t": 1731400000123 } ], "time": 1731400000200 }GET /v1/ticker/{symbol}
The aggregate plus every exchange quote for one pair. {symbol} accepts BTCUSDT, btcusdt or btc-usdt.
curl https://YOUR_HOST/v1/ticker/btc-usdt{ "symbol": "BTCUSDT", "agg": { "s": "BTCUSDT", "p": 97012.3 }, "quotes": [ { "ex": "binance", "b": 97012.5, "a": 97012.51, "bq": 3.2, "aq": 0.8, "t": 1731400000123 } ], "time": 1731400000200 }An unknown symbol returns 404 with {"error":"unknown_symbol"}.
GET /v1/history/{symbol}
The reference price (p, the median across exchanges) as 1-minute candles for the last 24 hours, oldest first. Each row is [t, open, high, low, close], where t is the candle's open time in ms. The newest candle is still forming. History is kept in memory: after a server restart, older candles are filled from Binance 1-minute klines where Binance lists the pair.
curl https://YOUR_HOST/v1/history/btc-usdt{ "symbol": "BTCUSDT", "interval": "1m", "data": [ [1731399960000, 97001.2, 97020.5, 96998.0, 97012.3], [1731400020000, 97012.3, 97015.0, 97004.1, 97010.8] ], "time": 1731400030000 }To keep a chart live, fold agg:* updates for the pair into the last candle (or start a new one when the minute changes).
Rate limits
120 requests per minute per IP. Going over returns 429 with Retry-After: 60.