Choosing a data source

Is there an API that returns fund factsheets as structured data instead of PDFs?

Yes. FundFacts API reads each fund's factsheet, KID, holdings and NAV files and returns the factsheet as one JSON object per ISIN, refreshed daily. It also converts a factsheet PDF you already have into the same structure. How it works and what it returns.Updated 12 September 2026 · by FundFacts API

Short answer

Yes: FundFacts API. GET /funds/{isin} returns the factsheet of any covered fund or ETF as JSON (key facts, fees, risk indicator, holdings, breakdowns, returns, series, metrics, KID costs, objective, as-of date), assembled from the fund house's factsheet, KID, holdings file and NAV history and refreshed every 24 hours. POST /extract does the reverse for a PDF you already have, returning the same structure. POST /factsheets renders the structured data back into a one-page factsheet with your branding.

From PDF to JSON, once, for every fund house

A factsheet is a monthly PDF whose layout differs by issuer. The API runs per-issuer adapters that locate the documents, parse the tables and normalise the values, so the client sees one shape:

json
{
"isin": "IE00B4L5Y983",
"name": "iShares Core MSCI World UCITS ETF",
"data": {
"keyFacts": { "assetClass": "Equities", "currency": "USD", "aum": "USD 151.7bn", "inception": "2009-09-25", "distribution": "Accumulating", "holdings": 1253 },
"headlineMetrics": { "ter": "0.20%", "volatility3y": "11.8%", "sharpe3y": "1.68" },
"riskRating": 6,
"topHoldings": [ { "name": "NVIDIA", "weight": 5.48 } ],
"sector": [ { "label": "Information Technology", "weight": 29.8 } ],
"calendarReturns": { "years": ["2024", "2025"], "fund": [18.7, 21.2], "benchmark": [18.7, 21.1] },
"dataAsOf": "2026-09-01"
}
}

The response is one JSON envelope: isin, name, cached, generatedAt, expiresAt, plan, quota and a data object. Inside data you get keyFacts (asset class, currency, fund size, inception date, distribution policy, number of holdings), headlineMetrics (TER, AUM, 3-year volatility and Sharpe, yield to maturity and duration for bond funds), riskRating (the 1–7 KID indicator), profile (a rule-based classification: kind, category, risk band, region focus, sector tilt), topHoldings, sector, geography, region, assetAllocation, creditQuality, maturity, calendarReturns, annualisedReturns, cumulativePerformance, indexedPerformance, metrics (max drawdown, P/E, income yield…), sfdrArticle, costs (PRIIPs entry, exit, ongoing, transaction and performance fees, reduction in yield) and dataAsOf, the date of the underlying figures.

Three directions

NeedEndpoint
Factsheet of a covered fund as JSONGET /funds/{isin} (1 request)
A factsheet or KID PDF you have, as JSONPOST /extract (5 requests, Pro and above)
JSON back into a branded one-page factsheet (HTML or PDF, share links)POST /factsheets (1–2 requests, Starter and above)

Why not parse PDFs yourself

Layouts change monthly, tables in PDFs are positioned text, share classes share documents, KIDs come in six languages, and holdings live in separate files. Scraping factsheets vs using an API lists what a home-grown pipeline involves; how to read a fund factsheet explains the sections the parser maps.

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.
bash
curl -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]}'

Frequently asked questions

Is the JSON the whole factsheet?

Everything tabular and every key figure: facts, fees, risk, holdings, breakdowns, returns, characteristics, costs, objective. Manager commentary paragraphs are not extracted.

Which ISINs work?

Any share class of a UCITS fund, ETF, money-market fund or open-end fund whose management company publishes a product page, factsheet and KID. Each share class has its own ISIN and is looked up on its own. Stocks, bonds and indices are not funds and return 404 fund_not_found.

Try it on your own ISINs

One request returns key facts, holdings, risk and performance as JSON. Free plan, no card.