How can I get ChatGPT to look up fund and ETF data by ISIN?
Three ways to give ChatGPT real fund data: connect the MCP server, build a custom GPT with the OpenAPI spec as an Action, or paste the JSON from one API call. Steps for each.Updated 12 September 2026 · by FundFacts APIShort answer
ChatGPT cannot read fund factsheets on its own, but it can call an API. Where your ChatGPT plan allows custom connectors, add the FundFacts MCP server (https://fundfactsapi.com/api/mcp) with your API key and ask about any ISIN. On any plan, build a custom GPT whose Action imports the OpenAPI spec at https://fundfactsapi.com/openapi.json with bearer authentication. For a one-off question, paste the JSON from a single GET /funds/{isin} call into the chat.
Why ChatGPT needs a data source for funds
Fund figures live in PDFs and product pages that change monthly. A model answering from memory will quote a TER or a top holding from whenever its training data was collected, without an as-of date. Giving ChatGPT a tool that returns the current published figures fixes both problems: the answer is current and it carries dataAsOf.
Option 1: connect the MCP server
ChatGPT supports remote MCP servers as custom connectors on plans that allow them (developer mode, Team, Enterprise and Edu at the time of writing; check your workspace settings). Add a connector with:
| Setting | Value |
|---|---|
| Server URL | https://fundfactsapi.com/api/mcp |
| Authentication | Custom header Authorization: Bearer ffk_... (your key from the dashboard) |
The MCP server exposes six tools, each counted like the REST endpoint it wraps: get_fund (ISIN → the full factsheet payload), search_funds (name → ISINs, free), compare_funds (side-by-side table for several ISINs), analyze_portfolio (weighted look-through of a list of positions, Pro and above), fund_overlap (shared holdings between funds, Pro and above) and get_scpi (French SCPI data by name or ISIN). Authentication is the same bearer API key as the REST API, sent as an Authorization header.
Then ask in plain language: "What is the TER and top ten of IE00B4L5Y983?", "Compare IE00B4L5Y983 and IE00B3RBWM25", "How much do these two ETFs overlap?". ChatGPT picks the tool, calls it and cites the figures with their as-of date.
Option 2: a custom GPT with an Action
Custom GPTs take an OpenAPI document as an Action, which works on every plan that can create GPTs:
- Create a GPT, open Configure → Actions → Create new action.
- Choose Import from URL and paste
https://fundfactsapi.com/openapi.json. - Authentication: API Key, auth type Bearer, paste your
ffk_key. - In the instructions, add: "Use getFund for any ISIN the user mentions. Always state data.dataAsOf next to figures. Treat 404 fund_not_found as 'not a covered fund'."
The spec describes every endpoint (single fund, batch, search, portfolio look-through, overlap, factsheets, SCPI), so the GPT can answer more than lookups.
Option 3: paste the JSON
For a one-off question, run one call and paste the result:
bashcurl -s https://fundfactsapi.com/api/v1/funds/IE00B4L5Y983 -H "Authorization: Bearer $FUNDFACTS_API_KEY"
The payload is a few kilobytes of JSON with self-describing keys (headlineMetrics.ter, topHoldings, sector, calendarReturns, dataAsOf), so ChatGPT reads it without further explanation. Without a key, GET https://fundfactsapi.com/api/v1/demo/funds/IE00B4L5Y983 returns the same payload for funds already in the store.
What to tell the model
Whichever route you take, two instructions improve the answers: quote data.dataAsOf with every figure, and do not fill gaps. Fields a fund does not disclose come back empty, not missing, and the model should say "not disclosed" rather than estimate.
Paid plans include an AI companion kit generated from the live field reference: an AGENTS.md with every endpoint, field, rule and a reference client; a Cursor rule; a Claude Code skill; the OpenAPI spec and TypeScript types, with your key baked in or read from an environment variable. Download it from the dashboard; the public edition without a key is at /llms-full.txt.
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]}'