# Eurodatahub > A hub for information and knowledge — open browser desktop + public cached APIs. Operated by ThuleAI (https://thuleai.com/). LLM-readable API docs live here; the human/console copy is GET /api/docs (plain text). The desktop OS boots at https://eurodatahub.com/ — apps: Dataset Browser, Search, Crypto Klines, API (this documentation as a desktop app at /os?app=api). ## Public APIs ### GET /api/market-history — Market History (permanent cache) The kline/candlestick dataset mirrored by Eurodatahub: top-10 USDT pairs, up to 1 YEAR of history (default 1 year; the EDH_KLINES_HISTORY_YEAR_OVERRIDE env var sets the retained years), synced from the market-data upstream EVERY 1 MINUTE in the background (the collector reads the database's own time stamps — the newest stored kline + the per-series last-sync stamp in klines_meta — and fetches the gap after the newest stored kline when it is more than 1 minute old; price history is fetched every 1m, not every 15m; symbols refresh SEQUENTIALLY over a rotating SOCKS5 proxy, max 1 concurrent curl process, infinite retries with no throttle). Every response is served from the permanent SQLite cache (eurodatahub_klines.sqlite3) — never a live upstream proxy; the response body says so (cached:true, cache.kind="permanent"). - Query params: symbol (required, one of: BTCUSDT, ETHUSDT, BNBUSDT, SOLUSDT, XRPUSDT, ADAUSDT, DOGEUSDT, TONUSDT, TRXUSDT, AVAXUSDT), interval (default 1m, the raw stored grid — the time-series' single stored data over the 1-year (default) store window; 5m 15m 30m 1h 2h 4h 6h 8h 12h 1d 3d are DERIVED on the fly from the stored 1m candles and a derived candle is emitted only once its bucket has fully closed), limit (1..1000, default 500), startTime / endTime (epoch ms, bucket-aligned), timeZone (metadata echo: 'UTC' or 'UTC±HH[:MM]'; candle open/close times are always epoch ms UTC). - 200 shape: { symbol, interval, timeZone, rows: [{ openTime, open, high, low, close, volume, closeTime, quoteVolume, trades }], totalAvailable, fetchedAt, cached: true, cache: { kind: 'permanent', store: 'sqlite3', maxAgeMs: 31536000000 }, synced: { syncedAt, everyMs: 60000, maxDelayMs }, source, delayMs, maxDelayMs, historyFrom, count } (rows oldest-first, candle-REST-compatible ordering, open times in epoch ms UTC). - Errors: 400 bad interval/limit/timeRange/timeZone • 404 unknown symbol (with allowedSymbols) • 503 the collector is still seeding the history for the pair. - Example: curl "https://eurodatahub.com/api/market-history?symbol=BTCUSDT&interval=1m&limit=100" ### POST /api/search — Search (perplexity-like answer engine) Searches the OPEN web with FREE backends (the Exa hosted MCP server https://mcp.exa.ai/mcp in keyless JSON-RPC mode — initialize handshake, session id, JSON-RPC 2.0 tools/call for web_search_exa — plus the DuckDuckGo HTML endpoint), synthesizes the fetched results into ONE cited answer with the deployment-configured LLM chat endpoint, and streams it back with the same job machinery as the Search desktop app. - Body: { message: string (required), history?: [{ role: 'user'|'assistant', content: string }] } — history lives ONLY in the browser; nothing about a search is stored server-side. - Response: { conversationId, jobId, pollMs } → poll GET /api/search/stream?job= (every pollMs) → done:true { reply, replyHtml } or error. - No API keys, no rate limit (the old max-LLM-calls-per-hour cap was removed on purpose). ### GET /api/klines — Crypto Klines (chart feed) The desktop chart's compact feed of the same permanent SQLite time-series as Market History (top-10 pairs; 1m stored raw for 1 year(s) — the single stored grid, synced every 1 minute; 5m–3d derived on the fly from the stored 1m candles; one interval step of closure delay applies to derived grids): ?symbol=&interval=&limit=&startTime=&endTime= → { symbol, interval, rows:[{openTime,open,high,low,close,volume,closeTime}], cached: true, delayMs, maxDelayMs, historyFrom, count }. ### GET /api/docs — full plain-text deployment documentation (console/LLM friendly) ### GET /llms.txt — this file (the machine-readable API index; the API app at /os?app=api documents the same APIs in the desktop) ## Notes for agents - All read APIs are unauthenticated, keyless and CORS-free by same-origin use; responses are JSON unless stated. - Market History /api/klines answers are CACHED BY DESIGN (permanent dataset, synced every 1 minute per the database time stamps) — treat cached:true + synced.maxDelayMs as the freshness contract; do not retry those endpoints expecting live ticks. All intervals are served from the same stored 1m candles; derived intervals carry one bucket step of closure delay. - The Search API is free and unlimited in this deployment; be reasonable. - Eurodatahub is a project under ThuleAI — https://thuleai.com/