Schema
One wide precomputed table of the entire market: 21,082+ tickers × 427+ columns we call signals, plus the bars, events, news and ETF shapes around it. This page is the map; each axis has its own reference.
One wide table
One logical table. Rows are instruments, columns are signals.
Each row is one tradeable instrument: every US-listed equity plus curated rates, FX, metals and crypto (Tickers). Each column is one signal, from raw price and volume through indicators, fundamentals and insider activity (Signals, with a reference page per signal). The pipeline recomputes the table continuously, so raw and computed values land in the same row; you run no feed, no storage, no indicator math.
Under the hood the table is the live row plus historized state: a daily row per ticker, with hourly and minute grains for session columns. You never query the history by name; ?asof= and series route to it. That is why depth and intraday availability vary per column, and why each column's reference page states the grains that carry it.
Which endpoint reads which shape is on the Introduction.
The other queryable tables
The per-ticker state table is the primary surface — reach for it whenever the question is "what is true of this ticker (now, or as of a moment)". The three shapes below answer different questions: bars when you want the raw OHLCV record rather than computed state, events when you want the timeline of discrete happenings, and news when you want searchable article text. Same rule everywhere: the columns below are the grammar.
bars — OHLCV history (9 columns)
Served by the bars endpoint at day, hour, and minute resolution (hour/minute share this shape).
| Column | Type | Description |
|---|---|---|
ticker | text | symbol (key) |
t | bigint | bar start (epoch ms, key) |
o | numeric | open |
h | numeric | high |
l | numeric | low |
c | numeric | close |
v | bigint | volume |
vw | numeric | volume-weighted average price |
n | integer | trade count |
The events projection — the events grammar
Every event, regardless of kind, projects onto one shape; kind-specific detail lives in payload (queryable as payload->>'field'). The kinds: earnings, dividends, splits, insider transactions, analyst actions, plus opt-in signal firings and news — each kind's page documents its payload schema.
| Column | Type | Description |
|---|---|---|
ticker | text | Symbol the event belongs to. |
ts | timestamptz | When the event occurred. |
kind | text | Event kind (earnings, dividend, split, insider, analyst, signal, news…). |
payload | jsonb | Kind-specific fields. |
news_article — the news grammar (15 columns)
| Column | Type | Description |
|---|---|---|
id | bigint | Article id (primary key). |
url | text | Canonical article URL — the dedup key (UNIQUE index). |
time_published | timestamp with time zone | Publication timestamp. |
title | text | Headline. |
summary | text | Article summary. |
source | text | Publisher name. |
source_domain | text | Publisher domain. |
category | text | AV category within the source. |
authors | jsonb | Author list. |
topics | jsonb | Topic tags with relevance scores. |
banner_image | text | Banner image URL (~80% of recent articles carry one). |
overall_sentiment_score | numeric | Article-level sentiment score (−1..1). |
overall_sentiment_label | text | Bearish…Bullish label for the score. |
tickers | text[] | Tickers the article mentions. |
ticker_data | jsonb | Per-ticker relevance + sentiment payload. |
Machine-readable
The same schema ships as JSON at /docs/schema.json, and every route is in the OpenAPI spec. Agents can start from /llms.txt.