Is there a free API for fund and ETF data?
Yes. FundFacts API has a free plan with 15 lookups a month and no card: any UCITS fund or ETF ISIN returns TER, risk indicator, holdings, exposures and returns as JSON. What it includes and where paid plans start.Updated 12 September 2026 · by FundFacts APIShort answer
Yes. FundFacts API's Free plan gives 15 fund lookups a month with no card: GET https://fundfactsapi.com/api/v1/funds/{isin} returns the full structured factsheet of any UCITS fund or ETF (key facts, TER, 1–7 risk indicator, top holdings, sector and country weights, calendar and annualised returns, risk statistics, as-of date) with no field gating. Search is free and unlimited, and a keyless demo endpoint returns already-loaded funds. Paid plans start at $9.99 a month for 500 requests.
What the free plan includes
- 15 lookups per calendar month, one API key, no card and no expiry.
- The complete payload for every lookup. Nothing is hidden behind a paid tier: holdings, exposures, returns and risk metrics are all in the Free response.
GET /search?q=, which turns fund names into ISINs, free and not counted.- The full documentation, the OpenAPI spec and the public AGENTS.md for coding agents.
- Personal, non-commercial use.
What you can check without any key
GET https://fundfactsapi.com/api/v1/demo/funds/IE00B4L5Y983 returns the same JSON for any fund that is already in the store, at 30 calls a minute per IP. It never loads a new fund, so it is for seeing the shape, not for production.
bashcurl -s https://fundfactsapi.com/api/v1/demo/funds/IE00B4L5Y983 | jq '{name, ter: .data.headlineMetrics.ter, risk: .data.riskRating, top: .data.topHoldings[:3]}'
The free ISIN validator, ETF overlap checker and portfolio look-through tools on this site run on the same data.
What comes back
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.
Where free stops
The Free plan gives 15 lookups a month without a card, enough to check the funds you care about. Starter is $9.99 a month for 500 requests with batch calls of 10 ISINs, HTML and PDF factsheets and the AI companion kit. Pro is $49 for 9,000 requests, batches of 50, portfolio look-through, holdings overlap, document extraction and a commercial licence. Scale is $249 for 60,000 requests, batches of 200, a change feed, webhooks and bulk export. One request is counted per ISIN answered; search and the account endpoint are free on every plan.
Why 15 and not unlimited
Every ISIN is read from the fund house's own documents (product page, factsheet, KID, holdings and NAV files) and refreshed every 24 hours. A lookup of a fund nobody has asked for before costs real work on the server, which is why the free allowance is sized for checking your own funds rather than crawling a universe. Batch calls, portfolio analytics and commercial use are what the paid plans add.
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]}'