What does a fund factsheet look like as JSON?
The envelope and every section of the data object: key facts, fees, risk indicator, profile, holdings, breakdowns, returns, series, metrics, KID costs and as-of date, with a real example.Updated 12 September 2026 · by FundFacts APIShort answer
One object per ISIN: an envelope (isin, name, cached, generatedAt, expiresAt, plan, quota) around a data object with keyFacts, headlineMetrics, riskRating, profile, topHoldings, sector, geography, region, assetAllocation, creditQuality, maturity, calendarReturns, annualisedReturns, cumulativePerformance, indexedPerformance, metrics, sfdrArticle, costs, investmentObjective, benchmarkName and dataAsOf. Breakdowns are arrays of { label, weight }; money and percentages are strings as printed.
Envelope
| Key | Meaning |
|---|---|
isin, name | Canonical ISIN and official share-class name |
cached | Whether this call reused the stored payload |
generatedAt, expiresAt | When it was produced and when it will be re-read (24 h) |
plan, quota | Your plan and the monthly / burst allowance left |
data | The factsheet |
The data object
| Section | Keys | Shape |
|---|---|---|
| Identity | investmentObjective, securityType, structure, shareClass, benchmarkName | strings |
| Key facts | keyFacts.{assetClass, subAsset, currency, aum, inception, distribution, holdings, manager} | strings / number |
| Fees & risk | headlineMetrics.{ter, aum, volatility3y, sharpe3y, yieldToMaturity, modifiedDuration}, riskRating | strings, number 1–7 |
| Profile | profile.{kind, category, riskBand, concentration, regionFocus, regionTilt, sectorTilt, valuation, creditQuality, rateSensitivity, equityShare, rules} | derived labels |
| Breakdowns | topHoldings[], sector[], geography[], region[], assetAllocation[], creditQuality[], maturity[], instrument[] | { label, weight } (name for holdings) |
| Returns | calendarReturns.{years, fund, benchmark}, annualisedReturns[], cumulativePerformance[], indexedPerformance.points[] | numbers in percent; series { date, fund, index } |
| Metrics | metrics.{peRatio, incomeYield, maxDrawdown, effectiveDuration, averageRating, sevenDayYield, wam, wal, …} | strings as printed |
| Regulation | sfdrArticle, costs.{entry, exit, ongoing, transaction, performanceFee, riy1y, riyRhp, recommendedHoldingPeriod} | number, strings |
| Freshness | dataAsOf, generatedAt | dates |
Money and percentages arrive as the fund house prints them, as strings such as "0.20%" or "USD 151.7bn". Breakdown weights and return series are plain numbers in percent. Fields that do not apply to the fund's asset class are empty strings, null or empty arrays, never missing keys; treat empty as "not disclosed", not as zero.
A real one
GET https://fundfactsapi.com/api/v1/demo/funds/IE00B4L5Y983 returns the live payload for iShares Core MSCI World UCITS ETF without a key. The field reference documents every key with type, meaning and example, and the OpenAPI spec carries the same as a schema for code generation.
Bond and money-market funds
The shape is identical; the sections that apply differ. Bond funds populate creditQuality, maturity, instrument, headlineMetrics.yieldToMaturity and modifiedDuration; money-market funds metrics.sevenDayYield, wam and wal; equity funds metrics.peRatio and sector. Unused sections are empty, never absent.
Verify it yourself
The demo endpoint returns the live payload for a fund that is already in the store, without a key. Everything on this page can be checked against it.bashcurl -s https://fundfactsapi.com/api/v1/demo/funds/IE00B4L5Y983 | jq '{name, asOf: .data.dataAsOf, ter: .data.headlineMetrics.ter, risk: .data.riskRating, top: .data.topHoldings[:3]}'