# Changelog

## v2.6.0 — 2026-06-19

- **added** — `GET /v2/tickers/{ticker}/bars/{interval}` — OHLCV bars at `1s`, `1m`, `5m`, `15m`, `30m`, `1h`, `1d`. Single symbol or comma-separated bulk (response keyed by symbol). Paging via `before` + `limit` (with `cursor`/`next_cursor` as sugar); `asof` returns a single point-in-time bar. `1d`/`1h` cover the full universe with full history; sub-hour covers the active universe and back-fills from the provider on first request. Available on every plan, all intervals.
- **added** — `1s` (1-second) interval on the bars endpoint, served on demand: from our store when present, otherwise passed through from the provider in the same call. Second data is not bulk-backfilled — it accumulates as requested. Best paired with a tight `before`+`limit` window.

## v2.5.0 — 2026-06-04

- **added** — `POST /v2/tickers/{ticker}/subscribe`, `POST /v2/signals/{signal}/subscribe`, and `POST /v2/scan/subscribe` — subscribe to a webhook directly from the resource you want to watch. The new endpoints all return the same webhook record shape; `/v2/webhooks` becomes a pure registry for listing, inspecting, deleting, and re-enabling subscriptions.
- **removed** — `POST /v2/webhooks` — replaced by the resource-level subscribe endpoints above. Existing webhooks created via the old path keep firing unchanged.
- **removed** — `/v2/rules` — saved-bundle layer retired. Inline the `q` directly on `/v2/scan` or on a subscribe endpoint; reference a universe via `?universe=<slug>` instead of bundling it.
- **added** — `?asof=` is now uniform across every read: `/v2/tickers/{ticker}?asof=`, `/v2/signals/{signal}?asof=`, `/v2/scan?asof=`. Returns the universe as it stood at the close of the requested day, sourced from `signal_daily_state`. `_meta.frozen_fields` lists columns that aren't historized (sector, industry, exchange, asset_type).
- **changed** — Every paid plan now ships full all-time history on every read, unlimited universes, and unlimited webhooks. The Hobby → Pro upgrade is webhook cadence (5-minute → 1-minute). The Pro → Scale upgrade is content (premium signals, news archive, custom signals).
- **changed** — News archive (`/v2/news/scan`) moved to Scale and above (previously Pro). The live `news_volume` and `news_volume_weighted_sentiment` columns on `/v2/tickers` and `/v2/scan` remain available on every paid plan.
- **changed** — Custom signals (`POST/PATCH/DELETE /v2/signals/{name}`) moved to Scale and above. The unified `/v2/signals` catalog remains readable on every plan.
- **changed** — Webhook visibility is account-scoped: every API key on the same account sees the same webhook registry. Rotating a key no longer strands subscriptions.

## v2.4.0 — 2026-06-02

- **changed** — Free trial no longer requires a credit card. New signups are placed on Hobby for 14 days; an API key is minted from the dashboard checklist with no Stripe interaction. Add a payment method anytime to keep going past the trial.
- **changed** — `/onboarding` retired. The dashboard is now the unified post-signup landing — trial countdown, account-status banner, and onboarding checklist all live there. Stripe Checkout success and cancel URLs now point back to `/dashboard` and `/dashboard/billing`.
- **added** — `402 trial_ended` error code (was `subscription_required`) returned by `/v2/*` when a no-card trial has expired. Body message links to `/dashboard/billing` to add a payment method.

## v2.3.0 — 2026-06-01

