# Schema

253+ queryable fields and 123 pre-thresholded boolean flags per ticker, recomputed every minute. The same identifier is the field name on a ticker response, the column name in a SQL WHERE clause, the signal name on a history pull, the order/fields argument on a scan, and the condition body on a subscribe call.

For a machine-readable JSON dump, see https://tickerbot.io/api/schema.json.

## Fields

### Identification

| Name | Type | Cadence | Description |
|------|------|---------|-------------|
| `ticker` | string | Daily, post-close | Ticker symbol. Equities use the exchange symbol (e.g. AAPL). Crypto uses the bare symbol (e.g. BTC, ETH). |
| `name` | string | Daily, post-close | Company or asset display name. |
| `asset_type` | enum | Daily, post-close | Asset class. One of `equity`, `etf`, or `crypto`. |
| `active` | boolean | Daily, post-close | Whether this ticker is actively tracked. False for delisted or auto-halted symbols. |

### Price & change

| Name | Type | Cadence | Description |
|------|------|---------|-------------|
| `price` | number | Every 1 min, 4 AM–8 PM ET weekdays | Most recent trade price. |
| `previous_close` | number | Daily, post-close | Official prior-session close. |
| `session_open` | number | Every 1 min, 4 AM–8 PM ET weekdays | Today’s opening print. |
| `session_high` | number | Every 1 min, 4 AM–8 PM ET weekdays | Highest trade so far today. |
| `session_low` | number | Every 1 min, 4 AM–8 PM ET weekdays | Lowest trade so far today. |
| `day_change` | number | Every 1 min, 4 AM–8 PM ET weekdays | Absolute change vs `previous_close`. |
| `day_change_pct` | number | Every 1 min, 4 AM–8 PM ET weekdays | Percent change vs `previous_close`. Expressed as a percent (5.2 = 5.2%), not a fraction. |
| `gap_pct` | number | Every 1 min, 4 AM–8 PM ET weekdays | Percent change of `session_open` vs `previous_close`. One value per session. |
| `premarket_price` | number | Every 1 min, 4 AM–8 PM ET weekdays | Last premarket price, if available. |
| `afterhours_price` | number | Every 1 min, 4 AM–8 PM ET weekdays | Last after-hours price, if available. |
| `bid` | number | Every 1 min, 4 AM–8 PM ET weekdays | Best bid from Polygon’s consolidated NBBO at the most recent snapshot tick. |
| `bid_size` | integer | Every 1 min, 4 AM–8 PM ET weekdays | Round lots at the bid. Raw count — NOT multiplied by 100. Multiply by 100 to get share count. |
| `ask` | number | Every 1 min, 4 AM–8 PM ET weekdays | Best ask from Polygon’s consolidated NBBO at the most recent snapshot tick. |
| `ask_size` | integer | Every 1 min, 4 AM–8 PM ET weekdays | Round lots at the ask. Raw count — NOT multiplied by 100. |
| `change_1w` | number | Daily, post-close | Percent change in close vs. the close 5 trading days ago. Computed post-close; does NOT update intraday — use `from_open_pc` + `day_change_pct` for intraday-aware change. |
| `change_1m` | number | Daily, post-close | Percent change vs. close ~21 trading days ago. Daily; see `change_1w` for note. |
| `change_3m` | number | Daily, post-close | Percent change vs. close ~63 trading days ago. |
| `change_6m` | number | Daily, post-close | Percent change vs. close ~126 trading days ago. |
| `change_1y` | number | Daily, post-close | Percent change vs. close ~252 trading days ago. |
| `change_ytd` | number | Daily, post-close | Percent change since the first trading day of the calendar year. |
| `from_open_pc` | number | Every 1 min, 4 AM–8 PM ET weekdays | Intraday: percent change from today’s session open to the latest snapshot price. Resets at session boundary. |
| `premarket_change_pc` | number | Every 1 min, 4 AM–8 PM ET weekdays | Pre-market: percent change from the previous session close to the latest pre-market print. Resets at session boundary. |
| `prev_day_open` | number | Daily, post-close | Previous trading day’s official open. |
| `prev_day_high` | number | Daily, post-close | Previous trading day’s session high. |
| `prev_day_low` | number | Daily, post-close | Previous trading day’s session low. |
| `prev_day_volume` | integer | Daily, post-close | Previous trading day’s total volume (raw shares). |
| `prev_day_vwap` | number | Daily, post-close | Previous trading day’s session VWAP. |
| `min_open` | number | Every 1 min, 4 AM–8 PM ET weekdays | Current minute bar’s open. Updates every snapshot tick during market hours. |
| `min_high` | number | Every 1 min, 4 AM–8 PM ET weekdays | Current minute bar’s running high. |
| `min_low` | number | Every 1 min, 4 AM–8 PM ET weekdays | Current minute bar’s running low. |
| `min_close` | number | Every 1 min, 4 AM–8 PM ET weekdays | Current minute bar’s most-recent close (last print). |
| `min_vwap` | number | Every 1 min, 4 AM–8 PM ET weekdays | Current minute bar’s volume-weighted average price. |
| `min_volume` | integer | Every 1 min, 4 AM–8 PM ET weekdays | Current minute bar’s accumulated shares traded. |
| `min_trade_count` | integer | Every 1 min, 4 AM–8 PM ET weekdays | Current minute bar’s number of trades. |
| `min_dollar_volume` | number | Every 1 min, 4 AM–8 PM ET weekdays | Current minute bar’s dollar volume (close × volume approximation). |
| `min_day_accumulated_volume` | integer | Every 1 min, 4 AM–8 PM ET weekdays | Today’s cumulative shares traded across the session so far (4 AM ET onward). |
| `min_day_accumulated_dollar_volume` | number | Every 1 min, 4 AM–8 PM ET weekdays | Today’s cumulative dollar volume across the session so far. |
| `gap` | number | Daily, post-close | Overnight gap as percent: `(today_open − prev_close) / prev_close`. Signed — positive = gap up, negative = gap down. Use this for custom gap thresholds; the boolean shortcuts `gap_up` (≥3%) and `gap_up_extreme` (≥10%) cover the canonical levels. |
| `days_up` | integer | Daily, post-close | Consecutive trading days closing higher than the prior close. Resets to 0 on a down day. |
| `days_down` | integer | Daily, post-close | Consecutive trading days closing lower than the prior close. Resets to 0 on an up day. |
| `afterhours_change_pc` | number | Every 1 min, 4 AM–8 PM ET weekdays | Percent change between regular-session close and most recent after-hours print. Sparse — most equities don't trade in after-hours, and the column updates only when a print actually happens. |

