Indian Mutual Fund NAV Scraper (AMFI)
Daily NAV for Indian mutual fund schemes from AMFI. Scheme code, name, fund house, category, NAV and its trading date. History to 2010. No API key.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
mode,universe,maxItems(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Pricing
$0.0002 per fund NAV = $0.2 per 1,000
| You are charged for | When | Price |
|---|---|---|
| Fund NAV | One fund with its published NAV and the date that NAV is for. Schemes whose last NAV is older than your age limit are left out and not charged. | $0.0002 |
Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-09-30, and they are what you are actually charged.
Inputs
| Field | What it does | Type |
|---|---|---|
mode | latest reads the daily published file and gives you one row per scheme, carrying that scheme's most recent published NAV. history reads AMFI's date-ranged report and gives you one row per scheme per day over the dates you choose. | string |
universe | Only used when mode is latest. open is open-ended schemes, the ones you can still buy and sell, and is what most people want. all adds the close-ended and interval schemes, most of which stopped trading years ago and are frozen at their final value. | string |
maxItems | Total rows to return in this run. You pay per row, so keep this low while you are testing. Rows come back in the file's own order, grouped by category and then by fund house, so cutting a run short with a low number gives you the first categories rather than a spread across the market. Use the filters below if you want particular schemes. Hard ceiling 50,000 per run. | integer |
maxNavAgeDays | This is the important setting. AMFI's file is a register of every scheme it has ever listed, so a large share of it is schemes that were wound up years ago and are frozen at their last published value, sitting there looking exactly like a current price. Anything older than this limit is skipped and never charged. The default of 7 days covers a weekend plus a public holiday and leaves you with the live market. Raise it to 20000 if you want the full historical register, in which case every row arrives flagged with its real age. | integer |
maxFileAgeDays | The alarm for the case where AMFI's own publishing stops. A file that has not been refreshed for a month still answers normally and still looks healthy, so this checks the newest NAV anywhere in it. If that is older than this limit the run charges nothing at all and returns one free row telling you the date it found. Only used when mode is latest. | integer |
schemeCodes | AMFI scheme codes, exactly as published, for example 119551. This is the cheapest way to follow a specific set of schemes every day: you are charged for the rows that come back and nothing else. If you do not know the codes, run once with a name filter and read them off the rows. | array |
fundHouses | Match on the fund house name, case-insensitive, matching anywhere in it. HDFC catches HDFC Mutual Fund. Several entries act as any of. | array |
nameContains | Match on the scheme name, case-insensitive, matching anywhere in it. Several entries act as any of. Note that the daily file and the history report write scheme names differently, so this is a good way to discover a scheme and a bad way to join across the two. | array |
categoryContains | Match on the category heading, case-insensitive. Try Large Cap, Liquid, ELSS, Index Funds, Gold ETF. Use a substring rather than the full heading, because AMFI writes several categories two ways, both Equity Scheme - and Equity Schemes -. | array |
dateFrom | Only used when mode is history. Either 2026-09-01 or 01-Sep-2026. Leave both dates empty and you get the last seven days. One run covers at most 366 days; a longer range is trimmed and the run tells you it did. | string |
dateTo | Only used when mode is history. Same formats as above. AMFI publishes no NAV on weekends or Indian public holidays for most schemes, so a range covering only those days legitimately returns nothing, and no rows are charged. | string |
proxyUrls | Leave this empty for a normal run. Fill it in only if you want the traffic to leave through proxy servers you already pay for, one URL per line, in the form http://user:pass@host:port. | array |
What you get
A structured dataset — each result includes fields like:
schemeCodeschemeNamefundHousecategorycategoryTypeplanoptionnavnavRawcurrencynavDatenavAgeDaysisinGrowthisinReinvestmentExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
Related tools in Developer & Research Tools
Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.
GitHub Scraper
Search GitHub repos and users: stars, forks, language, topics, licence, plus user bio, company and followers. No token needed. $0.90 per 1,000 rows.
Stack Overflow / Stack Exchange Scraper
Search Stack Overflow and Stack Exchange by keyword or tag. Score, answer count, views, reputation and body text. $2 per 1,000 questions.
Package Registry Scraper (npm + PyPI)
Get npm and PyPI package metadata as JSON. Version, license, author, repo, keywords and npm monthly downloads. $2 per 1,000 packages.
arXiv Scraper
Search arXiv papers by title, author, abstract or category. Get full abstracts, authors, categories, DOI, dates and PDF links. $2 per 1,000 papers.
OpenAlex Scholarly Works Scraper
Search 250M+ OpenAlex papers with no API key. Get titles, authors, venue, year, citations, DOI, OA links and full abstracts. $2.00 per 1,000 papers.
Crossref Scholarly Works Scraper
Search 150M+ papers on Crossref: DOI, title, authors, journal, publisher, date, citations and abstract. No API key. $1.00 per 1,000 works.
Where this tool sits
- Categories
- Developer & Research Tools
Indian Mutual Fund NAV Scraper: AMFI's published NAVs, each with the date it belongs to
Name the schemes you want, by AMFI scheme code, fund house, name or category, or take the whole market, and it reads the NAV files the Association of Mutual Funds in India publishes. You get one row per scheme with the scheme code, name, fund house, category, plan, option, ISINs, the NAV and the trading date that NAV is for, or one row per scheme per day in history mode, back to 2010. The catch is that AMFI's daily file is a register rather than a price list: on the day we measured it, about 40% of its rows were schemes that had stopped trading, some as far back as 2016, frozen at their last value, so anything older than your age limit is left out and not charged.
| Input | Latest or history, which schemes (by code, fund house, name or category), and age limits |
| Output | One row per scheme, or per scheme per day in history mode |
| Ceiling | 50,000 rows and 366 days of history per run |
| Account needed | None |
| Price | $0.20 per 1,000 NAV rows, flat on every plan |
🔍 What Indian Mutual Fund NAV Scraper does
In latest mode it reads AMFI's daily file: one row per scheme, carrying that scheme's most recent published NAV. Every row says which trading day its value is for, in navDate, and how many days old that was, in navAgeDays.
The whole file is checked before a single row is billed. If the newest NAV anywhere in it is older than maxFileAgeDays, the run charges nothing and writes a free FILE_STALE row with the date it found, because a file that has stopped moving still downloads normally. If the file's format changes shape, the run stops the same way rather than guessing at columns.
In history mode it reads AMFI's date-ranged report instead, one row per scheme per day. Every row is checked against the dates you asked for, and any outside them are dropped uncharged.
A NAV is struck once per valuation day and published in the evening, India time. There is no live price here, so once a day after the evening refresh is all you need.
Measured on 20 September 2026, on the file covering every scheme:
| NAV date on the row | Rows |
|---|---|
| 18 September 2026, the previous trading day | 7,982 |
| 20 September 2026, that morning | 706 |
| Anything earlier, back to April 2016 | 5,687 |
| Total rows in the file | 14,375 |
The rows dated that same morning are liquid and overnight schemes, which price every calendar day, weekends included.
📥 What you give it
| Field | If you leave it out | What it does |
|---|---|---|
mode | latest | latest for the daily file, one row per scheme. history for a date range, one row per scheme per day. |
universe | all | latest mode only. all (about 14,400 rows), open (about 9,600), close (about 4,700) or interval (about 40). open is the one most people want. |
maxItems | 1,000 | Total rows, 1 to 50,000. Rows come in the file's own order, by category and fund house, so filter rather than raise this. |
maxNavAgeDays | 7 | latest mode only. A scheme whose last NAV is older than this many days is left out and not charged. 7 covers a weekend and a holiday. Raise it to 20000 for the whole register. |
maxFileAgeDays | 7 | latest mode only. If nothing in the file is newer than this, the run charges nothing. |
schemeCodes | none | AMFI scheme codes exactly as published, such as 119551. The cheapest way to track a fixed set every day. |
fundHouses | any | Part of the fund house name, any case. HDFC catches HDFC Mutual Fund. |
nameContains | any | Part of the scheme name, any case. Several terms mean any of them. |
categoryContains | any | Part of the category, any case, such as Large Cap, Liquid or ELSS. |
dateFrom | 6 days before dateTo | history mode only. 2026-09-01 or 01-Sep-2026. A range longer than 366 days is trimmed, and a backwards one swapped, each with a free INPUT_ADJUSTED row saying so. |
dateTo | today | history mode only, same formats. |
proxyUrls | not used | Your own servers to send the traffic through, as http://user:pass@host:port. Leave it empty unless you need that. |
{
"mode": "latest",
"universe": "open",
"fundHouses": ["HDFC Mutual Fund"],
"categoryContains": ["Large Cap"],
"maxItems": 200,
"maxNavAgeDays": 7
}
Any input at all starts a real read, even just maxItems. Only a completely empty input, {} sent through the API, returns the free sample row.
📤 What you get back
A real row from a real run:
{
"ok": true,
"charged": true,
"recordType": "fund",
"schemeCode": "135762",
"schemeName": "Axis Children's Fund",
"fundHouse": "Axis Mutual Fund",
"category": "Open Ended Schemes (Children’s Fund - Childrens' Fund)",
"categoryType": "Open Ended",
"plan": "Direct Plan",
"option": "Growth Option",
"nav": 29.2283,
"navRaw": "29.2283",
"currency": "INR",
"navDate": "2026-09-29",
"navDateRaw": "29-Sep-2026",
"navAgeDays": 1,
"navStale": false,
"isinGrowth": "INF846K01WO1",
"isinReinvestment": null,
"source": "daily-file",
"filePublishedAt": "2026-09-30T02:28:33.000Z",
"scrapedAt": "2026-09-30T02:31:14.544Z",
"fileLatestNavDate": "2026-09-29"
}
| Field | What it is |
|---|---|
schemeCode | AMFI's own code and the key to use. It is stable across days, and it is the same in both modes while the name is not. |
schemeName | The name as the source writes it. The history report folds plan and option into the name, so match on schemeCode. |
category, categoryType | The category heading AMFI files the scheme under. Several categories appear under two spellings, Equity Scheme - and Equity Schemes -, so filter on a substring. |
plan, option | Direct Plan or Regular Plan, and growth, IDCW and the rest as published. option has hundreds of spellings, so treat it as text. |
nav, navRaw | The NAV in rupees, and the text exactly as published. A value that does not read as a number is left out, never turned into a zero. |
navDate, navAgeDays | The trading day the NAV belongs to, not the day you ran this, and how old that was. On a Monday morning the newest equity NAVs are Friday's. |
navStale | Always false on a row you receive, because anything past your limit is left out. |
isinGrowth, isinReinvestment | The ISINs, null where none is published. |
source | daily-file or history-report. |
filePublishedAt, fileLatestNavDate | When the daily file was last written, and the newest NAV date anywhere in it. If the second is not close to today, nothing in the file is current. |
🧾 Reading the output
Three kinds of row can share a dataset, and charged is the field that separates them.
| Row | How to spot it | Charged |
|---|---|---|
| A NAV | charged: true | yes |
| The sample | _sample: true, charged: false | no |
| A diagnostic | _diagnostic: true, charged: false, an errorCode | no |
The sample row also says recordType: "fund", so filter on charged == true, not on recordType.
| Code | What it means |
|---|---|
FILE_STALE | The file downloaded fine, but its newest NAV is past maxFileAgeDays. |
ALL_STALE | Schemes matched your filters, but every one last published a NAV past maxNavAgeDays. Almost always wound-up schemes. |
NO_RESULTS | Nothing matched your filters, or a history range held no NAVs, such as a weekend. |
RANGE_MISMATCH | In history mode, rows came back dated outside your range and were dropped. |
INPUT_ADJUSTED | A history range was trimmed or swapped. The row says what changed. |
FORMAT_UNRECOGNISED, FORMAT_DRIFT | The file's header or column layout changed, so nothing was read as data. |
FEED_HTTP, FEED_UNREACHABLE, FEED_TRUNCATED, FEED_EMPTY, NO_DATE | The file answered with an error, could not be reached, stopped part-way, held no scheme rows, or carried no readable dates. |
TIME_BUDGET | The run ran out of time before every row was written. |
▶️ How to run it
1. Open Indian Mutual Fund NAV Scraper and click Try for free. 2. Leave What to read on latest, or pick history and fill History from and History to. 3. Keep Which schemes on open, the form's starting choice, unless you want every scheme on the register. 4. Narrow it with Scheme codes (optional) or Fund houses (optional), and set Maximum rows. 5. Click Start, then download the dataset as CSV, JSON or Excel.
💰 How much does it cost?
$0.20 per 1,000 NAV rows, which is $0.0002 a row, flat on every Apify plan. The whole live market on a normal day, around 8,700 schemes, comes to under two dollars.
You pay for NAV rows and nothing else per row. The sample row and every diagnostic row are free, and so are schemes your filters drop, schemes past your age limit, history rows outside your range, and every row of a run where the file failed a check. If you set a maximum charge on the run, it stops at that figure instead of going past it.
💡 What people use it for
- Keeping a portfolio tracker up to date without anyone retyping numbers off a website every evening.
- Filling in NAV history for a set of schemes after the fact, one run over a date range rather than a request per scheme per day.
- Reconciling a statement against the published value for the exact date on it, by scheme code.
- Keeping your own archive. AMFI overwrites the daily file in place, so the only way to have last Tuesday is to have saved last Tuesday.
🚧 What it does not do
- India only. AMFI publishes Indian schemes, every value in rupees.
- No live prices. One NAV per valuation day, published in the evening.
- Only the NAV. No assets under management, expense ratio, holdings, returns or ratings, because none of that is in the file.
- No advice. It does not rank schemes or calculate returns.
- No weekend NAVs for most schemes, and none on Indian public holidays, so a short history range can come back empty.
- Not a spread by default. A low
maxItemsgives you the first schemes in the file's order, not a sample of the market. Use the filters. - History is slow to start. The report is generated when asked for, so a long range can take 20 to 30 seconds before the first row. A month of the whole market is around 160,000 rows.
🧭 Which market data scraper do you need?
| If you want | Use |
|---|---|
| Indian mutual fund NAVs with their dates | This one |
| Stock, index and currency quotes with price history | Yahoo Finance Scraper |
| Crypto prices, market caps and rankings | CoinGecko Scraper |
| US company filings with the SEC | SEC EDGAR Scraper |
❓ Questions people ask
Is the NAV live? No, and it cannot be. A fund's NAV is struck once per valuation day from its closing holdings. navDate tells you which day.
Why would a row be dated years ago? It would not, unless you raised maxNavAgeDays. The file keeps wound-up schemes frozen at their final value, and those are left out by default.
What happens if the file stops being updated? You get one free FILE_STALE row with the newest date it found, and no rows are charged.
How do I track just a few schemes? Put their codes in schemeCodes. You pay only for the rows that come back.
How do I find a scheme code? Run it once with nameContains set to part of the name and read schemeCode off the rows. Names change wording, codes do not.
Can I run it on a schedule? Yes. Once a day in the evening, India time, is the right pace. Key on schemeCode plus navDate to match rows across runs.
🆘 If something breaks
Open the Issues tab on the actor page and send the run ID with the input you used. The errorCode and details on a diagnostic row usually name the reason already.