- **added** — Custom (expression) signals — name a SQL `WHERE`-clause expression once, then reference it as a bare identifier in any predicate context (scan `q`, another custom signal's `expr`, webhook subscribe body). Compiles + inlines at create time; recursion is detected and capped at depth 5. CRUD: `POST /v2/signals`, `GET /v2/signals` (unified catalog of built-ins + your customs), `PATCH/DELETE /v2/signals/{name}`. Cascade-safe delete refuses with 409 `signal_referenced` (carries `referencing_signals` array) — pass `?force=true` to override.
- **added** — `GET /v2/signals/{name}/{ticker}/events` — occurrence records (start/end timestamps + start/end prices) for a single signal on a single ticker. State-style signals return windowed regions; event-style signals return point events. Drives the dashboard chart's flag-overlay rail.
- **changed** — Hobby now includes full per-ticker history and historical scans (previously live-data only). Rate limit on Hobby raised from 60 to 600 req/min.
- **changed** — Premium signals now available on Pro and above (previously Scale and above). When premium-flagged columns ship, Pro users get them included.
- **changed** — The demo ticker (AAPL) now bypasses the plan top-N scope filter on every plan, so the public docs and the per-signal reference page render without auth on every tier.

## v2.2.1 — 2026-05-26

- **changed** — `GET/POST /v2/news/scan` replaces the original `/v2/news` + `/v2/news/{id}` pair. One SQL-style endpoint, two shapes — article rows by default, aggregate rollups when `group_by` is supplied. Auto-joins `UNNEST(tickers) AS tk` whenever any clause references the `tk` alias. "As-of" is just a WHERE filter on `time_published`; no separate parameter.
- **changed** — News archive access now requires Pro or above (was Hobby). The two live news columns on the ticker table (`news_volume`, `news_volume_weighted_sentiment`) remain available on every paid plan via `/v2/scan` and `/v2/tickers`.
- **added** — `/v2/sandbox/news/scan` — unauthenticated, IP-rate-limited mirror of the scan endpoint, capped at 50 rows.

## v2.2.0 — 2026-05-25

- **added** — `GET /v2/news` — paginated, filterable news feed. Articles indexed back to 2015, refreshed every 15 minutes. Filterable by `tickers`, `topics`, time range, `min_relevance`, `min_sentiment`/`max_sentiment`. Hobby and above; per-call cap 50/200/1000 by plan. (Superseded the next day by `/v2/news/scan`.)
- **added** — `GET /v2/news/{id}` — fetch a single article by id. (Superseded the next day by `/v2/news/scan`.)
- **added** — Two new fields on the ticker schema: `news_volume` (24-hour rolling count of mentions at relevance ≥ 0.6) and `news_volume_weighted_sentiment` (relevance-weighted average sentiment, attenuated by tanh(volume/15) so quiet tickers read near zero). Both refresh every 15 minutes. Queryable through `/v2/scan` and `/v2/tickers`.
- **removed** — The four previously-stale news columns on `ticker` (`latest_news_at`, `recent_news_count`, `highly_relevant_news_count`, `news_sentiment_volatility`) have been removed. They were never reliably populated; the new two-field design above supersedes them.

## v2.1.1 — 2026-05-18

- **removed** — Free tier removed. Every plan (Hobby, Pro, Scale) now starts with a 14-day free trial; cancel anytime.

## v2.1.0 — 2026-05-14

- **added** — `/v2/universes` — create and manage named ticker lists. System universes `top_10` and `top_100` (rebalanced monthly by dollar volume) are available to every account.
- **added** — `/v2/rules` — save a `{q, universe_id?, order, dir, fields}` bundle and reference it from `/v2/scan?rule=` or `/v2/webhooks`.
- **added** — `?universe=` parameter on `/v2/scan`, `/v2/signals/{signal}`, and `/v2/tickers` — scope queries to a system or owned universe.
- **added** — `?asof=` on `/v2/scan` — folds the historical scan into the main scan endpoint. `/v2/scan/history` remains as a backwards-compatible alias.
- **added** — Webhook `cadence` field — pick `1m` / `5m` / `15m` / `hourly` / `nyse_open`. Default is the plan max.
- **added** — Webhook `rule_id` body field — subscribe to a saved rule instead of inlining `q`.
- **changed** — Free and Hobby plans now auto-scope ticker queries to the plan top-N (10 / 100). Response carries `_meta.scope` describing what got applied.
- **changed** — New pricing matrix: ticker scope, webhook cadence, max universes/rules/webhooks, premium signals (Scale+), and companion-app push (Hobby+). See /pricing for the full grid.

## v2.0.0 — 2026-05-13

- **changed** — API base path moves from `/v1` to `/v2`. v1 keeps working at its existing path for now; new integrations should use v2.
- **added** — `/v2/signals/{signal}` lists tickers where a signal matches. Numeric signals take a `?condition=` (e.g. `>70`); boolean flags are auto-detected.
- **added** — `/v2/signals/{signal}/{ticker}/history/{interval}` returns per-signal time-series at the requested resolution (`1d` / `1h` / `1m`). Daily history covers all-time; minute history is two years for top-200 tickers.
- **added** — `/v2/scan/history?asof=` snapshots the universe scan at any past date, as-of-that-day. Falls under the same SQL grammar as live `/v2/scan`.
- **added** — `/v2/tickers/{ticker}/history?asof=` returns the wide ticker row as it stood on a past date, with quarterly fundamentals (assets, equity, EPS…) joined in by filing date.
- **added** — `/v2/tickers/{ticker}/events` returns a unified event log: splits, dividends, analyst rating changes, all sorted newest-first with cursor pagination.
- **changed** — v2 uses scanner-native column names everywhere — the legacy v1 docs vocabulary (`day_change_pct`, `asset_type`) is gone in favor of `day_change_pc`, `type`. The full set is documented on the schema page.
- **changed** — Webhooks now live under `/v2/webhooks` with the same shape as `/v1/webhooks`. Existing v1 webhooks keep firing unchanged.

## v1.1.0 — 2026-05-11

- **added** — Free tier: live API key with no card on file. 10 req/min, 7 days of signal history, all query endpoints; no webhooks.
- **added** — Scale tier ($199/mo): 1,000 req/min, 1-year history, up to 100 webhook subscriptions, Slack Connect support.
- **changed** — Pricing: Pro replaces Core at $79/mo (down from $99), 500 req/min, 6-month history. Hobby now includes up to 3 webhook subscriptions.
- **added** — `/v1/signals/{ticker}/{signal}` enforces per-plan history depth. Requests with `from` older than the plan ceiling return `400 history_window_exceeded` with `max_history_days` + `earliest_allowed_from` in the response body.
- **changed** — Subscription cancellation falls back to Free instead of revoking API keys — your integration keeps working at Free-tier limits. Webhooks over the new tier limit are auto-disabled (config preserved); resubscribe to re-enable.
- **fixed** — `GET /v1/signals/{ticker}/{signal}` route now registered (previously returned 404 despite being documented).

## v1.0.0 — 2026-05-01

- **added** — Initial public release of the Tickerbot API. Four endpoints under /v1: tickers, signals, scan, webhooks.
- **added** — `GET /v1/tickers/{ticker}` and bulk `GET /v1/tickers?tickers=...` return the full curated ticker object.
- **added** — `GET /v1/signals/{ticker}/{signal}` returns time-series history: numeric bars, continuous-flag windows, or edge-flag triggers depending on the signal type.
- **added** — `GET/POST /v1/scan` accepts a SQL WHERE clause and returns matching tickers.
- **added** — `POST /v1/webhooks` creates a SQL-driven webhook that POSTs to your URL once per minute when new tickers enter the match set. State-change deduplication, HMAC-SHA256 signed deliveries, 5-attempt retry.
- **added** — 50+ boolean flags + ~50 numeric/string columns documented on the schema page.
- **added** — Coverage: ~12,000 US-listed equities and the top 100 cryptocurrencies by market cap.