### Volume

| Name | Type | Cadence | Description |
|------|------|---------|-------------|
| `volume_today` | integer | Every 1 min, 4 AM–8 PM ET weekdays | Shares traded so far today. |
| `avg_volume_10d` | integer | Daily, post-close | 10-day trailing average daily volume. |
| `avg_volume_30d` | integer | Daily, post-close | 30-day trailing average daily volume. |
| `relative_volume` | number | Every 1 min, 4 AM–8 PM ET weekdays | Ratio of today’s pace-adjusted volume to the 10-day average. 2.0 means 2× normal. |
| `day_dollar_volume` | number | Every 1 min, 4 AM–8 PM ET weekdays | Today’s cumulative dollar volume traded. |
| `day_vwap` | number | Every 1 min, 4 AM–8 PM ET weekdays | Today’s session volume-weighted average price. |
| `options_volume` | integer | Every 1 min, 4 AM–8 PM ET weekdays | Today’s options contract volume across all listed strikes and expiries for the underlying. Calls + puts combined. |
| `volume_change_vs_avg` | number | Every 1 min, 4 AM–8 PM ET weekdays | Ratio of today’s pace-adjusted volume to its 10-day average. Numeric surface of the same denominator `relative_volume` uses. |
| `volume_ratio_5min` | number | Every 1 min, 4 AM–8 PM ET weekdays | Current 5-minute window’s share volume divided by the 10-day average of that 5-minute window. Detects intraday-localized bursts. |
| `volume_trend_5d` | number | Daily, post-close | Slope of daily volume regressed over the last 5 trading days. Positive = building, negative = drying. |
| `days_to_cover` | number | Every 15 min | Short interest divided by 30-day average daily volume. Trader’s "how many days of normal trading to cover all shorts" measure. |
| `short_interest` | integer | Every 15 min | Raw shares-shorted count as last reported (FINRA bi-monthly). Pair with `short_interest_settlement_date` (profile.ts) for the as-of date. |
| `short_percent_of_float` | number | Every 15 min | Short interest as a fraction of the free float. 0.10 = 10% of float is short. |
| `illiquid` | boolean | Daily, post-close | Classification: `avg_volume_30d < 100k shares OR day_dollar_volume < $1M`. Useful to exclude micro-caps from scans. Boolean form proper belongs in flags.ts under `classification`; numeric thresholds documented here. |
| `high_short_interest` | boolean | Every 15 min | Classification: `short_percent_of_float >= 0.15`. Boolean form belongs in flags.ts. |

### 52-week & period extremes

| Name | Type | Cadence | Description |
|------|------|---------|-------------|
| `high_52w` | number | Every 1 min, 4 AM–8 PM ET weekdays | Highest trade in the trailing 52 weeks (live, includes today). |
| `low_52w` | number | Every 1 min, 4 AM–8 PM ET weekdays | Lowest trade in the trailing 52 weeks (live, includes today). |
| `high_20d` | number | Every 1 min, 4 AM–8 PM ET weekdays | Highest trade in the trailing 20 trading days. |
| `low_20d` | number | Every 1 min, 4 AM–8 PM ET weekdays | Lowest trade in the trailing 20 trading days. |
| `days_since_52w_high` | integer | Daily, post-close | Trading days since the most recent 52-week high. |
| `days_since_52w_low` | integer | Daily, post-close | Trading days since the most recent 52-week low. |
| `high_5d` | number | Every 1 min, 4 AM–8 PM ET weekdays | Highest intraday high over the last 5 trading sessions, inclusive of the current session. |
| `low_5d` | number | Every 1 min, 4 AM–8 PM ET weekdays | Lowest intraday low over the last 5 trading sessions, inclusive of the current session. |
| `high_5d_eod` | number | Daily, post-close | Highest close over the last 5 trading sessions. Close-basis (no intraday wicks) — pair with `high_5d` to distinguish. |
| `low_5d_eod` | number | Daily, post-close | Lowest close over the last 5 trading sessions. Close-basis. |
| `high_20d_eod` | number | Daily, post-close | Highest close over the last 20 trading sessions. Close-basis. For the intraday-wick variant use `at_20d_high`. |
| `low_20d_eod` | number | Daily, post-close | Lowest close over the last 20 trading sessions. Close-basis. |
| `high_52w_eod` | number | Daily, post-close | Highest close over the trailing 52 weeks. The `_eod` distinguishes from the canonical intraday `52_week_high` (which captures wicks). |
| `low_52w_eod` | number | Daily, post-close | Lowest close over the trailing 52 weeks. |
| `high_52w_date` | date | On corporate event | Date the trailing-52-week high was set. Useful for "fresh 52w highs in the last 30 days" scans. |
| `low_52w_date` | date | On corporate event | Date the trailing-52-week low was set. |
| `last_20d_high_date` | date | On corporate event | Date the trailing-20-day high was set. |
| `last_20d_low_date` | date | On corporate event | Date the trailing-20-day low was set. |

### Relative position

| Name | Type | Cadence | Description |
|------|------|---------|-------------|
| `pct_from_sma_10` | number | Every 1 min, 4 AM–8 PM ET weekdays | Percent difference between current close and `sma_10`. Positive = above MA, negative = below. Continuous version of the `above_sma_10` boolean. |
| `pct_from_sma_20` | number | Every 1 min, 4 AM–8 PM ET weekdays | Percent difference between current close and `sma_20`. Continuous version of the `above_sma_20` boolean. |
| `pct_from_sma_100` | number | Daily, post-close | Percent difference between current close and `sma_100`. Daily-cadence because the slow MA changes slowly. |
| `pct_from_52w_high` | number | Every 1 min, 4 AM–8 PM ET weekdays | Percent below the 52-week high. Always >= 0 (use the `at_52w_high` flag to test highs). |
| `pct_from_52w_low` | number | Every 1 min, 4 AM–8 PM ET weekdays | Percent above the 52-week low. Always >= 0. |
| `position_in_52w_range` | number | Every 1 min, 4 AM–8 PM ET weekdays | Where the live price sits in the 52-week range, 0–100. 0 = at low, 100 = at high. |
| `pct_from_sma_50` | number | Every 1 min, 4 AM–8 PM ET weekdays | Percent distance from the 50-day SMA. Negative when price is below the average. |
| `pct_from_sma_200` | number | Every 1 min, 4 AM–8 PM ET weekdays | Percent distance from the 200-day SMA. Negative when price is below the average. |
| `pct_from_vwap` | number | Every 1 min, 4 AM–8 PM ET weekdays | Percent distance from today’s VWAP. |

