Developer API docs
Data quality and lineage
Where each API value comes from: valuation series precomputed daily from licensed market data, statements from SEC EDGAR XBRL as filed. Null vs zero, freshness.
Documentation updated 2026-09-02. Machine-readable: openapi.json · llms.txt
Two lineages
- TGMCharts-computed series — the daily valuation and yield lines, rolling TTM flows, quarterly margins, ROIC and total return — are computed by TGMCharts from licensed end-of-day market data and reported financial statements, precomputed daily after the US close, and stored. The summary endpoint's scalars come from the same daily precompute. Every request reads the stored result; no request ever waits on, or varies with, a live vendor call.
- Statements and the EDGAR-lane metrics (revenue, net-income, capex, buybacks, stock-based-comp, r-and-d, revenue-quarterly, net-income-quarterly) come from SEC EDGAR XBRL company facts — public domain, as filed, latest-filed per period, with the winning us-gaap tag, accession number and filing date recorded on every value. The statements endpoint reads this lineage exclusively; nothing is backfilled from the market-data lineage.
- Chart renders are derived works drawn from the site's stored series. For the EDGAR-lane metrics a chart can therefore differ from the JSON series in restatement vintage; the JSON is the as-filed record.
null versus 0
null— not stored, not filed, not covered by the window, or intentionally withheld because the metric is not meaningful for the company type. The payload says which:applicabilityon summary/series,status/noteon statements.0— a stored or filed zero. Nothing is zero-filled to make a table look complete, and no value is estimated or interpolated.points: []androws: []— covered, but nothing stored for that metric or statement; anoteexplains.status: "preparing"— covered by the site, SEC ingestion pending (transient, short cache).status: "unavailable"— a stable terminal state with areason(ETF/trust, IFRS or non-USD filer).
Methodology on every series
Each series response carries the computation note of its slug. The distinct notes, generated from the registry:
pe-ratio,ps-ratio,pb-ratio,pfcf-ratio,pocf-ratio,ev-ebitda,ev-ebit,ev-sales,ev-fcf,ev-assets: Daily close-density series computed by TGMCharts: price (or enterprise value derived from it) over the rolling trailing-twelve-month denominator, stepped on each quarterly filing date. Loss/undefined windows are honest gaps, never zero-filled.earnings-yield,fcf-yield,ebitda-yield,ocf-yield: Daily close-density inverse-multiple series computed by TGMCharts from the same rolling trailing-twelve-month inputs, stepped on each quarterly filing date.dividend-yield: Computed by TGMCharts from the dividend event history: dividends are summed per calendar year and divided by the close sampled every 21st trading day; a year with no payments yet uses the prior year's total. Points exist only where both a price and a positive annual dividend are known.total-return: Total-return index computed by TGMCharts from daily closes with dividends reinvested (lib/calculations/total-return).roic: TGMCharts in-house ROIC from annual statements: after-tax operating profit over invested capital (total assets less non-interest-bearing current liabilities), one value per fiscal year; sector-gated where the definition is not meaningful.revenue-ttm,net-income-ttm,fcf-ttm,ebitda-ttm,capex-ttm,buybacks-ttm,sbc-ttm,rd-ttm: Rolling four-quarter sum computed by TGMCharts from as-reported quarters; a point exists only when four contiguous quarters are available. Outflow metrics store the absolute net four-quarter sum.gross-margin-quarterly,operating-margin-quarterly,net-margin-quarterly: Computed by TGMCharts per fiscal quarter from statement line items (profit measure over revenue); sign preserved for loss quarters.revenue,net-income,capex,buybacks,stock-based-comp,r-and-d: Annual fiscal-year values as filed with the SEC (XBRL company facts, public domain), selected latest-filed per period from the company's own filings; missing periods are honest gaps, never zero-filled or vendor-backfilled. Full per-value provenance (us-gaap tag + accession) at /api/v1/statements. Chart renders of this metric draw from the site's precomputed statement history and can differ in restatement vintage.eps,free-cash-flow,gross-margin,operating-margin,profit-margin,roe,roa: Annual fiscal-year values from company financial statements (vendor-sourced). Available as chart renders; JSON egress arrives as the EDGAR-sourced fundamentals lane extends to this metric.ebitda: Annual clean-EBITDA series computed by TGMCharts (operating income plus depreciation & amortization — never the vendor's derived EBITDA field).revenue-quarterly,net-income-quarterly: Single-quarter values as filed with the SEC (XBRL company facts, public domain), latest-filed per period. Quarters not filed discretely (typically Q4) are derived only by differencing two same-tag, same-fiscal-year filed facts and are withheld when a filing restates history — honest gaps, never plugs. Full per-value provenance at /api/v1/statements. Chart renders of this metric draw from the site's precomputed statement history and can differ in restatement vintage.eps-quarterly,fcf-quarterly: Single-quarter as-reported values from company financial statements (vendor-sourced). Available as chart renders; JSON egress arrives as the EDGAR-sourced fundamentals lane extends to this metric.
Restatements and derived quarters
- On the EDGAR lane the latest filing wins per period, so a company's restated figure supersedes the original and the
provenanceblock names the filing it came from. - Quarters that filers do not tag discretely are derived only by differencing two same-tag, same-fiscal-year facts, are marked
derived: "ytd-differencing"with both source accessions, and are withheld when a surrounding filing restates prior periods. - Per-share values are as filed and not split-adjusted; share counts and per-share values are never derived.
Freshness
Every covered symbol is recomputed daily after the US market close, and every payload carries its as-of date (asOf.dataUpdatedAt on summaries, asOf on series and statements, the footer of every chart). The public probe /api/health/freshness reports the oldest covered symbol's age against a 26-hour SLA and answers 503 when it is breached, so staleness is never silent.
GET /api/health/freshness — shape
{
"ok": boolean,
"slaHours": 26,
"totalCovered": integer,
"excluded": integer, // stubs with no real quote, excluded from the SLO and reported
"oldestSymbol": string,
"oldestAgeHours": number,
"countOverSla": integer,
"checkedAt": ISO date-time
}Coverage
- 800+ US-listed stocks and ETFs. A real ticker that is not yet covered onboards automatically when its stock page is visited (about two minutes); until then the API answers
404with that hint. - ETFs and trusts have summaries, price-based series and charts, but no SEC statements (
status: "unavailable"). Filers reporting under IFRS or in a non-USD currency are likewiseunavailableon the statements lane. - Foreign filers with USD-converted statements carry
reportedCurrencyon the summary so the conversion is visible.
FAQ
- Does the API ever return estimated, interpolated or backfilled values?
- No. Values are either stored results of TGMCharts' daily computation from licensed market data and reported statements, or SEC-filed XBRL facts. Missing inputs stay null, empty histories stay empty, and no source is substituted for another.
- How do I tell a missing value from a zero?
- A missing value is null and comes with an explanation — applicability on summaries and series, status and note on statements. A zero is a stored or filed zero. The API never zero-fills.
- How fresh is the data?
- Refreshed daily after the US market close; every payload carries its as-of date. The public probe at /api/health/freshness reports the oldest covered symbol's age against a 26-hour SLA and answers 503 on a breach.