---
title: "Point-in-time quarterly fundamentals (derived analytics + SEC-sourced raw)"
method: GET
path: "/fundamentals/{ticker}"
tags: ["Fundamentals"]
---

# Point-in-time quarterly fundamentals (derived analytics + SEC-sourced raw)

`GET /fundamentals/{ticker}`

## Request

- Base URL: `https://riskmodels.app/api`
- URL: `https://riskmodels.app/api/fundamentals/{ticker}`
- Auth: one of:
  - HTTP bearer
  - OAuth 2 (authorization code, authorization URL `https://riskmodels.app/oauth/authorize`, token URL `https://riskmodels.app/api/oauth/token`, scopes: `mcp:read`)

Quarterly fundamentals for a single ticker, point-in-time filtered: a row is visible if and only if its `filed_date` is on or before `as_of` (never "latest"). `filed_date_source` is `exact` (vendor filing date) or `approx` (period_end + 45 days, the 10-Q deadline, when the vendor date is missing).

**Derived analytics + per-cell raw SEC exposure.** Rows carry TTM profitability ratios (`roe_ttm`, `roa_ttm`, `fcf_margin`), capital-return ratios (`payout_ratio`, `retention_ratio`, `buyback_ratio`, `total_payout_ratio`, `sustainable_growth`), `leverage_ratio`, long-window ERM3 valuation betas with provenance, the cost-of-capital layer (`cost_of_equity`, strict `cost_of_debt` / `wacc`, parallel `cost_of_debt_imputed` / `wacc_imputed`, and `economic_profit`), and the equity-bridge residual + inputs mask. `sec_facts` carries RAW line items for the cells whose serving value is SEC XBRL (public); vendor-sourced cells are not included there.

Numeric line items are stored at ~7 significant figures (float32) — suitable for analysis, not cent-level reconciliation. `gross_margin` and `operating_margin` are currently always null (inputs not yet in the store). `market_cap` is a current snapshot, not point-in-time per quarter.

**Disclosures (also returned in every response body):**
- Realized historical data only. No forecasts, no analyst targets, no buy/sell
  signals.

- Coverage starts ~2009 for most filers; pre-2009 and small-cap or
  recently-IPO'd names are thin. Missing fields are null.

- `beta_market` is the long-window valuation beta used by the CAPM layer,
  not the short-half-life hedging beta on the daily risk surface. For defensive
  names `cost_of_equity` can still fall below the risk-free rate.

- WACC uses BOOK-value weights. Market-value weights are the textbook
  convention; compute them yourself if you have market-cap access.

- Strict `cost_of_debt` and `wacc` are never silently filled. When trusted
  SEC debt is positive but TTM interest expense cannot form a strict debt
  cost, the separate imputed fields may use a PIT-lagged high-quality-market
  proxy. Its spread is the monthly Treasury HQM 10-year spot yield minus
  the same-month GS10 monthly average; that stored spread is then added to
  the separate period-end point-in-time 10-year Treasury rate. HQM month M
  becomes eligible on day 10 of M+1. The proxy covers the A/AA/AAA market;
  it is not issuer-specific.

- TTM sums flows over the trailing 4 reported quarters; stock quantities are
  point-in-time (ROE denominator uses trailing-4-quarter average equity).
  Ratios need 4 finite quarters or they are null.

- `erp` (default 0.05) and `tax_rate` (default 0.21) are request parameters
  echoed in the response. The documented defaults are used when omitted;
  no equity-risk-premium opinion is stored in the data.

- `rf_rate` is the Treasury constant-maturity yield at the selected
  `rf_tenor` (3m|1y|2y|5y|10y|30y, default 10y — the valuation convention),
  sampled at the last observation on or before each quarter's period end.
  A short tenor should be paired with a bill-basis ERP or cost of capital
  is understated.


**Authentication:** Required (API Key or OAuth2)
**Billing:** $0.02 per request (deducted from account balance)
**Rate Limit:** 60 requests/minute (default)

Per-symbol, per-call only: no batch variant, no CSV/bulk export (JSON only).

## Path parameters

- `ticker` string, required

## Query parameters

- `as_of` string, date
- `periods` integer
- `erp` number
- `tax_rate` number
- `rf_tenor` '3m' | '1y' | '2y' | '5y' | '10y' | '30y'
- `grid` boolean
- `erp_grid` string
- `rf_tenor_grid` string