### Volatility

| Name | Type | Cadence | Description |
|------|------|---------|-------------|
| `atr_14` | number | Daily, post-close | 14-day Average True Range. |
| `atr_percent` | number | Every 1 min, 4 AM–8 PM ET weekdays | ATR(14) as a percent of price. Useful as a volatility filter. |
| `bollinger_pct_b` | number | Every 1 min, 4 AM–8 PM ET weekdays | Position within Bollinger bands. 0 = at lower band, 1 = at upper band, >1 = outside. |
| `bollinger_middle` | number | Daily, post-close | 20-day SMA — the centerline of the Bollinger band. `bollinger_upper` and `bollinger_lower` are already documented; this fills in the missing middle. |
| `bollinger_width` | number | Daily, post-close | `(bollinger_upper − bollinger_lower) / bollinger_middle`. Normalized width — measures volatility regime. Narrow widths often precede expansion (see `bollinger_squeeze` in flags.ts). |
| `vwap_upper_band` | number | Every 1 min, 4 AM–8 PM ET weekdays | VWAP + 2 standard deviations of intraday price action. Dynamic resistance reference. |
| `vwap_lower_band` | number | Every 1 min, 4 AM–8 PM ET weekdays | VWAP − 2 standard deviations. Dynamic support reference. |

### Technical indicators

| Name | Type | Cadence | Description |
|------|------|---------|-------------|
| `vwap` | number | Every 1 min, 4 AM–8 PM ET weekdays | Daily volume-weighted average price from market open through the most recent print. Updates intraday with each new tick. |
| `sma_100` | number | Daily, post-close | 100-day simple moving average of close. Slower than `sma_50`, faster than `sma_200` — useful for intermediate-term trend. |
| `ema_9` | number | Daily, post-close | 9-day exponential moving average of close. Most-recent-weighted; reacts faster than the same-period SMA. Commonly paired with `ema_21` for short-trend bias. |
| `ema_12` | number | Daily, post-close | 12-day EMA. Fast-side input of canonical MACD (`macd = ema_12 − ema_26`). |
| `ema_21` | number | Daily, post-close | 21-day EMA. Often paired with `ema_9` for short-trend bias; also serves as a dynamic-support reference. |
| `ema_26` | number | Daily, post-close | 26-day EMA. Slow-side input of canonical MACD (`macd = ema_12 − ema_26`). |
| `sma_10_crossed_above_50_today` | boolean | Daily, post-close | Bullish short-trend trigger: `sma_10` crossed above `sma_50` on today’s close. One-day event flag (not sticky); resets next session. Faster cousin of `golden_cross` (which is the 50/200 pair). |
| `sma_10_crossed_below_50_today` | boolean | Daily, post-close | Bearish short-trend trigger: `sma_10` crossed below `sma_50` on today’s close. One-day event flag (not sticky); resets next session. Faster cousin of `death_cross`. |
| `sma_10` | number | Daily, post-close | 10-day simple moving average. |
| `sma_20` | number | Daily, post-close | 20-day simple moving average. |
| `sma_50` | number | Daily, post-close | 50-day simple moving average. |
| `sma_200` | number | Daily, post-close | 200-day simple moving average. |
| `rsi_14` | number | Every 1 min, 4 AM–8 PM ET weekdays | Relative Strength Index, 14-period. Range 0–100. |
| `macd_line` | number | Every 1 min, 4 AM–8 PM ET weekdays | MACD line (12-EMA minus 26-EMA). |
| `macd_signal` | number | Every 1 min, 4 AM–8 PM ET weekdays | MACD signal line (9-EMA of MACD line). |
| `macd_histogram` | number | Every 1 min, 4 AM–8 PM ET weekdays | MACD line minus signal. Positive when bullish, negative when bearish. |
| `bollinger_upper` | number | Every 1 min, 4 AM–8 PM ET weekdays | Upper Bollinger band (20-period, 2σ). |
| `bollinger_lower` | number | Every 1 min, 4 AM–8 PM ET weekdays | Lower Bollinger band (20-period, 2σ). |
| `trend_short` | enum | Daily, post-close | Short-term trend classification from short-MA slope. One of `uptrend`, `downtrend`, `sideways`. |
| `trend_medium` | enum | Daily, post-close | Medium-term trend classification from `sma_50` slope. One of `uptrend`, `downtrend`, `sideways`. |
| `trend_long` | enum | Daily, post-close | Long-term trend classification from `sma_200` slope. One of `uptrend`, `downtrend`, `sideways`. |

### Fundamentals

