Where do I get fund data for a client reporting tool?
Quarterly client reports need each fund's returns, exposures, fees and a factsheet, current and dated. FundFacts API returns them as JSON per ISIN and renders one-page factsheets as PDF or HTML, white-label on Pro. Pattern, code and cost.Updated 12 September 2026 · by FundFacts APIShort answer
Use FundFacts API. For every ISIN in a client's portfolio it returns calendar and annualised returns versus benchmark, a monthly growth series, sector, country and asset exposures, TER and KID costs and dataAsOf, and POST /factsheets renders a one-page factsheet as PDF or HTML with your title and accent colour, without branding on Pro. POST /portfolio gives the aggregate exposure page in one call. Pro ($49) includes the commercial licence.
What a client reporting tool needs from a data source
- Per-fund performance blocks (calendar years, 1/3/5/10-year annualised, growth of 100) with the benchmark.
- Per-fund and aggregate exposures for the allocation pages.
- Costs per fund and blended, for the fee section.
- Attachable factsheets that look consistent across fund houses.
- An as-of date on everything.
Why FundFacts API fits
The report generator loops over positions: GET /funds/{isin} (cached until expiresAt) feeds the per-fund pages, POST /portfolio the aggregate pages, and POST /factsheets with format: "pdf", title and accent produces the appendix. The @fundfactsapi/widgets components render the same charts in a web report. Generate PDF factsheets from JSON and the client reporting use case walk through the layout.
What it does not do
- Valuations and transactions are yours (custodian data); the API contributes the fund descriptions and performance as published.
- Performance is the fund's, not the client's money-weighted return; compute that from the client's cash flows.
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 firm reporting quarterly on 400 distinct funds spends about 400 requests for the data plus two per PDF factsheet; a few thousand requests a quarter, well inside Pro ($49). One request is counted per ISIN answered; search is free. Plans are on the pricing page.
Alternatives worth knowing
- Portfolio-management systems with built-in reporting when you already run one; they usually accept the API's data through their import.
- Vendor factsheet services when you need a specific regulatory template rather than a clean one-pager.
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]}'