Developer API docs
Stock summary endpoint
Compact JSON summary of a stock's fundamentals: latest close, valuation ratios, margins, dividends, growth CAGRs, as-of dates, honest nulls. Keyless, CORS-open.
Documentation updated 2026-09-02. Machine-readable: openapi.json · llms.txt
Endpoint
GET https://tgmcharts.com/api/v1/summary/{symbol} returns a compact (~5 KB) JSON view of one US-listed stock or ETF: identity, latest end-of-day close, valuation, profitability, financial health, dividends, growth CAGRs, provenance dates, and page links. No key is required; responses are CORS-open and edge-cached.
Symbols are 1–10 characters (letters, digits, dot, dash) and are matched case-insensitively. A malformed symbol answers 400; an uncovered symbol answers 404 with an onboarding hint (see below).
curl -s https://tgmcharts.com/api/v1/summary/AAPLContent-Type: application/json
Cache-Control: public, s-maxage=3600, stale-while-revalidate=86400
Access-Control-Allow-Origin: *Fields
Every scalar is number | null. Percent fields carry a Percent suffix and are expressed in percentage points (a 2.9% yield is 2.9). Fundamentals are trailing-twelve-month unless a field name says otherwise; prices are official end-of-day closes.
| Field | Contents |
|---|---|
| symbol, name, sector, industry | Identity as stored; name/sector/industry are null when not stored. |
| currency, reportedCurrency | currency is always USD. reportedCurrency names the filer's own currency for foreign filers whose statements were converted at per-date FX; null otherwise. |
| asOf | dataUpdatedAt — the ISO time the symbol was last precomputed — plus a fixed basis note (end-of-day closes; TTM fundamentals unless suffixed). |
| price | Latest official close, day change, market cap, 52-week high/low, YTD and 1-year returns (percent). |
| valuation | P/E (trailing and forward), P/S, P/B, P/FCF, PEG, EV/EBITDA, EV/Sales, earnings yield, FCF yield. FCF- and EV-family fields are null when not meaningful for the company type (see applicability). |
| profitability | Gross, operating and net margin, ROE, ROA, ROIC — percent. |
| financialHealth | Current ratio, quick ratio, debt-to-equity, interest coverage. |
| dividends | Yield (percent), payout ratio (percent), dividend per share, consecutive years of increases. |
| growthCagrPercent | 3-, 5- and 10-year CAGRs for revenue, gross profit, net income, EPS, free cash flow, dividends and total return — null where the window is not covered. |
| applicability | Whether free-cash-flow and enterprise-value metrics are applicable, secondary context, or intentionally withheld for this company type. |
| links | The stock's overview, metrics and financials pages, plus llms.txt. |
Response shape
The skeleton below is produced by the same builder the endpoint runs, given no stored data — so every value reads null. A live response has the identical keys with the stored numbers filled in. It is shown this way on purpose: the docs never print numbers that were not read from the data store.
{
"symbol": "AAPL",
"name": null,
"sector": null,
"industry": null,
"currency": "USD",
"reportedCurrency": null,
"asOf": {
"dataUpdatedAt": null,
"note": "Prices are official end-of-day closes; fundamentals are trailing-twelve-month unless suffixed otherwise."
},
"price": {
"lastClose": null,
"change": null,
"changePercent": null,
"marketCap": null,
"high52Week": null,
"low52Week": null,
"returnYtdPercent": null,
"return1YPercent": null
},
"valuation": {
"peRatio": null,
"peRatioForward": null,
"psRatio": null,
"pbRatio": null,
"pfcfRatio": null,
"pegRatio": null,
"evToEbitda": null,
"evToSales": null,
"earningsYieldPercent": null,
"fcfYieldPercent": null
},
"profitability": {
"grossMarginPercent": null,
"operatingMarginPercent": null,
"netMarginPercent": null,
"roePercent": null,
"roaPercent": null,
"roicPercent": null
},
"financialHealth": {
"currentRatio": null,
"quickRatio": null,
"debtToEquity": null,
"interestCoverage": null
},
"dividends": {
"yieldPercent": null,
"payoutRatioPercent": null,
"dividendPerShare": null,
"consecutiveYears": null
},
"growthCagrPercent": {
"revenue": {
"y3": null,
"y5": null,
"y10": null
},
"grossProfit": {
"y3": null,
"y5": null,
"y10": null
},
"netIncome": {
"y3": null,
"y5": null,
"y10": null
},
"eps": {
"y3": null,
"y5": null,
"y10": null
},
"freeCashFlow": {
"y3": null,
"y5": null,
"y10": null
},
"dividends": {
"y3": null,
"y5": null,
"y10": null
},
"totalReturn": {
"y3": null,
"y5": null,
"y10": null
}
},
"links": {
"overview": "https://tgmcharts.com/stocks/AAPL",
"metrics": "https://tgmcharts.com/stocks/AAPL/metrics",
"financials": "https://tgmcharts.com/stocks/AAPL/financials",
"docs": "https://tgmcharts.com/llms.txt"
},
"applicability": {
"freeCashFlow": "applicable",
"enterpriseValue": "applicable"
}
}Honest states
nullmeans the value is not stored or not meaningful for the company type — it is never a zero standing in for missing data. A stored zero (for example a zero dividend per share) is served as0.- Free-cash-flow and enterprise-value metrics are withheld (
null) for banks, insurers, REITs and funds, where the definitions are not meaningful;applicabilitysays which and why. - An uncovered symbol answers
404with a short negative cache (s-maxage=120) so coverage onboarding — visiting the stock page triggers it, about two minutes — is not outlived by a cached miss.
{
"error": "Symbol not covered",
"symbol": "ZZZQ",
"hint": "If this is a real ticker, visiting https://tgmcharts.com/stocks/ZZZQ triggers coverage onboarding (~2 minutes)."
}Caching and keys
Data changes at most once a day (after the US close), so cache responses for at least an hour — the headers above do it for you. With an API key the same request is metered at one unit and answered with Cache-Control: private plus X-RateLimit-* headers; see authentication and limits.
FAQ
- What does the stock summary endpoint return?
- A compact JSON object with the stock's identity, latest end-of-day close and market cap, valuation ratios (P/E, P/S, P/B, P/FCF, PEG, EV/EBITDA, EV/Sales, earnings and FCF yield), margins and returns, financial-health ratios, dividend record, 3/5/10-year growth CAGRs, as-of dates, and page links.
- Why is a value null?
- Because it is not stored, or because it is not meaningful for the company type (free-cash-flow and enterprise-value metrics for banks, insurers, REITs and funds). The applicability block explains the withheld families. Nothing is zero-filled.
- Do I need an API key for the summary endpoint?
- No. It is keyless and CORS-open with attribution. A key adds exact metering, per-account quotas and X-RateLimit headers.