Where do I get ETF and fund data for a personal finance app in Europe?
European users hold UCITS ETFs and funds identified by ISIN, with KIDs, TERs and SRRI rather than US tickers and expense ratios. FundFacts API covers that universe from the fund houses' own documents. What it gives a consumer app and what to pair it with.Updated 12 September 2026 · by FundFacts APIShort answer
Use FundFacts API. It is keyed by ISIN, covers UCITS ETFs and funds from the European fund houses your users actually hold (iShares, Vanguard, Xtrackers, Amundi, SPDR, Invesco and 60 more), and returns the fields a consumer app shows: name, category, TER, the 1–7 risk indicator, top holdings, sector and country weights, returns, dataAsOf. Search resolves fund names to ISINs for free. Pair it with your broker connection or a price feed for valuations; Pro ($49) covers commercial use.
What a personal finance app in Europe needs from a data source
- ISIN-first identification, since European brokers and statements use ISINs, not exchange tickers.
- Coverage of UCITS ETFs and funds, including accumulating and distributing classes and hedged variants.
- Consumer-friendly fields: what is in it, what it costs, how risky, how it did.
- Localised documents behind the figures (KIDs in German, French, Italian…).
Why FundFacts API fits
A US-centric market API sees iShares Core MSCI World UCITS ETF as four tickers with thin profiles; the API sees one ISIN with the full factsheet. GET /search?q= (free) gives users name-based search returning ISIN, currency and Acc / Dist so they pick the right class. KID cost and risk tables are parsed in EN, FR, DE, ES, IT and NL, and the DE and FR landing pages describe the product in those markets. POST /portfolio powers a "what do I really own" screen; @fundfactsapi/widgets renders the donuts and bars.
What it does not do
- No prices or tax data; the broker connection or a quote feed provides valuations, and tax logic is yours.
- Stocks and bonds the user holds are not funds and return 404; keep them as plain positions.
Start in ten minutes
- Get a key at fundfactsapi.com/signup (Free plan, 15 lookups a month, no card).
- Look up one fund and read the shape:
python# pip install fundfacts (or call https://fundfactsapi.com/api/v1/funds/{isin} with any HTTP client)from fundfacts import FundFactsff = FundFacts() # reads FUNDFACTS_API_KEY; free key at https://fundfactsapi.com/signupfund = ff.get_fund("IE00B4L5Y983")d = fund["data"]print(fund["name"], d["profile"]["category"], d["headlineMetrics"]["ter"], d["riskRating"], d["dataAsOf"])print(d["topHoldings"][:5], d["sector"][:3], d["geography"][:3])
- Read the field reference for every key, and the endpoints for batch, search, portfolio, overlap, factsheets and SCPI.
- If a coding agent is building it, point it at /llms-full.txt, the complete AGENTS.md for the API.
What it costs
Requests scale with distinct funds, not users: 1,000 distinct ISINs refreshed daily is about 30,000 requests a month (Scale, $249); a smaller universe fits Pro ($49). User views hit your cache. One request is counted per ISIN answered; search is free. Plans are on the pricing page.
Alternatives worth knowing
- A market-data API with ISIN support when you only need prices and names and no holdings, fees or risk indicators.
- Licensing a vendor database when you need ratings or want a single contract covering prices and reference data, at enterprise pricing.
The provider comparison and the compare pages go into each in more depth.
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]}'