| Name | Type | Cadence | Description |
|------|------|---------|-------------|
| `market_cap` | number | Daily, post-close | Market capitalization. Updated daily; intraday change derived from `price` × `shares_outstanding`. |
| `pe_ratio` | number | Quarterly, after issuer files | Price-to-earnings ratio (trailing twelve months). Null for unprofitable issuers. |
| `eps` | number | Quarterly, after issuer files | Earnings per share (trailing twelve months). |
| `dividend_yield` | number | Daily, post-close | Forward dividend yield as a fraction (0.025 = 2.5%). Null for non-payers. |
| `beta` | number | Daily, post-close | Trailing beta vs SPY. Null for issuers with insufficient price history. |
| `float_shares` | integer | Daily, post-close | Public float (shares available to trade). |
| `shares_outstanding` | integer | Daily, post-close | Total shares outstanding. |
| `next_eps_estimate` | number | Daily, post-close | Wall Street consensus EPS estimate for the next reported quarter — weighted average across analyst contributors. |
| `next_eps_estimate_high` | number | Daily, post-close | Highest single-analyst EPS estimate for the next reported quarter. |
| `next_eps_estimate_low` | number | Daily, post-close | Lowest single-analyst EPS estimate for the next reported quarter. |
| `next_revenue_estimate` | integer | Daily, post-close | Wall Street consensus revenue estimate (USD, full dollars) for the next reported quarter. |
| `eps_estimate_revision_up_30d` | integer | Daily, post-close | Count of analysts who raised their next-quarter EPS estimate in the last 30 days. A positive read on forward sentiment momentum. |
| `eps_estimate_revision_down_30d` | integer | Daily, post-close | Count of analysts who lowered their next-quarter EPS estimate in the last 30 days. |
| `earnings_growth_yoy` | number | Daily, post-close | Year-over-year EPS growth percent from the most recently reported quarter vs. the same quarter prior year. Signed; positive = growth. |
| `revenues` | number | Quarterly, after issuer files | Total revenue for the most-recently reported quarter (Polygon `/stocks/financials/v1/income-statements`). |
| `revenue_ttm` | number | Daily, post-close | Trailing-twelve-month revenue (AlphaVantage-sourced). |
| `revenue_per_share_ttm` | number | Daily, post-close | Trailing-12m revenue divided by diluted shares outstanding. USD per share. |
| `revenue_growth_yoy` | number | Quarterly, after issuer files | Year-over-year revenue growth: most-recent quarter vs same quarter prior year. Signed; positive = growth. |
| `revenue_growth_yoy_quarterly` | number | Daily, post-close | YoY quarterly revenue growth from AlphaVantage. Signed. |
| `cost_of_revenue` | number | Quarterly, after issuer files | Cost of goods sold for the quarter. |
| `gross_profit` | number | Quarterly, after issuer files | `revenues − cost_of_revenue` for the quarter. |
| `gross_profit_ttm` | number | Daily, post-close | Trailing-12m gross profit (AlphaVantage). |
| `operating_expenses` | number | Quarterly, after issuer files | Sum of operating costs reported on the income statement for the quarter (excludes COGS). |
| `operating_income_loss` | number | Quarterly, after issuer files | Operating income or loss for the quarter. Signed. |
| `costs_and_expenses` | number | Quarterly, after issuer files | Total costs and expenses reported on the income statement (COGS + opex). |
| `selling_general_and_administrative_expenses` | number | Quarterly, after issuer files | SG&A for the quarter. |
| `research_and_development` | number | Quarterly, after issuer files | R&D spend for the quarter. NULL for companies that don't report R&D as a line item. |
| `wages` | number | Quarterly, after issuer files | Wages and salaries line item, where reported. Rare — most companies fold this into SG&A. |
| `benefits_costs_expenses` | number | Quarterly, after issuer files | Benefits and post-employment costs line item, where reported. Mostly insurance / utility issuers. |
| `nonoperating_income_loss` | number | Quarterly, after issuer files | Non-operating income/loss (interest income, gains/losses on investments, etc.) for the quarter. Signed. |
| `income_tax_expense_benefit` | number | Quarterly, after issuer files | Income tax expense (positive) or benefit (negative) for the quarter. |
| `income_tax_expense_benefit_deferred` | number | Quarterly, after issuer files | Deferred portion of income tax. Rare line item. |
| `income_loss_from_continuing_operations_before_tax` | number | Quarterly, after issuer files | Pre-tax income from continuing operations for the quarter. |
| `income_loss_from_continuing_operations_after_tax` | number | Quarterly, after issuer files | After-tax income from continuing operations for the quarter. |
| `net_income_loss` | number | Quarterly, after issuer files | Bottom-line net income/loss for the quarter. Signed. |
| `net_income_loss_attributable_to_parent` | number | Quarterly, after issuer files | Net income attributable to the parent entity (excludes noncontrolling interest). |
| `net_income_loss_attributable_to_noncontrolling_interest` | number | Quarterly, after issuer files | Portion of net income attributable to minority owners of consolidated subsidiaries. Usually 0 for non-conglomerates. |
| `net_income_loss_available_to_common_stockholders_basic` | number | Quarterly, after issuer files | Net income available to common shareholders — numerator for basic EPS. |
| `preferred_stock_dividends_and_other_adjustments` | number | Quarterly, after issuer files | Preferred-share dividends and other adjustments subtracted from net income to arrive at the common-stockholder figure. |
| `participating_securities_distributed_and_undistributed_earnings` | number | Quarterly, after issuer files | Earnings allocated to participating securities (convertible-debt issuers, certain RSU structures). |
| `basic_average_shares` | integer | Quarterly, after issuer files | Weighted-average basic shares outstanding for the quarter. Denominator for basic EPS. |
| `basic_earnings_per_share` | number | Quarterly, after issuer files | Basic EPS for the most-recently reported quarter. Signed. |
| `diluted_average_shares` | integer | Quarterly, after issuer files | Weighted-average diluted shares outstanding for the quarter. Denominator for diluted EPS. |
| `diluted_eps_ttm` | number | Daily, post-close | Trailing-12m diluted EPS (AlphaVantage). |
| `weighted_shares_outstanding` | integer | Quarterly, after issuer files | Weighted shares outstanding from the latest 10-Q / 10-K. Used by `market_cap = price × weighted_shares_outstanding`. |
| `ebitda` | number | Daily, post-close | Earnings before interest, taxes, depreciation, and amortization (AlphaVantage, TTM). |
| `enterprise_value` | number | Daily, post-close | Market cap + total debt − cash. |
| `assets` | number | Quarterly, after issuer files | Total assets on the balance sheet as of the most recently reported quarter. |
| `current_assets` | number | Quarterly, after issuer files | Assets expected to be converted to cash or used up within 12 months. |
| `noncurrent_assets` | number | Quarterly, after issuer files | Long-lived assets — property, plant, equipment, intangibles, long-term investments. |
| `fixed_assets` | number | Quarterly, after issuer files | Property, plant, and equipment (PP&E), net of accumulated depreciation. |
| `inventory` | number | Quarterly, after issuer files | Inventory on hand. NULL for service and financial companies that don't carry inventory. |
| `other_current_assets` | number | Quarterly, after issuer files | Current assets not separately broken out (prepaid expenses, short-term receivables, etc.). |
| `other_noncurrent_assets` | number | Quarterly, after issuer files | Non-current assets not separately broken out (intangibles, deferred tax assets, etc.). |
| `cash_on_hand` | number | Quarterly, after issuer files | Cash plus cash equivalents — the most-liquid balance-sheet line. |
| `liabilities` | number | Quarterly, after issuer files | Total liabilities on the balance sheet. |
| `current_liabilities` | number | Quarterly, after issuer files | Liabilities due within 12 months — accounts payable, short-term debt, accrued expenses. |
| `noncurrent_liabilities` | number | Quarterly, after issuer files | Liabilities due beyond 12 months — long-term debt, deferred taxes, pension obligations. |
| `other_current_liabilities` | number | Quarterly, after issuer files | Current liabilities not separately broken out. |
| `accounts_payable` | number | Quarterly, after issuer files | Trade payables to suppliers as of the quarter end. |
| `long_term_debt` | number | Quarterly, after issuer files | Long-term debt obligations. Often NULL because issuers fold this into `noncurrent_liabilities` instead of breaking it out. |
| `equity` | number | Quarterly, after issuer files | Total shareholders' equity. |
| `equity_attributable_to_parent` | number | Quarterly, after issuer files | Equity attributable to the parent entity's shareholders (excludes minority interest). |
| `equity_attributable_to_noncontrolling_interest` | number | Quarterly, after issuer files | Equity attributable to minority shareholders of consolidated subsidiaries. Usually 0 for non-conglomerates. |
| `book_value` | number | Daily, post-close | Trailing-12m book value per share (AlphaVantage). Computed from `equity_attributable_to_parent / diluted_average_shares`. |
| `debt_to_equity` | number | Quarterly, after issuer files | Total debt divided by total shareholders' equity. Common leverage ratio; lower = less leveraged. |
| `current_ratio` | number | Daily, post-close | Current assets ÷ current liabilities. Short-term liquidity. >1 = able to cover short-term obligations from current assets. |
| `quick_ratio` | number | Daily, post-close | (Current assets − inventory) ÷ current liabilities. Stricter liquidity — assumes inventory isn't quickly convertible. |
| `free_cash_flow` | number | Daily, post-close | Operating cash flow minus capital expenditures. Cash the business generates above what it needs to maintain operations. |
| `forward_pe` | number | Daily, post-close | Forward price-to-earnings ratio using next-12m consensus EPS. Lower = cheaper on forward basis. |
| `peg_ratio` | number | Daily, post-close | PE ratio divided by EPS growth rate (AlphaVantage). Few populated — AlphaVantage only computes PEG for tickers with positive earnings growth and analyst coverage. |
| `price_to_book` | number | Daily, post-close | Current price ÷ `book_value`. Common value-investing metric. |
| `price_to_sales` | number | Daily, post-close | Current price ÷ `revenue_per_share_ttm`. Often used when companies have no earnings. |
| `price_to_cash_flow` | number | Daily, post-close | Current price ÷ operating cash flow per share. Less manipulable than P/E. |
| `price_to_free_cash_flow` | number | Daily, post-close | Current price ÷ `free_cash_flow` per share. Strictest cash-based valuation. |
| `ev_to_ebitda` | number | Daily, post-close | `enterprise_value` ÷ `ebitda`. Capital-structure-neutral profitability multiple. |
| `ev_to_sales` | number | Daily, post-close | `enterprise_value` ÷ `revenue_ttm`. Capital-structure-neutral revenue multiple. |
| `return_on_equity` | number | Daily, post-close | Net income ÷ shareholders' equity. Quarterly figure. |
| `return_on_equity_ttm` | number | Daily, post-close | Trailing-12m return on equity (AlphaVantage). |
| `return_on_assets` | number | Daily, post-close | Net income ÷ total assets. Quarterly figure. |
| `return_on_assets_ttm` | number | Daily, post-close | Trailing-12m return on assets (AlphaVantage). |
| `profit_margin` | number | Daily, post-close | Net income ÷ revenue. Quarterly. |
| `profit_margin_ttm` | number | Daily, post-close | Trailing-12m profit margin (AlphaVantage). |
| `free_float_percent` | number | Daily, post-close | Percent of shares outstanding actually available for trading (excludes insider / restricted holdings). |
| `percent_insiders` | number | Daily, post-close | Percent of shares held by company insiders (executives, directors, founders). |
| `percent_institutions` | number | Daily, post-close | Percent of shares held by institutional investors (mutual funds, ETFs, pensions). |
| `net_cash_flow_from_operating_activities` | number | Daily, post-close | Net cash from operations for the quarter. |
| `net_cash_flow_from_investing_activities` | number | Daily, post-close | Net cash from investing activities (capex, acquisitions). Negative for net spend. |
| `net_cash_flow_from_financing_activities` | number | Daily, post-close | Net cash from financing (debt, dividends, buybacks). |
| `net_cash_flow` | number | Daily, post-close | Sum of operating + investing + financing cash flow — period change in cash. |
| `net_cash_flow_from_operating_activities_continuing` | number | Daily, post-close | Same as `net_cash_flow_from_operating_activities` but excludes discontinued operations. |
| `net_cash_flow_from_investing_activities_continuing` | number | Daily, post-close | Investing cash flow excluding discontinued operations. |
| `net_cash_flow_from_financing_activities_continuing` | number | Daily, post-close | Financing cash flow excluding discontinued operations. |
| `net_cash_flow_continuing` | number | Daily, post-close | Total cash flow excluding discontinued operations. Rare line item — populated only for companies in active discontinued-ops winddown. |
| `gross_margin` | number | Daily, post-close | `gross_profit / revenues` for the quarter. |
| `operating_margin` | number | Daily, post-close | `operating_income_loss / revenues` for the quarter. |
| `operating_margin_ttm` | number | Daily, post-close | Trailing-12m operating margin (AlphaVantage). |
| `liabilities_and_equity` | number | Quarterly, after issuer files | Total liabilities + total equity. Should equal `assets` (balance-sheet identity). Documented for completeness — useful as a sanity check rather than a scan target. |

