By field

How do I get the NAV history or price series of a fund by ISIN?

Monthly performance series for any fund or ETF from its ISIN as JSON: data.indexedPerformance.points rebased to 100 and data.cumulativePerformance, fund and benchmark side by side.Updated 12 September 2026 · by FundFacts API

Short answer

Call GET https://fundfactsapi.com/api/v1/funds/{isin} with a bearer API key and read data.indexedPerformance.points in the JSON response (related fields: data.indexedPerformance.hasIndex, data.cumulativePerformance). Where the fund house publishes a NAV file, the series is computed from it: monthly points, rebased to 100 at inception or the start of the file, with the benchmark leg rebased on the same date. The Free plan gives 15 lookups a month with no card, and the keyless demo endpoint shows the shape for an already-loaded fund.

Where it is in the response

PathTypeMeaning
data.indexedPerformance.pointsArray<{ date, fund, index }>Monthly points rebased to 100 at the start of the series; index is the benchmark when published.
data.indexedPerformance.hasIndexbooleanWhether a benchmark leg is present.
data.cumulativePerformanceArray<{ date, fund, benchmark }>Cumulative growth of the fund and its benchmark, as the document or NAV file provides it.

Sample for iShares Core MSCI World UCITS ETF (IE00B4L5Y983):

json
"indexedPerformance": {
"hasIndex": true,
"points": [
{ "date": "2026-07", "fund": 588.12, "index": 409.90 },
{ "date": "2026-08", "fund": 594.48, "index": 413.62 },
{ "date": "2026-09", "fund": 590.37, "index": 410.74 }
]
}

Where the figure comes from

Where the fund house publishes a NAV file, the series is computed from it: monthly points, rebased to 100 at inception or the start of the file, with the benchmark leg rebased on the same date. Where only the factsheet's growth chart or cumulative table is published, that is what the series reflects. The freshness page describes the computation.

The request

bash
curl -s --max-time 300 https://fundfactsapi.com/api/v1/funds/IE00B4L5Y983 \
-H "Authorization: Bearer $FUNDFACTS_API_KEY" | jq '.data.indexedPerformance.points[-6:]'
python
import os, requests
r = requests.get("https://fundfactsapi.com/api/v1/funds/IE00B4L5Y983",
headers={"Authorization": f"Bearer {os.environ['FUNDFACTS_API_KEY']}"}, timeout=300)
fund = r.json()
print(fund["name"], fund['data']['indexedPerformance']['points'])
javascript
const res = await fetch("https://fundfactsapi.com/api/v1/funds/IE00B4L5Y983", {
headers: { Authorization: `Bearer ${process.env.FUNDFACTS_API_KEY}` },
signal: AbortSignal.timeout(300_000),
});
const fund = await res.json();
console.log(fund.name, fund.data.indexedPerformance.points);

Sign up at fundfactsapi.com/signup for a key; the Free plan is 15 lookups a month with no card. Without a key, GET https://fundfactsapi.com/api/v1/demo/funds/IE00B4L5Y983 returns the same payload for funds already in the store (30 calls a minute per IP; it never loads a new fund).

Caveats

  • This is a monthly series for charts and statistics, not daily tick data. Use it for growth charts, drawdown, volatility and rolling returns.
  • Series length depends on what the fund house publishes; some carry the full history since inception, some the last five years.
  • Values are total return where the fund house reports total return (almost always for UCITS).

Several funds at once

POST /funds with { "isins": ["…", "…"], "wait": true } returns the same payload for up to 10 ISINs per call on Starter, 50 on Pro and 200 on Scale. One request is counted per ISIN answered. X-RateLimit-Remaining on every response tells you how many are left this month; a 429 rate_limited response carries Retry-After. Search and /me are free.

A fund nobody has requested in the last 24 hours is loaded on demand from the documents the fund house publishes. That first call takes 15 seconds to about 3 minutes; set your client timeout to 300 seconds and do not fire a second request for the same ISIN while the first is running. Every later call within 24 hours returns from the store in well under a second with cached: true.

Everything else in the payload is listed in the field reference.

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.
bash
curl -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]}'

Terms used on this page

Frequently asked questions

Is daily NAV available?

The API returns a monthly series computed from the published NAV file or the factsheet. Daily NAV history is not exposed as a series; the point of the product is the factsheet, not a price feed.

Do I need a credit card to try it?

No. The Free plan is 15 lookups per month with no card; sign up with an e-mail address or Google and the key is shown in the dashboard.

Which ISINs work?

Any share class of a UCITS fund, ETF, money-market fund or open-end fund whose management company publishes a product page, factsheet and KID. Each share class has its own ISIN and is looked up on its own. Stocks, bonds and indices are not funds and return 404 fund_not_found.

How current are the figures?

Each ISIN is re-read from the fund house's documents at most every 24 hours. data.dataAsOf is the as-of date printed on the documents, typically the last month end for a factsheet and the last trading day for holdings files.

Try it on your own ISINs

One request returns key facts, holdings, risk and performance as JSON. Free plan, no card.