## Response `200`

PIT quarterly fundamentals rows.

- FundamentalsResponse: Wire response for `GET /fundamentals/{ticker}`. Rows are ordered oldest to newest and PIT-filtered by filed_date <= as_of. `disclosures` echoes the parameters and the interpretation caveats.
  - `ticker` string, required
  - `as_of` string, date, required
  - `periods_returned` integer
  - `rows` FundamentalsRow[], required
    - `period_end_date` string, date: Quarterly reporting period end.
    - `filed_date` string, date, nullable: Filing date used for PIT visibility (filed_date <= as_of).
    - `filed_date_source` 'exact' | 'approx', nullable: exact = vendor filing date; approx = period_end + 45 days (10-Q deadline) when the vendor date is missing.
    - `sec_facts` object: Raw line items for this period, present only for cells whose serving value is SEC XBRL. Keyed by concept (revenue, net_income, total_equity, cash_from_operations, dividends_paid, share_repurchases, etc.); a concept is absent when its cell is vendor-sourced or empty.
    - `gross_margin` number, nullable: Currently always null — inputs not yet in the store.
    - `operating_margin` number, nullable: Currently always null — inputs not yet in the store.
    - `roe_ttm` number, nullable: TTM net income over trailing-4-quarter average equity. Null if average equity <= 0.
    - `roa_ttm` number, nullable: TTM net income over trailing-4-quarter average total assets.
    - `leverage_ratio` number, nullable: Total debt / total equity (book). Null if equity <= 0.
    - `fcf_margin` number, nullable: TTM free cash flow (CFO - capex) over TTM revenue.
    - `payout_ratio` number, nullable: TTM dividends paid / TTM net income. Null when TTM net income <= 0.
    - `retention_ratio` number, nullable: 1 - payout_ratio (the reinvestment-rate proxy). Cash basis.
    - `buyback_ratio` number, nullable: TTM share repurchases / TTM net income.
    - `total_payout_ratio` number, nullable: (TTM dividends paid + share repurchases) / TTM net income. May exceed 1.
    - `sustainable_growth` number, nullable: retention_ratio * roe_ttm.
    - `equity_bridge_residual` number, nullable: Plug that closes the equity roll-forward by construction (total_equity_t - total_equity_{t-1} = sum of tagged components + residual). Frequently large; a decomposition aid, not a measured line. Null on a symbol's first reported period.
    - `equity_bridge_inputs` string[]: Components that backed the residual. A component MISSING from the list means its movement is inside the residual, not that it was zero.
    - `beta_market` number, nullable: Long-window (~60-month monthly, Vasicek-shrunk) ERM3 valuation beta sampled at the last month end <= period_end.
    - `beta_sector` number, nullable
    - `beta_subsector` number, nullable
    - `beta_source` 'none' | 'in-universe' | 'out-of-universe' | 'post-delisting', nullable: Beta provenance. Post-delisting betas are never forward-filled.
    - `rf_rate` number, nullable: Treasury constant-maturity rate for the requested rf_tenor, sampled at the last observation <= period_end.
    - `cost_of_equity` number, nullable: rf_rate + beta_market * erp, using the long-window valuation beta. Can fall below rf_rate for defensive names.
    - `cost_of_debt` number, nullable: Strict reported-data value, TTM interest expense / trusted SEC debt. Never silently imputed.
    - `cost_of_debt_imputed` number, nullable: Separate PIT-lagged high-quality-market proxy for positive trusted SEC debt when strict cost_of_debt is null: the period-end point-in-time 10-year Treasury rate plus a spread formed from monthly Treasury HQM and GS10 observations. Not issuer-specific.
    - `cost_of_debt_imputation` CostOfDebtImputation: Inspectable provenance for the parallel PIT-lagged high-quality-market debt-cost proxy. The HQM series covers the A/AA/AAA high-quality corporate market; it is not an issuer rating or issuer bond yield.
      - `status` 'used' | 'not_needed' | 'unavailable', required
      - `method` 'rf_10y_plus_treasury_hqm_10y_spread', required
      - `risk_free_rate` number, nullable, required: Period-end point-in-time 10-year Treasury input used in cost_of_debt_imputed (fraction).
      - `credit_spread` number, nullable, required: Treasury HQM 10-year monthly spot yield minus the same-month GS10 monthly average used to form the stored spread. This is not calculated from risk_free_rate, which is the separate period-end point-in-time 10-year Treasury input.
      - `hqm_spot_rate` number, nullable, required: Treasury HQM 10-year monthly high-quality corporate spot yield (fraction).
      - `hqm_observation_date` string, date, nullable, required: Reference-month stamp for the monthly HQM/GS10 pair, represented as the first day of that month. It is not a publication timestamp. The sampler makes month M eligible on day 10 of M+1 to preserve PIT lag.
      - `corporate_series` 'HQMCB10YR', required
      - `treasury_series` 'GS10', required
      - `rating_scope` 'A/AA/AAA high-quality market; not issuer-specific', required
    - `wacc` number, nullable: Strict BOOK-value-weighted average cost of capital with tax-shielded reported-data debt leg.
    - `wacc_imputed` number, nullable: BOOK-value-weighted WACC using cost_of_debt_imputed. Strict wacc remains unchanged.
    - `economic_profit` number, nullable: (roe_ttm - cost_of_equity) * total equity (equity-charge form). Null if equity <= 0.
    - `market_cap` number, nullable: Reserved. Currently null per row; see the top-level market_cap snapshot.
  - `market_cap` object: Current market cap snapshot (not PIT per quarter).
    - `value` number, nullable
    - `basis` string
    - `note` string
  - `sensitivity_grid` FundamentalsSensitivityGrid: Cost-of-capital sensitivity grid for the latest PIT-visible period only — `cost_of_equity`, strict `wacc`, parallel `wacc_imputed`, and `economic_profit` recomputed across every combination of `erp_values` x `rf_tenor_values`. `cost_of_debt_imputed` and its provenance are fixed 10-year proxy inputs shared by all cells; the chosen grid tenor changes the cost-of-equity leg, not that debt proxy. Pure derived analytics, parameterized instead of single-valued. `cells` is row-major: `cells[i][j]` pairs `erp_values[i]` with `rf_tenor_values[j]`.
    - `period_end_date` string, date, required
    - `filed_date` string, date, nullable
    - `erp_values` number[], required
    - `rf_tenor_values` string[], required
    - `tax_rate` number, required
    - `cost_of_debt_imputed` number, nullable, required: Fixed 10-year debt-cost proxy shared by every grid cell.
    - `cost_of_debt_imputation` CostOfDebtImputation, required: Inspectable provenance for the parallel PIT-lagged high-quality-market debt-cost proxy. The HQM series covers the A/AA/AAA high-quality corporate market; it is not an issuer rating or issuer bond yield.
      - `status` 'used' | 'not_needed' | 'unavailable', required
      - `method` 'rf_10y_plus_treasury_hqm_10y_spread', required
      - `risk_free_rate` number, nullable, required: Period-end point-in-time 10-year Treasury input used in cost_of_debt_imputed (fraction).
      - `credit_spread` number, nullable, required: Treasury HQM 10-year monthly spot yield minus the same-month GS10 monthly average used to form the stored spread. This is not calculated from risk_free_rate, which is the separate period-end point-in-time 10-year Treasury input.
      - `hqm_spot_rate` number, nullable, required: Treasury HQM 10-year monthly high-quality corporate spot yield (fraction).
      - `hqm_observation_date` string, date, nullable, required: Reference-month stamp for the monthly HQM/GS10 pair, represented as the first day of that month. It is not a publication timestamp. The sampler makes month M eligible on day 10 of M+1 to preserve PIT lag.
      - `corporate_series` 'HQMCB10YR', required
      - `treasury_series` 'GS10', required
      - `rating_scope` 'A/AA/AAA high-quality market; not issuer-specific', required
    - `cells` array[], required: Row-major [erp_values.length][rf_tenor_values.length].
      - object[]
        - `cost_of_equity` number, nullable
        - `wacc` number, nullable
        - `wacc_imputed` number, nullable
        - `economic_profit` number, nullable
  - `disclosures` object, required: Realized-historical-only statement, ~2009 coverage note, long-window valuation-beta cost-of-equity caveat, strict-versus-proxy book-weight WACC notes, TTM convention, and the request-parameter echo.
  - `_metadata` object

## Other responses

- `400`: Malformed ticker or query parameter.
- `401`: Missing or invalid Bearer token.
- `402`: Insufficient balance.
- `404`: Ticker not present in the fundamentals panel.
- `429`: Rate limit exceeded.

---

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