### Classification

| Name | Type | Cadence | Description |
|------|------|---------|-------------|
| `sector` | enum | Daily, post-close | GICS sector. One of: Technology, Healthcare, Financials, Consumer Discretionary, Consumer Staples, Energy, Industrials, Materials, Utilities, Real Estate, Communication Services. |
| `industry` | string | Daily, post-close | GICS industry within the sector. |
| `etf_holders` | array | Daily, post-close | ETFs that hold this ticker, ordered by the ticker's weight within each (the reverse of ETF holdings). Filter with array operators in /v2/scan, e.g. `'SPY' = ANY(etf_holders)` to find SPY constituents. Refreshed nightly post-close. |
| `exchange` | enum | Daily, post-close | Listing exchange. One of `NYSE`, `NASDAQ`, `AMEX`, `OTC`, `CRYPTO`. |
| `country` | string | Daily, post-close | ISO country code of the issuer. |
| `cap_class` | enum | Daily, post-close | Market-capitalization tier. One of `nano` (<$50M), `micro` ($50M–$300M), `small` ($300M–$2B), `mid` ($2B–$10B), `large` ($10B–$200B), `mega` (≥$200B), or `unknown` when `market_cap` is null. Updates daily post-close as `market_cap` moves. Preferred over the legacy `nano_cap/micro_cap/small_cap/mid_cap/large_cap/mega_cap` boolean columns (which remain in sync as backward-compat shortcuts). |
| `total_employees` | integer | Daily, post-close | Number of full-time employees as last reported. Useful for size-based filters ("small-cap by employee count"). |
| `market` | enum | Daily, post-close | Asset market: `stocks`, `fx`, `crypto`, `commodities`. Distinct from `asset_type` (which says equity / etf). |
| `currency_name` | string | Daily, post-close | Currency the prices are quoted in (`usd`, `eur`, `gbp`, etc.). Effectively always `usd` for US-listed equities. |

