# Tables

The ticker table, 23,383+ tickers × 452+ signals, updated every minute with history back to 2003, and the tables around it: bars, events and news, plus ETF holdings. This page is the map; each has its own reference.

## The ticker table

One row per ticker, one column per signal.

Each **row** is one tradeable instrument: every US-listed stock and ETF plus curated rates, FX, metals and crypto (https://tickerbot.io/docs/tickers.md). Each **column** is one signal: the raw data (price, volume, statement lines), values calculated from it (moving averages, RSI, ratios), and boolean conditions on top (`above_sma_200`, `golden_cross`) (https://tickerbot.io/docs/signals.md, 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=` (https://tickerbot.io/docs/asof.md) and series (https://tickerbot.io/docs/endpoints/series/get.md) 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.

You read it four ways: a row (one ticker's every signal, Tickers: https://tickerbot.io/docs/endpoints/tickers.md), a column (every ticker where one signal holds, Signals: https://tickerbot.io/docs/endpoints/signals.md), a scan (every ticker matching a `WHERE` clause, Scan: https://tickerbot.io/docs/endpoints/scan.md), and a series (any tickers' columns over time, Series: https://tickerbot.io/docs/endpoints/series.md).

The ticker table's columns and the bars ship as JSON at https://tickerbot.io/docs/schema.json, and every route is in the OpenAPI spec (https://tickerbot.io/openapi.yaml). Agents can start from https://tickerbot.io/llms.txt.

## When to use the other shapes

The state table answers "what is true of this ticker (now, or as of a moment)". The 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, news when you want searchable article text.

## bars (OHLCV history)

Served by the bars endpoint at day/hour/minute resolution.

- `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

Every event projects onto one shape; kind-specific detail is in payload (queryable as payload->>'field'). The kinds: earnings, dividends, splits, filings, insider trades, analyst actions and estimate revisions, plus opt-in signal firings and news — each kind's page under https://tickerbot.io/docs/endpoints/events/ documents its payload schema.

- `ticker` (text) — Symbol the event belongs to.
- `ts` (timestamptz) — When the event occurred.
- `kind` (text) — Event kind (dividend, split, insider, analyst, signal, news…).
- `payload` (jsonb) — Kind-specific fields.

## news_article (the news grammar)

The /v2/news query grammar.

- `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) — The publisher's web domain, or its name when the domain isn't known.
- `category` (text) — The source's section for the article, e.g. `General`. Often null.
- `authors` (jsonb) — Author list.
- `topics` (jsonb) — Topic tags, each with a relevance score from 0 to 1 given as a string: `[{"topic": "earnings", "relevance_score": "0.94"}]`.
- `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[]) — Every company the article mentions. How much the article is about each one is in `ticker_data.<TICKER>.rel`.
- `ticker_data` (jsonb) — Per-company scores, keyed by ticker: `{"AAPL": {"rel": 0.88, "sent_score": 0.11, "sent_label": "Neutral"}}`. `rel` (0 to 1) is how much the article is about that company; `sent_score` (−1 to 1) and `sent_label` are its sentiment toward that company. Some articles carry a label without a score (`sent_score` null).
- `created_at` (timestamp with time zone) — When Tickerbot stored the article. Use it to poll for new articles: time_published can be older for articles filled in after the fact.
