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.Updated 12 September 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 next refresh happens. 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 will be re-read (24 h later) | 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
On the Scale plan, 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) and webhooks push the same events, signed. That is the reliable way to react to changes rather than diffing payloads yourself.
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]}'