### Event dates

| Name | Type | Cadence | Description |
|------|------|---------|-------------|
| `earnings_date` | date | On corporate event | Next scheduled earnings announcement date. Null if not scheduled. |
| `days_to_earnings` | integer | Daily, post-close | Calendar days until next earnings announcement. Negative after report. |
| `earnings_fiscal_quarter` | string | Daily, post-close | Fiscal quarter the next earnings report covers (e.g. "2026Q1"). Distinct from calendar quarter — covers companies whose fiscal year doesn't match the calendar. |
| `earnings_report_time` | enum | Daily, post-close | When in the trading day the next earnings will be reported. One of `BMO` (before market open), `AMC` (after market close), `DMH` (during market hours). |
| `earnings_beat_streak` | integer | Daily, post-close | Consecutive quarters the company has beaten consensus EPS estimates. Resets to 0 on a miss. |
| `last_reported_eps` | number | Daily, post-close | Actual EPS reported in the most recent earnings announcement. |
| `last_eps_estimate` | number | Daily, post-close | Consensus EPS estimate going into the most recent earnings announcement. |
| `last_earnings_surprise` | number | Daily, post-close | `last_reported_eps − last_eps_estimate`. Signed; positive = beat. |
| `last_earnings_surprise_pct` | number | Daily, post-close | Beat as percent of consensus. |
| `dividend` | number | On corporate event | Most-recent dividend amount per share. |
| `dividend_date` | date | On corporate event | Date of the most-recent dividend payment. |
| `dividend_frequency` | enum | On corporate event | Payment frequency: `quarterly`, `monthly`, `semiannual`, `annual`. |
| `ex_dividend_date` | date | On corporate event | Next ex-dividend date. |

### News

| Name | Type | Cadence | Description |
|------|------|---------|-------------|
| `news_volume` | number | Every 15 min | Count of news articles published in the last 24 hours mentioning this ticker with AlphaVantage relevance score ≥ 0.6. Refreshed every 15 minutes. Null when no qualifying articles in the window. |
| `news_volume_weighted_sentiment` | number | Every 15 min | Range -1.0 to +1.0. The relevance-weighted average sentiment of articles in the last 24 hours, attenuated by `tanh(news_volume / 15)` so quiet tickers (1-2 articles) read near zero regardless of sentiment sign. Strong negative = loud bad news; strong positive = loud good news; values near 0 = quiet or mixed. Null when no qualifying articles. |

### Analyst ratings

| Name | Type | Cadence | Description |
|------|------|---------|-------------|
| `analyst_consensus_rating` | enum | Daily, post-close | Consensus analyst rating across contributing firms. One of `strong buy`, `buy`, `hold`, `sell`, `strong sell`. NULL for tickers without analyst coverage. |
| `analyst_consensus_rating_value` | number | Daily, post-close | Consensus rating as a numeric score on the standard 1–5 scale (1 = strong buy, 5 = strong sell). Lower is more bullish. |
| `analyst_consensus_target_price` | number | Daily, post-close | Mean of contributing analysts' 12-month price targets. |
| `analyst_target_price_high` | number | Daily, post-close | Highest single-analyst 12-month price target across contributing firms. |
| `analyst_target_price_low` | number | Daily, post-close | Lowest single-analyst 12-month price target across contributing firms. |
| `analyst_target_upside_pct` | number | Every 1 min, 4 AM–8 PM ET weekdays | Implied upside from the current price to the consensus target, in percent. `(analyst_consensus_target_price - price) / price * 100`. Negative when price is above target. Recomputed every minute during market hours. |
| `analyst_count_strong_buy` | integer | Daily, post-close | Number of contributing firms rating the ticker as strong buy. |
| `analyst_count_buy` | integer | Daily, post-close | Number of contributing firms rating the ticker as buy. |
| `analyst_count_hold` | integer | Daily, post-close | Number of contributing firms rating the ticker as hold (neutral). |
| `analyst_count_sell` | integer | Daily, post-close | Number of contributing firms rating the ticker as sell. |
| `analyst_count_strong_sell` | integer | Daily, post-close | Number of contributing firms rating the ticker as strong sell. |
| `analyst_count_total` | integer | Daily, post-close | Total number of contributing firms covering the ticker with any rating. Sum of the five `analyst_count_*` buckets. `well_covered` fires when this is at least 10. |
| `analyst_count_with_target` | integer | Daily, post-close | Number of contributing firms whose rating includes a published 12-month price target. Always ≤ `analyst_count_total`. |
| `last_rating_date` | date | Every 15 min | Date of the most recent rating action across all firms covering the ticker. |
| `last_rating_firm` | string | Every 15 min | Name of the firm that issued the most recent rating action. |
| `last_rating_action` | enum | Every 15 min | Action taken in the most recent rating change. Common values: `upgrades`, `downgrades`, `initiates_coverage_on`, `maintains`, `reiterates`, `assumes`, `reinstates`, `suspends`. |

## Flags

### Moving averages

