How fresh is the fund data, and how often is it updated?
Each ISIN is re-read from the fund house's documents at most every 24 hours. Factsheet figures are month-end, holdings and NAV are daily, and every payload states its as-of date and expiry.Published September 12, 2026 · by FundFacts APIShort answer
Every ISIN is re-read from the fund house's documents at most once per 24 hours; expiresAt in the response says when the payload is due for a refresh. A request after that date is answered at once from the store with stale: true while the refresh runs in the background (ask again a minute later for the new payload); nothing older than 7 days is served without a new read. The figures themselves are as fresh as the documents: holdings files and NAV history are usually one trading day old, factsheet tables (sector weights, returns) are month-end, and the KID is updated when the fund house updates it. data.dataAsOf states the date of the figures on every payload.
Two dates, two meanings
| Field | Meaning | Use it for |
|---|---|---|
data.dataAsOf | Date printed on the source documents | Show next to any figure |
generatedAt / expiresAt | When the payload was produced and when it is due for a refresh (24 h later); past it, stale: true marks a payload served while the refresh runs | Cache until expiresAt |
A payload produced this morning can carry figures dated the last month end. That is not staleness in the API; it is how fund houses publish. The as-of dates guide walks through the cases.
Per section
- Holdings and NAV series: previous trading day where the fund house publishes files; month-end where only the factsheet table exists.
- Sector, country, asset weights, returns, portfolio characteristics: month-end factsheet.
- TER, AUM, name, distribution policy: product page, usually a few days old.
- Risk indicator, KID costs, SFDR article: the current KID, which changes when the fund house re-issues it.
Not a price feed
The API returns the factsheet as data, refreshed daily. It does not stream intraday prices or NAVs; the monthly series is for charts and statistics. For ETF market prices use your broker or exchange feed; for the difference between the two see NAV vs market price.
Knowing when something moved
From Starter, GET /changes?since= lists every tracked field that changed between refreshes (TER, risk indicator, AUM, manager, distribution policy, holdings count, benchmark, objective, top-five holdings) on the funds you watch (POST /watchlist; 10 funds on Starter, 100 on Pro; every fund in the store on Scale), and webhooks push the same events, signed. That is the reliable way to react to changes rather than diffing payloads yourself; for the figures themselves over time, GET /funds/{isin}/history (Pro and up) serves TER, KID costs, fund size, risk indicator and top holdings per as-of date since 15 September 2026.
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]}'