Get Started

Welcome to Eurodatahub

Two live desktop apps to try first:

1
Crypto Klines1m, 5m and 15m–3d candle views for the top 10 coins — up to 1 year(s) back.
2
SearchPerplexity-like web search — streamed cited answers; your searches live only in your browser.
Dataset Browser
DatasetFormat · Size
knowledge_collectionParquet · 12.4 GB
knowledge_catalogCSV · 890 MB
knowledge_overview_seriesJSONL · 3.1 GB
market_knowledgeParquet · 24.8 GB
knowledge_snapshotsCSV · 1.2 GB
knowledge_summary_collectionParquet · 9.7 GB
Settings

Appearance

Color ThemeLight or Dark. Your choice is kept in your browser's local storage and restored on your next visit.
Light

Settings live on your device only — no accounts, no cookies.

Markets

Loading…

Search
No past searches yet.
Search
Search the webask anything · answers stream live with sources · searches live in your browser only

API

Every Eurodatahub API on this deployment, in one place — cached public reads (Market History, Crypto Klines) plus the streamed Search answer engine. Machine-readable copies: /api/docs and /llms.txt.

MethodPathWhat it servesCache
GET/api/market-historyMarket History — the top-10 crypto candle dataset (default 1-year window) mirrored from the market-data upstream and kept synced EVERY 1 MINUTE (database time stamps gate every fetch; max 1 concurrent curl process); permanent SQLite cache. 1m is stored raw (the single stored grid); 5m–3d derive on the fly from it.permanent
GET/api/klinesCrypto Klines chart feed — the same SQLite time-series (cached-only) used by the desktop chart app; 1m stored, 5m–3d derived from 1m at read time; synced every 1 minute.permanent
POST/api/searchSearch — perplexity-like answer engine: open web search (free DuckDuckGo + Exa MCP) synthesized by the LLM into one streamed cited answer.none
GET/api/search/streamThe streamed reply poller for /api/search jobs (NDJSON-emulating polling).none
GET/api/llms.txtMachine-readable API documentation for LLM agents (also at /llms.txt).permanent

Try it — Market History

Response appears here.

Market History — GET /api/market-history

The kline/candlestick dataset replicated by Eurodatahub: ONLY the top-10 pairs (BTCUSDT, ETHUSDT, BNBUSDT, SOLUSDT, XRPUSDT, ADAUSDT, DOGEUSDT, TONUSDT, TRXUSDT, AVAXUSDT) with up to 1 year(s) of history (older rows pruned; default 1 year — the EDH_KLINES_HISTORY_YEAR_OVERRIDE env var widens/narrows the retained window), kept synced from the market-data upstream EVERY 1 MINUTE in the background — the database’s own time stamps (the newest stored kline via SQL MAX(open_time) + the per-series last-sync stamp in klines_meta) gate every fetch to a 1-minute cadence (price history is fetched every 1m, not every 15m), and only the GAP after the newest stored kline is fetched; symbols refresh SEQUENTIALLY with at most ONE concurrent curl process. Answers come from the permanent SQLite cache (eurodatahub_klines.sqlite3) — never a live proxy call; `cache` in the response says exactly that. Intervals: 1m is STORED raw exactly as synced (the 1-year window’s single stored grid); every larger interval up to 3d (5m, 15m, 30m, 1h, 2h, 4h, 6h, 8h, 12h, 1d, 3d) is DERIVED on the fly from those stored 1m candles (a derived candle is emitted only once its bucket fully closed — authentic, never partial). The response mirrors the upstream klines row shape: openTime/open/high/low/close/volume/closeTime (epoch ms).

curl "https://eurodatahub.com/api/market-history?symbol=BTCUSDT&interval=1m&limit=100"

# A larger derived grid:
curl "https://eurodatahub.com/api/market-history?symbol=ETHUSDT&interval=15m&limit=500"

# 200 → { symbol, interval, rows: [...], cached: true,
#        cache: { kind: "permanent", store: "sqlite3", maxAgeMs: 31536000000 },
#        synced: { syncedAt, everyMs: 60000, maxDelayMs }, count, ... }
# 404 → unknown symbol (allowedSymbols lists the top 10)
# 400 → bad interval/limit/timeZone
# 503 → collector still seeding; retry shortly

Search — POST /api/search

The perplexity-like Search API behind the desktop Search app: the query is fanned out to OPEN/FREE web-search backends (the Exa hosted MCP server in keyless mode via JSON-RPC initialize→tools/call, plus the DuckDuckGo HTML endpoint, both verified live), the configured LLM chat endpoint synthesizes ONE answer grounded in the fetched result snippets, and the reply streams back (poll /api/search/stream?job= like /api/chat — same machinery). No API keys, no rate limit, no stored history, and no count of searches — nothing tracks or displays how many searches have been run.

curl -X POST "https://eurodatahub.com/api/search" \
  -H "Content-Type: application/json" \
  -d '{"message":"what did the ECB decide this month?","history":[]}'

# → { jobId, conversationId, pollMs }
# then poll: GET /api/search/stream?job=
# done:true carries { reply, replyHtml }

Crypto Klines — GET /api/klines

The desktop Crypto Klines chart feed: identical SQLite time-series as Market History (top-10 pairs; 1m stored raw for 1 year(s) — the single stored grid, 1-minute gated sync; 5m–3d derived from the stored 1m candles at read time), a compact chart payload.

curl "https://eurodatahub.com/api/klines?symbol=BTCUSDT&interval=1m&limit=500"
curl "https://eurodatahub.com/api/klines?symbol=BTCUSDT&interval=15m&limit=500"
Eurodatahub
--:--