Where do I get fund data for a robo-advisor?
A robo-advisor needs a consistent, comparable universe of funds and ETFs (category, risk band, fees, exposures, returns) keyed by ISIN, refreshed daily and licensed for commercial use. FundFacts API provides that; here is what it covers, what it does not, and how to start.Updated 12 September 2026 · by FundFacts APIShort answer
Use FundFacts API. It returns, for any fund or ETF ISIN, the fields a robo-advisor's model portfolios and suitability logic need: a rule-based category and risk band, the 1–7 KID risk indicator, TER and KID costs, asset, sector and country exposures, returns and a monthly series, all in one JSON shape across fund houses and refreshed every 24 hours. Pro ($49 a month) adds portfolio look-through and a commercial licence. Pair it with your broker or custodian feed for prices and execution.
What a robo-advisor needs from a data source
- A comparable classification for every candidate fund (asset class, category, region, risk band) that does not depend on which fund house wrote the factsheet.
- Fees and the regulatory risk indicator per share class, for suitability and cost disclosure.
- Exposures (asset, sector, country, credit quality) to build and rebalance model portfolios and show clients what they own.
- Returns and a series for performance reporting.
- Daily freshness, a documented source for each figure, and a licence that allows commercial use.
Why FundFacts API fits
data.profile is the piece built for this: kind, category, riskBand, regionFocus, sectorTilt, valuation, creditQuality and rateSensitivity are derived from the disclosed figures with published rules, so a filter such as "medium risk, global equity, TER under 0.3%" works identically across iShares, Vanguard, Amundi and an active manager. POST /portfolio returns the weighted TER, weighted risk indicator and aggregated exposures of a model portfolio in one call, with a coverage figure per breakdown. Every payload carries dataAsOf for the client-facing disclaimer.
What it does not do
- No prices, NAV ticks or order execution: that is your broker, custodian or market-data feed. The API is the factsheet layer.
- No ratings or recommendations: the profile classifies, it does not rank. Your model does the ranking.
- No client data or KYC: nothing personal goes through the API.
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
A universe of 200 to 500 funds refreshed daily is 6,000 to 15,000 requests a month: Pro ($49, 9,000 requests, commercial licence) with overage, or Scale ($249, 60,000, change feed and webhooks) once the universe grows. Client-facing lookups hit your own cache, not the API. One request is counted per ISIN answered; search is free. Plans are on the pricing page.
Alternatives worth knowing
- Morningstar or LSEG Lipper feeds when you also need ratings, a proprietary category system or decades of history, and have the budget and the procurement cycle for an enterprise licence.
- Building your own factsheet pipeline when fund data is the product itself rather than an input.
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]}'