| Name | Firing | Kind | Summary |
|------|--------|------|---------|
| `above_sma_10` | Continuous | State | Price is above the 10-day simple moving average. |
| `above_sma_20` | Continuous | State | Price is above the 20-day simple moving average. |
| `above_sma_50` | Continuous | State | Price is above the 50-day simple moving average. |
| `above_sma_200` | Continuous | State | Price is above the 200-day simple moving average. |
| `above_vwap` | Continuous | State | Price is above today’s volume-weighted average price. |
| `golden_cross` | Sticky for session | Event | 50-day SMA crossed above 200-day SMA today. |
| `golden_regime` | Continuous | State | Long-term uptrend regime — 50-day SMA above 200-day SMA. |
| `death_cross` | Sticky for session | Event | 50-day SMA crossed below 200-day SMA today. |
| `death_regime` | Continuous | State | Long-term downtrend regime — 50-day SMA below 200-day SMA. |
| `macd_above_signal` | Continuous | State | MACD line is above its signal line. |
| `macd_below_signal` | Continuous | State | MACD line is below its signal line. |
| `above_vwap_minute` | Continuous | State | Current price above session VWAP. |

### Trend

| Name | Firing | Kind | Summary |
|------|--------|------|---------|
| `in_uptrend` | Continuous | State | Stacked uptrend across short, medium, and long horizons. |
| `in_downtrend` | Continuous | State | Stacked downtrend across short, medium, and long horizons. |
| `trend_reversal_bullish_today` | Sticky for session | Event | Trend flipped from down to up today. |
| `trend_reversal_bearish_today` | Sticky for session | Event | Trend flipped from up to down today. |

### 52-week & 20-day extremes

| Name | Firing | Kind | Summary |
|------|--------|------|---------|
| `at_52w_high` | Continuous | State | Price is within 0.5% of the 52-week high. |
| `at_52w_low` | Continuous | State | Price is within 0.5% of the 52-week low. |
| `at_20d_high` | Continuous | State | Price is at or above the 20-day high. |
| `at_20d_low` | Continuous | State | Price is at or below the 20-day low. |
| `approaching_52w_high` | Continuous | State | Price is within 5% of the 52-week high. |
| `approaching_52w_low` | Continuous | State | Price is within 5% of the 52-week low. |
| `tested_session_high_recent` | Continuous | State | Price touched today’s session high within the last 5 minutes. |
| `tested_session_low_recent` | Continuous | State | Price touched today’s session low within the last 5 minutes. |

### Session position

| Name | Firing | Kind | Summary |
|------|--------|------|---------|
| `above_session_open` | Continuous | State | Close above today’s session-open price. |
| `above_premarket_high` | Continuous | State | Close above the pre-market session high. |
| `below_premarket_low` | Continuous | State | Close below the pre-market session low. |
| `at_session_high` | Continuous | State | At today’s intraday session high (within tolerance). |
| `at_session_low` | Continuous | State | At today’s intraday session low (within tolerance). |
| `above_yesterday_close` | Continuous | State | Close above the prior session’s close. |
| `above_yesterday_high` | Continuous | State | Close above the prior session’s intraday high. |
| `below_yesterday_low` | Continuous | State | Close below the prior session’s intraday low. |

### Gaps

| Name | Firing | Kind | Summary |
|------|--------|------|---------|
| `gap_up` | Sticky for session | Event | Today opened 3%+ above prior close. |
| `gap_down` | Sticky for session | Event | Today opened 3%+ below prior close. |
| `gap_up_extreme` | Sticky for session | Event | Today opened 10%+ above prior close. |
| `gap_down_extreme` | Sticky for session | Event | Today opened 10%+ below prior close. |
| `gap_filled_today` | Sticky for session | Event | Today’s opening gap was closed by an intraday move. |

### Bollinger bands

| Name | Firing | Kind | Summary |
|------|--------|------|---------|
| `at_bollinger_upper` | Continuous | State | Price has reached the upper Bollinger band. |
| `at_bollinger_lower` | Continuous | State | Price has reached the lower Bollinger band. |
| `bollinger_squeeze` | Continuous | State | Bollinger band width compressed to a multi-week low — volatility is contracted. |
| `expanded_hourly_range` | Continuous | State | This hour’s range is unusually wide. |
| `narrow_hourly_range` | Continuous | State | This hour’s range is unusually narrow. |

### Volume

| Name | Firing | Kind | Summary |
|------|--------|------|---------|
| `high_volume_alert` | Sticky for session | Event | Today’s volume is at least 2× the 30-day average. |
| `low_volume_regime` | Continuous | State | This name is in a sustained quiet stretch. |
| `volume_burst_3x` | Continuous | Event | Current minute volume ≥ 3× recent average. |
| `volume_burst_5x` | Continuous | Event | Current minute volume ≥ 5× recent average. |
| `quiet_minute` | Continuous | State | A sustained quiet stretch — 10-minute volume average well below recent baseline. |

### Momentum

| Name | Firing | Kind | Summary |
|------|--------|------|---------|
| `rsi_overbought` | Continuous | State | RSI(14) is in overbought territory. |
| `rsi_oversold` | Continuous | State | RSI(14) is in oversold territory. |
| `momentum_strong_up` | Sticky for session | Event | Strong upward momentum across multiple measures. |
| `momentum_strong_down` | Sticky for session | Event | Strong downward momentum across multiple measures. |
| `momentum_exhaustion_up` | Sticky for session | Event | Upward momentum showing signs of exhaustion. |
| `momentum_exhaustion_down` | Sticky for session | Event | Downward momentum showing signs of exhaustion. |
| `three_up_hours` | Continuous | State | Three consecutive higher hourly closes. |
| `three_down_hours` | Continuous | State | Three consecutive lower hourly closes. |
| `morning_strength` | Sticky for session | State | First two hours of session net positive. |
| `afternoon_drift_up` | Sticky for session | State | Afternoon session net up. |
| `last_hour_rally` | Sticky for session | Event | Final hour of session net up. |
| `last_hour_selloff` | Sticky for session | Event | Final hour of session net down. |
| `held_above_vwap_30m` | Continuous | State | Price has stayed above session VWAP without dipping for at least 30 minutes. |
| `held_below_vwap_30m` | Continuous | State | Price has stayed below session VWAP without lifting for at least 30 minutes. |
| `microspike_up` | Continuous | Event | Single 1-minute candle return ≥ +1%. |
| `microspike_down` | Continuous | Event | Single 1-minute candle return ≤ −1%. |
| `rapid_move_up_5m` | Continuous | State | Price up more than +0.5% in the last 5 minutes. |
| `rapid_move_down_5m` | Continuous | State | Price down more than −0.5% in the last 5 minutes. |
| `opening_drive_up` | Sticky for session | Event | First 5 minutes of session up > +0.5%. |
| `opening_drive_down` | Sticky for session | Event | First 5 minutes of session down < −0.5%. |
| `pre_close_drift_up` | Sticky for session | Event | Last 10 minutes before close net up. |
| `pre_close_drift_down` | Sticky for session | Event | Last 10 minutes before close net down. |

