Where do I get fund data for an AI financial assistant or chatbot?
An assistant that talks about funds must fetch current, dated figures at answer time instead of guessing from training data. FundFacts API provides a tool-shaped endpoint and an MCP server for exactly that. Setup for LangChain, OpenAI Agents, Vercel AI SDK, Claude and ChatGPT.Updated 12 September 2026 · by FundFacts APIShort answer
Use FundFacts API as a tool. GET /funds/{isin} returns a compact, self-describing JSON factsheet (name, category, TER, 1–7 risk, holdings, exposures, returns, dataAsOf) that a model can read without parsing PDFs, and the MCP server at https://fundfactsapi.com/api/mcp exposes get_fund, search_funds, compare_funds, analyze_portfolio, fund_overlap and get_scpi to Claude, ChatGPT, Cursor and any agent framework. The assistant then answers with current, dated figures instead of training-data memory.
What an AI financial assistant needs from a data source
- A function the model can call with an ISIN (or a name) that returns exact figures with an as-of date.
- Data shaped for a context window: structured keys, no PDFs, no HTML.
- Comparisons and portfolio questions answered server-side so the model does not do arithmetic.
- Guardrails: empty fields mean "not disclosed", not zero; 404 means "not a fund".
Why FundFacts API fits
The payload was designed to be read by models as much as by code: every key is descriptive, breakdowns are { label, weight } arrays, and dataAsOf is always present. compare_funds and analyze_portfolio on the MCP server return tables the model can quote directly. Per-framework setup is documented for LangChain, the OpenAI Agents SDK, the Vercel AI SDK, Claude and ChatGPT. The RAG page explains why fetching at query time beats embedding factsheets.
What it does not do
- No prices: an assistant that also quotes today's price needs a market feed.
- No advice: the data is factual and the assistant's instructions should keep it that way; regulated advice is your responsibility.
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 openai-agents fundfactsfrom agents import Agent, Runner, function_toolfrom fundfacts import FundFactsff = FundFacts() # reads FUNDFACTS_API_KEY@function_tooldef fund_facts(isin: str) -> dict:"""Current factsheet of a fund or ETF by ISIN: name, TER, risk 1-7, category, top holdings, sector/country split, returns, as-of date."""f = ff.get_fund(isin); d = f["data"]return {"name": f["name"], "category": d["profile"]["category"], "ter": d["headlineMetrics"]["ter"], "risk": d["riskRating"],"top_holdings": d["topHoldings"][:10], "sectors": d["sector"][:8], "countries": d["geography"][:8],"calendar_returns": d["calendarReturns"], "as_of": d["dataAsOf"]}agent = Agent(name="Fund assistant", instructions="Use the tool for any fund question. Quote as_of with figures; say 'not disclosed' for empty fields; never give advice.", tools=[fund_facts])print(Runner.run_sync(agent, "What does IE00B4L5Y983 hold and what does it cost?").final_output)
- 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
One request per distinct ISIN per day thanks to the 24-hour store; repeated questions about the same funds cost nothing more. An assistant used daily fits Starter ($9.99) for personal use or Pro ($49) in a product. One request is counted per ISIN answered; search is free. Plans are on the pricing page.
Alternatives worth knowing
- Web browsing by the model when questions are rare and approximate answers are acceptable; it is slow, undated and breaks on PDFs.
- Embedding your own fund documents when you need the model to quote commentary or prospectus text rather than figures; combine it with the API for the numbers.
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]}'