---
title: "Get Stock Valuation"
method: GET
path: "/api/stocks/{symbol}/valuation"
tags: ["valuation"]
---

# Get Stock Valuation

`GET /api/stocks/{symbol}/valuation`

## Request

- Base URL: `https://api.equity-rank.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.equity-rank.com/api/stocks/{symbol}/valuation`
- Auth: HTTP bearer

Public valuation endpoint — thin wrapper that records calc_exception
anomalies (Phase 31 Plan 01, ANOM-02) when the underlying computation
raises an unexpected error.

HTTPException is re-raised unchanged (it represents a known failure mode
like 422 invalid ticker or 503 market data unavailable — those are not
anomalies). Unexpected exceptions are logged to av_anomaly_log with
rule='calc_exception', then re-raised so the caller still sees the 500.

## Path parameters

- `symbol` string, required

## Response `200`

Successful Response

- ValuationResult
  - `symbol` string, required
  - `price` number, required
  - `sector` string, required
  - `best_fit` BestFit: The single best-fitting valuation method for this specific stock.
    - `method` string, required
    - `label` string, required
    - `fair_value` number, required
    - `margin_of_safety` number, required
    - `rationale` string, required
    - `confidence` string, required
    - `method_no_leverage` string, nullable
    - `label_no_leverage` string, nullable
    - `fair_value_no_leverage` number, nullable
    - `margin_of_safety_no_leverage` number, nullable
    - `confidence_no_leverage` string, nullable
    - `leverage_fired` boolean, nullable
    - `leverage_debt_equity` number, nullable
    - `bridge_observed` boolean, nullable
    - `rule_sha` string, nullable
  - `dcf_fair_value` number, nullable
  - `dcf_margin_of_safety` number, nullable
  - `dcf_unavailable_reason` string, nullable
  - `pe_fair_value` number, nullable
  - `pe_margin_of_safety` number, nullable
  - `pe_unavailable_reason` string, nullable
  - `pb_fair_value` number, nullable
  - `pb_margin_of_safety` number, nullable
  - `pb_unavailable_reason` string, nullable
  - `ps_fair_value` number, nullable
  - `ps_margin_of_safety` number, nullable
  - `ps_unavailable_reason` string, nullable
  - `ev_ebitda_fair_value` number, nullable
  - `ev_ebitda_margin_of_safety` number, nullable
  - `ev_ebitda_unavailable_reason` string, nullable
  - `graham_number` number, nullable
  - `graham_margin_of_safety` number, nullable
  - `graham_unavailable_reason` string, nullable
  - `ddm_fair_value` number, nullable
  - `ddm_margin_of_safety` number, nullable
  - `ddm_unavailable_reason` string, nullable
  - `peg_fair_value` number, nullable
  - `peg_margin_of_safety` number, nullable
  - `peg_unavailable_reason` string, nullable
  - `consensus_fair_value` number, nullable, required
  - `consensus_margin_of_safety` number, nullable, required
  - `methods_used` integer, required
  - `best_method` string, required
  - `last_updated` string
  - `data_quality` string: 'full' | 'partial' | 'limited' — indicates data completeness
  - `yfinance_fallback` boolean: True when financials were sourced from yfinance fallback
  - `derived_fields` unknown[]: Fields estimated via mathematical derivation
    - unknown
  - `calculated_growth_rate` number, nullable: Forward earnings growth rate (decimal). DTL/causal model when sector driver available; DuPont or historical blend fallback.
  - `growth_rate_model` string, nullable: Which growth model tier was used, e.g. 'DTL/Gold spot', 'DTL/revenue', 'DuPont', 'historical_blend'
  - `eps_beat_probability` number, nullable: Fraction of last 8 quarters beating consensus EPS estimate (0.0–1.0). None when fewer than 4 quarters of data available.
  - `accruals_ratio` number, nullable: Sloan accruals ratio: (NetIncome - OCF) / TotalAssets. >0.10 suggests earnings inflation risk; <-0.10 is conservative.
  - `piotroski_f_score` integer, nullable: Piotroski F-Score 0-9. >=7 = strong fundamentals; <=3 = weak.
  - `beneish_m_score` number, nullable: Beneish M-Score. >-1.78 = probable manipulation risk. NULL for banks, insurance, REITs, utilities (model not applicable).
  - `beneish_flag` boolean, nullable: True when beneish_m_score > -1.78. NULL for suppressed sectors.
  - `roic_trend` string, nullable: ROIC trajectory: 'improving' | 'flat' | 'declining'.
  - `margin_trend` string, nullable: Operating margin trajectory: 'expanding' | 'stable' | 'compressing'.
  - `momentum_12m_1m` number, nullable: 12m-1m price momentum factor: (price_1m_ago / price_12m_ago) - 1. Positive = upward trend; excludes last month per Jegadeesh-Titman.
  - `implied_earnings_move` number, nullable: ATM straddle / current_price for nearest post-earnings expiry. Market-implied expected move magnitude (e.g. 0.08 = 8%). Only populated when a future earnings date is within 90 days.
  - `pmi_multiplier_applied` boolean, nullable: True when the ISM Manufacturing PMI multiplier adjusted the Tier 1 or Tier 2 earnings growth estimate for this sector. Indicated by '+PMI' suffix in growth_rate_model label.
  - `forward_eps` number, nullable: Forward EPS (analyst consensus when available; otherwise TTM EPS x (1 + blended growth))
  - `forward_eps_source` string, nullable: 'analyst' when forward EPS is sourced from consensus estimates; 'analyst_fy2' when the second forward fiscal year replaced a trough FY1 (see forward_eps_note); 'modelled' when synthetic
  - `forward_eps_note` string, nullable: Input-selection code for the forward P/E method when it ran on something other than the FY1 consensus (e.g. 'fy1_trough_fy2_fallback'); None otherwise
  - `forward_pe_fair_value` number, nullable: Forward EPS x Sector P/E multiple
  - `forward_pe_margin_of_safety` number, nullable: MoS% using forward P/E fair value
  - `forward_pe_unavailable_reason` string, nullable: Abstention code when forward P/E produced no fair value
  - `implied_growth_rate` number, nullable: Reverse DCF implied growth rate (decimal)
  - `trailing_eps` number, nullable: TTM EPS used by trailing P/E fair value
  - `trailing_pe_ratio` number, nullable: Trailing P/E ratio (price / TTM EPS)
  - `forward_pe_ratio` number, nullable: Forward P/E ratio from AV OVERVIEW
  - `analyst_consensus_target` number, nullable: Street consensus price target (AV AnalystTargetPrice)
  - `eps_estimate_current_year` number, nullable: Consensus EPS estimate for current fiscal year
  - `eps_estimate_next_year` number, nullable: Consensus EPS estimate for next fiscal year
  - `revenue_estimate_current_year` number, nullable: Consensus revenue estimate for current fiscal year
  - `revenue_estimate_next_year` number, nullable: Consensus revenue estimate for next fiscal year
  - `forward_ps_fair_value` number, nullable: Forward revenue per share x sector P/S multiple
  - `forward_ps_margin_of_safety` number, nullable: MoS% using forward P/S fair value
  - `forward_ps_unavailable_reason` string, nullable
  - `forward_ev_ebitda_fair_value` number, nullable: Forward EBITDA per share x sector EV/EBITDA multiple
  - `forward_ev_ebitda_margin_of_safety` number, nullable: MoS% using forward EV/EBITDA fair value
  - `forward_ev_ebitda_unavailable_reason` string, nullable
  - `forward_pfcf_fair_value` number, nullable: Forward FCF per share x sector P/FCF multiple
  - `forward_pfcf_margin_of_safety` number, nullable: MoS% using forward P/FCF fair value
  - `forward_pfcf_unavailable_reason` string, nullable
  - `projected_best_fit_fair_value` number, nullable: NTM fair value using the forward version of the best-fit method
  - `projected_best_fit_margin_of_safety` number, nullable: MoS% at projected best-fit fair value
  - `projected_best_fit_method` string, nullable: Forward method used, e.g. 'forward_ps', 'forward_pe', 'forward_ev_ebitda'
  - `pfcf_fair_value` number, nullable
  - `pfcf_margin_of_safety` number, nullable
  - `pfcf_unavailable_reason` string, nullable
  - `evfcf_fair_value` number, nullable
  - `evfcf_margin_of_safety` number, nullable
  - `evfcf_unavailable_reason` string, nullable
  - `justified_pb_fair_value` number, nullable
  - `justified_pb_margin_of_safety` number, nullable
  - `justified_pb_unavailable_reason` string, nullable
  - `epv_fair_value` number, nullable
  - `epv_margin_of_safety` number, nullable
  - `epv_unavailable_reason` string, nullable
  - `ev_ebit_fair_value` number, nullable
  - `ev_ebit_margin_of_safety` number, nullable
  - `ev_ebit_unavailable_reason` string, nullable
  - `three_stage_dcf_fair_value` number, nullable
  - `three_stage_dcf_margin_of_safety` number, nullable
  - `three_stage_dcf_unavailable_reason` string, nullable
  - `ffo_fair_value` number, nullable: FFO-based fair value (REIT-specific)
  - `ffo_margin_of_safety` number, nullable
  - `ffo_unavailable_reason` string, nullable
  - `ffo_per_share` number, nullable: FFO per share (Net Income + D&A, per share)
  - `pffo_multiple_used` number, nullable: P/FFO multiple applied
  - `paffo_fair_value` number, nullable: P/AFFO fair value (estimated AFFO = FFO - 0.20*capex)
  - `paffo_margin_of_safety` number, nullable
  - `paffo_unavailable_reason` string, nullable
  - `affo_payout_coverage` number, nullable: AFFO_ps / dividend_ps ratio; None if dividend_ps unavailable
  - `affo_payout_coverage_flag` boolean, nullable: True when coverage < 1.0 (distributions exceed estimated AFFO)
  - `shareholder_yield_total` number, nullable: Boudoukh et al. (2007): (div + buybacks - net_debt_issuance) / market_cap; decimal
  - `capital_allocation_score` number, nullable: Capital allocation quality score 0-100 (50% spread / 30% SGR / 20% goodwill trend); None if all inputs missing
  - `roic` number, nullable: NOPAT / invested_capital (decimal); None if invested_capital <= 0
  - `economic_spread` number, nullable: ROIC - cost_of_equity (CAPM rf+beta*ERP; ERP dynamic via app_config, default 0.055); positive = returns exceed cost of capital
  - `goodwill_heavy_acquisition_flag` boolean, nullable: True when goodwill/assets > 0.30 AND economic_spread < 0 (factual capital allocation signal)
  - `ohlson_o_score` number, nullable: Ohlson (1980) logit O-Score; None for Financials/Banks/Insurance/REIT
  - `default_probability` number, nullable: P(default within 2yr) = 1/(1+exp(-O)); range [0,1]
  - `cash_conversion_ratio` number, nullable: OCF / Net_Income; None when NI <= 0; < 0.7 = weak cash backing
  - `revenue_quality_ratio` number, nullable: DeltaAR / DeltaRevenue; None when flat revenue; > 1.2 = receivables growing faster than revenue
  - `dio_trend` number, nullable: DIO_t - DIO_t-1 (days); None when COGS <= 0; positive = inventory building
  - `ev_sales_fair_value` number, nullable: EV/Sales-based fair value
  - `ev_sales_margin_of_safety` number, nullable
  - `ev_sales_unavailable_reason` string, nullable
  - `ev_sales_multiple_used` number, nullable: EV/Sales multiple applied
  - `high_multiple_model` boolean: True when valuation relies primarily on revenue-multiple methods
  - `rnpv_fair_value` number, nullable: rNPV per-share equity model estimate (base case): pipeline value + net cash, per share. Model estimate under stated assumptions — not advice or a return promise; clinical-stage drug outcomes are binary and uncertain, and a program can fail with its modeled value falling toward zero.
  - `rnpv_fair_value_low` number, nullable: rNPV per-share estimate under the low peak-sales band (0.4x prior)
  - `rnpv_fair_value_high` number, nullable: rNPV per-share estimate under the high peak-sales band (2.5x prior)
  - `rnpv_margin_of_safety` number, nullable
  - `rnpv_unavailable_reason` string, nullable
  - `rnpv_program_count` integer, nullable: Count of unique clinical programs valued in the rNPV
  - `rnpv_lead_phase` string, nullable: Canonical phase of the most-advanced program (PHASE1/PHASE2/PHASE3/FILED/PHASE4)
  - `rnpv_pipeline_value_per_share` number, nullable: Pipeline-only rNPV per share (before net cash)
  - `rnpv_net_cash_per_share` number, nullable: Net cash (cash − total debt) per share added to pipeline value
  - `rnpv_in_consensus` boolean, nullable: True when rNPV carried non-zero weight in the consensus blend (shadow gate live)
  - `nav_fair_value` number, nullable: NAV proxy fair value for commodity producers — normalized FCF / depletion-adjusted discount rate
  - `nav_margin_of_safety` number, nullable
  - `nav_unavailable_reason` string, nullable
  - `pe_midcycle_fair_value` number, nullable: P/E fair value using normalized mid-cycle EPS (commodity price ratio adjusted)
  - `pe_midcycle_margin_of_safety` number, nullable
  - `pe_midcycle_unavailable_reason` string, nullable
  - `commodity_scenarios` object, nullable: Bear/base/bull fair value scenarios for commodity producers using forecast service price scenarios
  - `commodity_price_vs_ma252` number, nullable: Current commodity spot price vs 1-year moving average (>1.0 = above mid-cycle)
  - `ri_fair_value` number, nullable: Residual Income fair value (Ohlson 1995 intrinsic value model)
  - `ri_margin_of_safety` number, nullable
  - `ri_unavailable_reason` string, nullable
  - `ptbv_fair_value` number, nullable: Justified P/TBV fair value: TBVPS × (ROTE − g)/(CoE − g); bank sectors only
  - `ptbv_margin_of_safety` number, nullable
  - `ptbv_unavailable_reason` string, nullable
  - `ev_gp_fair_value` number, nullable: EV/Gross-Profit fair value: GP/share × (sector EV/Sales multiple ÷ 0.70) − net debt/share; software sectors only
  - `ev_gp_margin_of_safety` number, nullable
  - `ev_gp_unavailable_reason` string, nullable
  - `eva_fair_value` number, nullable: EVA firm-level fair value (NOPAT - WACC × IC, Stern-Stewart); audit companion only
  - `eva_margin_of_safety` number, nullable
  - `eva_unavailable_reason` string, nullable
  - `cape_fair_value` number, nullable: Shiller CAPE fair value: real_EPS_avg (10yr CPI-adjusted) × sector long-run CAPE multiple
  - `cape_margin_of_safety` number, nullable
  - `cape_unavailable_reason` string, nullable
  - `ev_ebitdax_fair_value` number, nullable: EV/EBITDA (E&P) fair value: (EBITDA/share + exploration_expense/share) × E&P sector multiple (5.5x) − net_debt/share. Exploration add-back requires future data source (always None from AV as of Phase 70).
  - `ev_ebitdax_margin_of_safety` number, nullable
  - `ev_ebitdax_unavailable_reason` string, nullable
  - `ri_intangible_fair_value` number, nullable: Residual-Income fair value on intangible-adjusted book equity (Adjusted_BVPS = BVPS + KC/share + OC/share − Goodwill/share); Tech/Software/Semis/Pharma/Biotech/MedDev only; shadow lens at weight 0.0.
  - `ri_intangible_margin_of_safety` number, nullable
  - `ri_intangible_unavailable_reason` string, nullable
  - `pb_intangible_fair_value` number, nullable: Price-to-Book fair value on intangible-adjusted book equity × sector-median intangible-adjusted P/B (calibrated from live universe); Tech/Software/Semis/Pharma/Biotech/MedDev only; shadow lens at weight 0.0.
  - `pb_intangible_margin_of_safety` number, nullable
  - `pb_intangible_unavailable_reason` string, nullable
  - `merton_distance_to_default` number, nullable: Std deviations from default; >3=safe, 1-3=watch, <1=distress
  - `merton_default_probability` number, nullable: Risk-neutral probability of default over 1 year
  - `real_options_flag` string, nullable: 'optionality_premium' when price >> DCF and growth > 20%
  - `options_fwd_fair_value` number, nullable
  - `options_fwd_margin_of_safety` number, nullable
  - `options_fwd_unavailable_reason` string, nullable
  - `sector_bubble_score` integer, nullable: 0–100 bubble score for the sector (0=cheap, 100=extreme bubble)
  - `sector_bubble_signal` string, nullable: e.g. 'elevated', 'bubble_risk', 'fairly_valued'
  - `sector_bubble_premium_pct` number, nullable: How far current sector P/E is above/below 20Y historical mean (%)
  - `save_composite` number, nullable: Latest SAVE composite score [-1, +1]
  - `save_multiplier_weight` number, nullable: Sector-calibrated SAVE multiplier (0.10–0.25)
  - `save_adjusted_fair_value` number, nullable: Consensus fair value adjusted by SAVE multiplier
  - `save_adjusted_margin_of_safety` number, nullable: Margin of safety at SAVE-adjusted fair value
  - `innovation_score` number, nullable: Innovation/implementation score (0–100); 50 = sector average
  - `innovation_multiplier_alpha` number, nullable: Sector-calibrated innovation alpha (sensitivity of FV to score)
  - `innovation_adjusted_fair_value` number, nullable: Consensus fair value adjusted by innovation multiplier
  - `innovation_adjusted_margin_of_safety` number, nullable: Margin of safety at innovation-adjusted fair value
  - `combined_adjusted_fair_value` number, nullable: Consensus FV adjusted by both SAVE composite and innovation score
  - `combined_adjusted_margin_of_safety` number, nullable: Margin of safety at combined SAVE+Innovation fair value
  - `excluded_from_consensus` unknown[]: Method keys with 0 sector weight — computed but not blended
    - unknown
  - `company_type` string, nullable: Classified company type (e.g. 'profitable_saas', 'financial_bank', 'deep_value')
  - `profile_confidence` string, nullable: Classification confidence: 'high' | 'medium' | 'low'
  - `classification_notes` unknown[], nullable: Edge-case flags applied during classification (e.g. 'extreme_leverage', 'dividend_sustainability_risk')
    - unknown
  - `stage_gated_methods` unknown[]: Method keys disabled by stage-based gating for this company_type
    - unknown
  - `method_weights_used` object, nullable: Normalized per-method weights actually used in this consensus blend (post overrides/outlier-trim/renormalization)
  - `consensus_overrides_applied` string[], nullable: Factual trail of weight/FV adjustments that fired for this computation (e.g. high_pe_override, ttm_contamination_guard, sector_cape_haircut, outlier_trim, coverage_shrink, dispersion_shrink)
  - `valuation_assumptions` object, nullable: Model parameters behind this valuation: risk-free rate, beta (raw + cap), equity risk premium, cost of equity, terminal growth, sector multiples, growth rates, illiquidity premium, micro-cap discount
  - `method_sensitivity` object[], nullable: Ceteris-paribus per-method fair-value sensitivity to ±1pp input changes (DCF terminal growth / discount rate; DDM discount rate). Educational what-if, not a projection.
  - `cluster_count` integer, nullable: Number of valuation clusters with at least 1 method contributing
  - `clusters_used` string[], nullable: Cluster names that contributed to the consensus blend
  - `intra_cluster_method_counts` object, nullable: Mapping of cluster name to number of methods in that cluster
  - `low_cluster_count_flag` boolean, nullable: True when only 2 clusters contributed (reduced diversification)
  - `model_confidence_score` number, nullable: 0–100: reliability of the fair value estimate
  - `model_confidence_label` string, nullable: 'Strong' | 'Moderate' | 'Limited' | 'Weak'
  - `model_confidence_breakdown` object, nullable: Pillar sub-scores: convergence, coverage, data_quality, best_fit_certainty
  - `model_confidence_diagnostics` unknown[], nullable: Plain-English reasons why confidence is limited
    - unknown
  - `fair_value_low` number, nullable: Lowest fair value across all applicable methods
  - `fair_value_high` number, nullable: Highest fair value across all applicable methods
  - `fair_value_range_pct` number, nullable: Range spread as % of low FV — measures method divergence
  - `required_mos` number, nullable: Minimum MoS% this stock should clear given its risk profile
  - `mos_excess` number, nullable: mos_mid - required_mos; positive = clears hurdle
  - `page_blend_fair_value` number, nullable: This page's own multi-method blend; the headline consensus uses the screener's value when its row is fresh (PARITY-01)
  - `consensus_source` string, nullable: 'screener' when the headline consensus is the screener batch value, 'page' when it is this page's own blend, 'screener_withheld' when the fresh screener row publishes no fair value so the page publishes none either
  - `fv_low_band` number, nullable: Weighted 25th percentile fair value across methods
  - `fv_high_band` number, nullable: Weighted 75th percentile fair value across methods
  - `mos_low` number, nullable: MoS% at fv_low_band (conservative)
  - `mos_mid` number, nullable: MoS% at consensus FV after dispersion shrinkage
  - `mos_high` number, nullable: MoS% at fv_high_band (optimistic)
  - `mos_mid_raw` number, nullable: MoS% before dispersion shrinkage (unshrunk)
  - `dispersion_cv` number, nullable: Coefficient of variation across method FVs
  - `dispersion_factor` number, nullable: Shrinkage factor applied to MoS (0..0.6)
  - `trimmed_methods` unknown[], nullable: Method keys dropped by the robust outlier trim (median-anchored MAD filter)
    - unknown
  - `coverage_shrink_factor` number, nullable: Factor applied to shrink fair value toward price when fewer than 5 methods carry weight in the blend (1.0 = no shrink)
  - `forward_consensus_fv` number, nullable: Forward (NTM) consensus fair value blend
  - `forward_consensus_mos` number, nullable: MoS% using forward consensus FV
  - `forward_consensus_methods` integer, nullable: Methods used in forward consensus
  - `quality_label` string, nullable: 'high' | 'medium' | 'low' | 'distressed' | 'unknown'
  - `mos_quality_bucket` string, nullable: 'cheap_quality' | 'value_trap_risk' | 'premium_quality' | 'fair_value'
  - `mos_regime` string, nullable: 'persistent_cheap' | 'freshly_cheap' | 'persistent_premium' | 'freshly_premium' | 'transitioning'
  - `weeks_at_current_band` integer, nullable: Consecutive weeks the MoS sign has been the same
  - `mos_4w_avg` number, nullable: Average consensus MoS over the last 4 weekly snapshots
  - `mos_drift_30d` number, nullable: mos_now - mos_30d_ago; positive = model increasingly undervalued
  - `convergence_low_weeks` integer, nullable: Optimistic re-rating horizon in weeks (OU p25)
  - `convergence_mid_weeks` integer, nullable: Base-case re-rating horizon in weeks (OU halflife × catalyst)
  - `convergence_high_weeks` integer, nullable: Pessimistic re-rating horizon in weeks (OU p75)
  - `convergence_probability_label` string, nullable: Human-readable horizon: 'Near-term' | 'Medium-term' | 'Patient' | 'Long-dated'
  - `catalyst_acceleration` number, nullable: Multiplier on OU halflife from earnings/SAVE/momentum. <1 = faster, >1 = slower
  - `ou_halflife_weeks` number, nullable: Raw OU mean-reversion halflife in weeks before catalyst adjustment
  - `ou_r2` number, nullable: AR(1) goodness-of-fit for OU regression (0–1)
  - `ou_confidence` string, nullable: 'high' | 'medium' | 'low' | 'insufficient' based on history length and R²
  - `company_name` string, nullable: Full company name
  - `company_description` string, nullable: Business description narrative from AV OVERVIEW
  - `company_website` string, nullable: Official company website
  - `company_employees` integer, nullable: Full-time employees
  - `company_country` string, nullable: HQ country
  - `company_address` string, nullable: HQ street address
  - `company_fiscal_year_end` string, nullable: Fiscal year-end month
  - `company_exchange` string, nullable: Listing exchange
  - `company_industry` string, nullable: Sub-industry
  - `earnings_quality_score` number, nullable: Forensic risk score 0-100 (Earnings Quality badge)
  - `earnings_quality_label` string, nullable: Earnings Quality label: Excellent | Adequate | Caution | At-Risk
  - `macro_regime` string, nullable: Macro regime: RISK_ON | LATE_CYCLE | STAGFLATION | RECESSION
  - `consensus_fair_value_macro_adjusted` number, nullable: Macro-adjusted consensus FV
  - `macro_haircut` number, nullable: Fractional haircut applied by macro regime overlay
  - `mgmt_quality_score` number, nullable: Management Quality Score 0-100 (4 governance signals + drop-renorm + 25 baseline). None when all signals absent.
  - `mgmt_quality_grade` string, nullable: Management Quality neutral-tier label — pending financial-legal-advisor sign-off. None when score None.
  - `consensus_fair_value_mgmt_adjusted` number, nullable: consensus_fair_value × (1+mgmt_haircut[±2.5%]). DISTINCT column off RAW consensus — not stacked on macro_adjusted.
  - `illiquidity_premium_pct` number, nullable: Amihud (2002) illiquidity model parameter — cost-of-equity add-on in decimal (e.g. 0.02 = 2pp). Factual computation input, not investment advice. None when history < 253 daily rows (252 daily returns) or liquidity is unknown.
  - `micro_cap_discount_pct` number, nullable: Market-cap tier discount: 0.25 (<$100M) / 0.15 (<$300M) / 0.05 (<$500M) / 0.0 (>=500M). Applied post-consensus as distinct multiplier off RAW consensus_fair_value. Factual model parameter, not investment advice.
  - `consensus_fair_value_liquidity_adjusted` number, nullable: Model estimate under [liquidity] assumptions. Distinct column off RAW consensus_fair_value — not stacked on macro_adjusted or mgmt_adjusted.
  - `inventory_turns_ratio` number, nullable: Inventory turns = COGS / average inventory (retail cohort only). Factual operational efficiency metric, not investment advice. None for non-cohort names or when inputs are missing / non-positive.
  - `brand_equity_premium_pp` number, nullable: Company gross margin minus peer-subgroup median GM, in percentage points (retail cohort). Factual margin comparison, not investment advice. None below the 4-member subgroup quorum or for non-cohort names.
  - `sssg_pct` number, nullable: Most recent reported same-store / comparable-store sales growth (decimal), from a curated cited seed. Reported historical metric, not a forecast. None for unseeded / stale / e-commerce / non-cohort names.
  - `consensus_fair_value_retail_adjusted` number, nullable: Model estimate under [retail] assumptions. Distinct column off RAW consensus_fair_value — not stacked on macro_adjusted, mgmt_adjusted, or liquidity_adjusted. Equals RAW consensus when no retail signal is available.
  - `semis_ev_ebitda_midcycle_fair_value` number, nullable: EV/EBITDA mid-cycle fair value: EBITDA/share normalized by GM ratio (current/5yr-avg) × sub-sector multiple minus net_debt/share. Abstains if avg GM unavailable or |GM deviation| <= 5pp.
  - `semis_ev_ebitda_midcycle_margin_of_safety` number, nullable
  - `semis_ev_ebitda_midcycle_unavailable_reason` string, nullable
  - `cycle_position` string, nullable: Semiconductor cycle-position indicator: 'early' | 'mid' | 'late' | 'trough'. Derived from DOH trend and GM deviation. Factual industry term only. Does NOT read book_to_bill.
  - `inventory_doh` number, nullable: Days of Inventory On Hand = inventory / (COGS/365). Factual balance-sheet metric from most-recent annual period.
  - `rd_intensity` number, nullable: R&D as percentage of revenue (R&D expense / total revenue × 100). Factual metric derived from income statement.
  - `book_to_bill` number, nullable: Book-to-bill ratio. ALWAYS None in Phase 73 — SIA association data not wired (abstain). T-73-03 integrity gate.
  - `book_to_bill_reason` string, nullable: Reason book_to_bill is None. Value: 'semi_association_data_not_wired'.
  - `backlog_to_revenue_ratio` number, nullable: Backlog / TTM revenue ratio. >3.0 = very high; <0.8 = flag. Factual. Abstains when unseeded.
  - `contract_mix_risk_score` integer, nullable: Contract mix risk score 0-100 (fixed-price-heavy = higher). Only for directly-disclosed tickers (LMT/RTX/NOC/BA). Factual — not investment advice.
  - `aftermarket_revenue_pct` number, nullable: Aftermarket / services revenue as decimal fraction of total revenue. From seed (public filings).
  - `backlog_adjusted_fair_value` number, nullable: Model estimate under [backlog_as_of_date] backlog assumptions. DISTINCT field off RAW consensus — clamped +/-5%. Not a revenue forecast.
  - `backlog_as_of_date` string, nullable: As-of date of the backlog figures used (e.g. 'FY2024 10-K'). Always displayed alongside backlog_adjusted_fair_value.
  - `fair_value_ci_low` number, nullable: Lower bound of the 80% model confidence interval on consensus fair value
  - `fair_value_ci_high` number, nullable: Upper bound of the 80% model confidence interval on consensus fair value
  - `sue_score` number, nullable: BST-01: SUE z-score (Bernard & Thomas 1989); winsorized to [-10, 10]; sourced from screener batch
  - `eps_revision_ratio` number, nullable: BST-02: EPS estimate revision ratio — upward revisions / total revisions (past 30 days); range [0.0, 1.0]
  - `short_ratio` number, nullable: Days-to-cover short ratio (factual count); sourced from screener batch
  - `short_percent_of_float` number, nullable: Short interest as decimal fraction of float; sourced from screener batch
  - `pead_signal` number, nullable: BST-01: PEAD proxy — most recent EPS surprise bounded to [-1.0, 1.0]
  - `eps_surprise_rate` number, nullable: Mean EPS surprise % across last 8 quarters (decimal fraction)

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/equity-rank/apis/equity-rank-api.md) · [All operations](https://skmtc.dev/equity-rank/apis/equity-rank-api/llms.txt) · [OpenAPI document](https://skmtc.dev/equity-rank/apis/equity-rank-api/revisions/c2f2463fee33?raw)
