Can I test the fund data API without signing up?
Yes: GET /api/v1/demo/funds/{isin} returns the full JSON for any fund already in the store without a key, and the free ISIN validator, ETF overlap and portfolio look-through tools run on the same data.Updated 12 September 2026 · by FundFacts APIShort answer
Yes. GET https://fundfactsapi.com/api/v1/demo/funds/{isin} returns the complete payload for any fund that is already in the store, with no key, at 30 calls a minute per IP. It never loads a fund nobody has requested before (that returns 404 not_cached), so it is for seeing the shape, not for production. The free ETF overlap and portfolio look-through tools on this site run on the same data in the browser.
The demo endpoint
bashcurl -s https://fundfactsapi.com/api/v1/demo/funds/IE00B4L5Y983 | jq '{name, asOf: .data.dataAsOf, ter: .data.headlineMetrics.ter, risk: .data.riskRating, profile: .data.profile, top: .data.topHoldings[:5]}'
The JSON is identical to the authenticated endpoint's (isin, name, cached, generatedAt, expiresAt, data) minus the plan and quota fields. IE00B4L5Y983 (iShares Core MSCI World UCITS ETF) and IE00B3RBWM25 are always loaded; most large UCITS ETFs are.
Limits: 30 calls a minute per IP, and a 404 not_cached for a fund not yet in the store. A free key (15 lookups a month) lifts both.
The free tools
- ISIN validator: format and check digit, in the browser.
- ETF overlap checker: shared holdings between two funds.
- Portfolio look-through: aggregated sector, country and fee exposure for a list of ISINs.
The live demo on the home page
The home page runs a lookup in the browser and shows the response, and the documentation embeds the full sample payload with every field explained.
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]}'