### Support & resistance

| Name | Firing | Kind | Summary |
|------|--------|------|---------|
| `at_support` | Continuous | State | Price is testing a detected support level. |
| `at_resistance` | Continuous | State | Price is testing a detected resistance level. |

### Patterns

| Name | Firing | Kind | Summary |
|------|--------|------|---------|
| `range_expansion` | Sticky for session | Event | Today's true range > 2 × ATR(14) with volume — direction-agnostic regime-change tag. |
| `bounce_off_support` | Sticky for session | Event | Reversal off a detected support level. |
| `pullback` | Continuous | State | Pullback to the 20-day moving average within an uptrend. |
| `in_opening_range` | Continuous | State | Price is inside the first-hour high/low range. |
| `above_opening_range` | Continuous | State | Price is trading above the first 15-minute opening-range high. |
| `below_opening_range` | Continuous | State | Price is trading below the first 15-minute opening-range low. |
| `hourly_reversal_bullish` | Continuous | Event | Lower low, higher close than the prior hour. |
| `hourly_reversal_bearish` | Continuous | Event | Higher high, lower close than the prior hour. |
| `consolidating_15m` | Continuous | State | Last 15 minutes traded in a tight range. |
| `range_break_15m_up` | Continuous | Event | Broke above the prior 15-minute high. |
| `range_break_15m_down` | Continuous | Event | Broke below the prior 15-minute low. |
| `repeated_test_of_high` | Continuous | State | Tested today’s session high three or more times — failed-breakout setup. |
| `repeated_test_of_low` | Continuous | State | Tested today’s session low three or more times — failed-breakdown setup. |

### Edge-triggered alerts

| Name | Firing | Kind | Summary |
|------|--------|------|---------|
| `price_up_3pct` | Sticky for session | Event | Intraday move of 3%+ vs prior close. |
| `price_down_3pct` | Sticky for session | Event | Intraday move of -3% or worse vs prior close. |
| `pre_earnings_drift` | Continuous | State | Stock has moved ≥5% (absolute) over the trailing week with earnings within 7 days — a setup the literature shows often continues through the report. |
| `vwap_cross_up` | Sticky for session | Event | Crossed above session VWAP this minute. |
| `vwap_cross_down` | Sticky for session | Event | Crossed below session VWAP this minute. |

### Fundamentals

| Name | Firing | Kind | Summary |
|------|--------|------|---------|
| `small_cap` | Continuous | Classification | Market cap between $300M and $2B. |
| `mid_cap` | Continuous | Classification | Market cap between $2B and $10B. |
| `large_cap` | Continuous | Classification | Market cap between $10B and $200B. |
| `mega_cap` | Continuous | Classification | Market cap above $200B. |
| `value_stock` | Continuous | Classification | Trades at a value-style P/E. |
| `high_dividend_yield` | Continuous | Classification | Dividend yield above 4%. |
| `high_beta` | Continuous | Classification | Beta above 1.5: moves more than the market. |
| `low_float` | Continuous | Classification | Public float under 50 million shares. |
| `profitable` | Continuous | Classification | Most-recently-reported quarter had positive net income. |
| `profitable_estimate` | Continuous | Classification | Analyst consensus expects positive EPS for the upcoming report. |
| `loss_estimate` | Continuous | Classification | Analyst consensus expects negative EPS for the upcoming report. |

### Corporate events

| Name | Firing | Kind | Summary |
|------|--------|------|---------|
| `earnings_this_week` | Continuous | State | Earnings announcement scheduled in the next 7 days. |
| `earnings_today` | Sticky for session | Event | Earnings reported today. |
| `recently_reported_earnings` | Continuous | State | Reported earnings within the last 5 days. |
| `earnings_approaching` | Continuous | State | Earnings within 3 days. |
| `earnings_tomorrow` | Continuous | State | Earnings reported in 1 calendar day. Pair with `earnings_report_time` to know BMO vs. AMC. |
| `earnings_next_week` | Continuous | State | Earnings 8–14 days out — useful for the lead-up swing window. |
| `earnings_published` | Continuous | State | Earnings report date has passed (next earnings date is in the past). |

### Analyst ratings

| Name | Firing | Kind | Summary |
|------|--------|------|---------|
| `bullish_consensus` | Continuous | State | Consensus analyst rating is `strong buy` or `buy`. |
| `bearish_consensus` | Continuous | State | Consensus analyst rating is `sell` or `strong sell`. |
| `recent_upgrade` | Continuous | State | At least one analyst upgraded the ticker in the last 7 days. |
| `recent_downgrade` | Continuous | State | At least one analyst downgraded the ticker in the last 7 days. |
| `recent_initiation` | Continuous | State | At least one analyst initiated coverage in the last 7 days. |
| `recent_target_raise` | Continuous | State | At least one analyst raised their price target in the last 7 days. |
| `recent_target_lower` | Continuous | State | At least one analyst lowered their price target in the last 7 days. |
| `above_price_target` | Continuous | State | Current price is above the consensus analyst target. |
| `below_price_target` | Continuous | State | Current price is below the consensus analyst target. |
| `well_covered` | Continuous | Classification | Ten or more analyst firms cover the ticker. |
| `target_upside_above_10pct` | Continuous | State | Consensus price target implies more than 10% upside from the current price. |
| `target_upside_above_25pct` | Continuous | State | Consensus price target implies more than 25% upside from the current price. |
| `target_downside_above_10pct` | Continuous | State | Current price is more than 10% above the consensus target — significant implied downside. |
| `estimate_revised_up` | Continuous | State | At least one analyst raised their next-quarter EPS estimate in the last 30 days. |
| `estimate_revised_down` | Continuous | State | At least one analyst lowered their next-quarter EPS estimate in the last 30 days. |
| `high_earnings_estimate` | Continuous | Classification | Consensus next-quarter EPS estimate exceeds an absolute $1.00 per share threshold. |
