A read-only HTTP, WebSocket, and MCP interface over a 961 GB financial dataset — symbols, OHLC bars, fundamentals, short interest, SEC filings, news with sentiment, ownership, regulatory, macro, plus a 33.8 M-row KOL tweet archive with 10 M mirrored images. Refreshed continuously, streamed live.
Every endpoint is a plain GET that returns JSON. A Lumid PAT is
required — pass it as Authorization: Bearer <pat>.
Anonymous requests get 401. The authed tier is 100 req/min.
curl https://kv.run:5000/symbols/AAPL
1d, 7 d for 5min, 1 d for 1min.curl "https://kv.run:5000/ohlc/AAPL?interval=1d"
curl "https://kv.run:5000/quotes?symbols=AAPL,BTCUSD"
websocat -H="Authorization: Bearer $TOKEN" \ wss://kv.run:5000/ws/quotes
curl "https://kv.run:5000/screener?sector=Technology&market_cap_min=1e12"
curl "https://kv.run:5000/kols/tweets/search?q=earnings+beat"
curl "https://kv.run:5000/news/latest?category=general&limit=20"
by-url falls through to pbs.twimg.com if not cached.curl -L "https://kv.run:5000/kols/media/by-url?u=<twitter-cdn-url>"
Endpoints are grouped by data domain. Open any group in the OpenAPI spec or the guide for schemas and example payloads.
SSE /prediction-markets/stream./kols/media/.
Three streams over the same hub: tick prices, news articles, KOL tweets.
Both WSS /ws/quotes (bidirectional, subscribe-by-symbol) and
GET /quotes/stream (SSE) are supported; WSS /ws/news
is a news-only variant. Authentication via Lumid PAT (or X-API-Key).
| Stream | Transport | Source tier |
|---|---|---|
| tick:<sym> | /ws/quotes • /quotes/stream | A — WS feed for US equities + crypto / forex. Multiple sources: crypto & forex run a primary + hot-standby WSS pair; US equities additionally have a secondary quote feed that auto-covers within seconds if the primary goes quiet. No manual intervention needed on any gap. |
| news:<sym> | /ws/news | B — news firehose poller (60 s) |
| kol:<sym> | /kols/tweets/stream (SSE) | B — tweet provider, filtered by roster |
| pm:events | /prediction-markets/stream (SSE) | A — 1st-hand Polymarket CLOB WSS (500 active markets) |
| last:tick:<sym> | /quotes?symbols=… | C — Tier-C Redis snapshot, evictable on memory pressure |
Tier and lag are exposed live at GET /freshness
(realtime.by_source.{p50,p95,p99}_ms).
A Lumid PAT is required on every route — anonymous requests
return 401. Auth goes through Lumid identity introspection;
bring a Lumid PAT (lm_pat_live_… / rm_pat_live_…)
or an RS256 JWT. Authed tier: 100 req/min.
# Bring your Lumid PAT (lm_pat_live_… / rm_pat_live_…) or JWT. curl -H "Authorization: Bearer $LUMID_TOKEN" \ https://kv.run:5000/symbols/AAPL # Or via X-API-Key header — same effect. curl -H "X-API-Key: $LUMID_TOKEN" \ "https://kv.run:5000/quotes?symbols=AAPL"
Every query is also a Model Context Protocol tool, so an agent can pull OHLC, fundamentals, holdings, or a real-time quote without learning a separate HTTP shape.
# Streamable-HTTP transport (MCP 2025-03-26, recommended): curl -X POST https://kv.run:5000/mcp \ -H "Authorization: Bearer <token>" \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
Read tools: symbols_search, symbol_get,
universe_list, ohlc, fundamentals_latest,
fundamentals_history, news_for_symbol,
holders_top, price_target, freshness,
get_quote, get_quotes.
Write & discovery tools: catalog_ingress,
catalog_table_profile, catalog_table_schema,
catalog_lineage_run, catalog_lineage_row,
catalog_sources, ingest_typed, ingest_adapter.
The read API is paired with an ingress surface. Partners and agents
push data with a Lumid PAT (per-role allowlist); the server stamps
provenance and exposes the lineage chain back at
/catalog/lineage/*.
One call discovery: GET /catalog/ingress.
| Mode | Endpoint | When |
|---|---|---|
| Typed | POST /ingest/{schema}/{table} |
JSON body with records in target-column shape. Idempotent. |
| Adapter | POST /ingest/adapter/{adapter_id} |
Upstream-shape records flattened server-side via the registered adapter (69 available). |
| Stream | POST /ingest/{schema}/{table}/stream |
NDJSON, chunked transfer; one run row spans the whole stream. Gzip/zstd accepted. |
| File | POST /ingest/{schema}/{table}/file |
Multipart upload — JSON / NDJSON / CSV / TSV / XML / YAML / Parquet / Arrow. |
| Blob | POST /ingest/blob |
Images / PDFs / opaque binary. sha256 dedup; bytes land in sibling object storage, metadata in raw.blobs. |
| Webhook | POST /webhook/{webhook_id} |
HMAC-SHA256 signed, no PAT. Created via POST /admin/ingress/webhooks. Rate-limited per webhook. |
Full guide: INGRESS.md.
MCP tools for AI agents: catalog_ingress, catalog_table_schema,
ingest_typed, ingest_adapter,
catalog_lineage_run, catalog_lineage_row,
catalog_sources.
| Source | Cadence |
|---|---|
| Realtime tick stream | Continuous — WS feed across asset classes (stocks, crypto, forex, indices) + secondary quote feed with live 1-min OHLC aggregation as a backup layer |
| Prediction-markets trades + orderbook | Continuous WSS recorder; live trade prints + L2 deltas land in <1 s |
| Kalshi trades (incremental) | Every 30 min |
| Non-stock 1-min OHLC | Every 30 minutes (etf / crypto / forex / index / commodity) |
| Stock 1-min OHLC | Daily at 04:30 UTC (primary feed lags ~3 days) + real-time secondary feed writes live bars continuously |
| Stock daily-adjusted EOD | Daily at 05:15 UTC (dividend + non-split adjusted) |
| Analyst estimates | Every 4 hours — grades, price-target, recommendation, ratings |
| Fundamentals statements | Daily at 06:00 UTC — income / balance / cashflow + ratios + key-metrics + scores + earnings + growth + enterprise-values |
| Ownership (13F + insider + gov-trades) | Daily at 07:00 UTC |
| Events + macro | Daily at 07:30 UTC — earnings calendar, IPOs, treasury rates, economic indicators, COT, FDA |
| Market metadata | Daily at 08:00 UTC — dividends, splits, market_cap |
| Social + news sentiment | Daily at 09:00 UTC |
| Reference (profile, executives, ETF metadata) | Weekly Sun 03:00 UTC + ETF holdings refresh |
| Regulatory (ESG, SEC filings, patents, lobbying) | Weekly Sun 04:30 UTC |
| News articles (6 sources) | Every 15 min — company-news, general, stock, crypto, forex, press releases + sentiment-enhanced feed every 4 h (structured per-ticker sentiment) |
| Short interest + short volume | Weekly Sun 03:00 UTC — FINRA bi-weekly short interest + daily off-exchange short volume |
| Risk factors + 10-K sections | Weekly Sun 05:00 UTC — machine-readable SEC risk-factor taxonomy + plain-text 10-K sections |
| Fundamentals (secondary source) | Weekly Sun 07:00 UTC — income / balance / cash-flow (second provider, for cross-validation) |
| KOL tweets | 3h / 12h / 24h tiers by tweet frequency (3,702 active handles) |
| News firehose → SSE | Polled every 60 s — event-driven WS fan-out |
| Times | UTC ISO-8601. Dates are YYYY-MM-DD. |
| Symbols | Upper-cased server-side. Crypto / forex use the upstream shape (e.g. BTCUSD, EURUSD). |
| Lineage | The fields source, source_endpoint, source_run_id, ingest_ts, raw are intentionally stripped from responses. The API picks the canonical provider per surface. |
| Errors | JSON {"detail": "…"} on 4xx / 5xx. 429 carries a Retry-After header. |
| Pagination | Endpoints that return lists accept limit (max 1000) and offset; /ohlc uses a server-side row cap instead. |
| Failure mode | Lumid unreachable while validating a presented token → 503 fail-closed. |